diff --git a/pixi-spine/pixi-spine-tests.ts b/pixi-spine/pixi-spine-tests.ts
new file mode 100644
index 000000000..71ecf3147
--- /dev/null
+++ b/pixi-spine/pixi-spine-tests.ts
@@ -0,0 +1,312 @@
+///
+///
+
+module Spine {
+
+ export class Dragon {
+
+ private renderer: PIXI.CanvasRenderer | PIXI.WebGLRenderer;
+
+ private stage: PIXI.Container;
+
+ private dragon: PIXI.spine.Spine;
+
+ constructor() {
+
+ this.renderer = PIXI.autoDetectRenderer(800, 600, { backgroundColor: 0x1099bb });
+ document.body.appendChild(this.renderer.view);
+
+ // create the root of the scene graph
+ this.stage = new PIXI.Container();
+
+ PIXI.loader.add('dragon', '../../_assets/spine/dragon.json').load(this.onAssetsLoaded);
+
+ }
+
+ private onAssetsLoaded = (loader: PIXI.loaders.Loader, res: any): void => {
+
+ //initiate the spine animation
+ this.dragon = new PIXI.spine.Spine(res.dragon.spineData);
+ this.dragon.skeleton.setToSetupPose();
+ this.dragon.update(0);
+ this.dragon.autoUpdate = false;
+
+ //create a container for the spin animation and add the animation to it
+ var dragonCage: PIXI.Container = new PIXI.Container();
+ dragonCage.addChild(this.dragon);
+
+ // measure the spine animation and position it inside its container to align it to the origin
+ var localRect: PIXI.Rectangle = this.dragon.getLocalBounds();
+ this.dragon.position.set(-localRect.x, -localRect.y);
+
+ // now we can scale, position and rotate the container as any other display object
+ var scale = Math.min((this.renderer.width * 0.7) / dragonCage.width, (this.renderer.height * 0.7) / dragonCage.height);
+ dragonCage.scale.set(scale, scale);
+ dragonCage.position.set((this.renderer.width - dragonCage.width) * 0.5, (this.renderer.height - dragonCage.height) * 0.5);
+
+ // add the container to the stage
+ this.stage.addChild(dragonCage);
+
+ // once position and scaled, set the animation to play
+ this.dragon.state.setAnimationByName(0, 'flying', true);
+
+ this.animate();
+
+ }
+
+ private animate = (): void => {
+
+ requestAnimationFrame(this.animate);
+
+ // update the spine animation, only needed if dragon.autoupdate is set to false
+ this.dragon.update(0.01666666666667); // HARDCODED FRAMERATE!
+
+ this.renderer.render(this.stage);
+
+ }
+
+ }
+
+}
+
+module Spine {
+
+ export class Goblin {
+
+ private renderer: PIXI.CanvasRenderer | PIXI.WebGLRenderer;
+
+ private stage: PIXI.Container;
+
+ private goblin: PIXI.spine.Spine;
+
+ constructor() {
+
+ this.renderer = PIXI.autoDetectRenderer(800, 600, { backgroundColor: 0x1099bb });
+ document.body.appendChild(this.renderer.view);
+
+ // create the root of the scene graph
+ this.stage = new PIXI.Container();
+ this.stage.interactive = true;
+
+ PIXI.loader.add('goblins', '../../_assets/spine/goblins.json').load(this.onAssetsLoaded);
+
+ }
+
+ private onAssetsLoaded = (loader: PIXI.loaders.Loader, res: any): void => {
+
+ //initiate the spine animation
+ this.goblin = new PIXI.spine.Spine(res.goblins.spineData);
+ this.goblin.skeleton.setSkinByName('goblin');
+ this.goblin.skeleton.setSlotsToSetupPose();
+
+ this.goblin.position.x = 400;
+ this.goblin.position.y = 600;
+ this.goblin.scale.set(1.5);
+
+ this.goblin.state.setAnimationByName(0, 'walk', true);
+
+ this.stage.addChild(this.goblin);
+
+ this.stage.on('click', () => {
+
+ // change current skin
+ var currentSkinName = this.goblin.skeleton.skin.name;
+ var newSkinName = (currentSkinName === 'goblin' ? 'goblingirl' : 'goblin');
+ this.goblin.skeleton.setSkinByName(newSkinName);
+ this.goblin.skeleton.setSlotsToSetupPose();
+
+ });
+
+ this.animate();
+
+ }
+
+ private animate = (): void => {
+
+ requestAnimationFrame(this.animate);
+
+ this.renderer.render(this.stage);
+
+ }
+
+ }
+
+}
+
+module Spine {
+
+ export class Pixie {
+
+ private renderer: PIXI.CanvasRenderer | PIXI.WebGLRenderer;
+
+ private stage: PIXI.Container;
+
+ private pixie: PIXI.spine.Spine;
+
+ private position: number;
+ private background: PIXI.Sprite;
+ private background2: PIXI.Sprite;
+ private foreground: PIXI.Sprite;
+ private foreground2: PIXI.Sprite;
+
+ constructor() {
+
+ this.renderer = PIXI.autoDetectRenderer(800, 600, { backgroundColor: 0x1099bb });
+ document.body.appendChild(this.renderer.view);
+
+ // create the root of the scene graph
+ this.stage = new PIXI.Container();
+ this.stage.interactive = true;
+
+ PIXI.loader.add('pixie', '../../_assets/spine/pixie.json').load(this.onAssetsLoaded);
+
+ }
+
+ private onAssetsLoaded = (loader: PIXI.loaders.Loader, res: any): void => {
+
+ this.background = PIXI.Sprite.fromImage('../../_assets/spine/iP4_BGtile.jpg');
+ this.background2 = PIXI.Sprite.fromImage('../../_assets/spine/iP4_BGtile.jpg');
+ this.stage.addChild(this.background);
+ this.stage.addChild(this.background2);
+
+ this.foreground = PIXI.Sprite.fromImage('../../_assets/spine/iP4_ground.png');
+ this.foreground2 = PIXI.Sprite.fromImage('../../_assets/spine/iP4_ground.png');
+ this.stage.addChild(this.foreground);
+ this.stage.addChild(this.foreground2);
+ this.foreground.position.y = this.foreground2.position.y = 640 - this.foreground2.height;
+
+ this.pixie = new PIXI.spine.Spine(res.pixie.spineData);
+
+ var scale = 0.3;
+
+ this.pixie.position.x = 1024 / 3;
+ this.pixie.position.y = 500;
+
+ this.pixie.scale.x = this.pixie.scale.y = scale;
+
+ this.stage.addChild(this.pixie);
+
+ this.pixie.stateData.setMixByName('running', 'jump', 0.2);
+ this.pixie.stateData.setMixByName('jump', 'running', 0.4);
+
+ this.pixie.state.setAnimationByName(0, 'running', true);
+
+ this.stage.on('mousedown', this.onTouchStart);
+ this.stage.on('touchstart', this.onTouchStart);
+
+ this.animate();
+
+ }
+
+ private onTouchStart = (): void => {
+
+ this.pixie.state.setAnimationByName(0, 'jump', false);
+ this.pixie.state.addAnimationByName(0, 'running', true, 0);
+
+ }
+
+ private animate = (): void => {
+
+ this.position += 10;
+
+ this.background.position.x = -(this.position * 0.6);
+ this.background.position.x %= 1286 * 2;
+ if (this.background.position.x < 0) {
+ this.background.position.x += 1286 * 2;
+ }
+ this.background.position.x -= 1286;
+
+ this.background2.position.x = -(this.position * 0.6) + 1286;
+ this.background2.position.x %= 1286 * 2;
+ if (this.background2.position.x < 0) {
+ this.background2.position.x += 1286 * 2;
+ }
+ this.background2.position.x -= 1286;
+
+ this.foreground.position.x = -this.position;
+ this.foreground.position.x %= 1286 * 2;
+ if (this.foreground.position.x < 0) {
+ this.foreground.position.x += 1286 * 2;
+ }
+ this.foreground.position.x -= 1286;
+
+ this.foreground2.position.x = -this.position + 1286;
+ this.foreground2.position.x %= 1286 * 2;
+ if (this.foreground2.position.x < 0) {
+ this.foreground2.position.x += 1286 * 2;
+ }
+ this.foreground2.position.x -= 1286;
+
+ requestAnimationFrame(this.animate);
+
+ this.renderer.render(this.stage);
+
+ }
+
+ }
+
+ module Spine {
+
+ export class SpineBoy {
+
+ private renderer: PIXI.CanvasRenderer | PIXI.WebGLRenderer;
+
+ private stage: PIXI.Container;
+
+ private spineboy: PIXI.spine.Spine;
+
+ constructor() {
+
+ this.renderer = PIXI.autoDetectRenderer(800, 600, { backgroundColor: 0x1099bb });
+ document.body.appendChild(this.renderer.view);
+
+ // create the root of the scene graph
+ this.stage = new PIXI.Container();
+ this.stage.interactive = true;
+
+ PIXI.loader.add('spineboy', '../../_assets/spine/spineboy.json').load(this.onAssetsLoaded);
+
+ }
+
+ private onAssetsLoaded = (loader: PIXI.loaders.Loader, res: any): void => {
+
+ //initiate the spine animation
+ this.spineboy = new PIXI.spine.Spine(res.spineboy.spineData);
+ this.spineboy.position.x = this.renderer.width / 2;
+ this.spineboy.position.y = this.renderer.height;
+ this.spineboy.scale.set(1.5);
+
+ // set up the mixes!
+ this.spineboy.stateData.setMixByName('walk', 'jump', 0.2);
+ this.spineboy.stateData.setMixByName('jump', 'walk', 0.4);
+
+ // play animation
+ this.spineboy.state.setAnimationByName(0, 'walk', true);
+
+ this.stage.addChild(this.spineboy);
+
+
+ this.stage.on('click', () => {
+
+ this.spineboy.state.setAnimationByName(0, 'jump', false);
+ this.spineboy.state.addAnimationByName(0, 'walk', true, 0);
+
+ });
+
+ this.animate();
+
+ }
+
+ private animate = (): void => {
+
+ requestAnimationFrame(this.animate);
+
+ this.renderer.render(this.stage);
+
+ }
+
+ }
+
+ }
+
+}
\ No newline at end of file
diff --git a/pixi-spine/pixi-spine.d.ts b/pixi-spine/pixi-spine.d.ts
new file mode 100644
index 000000000..e39dffa42
--- /dev/null
+++ b/pixi-spine/pixi-spine.d.ts
@@ -0,0 +1,812 @@
+// Type definitions for pixi-spine 1.0.4
+// Project: https://github.com/pixijs/pixi-spine/
+// Definitions by: martijncroezen
+// Definitions: https://github.com/borisyankov/DefinitelyTyped
+
+///
+declare module PIXI {
+
+ export module spine {
+
+ export interface Timeline {
+
+ frames: number[];
+
+ getFrameCount(): number;
+ apply(skeleton: Skeleton, lastTime: number, time: number, firedEvents: Event[], alpha: number): void;
+
+ }
+
+ export interface Attachment {
+
+ name: string;
+ type: number;
+
+ }
+
+ export class Animation {
+
+ constructor(name: string, timelines?: Timeline[], duration?: number);
+
+ apply(skeleton: Skeleton, lastTime: number, time: number, loop?: boolean, events?: Event[]): void;
+ mix(skeleton: Skeleton, lastTime: number, time: number, loop?: boolean, events?: any[], alpha?: number): void;
+ binarySearch(values: number[], target: number, step: number): number;
+ binarySearch1(values: number[], target: number): number;
+ linearSearch(values: number[], target: number, step: number): number;
+
+ name: string;
+ timelines: Timeline[];
+ duration: number;
+
+ }
+
+ export class AnimationState {
+
+ data: AnimationStateData;
+ tracks: TrackEntry[];
+ events: Event[];
+ onStart: (index: number) => void;
+ onEnd: (trackIndex: number) => void;
+ onComplete: (i: number, count: number) => void;
+ onEvent: (i: number, event: Event) => void;
+ timeScale: number;
+
+ constructor(stateData: AnimationStateData);
+
+ update(delta: number): void;
+ apply(skeleton: Skeleton): void;
+ clearTracks(): void;
+ clearTrack(trackIndex: number): void;
+ private _expandToIndex(index: number): TrackEntry;
+ setCurrent(index: number, entry: TrackEntry): void;
+ setAnimationByName(trackIndex: number, animationName: string, loop: boolean): TrackEntry;
+ setAnimation(trackIndex: number, animation: Animation, loop: boolean): TrackEntry;
+ addAnimationByName(trackIndex: number, animationName: string, loop: boolean, delay: number): TrackEntry;
+ addAnimation(trackIndex: number, animation: Animation, loop: boolean, delay: number): TrackEntry;
+ getCurrent(trackIndex: number): TrackEntry;
+
+ }
+
+ export class Spine extends PIXI.Container {
+
+ constructor(spineData: any);
+
+ static fromAtlas(resourceName: string): Spine;
+
+ update(dt: number): void;
+
+ private autoUpdateTransform(): void;
+ private createSprite(slot: Slot, attachment: Attachment): Sprite;
+ private createMesh(slot, attachment)
+
+ spineData: any;
+ skeleton: Skeleton;
+ stateData: AnimationStateData;
+ state: AnimationState;
+ slotContainers: PIXI.Container[];
+ autoUpdate: boolean;
+
+ }
+
+ export class AnimationStateData {
+
+ constructor(skeletonData: SkeletonData);
+
+ private _skelentonData: SkeletonData;
+ private animationToMixTime: number;
+ defaultMix: number;
+ skeletonData: SkeletonData;
+ setMixByName(fromName: string, toName: string, duration: number): void;
+ setMix(from: Animation, to: Animation, duration: number): void;
+ getMix(from: Animation, to: Animation): number;
+
+ }
+
+ export class AttachmentType {
+
+ static region: number;
+ static boundingbox: number;
+ static mesh: number;
+ static skinnedmesh: number;
+
+ }
+
+ export class Bone {
+
+ data: BoneData;
+ skeleton: Skeleton;
+ parent: Bone;
+
+ constructor(boneData: BoneData, skeleton: Skeleton, parent: Bone);
+
+ x: number;
+ y: number;
+ rotation: number;
+ rotationIK: number;
+ scaleX: number;
+ scaleY: number;
+ flipX: boolean;
+ flipY: boolean;
+ m00: number;
+ m01: number;
+ worldX: number;
+ m10: number;
+ m11: number;
+ worldY: number;
+ worldRotation: number;;
+ worldScaleX: number;
+ worldScaleY: number;
+ worldFlipX: boolean;
+ worldFlipY: boolean;
+
+ updateWorldTransform(): void;
+ setToSetupPose(): void;
+ worldToLocal(world: number[]): void;
+ localToWorld(local: number[]): void;
+
+ }
+
+ export class BoneData {
+
+ name: string;
+ parent: Bone;
+
+ constructor(name: string, parent: Bone);
+
+ length: number;
+ x: number;
+ y: number;
+ rotation: number;
+ scaleX: number;
+ scaleY: number;
+ inheritScale: boolean;
+ inheritRotation: boolean;
+ flipX: boolean;
+ flipY: boolean;
+
+ }
+
+ export class BoundingBoxAttachment implements Attachment {
+
+ constructor(name: string);
+
+ name: string;
+ vertices: number[];
+ type: number;
+
+ computeWorldVertices(x: number, y: number, bone: Bone, worldVertices: number[]): void;
+
+ }
+
+ export class ColorTimeline implements Timeline {
+
+ constructor(frameCount: number);
+
+ curves: Curves;
+ frames: number[];
+ slotIndex: number;
+
+ getFrameCount(): number;
+ setFrame(frameIndex: number, time: number, r: number, g: number, b: number, a: number): void;
+ apply(skeleton: Skeleton, lastTime: number, time: number, firedEvents: Event[], alpha: number): void;
+
+ }
+
+ export class Curves {
+
+ constructor(frameCount: number[]);
+
+ curves: number[];
+
+ setLinear(frameIndex: number): void;
+ setStepped(frameIndex: number): void;
+ setCurve(frameIndex: number, cx1: number, cy1: number, cx2: number, cy2: number): void;
+ getCurvePercent(frameIndex: number, percent: number): number;
+
+ }
+
+ export class DrawOrderTimeline implements Timeline {
+
+ constructor(frameCount: number);
+
+ frames: number[];
+ drawOrders: number[];
+
+ getFrameCount(): number;
+ setFrame(frameIndex: number, time: number, drawOrder: number[]): void;
+ apply(skeleton: Skeleton, lastTime: number, time: number, firedEvents: Event[], alpha: number): void;
+
+ }
+
+ export class Event {
+
+ constructor(data: any);
+
+ data: any;
+ intValue: number;
+ floatValue: number;
+ stringValue: string;
+
+ }
+
+ export class EventData {
+
+ constructor(name: string);
+
+ name: string;
+
+ intValue: number;
+ floatValue: number;
+ stringValue: string;
+
+ }
+
+ export class EventTimeline implements Timeline {
+
+ constructor(frameCount: number);
+
+ frames: number[];
+ events: Event[];
+
+ getFrameCount(): number;
+ setFrame(frameIndex: number, time: number, event: Event): void;
+ apply(skeleton: Skeleton, lastTime: number, time: number, firedEvents: Event[], alpha: number): void;
+
+ }
+
+
+ export class FfdTimeline implements Timeline {
+
+ constructor(frameCount: number);
+
+ curves: Curves;
+ frames: number[];
+ frameVertices: number[];
+ slotIndex: number;
+ attachment: number;
+
+ getFrameCount(): number;
+ setFrame(frameIndex: number, time: number, vertices: number[]): void;
+ apply(skeleton: Skeleton, lastTime: number, time: number, firedEvents: Event[], alpha: number): void;
+
+ }
+
+ export class FlipXTimeline implements Timeline {
+
+ constructor(frameCount: number);
+
+ curves: Curves;
+ frames: number[];
+ boneIndex: number;
+
+ getFrameCount(): number;
+ setFrame(frameIndex: number, time: number, vertices: number[]): void;
+ apply(skeleton: Skeleton, lastTime: number, time: number, firedEvents: Event[], alpha: number): void;
+
+ }
+
+ export class FlipYTimeline implements Timeline {
+
+ constructor(frameCount: number);
+
+ curves: Curves;
+ frames: number[];
+ boneIndex: number;
+
+ getFrameCount(): number;
+ setFrame(frameIndex: number, time: number, vertices: number[]): void;
+ apply(skeleton: Skeleton, lastTime: number, time: number, firedEvents: Event[], alpha: number): void;
+
+ }
+
+ export class IkConstraint {
+
+ constructor(data: IkConstraintData, skeleton: Skeleton);
+
+ data: IkConstraintData;
+ mix: number;
+ bendDirection: number;
+ bones: Bone[];
+ target: Bone;
+
+ apply(): void;
+ apply1(bone: Bone, targetX: number, targetY: number, alpha: number): void;
+ apply2(parent: Bone, child: Bone, targetX: number, targetY: number, bendDirection: number, alpha: number): void;
+
+ }
+
+ export class IkConstraintData {
+
+ constructor(name: string);
+
+ name: string;
+ bones: Bone[];
+ target: Bone;
+ bendDirection: number;
+ mix: number;
+
+ }
+
+ export class IkConstraintTimeline implements Timeline {
+ constructor(frameCount: number);
+
+ curves: Curves;
+ frames: number[];
+ ikConstraintIndex: number;
+
+ getFrameCount(): number;
+ setFrame(frameIndex: number, time: number, mix: number, bendDirection: number): void;
+ apply(skeleton: Skeleton, lastTime: number, time: number, firedEvents: Event[], alpha: number): void;
+
+ }
+
+ export class MeshAttachment implements Attachment {
+
+ constructor(name: string);
+
+ name: string;
+ type: number;
+ vertices: number[];
+ uvs: number[]
+ regionUVs: number[]
+ triangles: number[]
+ hullLength: number;
+ r: number;
+ g: number;
+ b: number;
+ a: number;
+ path: string;
+ rendererObject: any;
+ regionU: number;
+ regionV: number;
+ regionU2: number;
+ regionV2: number;
+ regionRotate: boolean;
+ regionOffsetX: number;
+ regionOffsetY: number;
+ regionWidth: number;
+ regionHeight: number;
+ regionOriginalWidth: number;
+ regionOriginalHeight: number;
+ edges: number[];
+ width: number;
+ height: number;
+
+ updateUVs(): void;
+ computeWorldVertices(x: number, y: number, slot: Slot, worldVertices: number[]): void;
+
+ }
+
+ export class RegionAttachment implements Attachment {
+
+ constructor(name: string);
+
+ name: string;
+ offset: number[];
+ uvs: number[]
+ type: number;
+ x: number;
+ y: number;
+ rotation: number;
+ scaleX: number;
+ scaleY: number;
+ width: number;
+ height: number;
+ r: number;
+ g: number;
+ b: number;
+ a: number;
+ path: string;
+ rendererObject: any;
+ regionOffsetX: number;
+ regionOffsetY: number;
+ regionWidth: number;
+ regionHeight: number;
+ regionOriginalWidth: number;
+ regionOriginalHeight: number;
+
+ updateOffset(): void;
+ setUVs(u: number, v: number, u2: number, v2: number, rotate: number): void;
+ computeVertices(x: number, y: number, bone: Bone, vertices: number[]): void;
+
+ }
+
+ export class RotateTimeline implements Timeline {
+
+ constructor(frameCount: number);
+
+ curves: Curves;
+ frames: number[];
+ boneIndex: number;
+
+ getFrameCount(): number;
+ setFrame(frameIndex: number, time: number, mix: number, bendDirection: number): void;
+ apply(skeleton: Skeleton, lastTime: number, time: number, firedEvents: Event[], alpha: number): void;
+
+ }
+
+ export class ScaleTimeline implements Timeline {
+
+ constructor(frameCount: number);
+
+ curves: Curves;
+ frames: number[];
+ boneIndex: number;
+
+ getFrameCount(): number;
+ setFrame(frameIndex: number, time: number, mix: number, bendDirection: number): void;
+ apply(skeleton: Skeleton, lastTime: number, time: number, firedEvents: Event[], alpha: number): void;
+
+ }
+
+ export class Skeleton {
+
+ constructor(skeletonData: SkeletonData);
+
+ data: SkeletonData;
+ bones: Bone[];
+ slots: Slot[];
+ drawOrder: Slot[];
+ ikConstraints: IkConstraint[];
+ boneCache: Bone[][];
+ x: number;
+ y: number;
+ skin: Skin;
+ r: number;
+ g: number;
+ b: number;
+ a: number;
+ time: number;
+ flipX: boolean;
+ flipY: boolean;
+
+ updateCache(): void;
+ updateWorldTransform(): void;
+ setToSetupPose(): void;
+ setBonesToSetupPose(): void;
+ setSlotsToSetupPose(): void;
+ getRootBone(): Bone;
+ findBone(boneName: string): Bone;
+ findBoneIndex(boneName: string): number;
+ findSlot(slotName: string): Slot;
+ findSlotIndex(slotName: string): number;
+ setSkinByName(skinName: string): Skin;
+ setSkin(newSkin: Skin): void;
+ getAttachmentBySlotName(slotName: string, attachmentName: string): Attachment;
+ getAttachmentBySlotIndex(slotIndex: number, attachmentName: string): Attachment
+ setAttachment(slotName: string, attachmentName: string): void;
+ findIkConstraint(ikConstraintName: string): IkConstraint;
+ update(delta: number): void;
+ resetDrawOrder(): void;
+
+ }
+
+ export class SkeletonBounds {
+
+ polygonPool: Polygon[];
+ polygons: Polygon[];
+ boundingBoxes: BoundingBoxAttachment[];
+ minX: number;
+ minY: number;
+ maxX: number;
+ maxY: number;
+
+ update(skeleton: Skeleton, updateAabb: boolean): void;
+ aabbCompute(): void;
+ aabbContainsPoint(x: number, y: number): void;
+ aabbIntersectsSegment(x1: number, y1: number, x2: number, y2: number): boolean;
+ aabbIntersectsSkeleton(bounds: SkeletonBounds): boolean;
+ containsPoint(x: number, y: number): BoundingBoxAttachment;
+ intersectsSegment(x1: number, y1: number, x2: number, y2: number): BoundingBoxAttachment;
+ polygonContainsPoint(polygon: Polygon, x: number, y: number): boolean;
+ polygonIntersectsSegment(polygon: Polygon, x1: number, y1: number, x2: number, y2: number): boolean;
+ getPolygon(attachment: Attachment): Polygon;
+ getWidth(): number;
+ getHeight(): number;
+
+ }
+
+ export class SkeletonData {
+
+ bones: Bone[];
+ slots: Slot[];
+ skins: Skin[];
+ events: Event[];
+ animations: Animation[];
+ ikConstraints: IkConstraint[];
+ name: string;
+ defaultSkin: Skin;
+ width: number;
+ height: number;
+ version: any;
+ hash: any;
+
+ findBone(boneName: string): Bone;
+ findBoneIndex(boneName: string): number;
+ findSlot(slotName: string): Slot;
+ findSlotIndex(slotName: string): number;
+ findSkin(skinName: string): Skin;
+ findEvent(eventName: string): Event;
+ findAnimation(animationName: string): Animation
+ findIkConstraint(ikConstraintName: string): IkConstraint;
+
+ }
+
+ export class SkeletonJsonParser {
+
+ constructor(attachmentLoader: any);
+
+ attachmentLoader: any;
+ scale: number;
+
+ readSkeletonData(root: Bone, name: string): void;
+ readAttachment(skin: Skin, name: string, map: any): void;
+ readAnimation(name: string, map: any, skeletonData: SkeletonData): void;
+ readCurve(timeline: Timeline, frameIndex: number, valueMap: any): void;
+ toColor(hexString: string, colorIndex: string): number;
+ getFloatArray(map: any, name: string, scale: number): number[];
+ getIntArray(map: any, name: string): number[];
+
+ }
+
+ export class Skin {
+
+ constructor(name: string);
+
+ name: string;
+ attachments: Attachment[];
+ addAttachment(slotIndex: number, name: string, attachment: Attachment): void;
+ getAttachment(slotIndex: number, name: string): Attachment;
+
+ protected _attachAll(skeleton: Skeleton, oldSkin: Skin): void;
+
+ }
+
+ export class SkinnedMeshAttachment implements Attachment {
+
+ constructor(name: string);
+
+ name: string;
+ type: number;
+ bones: number[];
+ weights: number[];
+ uvs: number[];
+ regionUVs: number[];
+ triangles: number[];
+ hullLength: number;
+ r: number;
+ g: number;
+ b: number;
+ a: number;
+ path: string;
+ rendererObject: any;
+ regionU: number;
+ regionV: number;
+ regionU2: number;
+ regionV2: number;
+ regionRotate: boolean;
+ regionOffsetX: number;
+ regionOffsetY: number;
+ regionWidth: number;
+ regionHeight: number;
+ regionOriginalWidth: number;
+ regionOriginalHeight: number;
+ edges: number[];
+ width: number;
+ height: number;
+
+ updateUVs(u: number, v: number, u2: number, v2: number, rotate: boolean): void;
+ computeWorldVertices(x: number, y: number, slot: Slot, worldVertices: number[]): void;
+
+ }
+
+ export class Slot {
+
+ constructor(slotData: SlotData, bone: Bone);
+
+ data: SlotData;
+ bone: Bone;
+ r: number;
+ g: number;
+ b: number;
+ a: number;
+ _attachmentTime: number;
+ attachment: Attachment;
+ attachmentVertices: number[];
+ setAttachment(attachment: Attachment): void;
+ setAttachmentTime(time: number): void;
+ getAttachmentTime(): number;
+ setToSetupPose(): void;
+
+ }
+
+ export class SlotData {
+
+ constructor(name: string, boneData: BoneData);
+
+ name: string;
+ boneData: BoneData;
+
+ static PIXI_BLEND_MODE_MAP: {
+ multiply: number;
+ screen: number;
+ additive: number;
+ normal: number;
+ };
+ r: number;
+ g: number;
+ b: number;
+ a: number;
+ attachmentName: string;
+ blendMode: number;
+
+ }
+
+ export class TrackEntry {
+
+ next: TrackEntry;
+ previous: TrackEntry;
+ animation: Animation;
+ loop: boolean;
+ delay: number;
+ time: number;
+ lastTime: number;
+ endTime: number;
+ timeScale: number;
+ mixTime: number;
+ mixDuration: number;
+ mix: number;
+ onStart: (index: number) => void;
+ onEnd: (trackIndex: number) => void;
+ onComplete: (i: number, count: number) => void;
+ onEvent: (i: number, event: Event) => void;
+
+ }
+
+ export class TranslateTimeline implements Timeline {
+
+ constructor(frameCount: number);
+
+ curves: Curves[];
+ frames: number[];
+ boneIndex: number;
+
+ getFrameCount(): number;
+ setFrame(frameIndex: number, time: number, x: number, y: number): void;
+ apply(skeleton: Skeleton, lastTime: number, time: number, firedEvents: Event[], alpha: number): void;
+
+ }
+
+ export class Atlas {
+
+ constructor(atlasText: string, baseUrl: string, crossOrigin: any);
+
+ pages: AtlasPage[];
+ regions: AtlasRegion[];
+ texturesLoading: number;
+
+ findRegion(name: string): AtlasRegion;
+ dispose(): void;
+ updateUVs(page: AtlasPage): void;
+
+ Format: {
+
+ alpha: number;
+ intensity: number;
+ luminanceAlpha: number;
+ rgb565: number;
+ rgba4444: number;
+ rgb888: number;
+ rgba8888: number;
+
+ };
+
+ TextureFilter: {
+
+ nearest: number;
+ linear: number;
+ mipMap: number;
+ mipMapNearestNearest: number;
+ mipMapLinearNearest: number;
+ mipMapNearestLinear: number;
+ mipMapLinearLinear: number;
+
+ };
+
+ TextureWrap: {
+
+ mirroredRepeat: number;
+ clampToEdge: number;
+ repeat: number;
+
+ };
+
+ }
+
+ export class AtlasAttachmentParser {
+
+ constructor(atlas: Atlas);
+
+ newRegionAttachment(skin: Skin, name: string, path: string): RegionAttachment;
+ newMeshAttachment(skin: Skin, name: string, path: string): SkinnedMeshAttachment;
+ newSkinnedMeshAttachment(skin: Skin, name: string, path: string): SkinnedMeshAttachment;
+ newBoundingBoxAttachment(skin: Skin, name: string): BoundingBoxAttachment;
+
+ }
+
+ export class AtlasPage {
+ name: string;
+ format: any;
+ minFilter: any;
+ magFilter: any;
+ uWrap: any;
+ vWrap: any;
+ rendererObject: any;
+ width: number;
+ height: number;
+
+ }
+
+ export class AtlasReader {
+ constructor(text: string);
+
+ lines: string[];
+ index: number;
+
+ trim(value: string): string;
+ readLine(): string;
+ readValue(): string;
+ readTuple(tuple: number): number;
+
+ }
+
+ export class AtlasRegion {
+
+ page: AtlasPage;
+ name: string;
+ x: number;
+ y: number;
+ width: number;
+ height: number;
+ u: number;
+ v: number;
+ u2: number;
+ v2: number;
+ offsetX: number;
+ offsetY: number;
+ originalWidth: number;
+ originalHeight: number;
+ index: number;
+ rotate: boolean;
+ splits: any;
+ pads: any;
+
+
+ }
+
+ export class AttachmentTimeline implements Timeline {
+
+ constructor(frameCount: number);
+
+ slotIndex: number;
+ frames: number[];
+ attachmentNames: string[];
+
+ getFrameCount(): number;
+ setFrame(frameIndex: number, time: number, attachmentName: string): void;
+ apply(skeleton: Skeleton, lastTime: number, time: number, firedEvents: Event[], alpha: number): void;
+
+ }
+
+ export class atlasParser {
+
+ constructor(resource: any, next: any);
+
+ AnimCache: any;
+ enableCaching: boolean;
+
+ }
+
+ }
+
+}
\ No newline at end of file
diff --git a/pixi.js/pixi.js-tests.ts b/pixi.js/pixi.js-tests.ts
new file mode 100644
index 000000000..6a462fc2e
--- /dev/null
+++ b/pixi.js/pixi.js-tests.ts
@@ -0,0 +1,2762 @@
+///
+
+module basics {
+
+ export class Basics {
+
+ private renderer: PIXI.CanvasRenderer | PIXI.WebGLRenderer;
+
+ private stage: PIXI.Container;
+
+ private bunny: PIXI.Sprite;
+
+ constructor() {
+
+ this.renderer = PIXI.autoDetectRenderer(800, 600, { backgroundColor: 0x1099bb });
+ document.body.appendChild(this.renderer.view);
+
+ // create the root of the scene graph
+ this.stage = new PIXI.Container();
+
+ // create a texture from an image path
+ var texture: PIXI.Texture = PIXI.Texture.fromImage("../../_assets/basics/bunny.png");
+
+ // create a new Sprite using the texture
+ this.bunny = new PIXI.Sprite(texture);
+
+ // center the sprite's anchor point
+ this.bunny.anchor.x = 0.5;
+ this.bunny.anchor.y = 0.5;
+
+ // move the sprite to the center of the screen
+ this.bunny.position.x = 200;
+ this.bunny.position.y = 150;
+
+ //add it to the stage
+ this.stage.addChild(this.bunny);
+
+ this.animate();
+
+ }
+
+ private animate = (): void => {
+
+ requestAnimationFrame(this.animate);
+
+ this.bunny.rotation += 0.1;
+
+ this.renderer.render(this.stage);
+
+ }
+
+ }
+
+}
+
+module basics {
+
+ export class Click {
+
+ private renderer: PIXI.CanvasRenderer | PIXI.WebGLRenderer;
+
+ private stage: PIXI.Container;
+
+ private sprite: PIXI.Sprite;
+
+ constructor() {
+
+ this.renderer = PIXI.autoDetectRenderer(800, 600, { backgroundColor: 0x1099bb });
+ document.body.appendChild(this.renderer.view);
+
+ // create the root of the scene graph
+ this.stage = new PIXI.Container();
+
+ this.sprite = PIXI.Sprite.fromImage('../../_assets/basics/bunny.png');
+ this.sprite.position.set(230, 264);
+ this.sprite.interactive = true;
+ this.sprite.on('mousedown', this.onDown, this);
+ this.sprite.on('touchstart', this.onDown, this);
+
+ //add it to the stage
+ this.stage.addChild(this.sprite);
+
+ //start animatng
+ this.animate();
+
+ }
+
+ private onDown = (eventData: PIXI.interaction.InteractionData): void => {
+
+ this.sprite.scale.x += 0.3;
+ this.sprite.scale.y += 0.3;
+
+ }
+
+ private animate = (): void => {
+
+ requestAnimationFrame(this.animate);
+
+ this.renderer.render(this.stage);
+
+ }
+
+ }
+
+}
+
+module basics {
+
+ export class Container {
+
+ private renderer: PIXI.CanvasRenderer | PIXI.WebGLRenderer;
+
+ private stage: PIXI.Container;
+
+ private container: PIXI.Container;
+
+ constructor() {
+
+ this.renderer = PIXI.autoDetectRenderer(800, 600, { backgroundColor: 0x1099bb });
+ document.body.appendChild(this.renderer.view);
+
+ // create the root of the scene graph
+ this.stage = new PIXI.Container();
+
+ this.container = new PIXI.Container();
+
+ this.stage.addChild(this.container);
+
+ for (var j = 0; j < 5; j++) {
+
+ for (var i = 0; i < 5; i++) {
+
+ var bunny: PIXI.Sprite = PIXI.Sprite.fromImage('../../_assets/basics/bunny.png');
+ bunny.x = 40 * i;
+ bunny.y = 40 * j;
+ this.container.addChild(bunny);
+
+ };
+
+ };
+
+ /*
+ * All the bunnies are added to the container with the addChild method
+ * when you do this, all the bunnies become children of the container, and when a container moves,
+ * so do all its children.
+ * This gives you a lot of flexibility and makes it easier to position elements on the screen
+ */
+ this.container.x = 100;
+ this.container.y = 60;
+
+ // start animating
+ this.animate();
+
+ }
+
+ private animate = (): void => {
+
+ requestAnimationFrame(this.animate);
+
+ this.renderer.render(this.stage);
+
+ }
+
+ }
+
+}
+
+module basics {
+
+ export class CustomFilter {
+
+ private renderer: PIXI.CanvasRenderer | PIXI.WebGLRenderer;
+
+ private stage: PIXI.Container;
+
+ private background: PIXI.Sprite;
+
+ private filter: CustomizedFilter;
+
+ constructor() {
+
+ this.renderer = PIXI.autoDetectRenderer(800, 600, { backgroundColor: 0x1099bb });
+ document.body.appendChild(this.renderer.view);
+
+ // create the root of the scene graph
+ this.stage = new PIXI.Container();
+
+ this.background = PIXI.Sprite.fromImage('../../_assets/bkg-grass.jpg');
+ this.background.scale.set(1.3, 1);
+ this.stage.addChild(this.background);
+
+
+ PIXI.loader.add('shader', '../../_assets/basics/shader.frag');
+ PIXI.loader.once('complete', this.onLoaded, this);
+ PIXI.loader.load();
+
+ }
+
+ private onLoaded(loader: PIXI.loaders.Loader, res: any) {
+
+ var fragmentSrc = res.shader.data;
+
+ this.filter = new CustomizedFilter(fragmentSrc);
+ this.background.filters = [this.filter];
+
+ this.animate();
+
+
+ }
+
+ private animate = (): void => {
+
+ this.filter.uniforms.customUniform.value += 0.04;
+
+ this.renderer.render(this.stage);
+ requestAnimationFrame(this.animate);
+
+ }
+
+ }
+
+ export class CustomizedFilter extends PIXI.AbstractFilter {
+
+ constructor(fragmentSource: string | string[]) {
+ super(null, fragmentSource, {
+ customUniform: {
+ type: '1f',
+ value: 0
+ }
+ })
+ }
+
+ }
+
+}
+
+module basics {
+
+ export class Graphics {
+
+ private renderer: PIXI.CanvasRenderer | PIXI.WebGLRenderer;
+
+ private stage: PIXI.Container;
+
+ private graphics: PIXI.Graphics;
+
+ constructor() {
+
+ this.renderer = PIXI.autoDetectRenderer(800, 600, { backgroundColor: 0x1099bb });
+ document.body.appendChild(this.renderer.view);
+
+ // create the root of the scene graph
+ this.stage = new PIXI.Container();
+ this.stage.interactive = true;
+
+ this.graphics = new PIXI.Graphics();
+
+ // draw a shape
+ this.graphics.moveTo(50, 50);
+ this.graphics.lineTo(250, 50);
+ this.graphics.lineTo(100, 100);
+ this.graphics.lineTo(50, 50);
+ this.graphics.endFill();
+
+ // set a fill and a line style again and draw a rectangle
+ this.graphics.lineStyle(2, 0x0000FF, 1);
+ this.graphics.beginFill(0xFF700B, 1);
+ this.graphics.drawRect(50, 250, 120, 120);
+
+ // draw a rounded rectangle
+ this.graphics.lineStyle(2, 0xFF00FF, 1);
+ this.graphics.beginFill(0xFF00BB, 0.25);
+ this.graphics.drawRoundedRect(150, 450, 300, 100, 15);
+ this.graphics.endFill();
+
+ // draw a circle, set the lineStyle to zero so the circle doesn't have an outline
+ this.graphics.lineStyle(0);
+ this.graphics.beginFill(0xFFFF0B, 0.5);
+ this.graphics.drawCircle(470, 90, 60);
+ this.graphics.endFill();
+
+ this.stage.addChild(this.graphics);
+
+ // start animating
+ this.animate();
+
+ }
+
+ private animate = (): void => {
+
+ requestAnimationFrame(this.animate);
+
+ this.renderer.render(this.stage);
+
+ }
+
+ }
+
+}
+
+module basics {
+
+ export class RenderTexture {
+
+ private renderer: PIXI.CanvasRenderer | PIXI.WebGLRenderer;
+
+ private stage: PIXI.Container;
+
+ private container: PIXI.Container;
+
+ private renderTexture: PIXI.RenderTexture;
+
+ private sprite: PIXI.Sprite;
+
+ constructor() {
+
+ this.renderer = PIXI.autoDetectRenderer(800, 600, { backgroundColor: 0x1099bb });
+ document.body.appendChild(this.renderer.view);
+
+ // create the root of the scene graph
+ this.stage = new PIXI.Container();
+
+ this.container = new PIXI.Container();
+
+ this.stage.addChild(this.container);
+
+ for (var j = 0; j < 5; j++) {
+
+ for (var i = 0; i < 5; i++) {
+
+ var bunny: PIXI.Sprite = PIXI.Sprite.fromImage('../../_assets/basics/bunny.png');
+ bunny.x = 40 * i;
+ bunny.y = 40 * j;
+ bunny.rotation = Math.random() * (Math.PI * 2);
+ this.container.addChild(bunny);
+
+ };
+
+ };
+
+ this.renderTexture = new PIXI.RenderTexture(this.renderer, 300, 200, PIXI.SCALE_MODES.LINEAR, 0.1);
+
+ this.sprite = new PIXI.Sprite(this.renderTexture);
+ this.sprite.x = 450;
+ this.sprite.y = 60;
+ this.stage.addChild(this.sprite);
+
+ this.container.x = 100;
+ this.container.y = 60;
+
+ // start animating
+ this.animate();
+
+ }
+
+ private animate = (): void => {
+
+ this.renderTexture.render(this.container);
+
+ requestAnimationFrame(this.animate);
+
+ this.renderer.render(this.stage);
+
+ }
+
+ }
+
+}
+
+module basics {
+
+ export class SpriteSheet {
+
+ private renderer: PIXI.CanvasRenderer | PIXI.WebGLRenderer;
+
+ private stage: PIXI.Container;
+
+ private movie: PIXI.extras.MovieClip;
+
+ constructor() {
+
+ this.renderer = PIXI.autoDetectRenderer(800, 600, { backgroundColor: 0x1099bb });
+ document.body.appendChild(this.renderer.view);
+
+ // create the root of the scene graph
+ this.stage = new PIXI.Container();
+
+ PIXI.loader.add('../../_assets/basics/fighter.json').load((loader: PIXI.loaders.Loader, object: any): void => {
+
+ // create an array of textures from an image path
+ var frames: PIXI.Texture[] = [];
+
+ for (var i = 0; i < 30; i++) {
+
+ var val = i < 10 ? '0' + i : i;
+
+ // magically works since the spritesheet was loaded with the pixi loader
+ frames.push(PIXI.Texture.fromFrame('rollSequence00' + val + '.png'));
+ }
+
+
+ // create a MovieClip (brings back memories from the days of Flash, right ?)
+ this.movie = new PIXI.extras.MovieClip(frames);
+
+ /*
+ * A MovieClip inherits all the properties of a PIXI sprite
+ * so you can change its position, its anchor, mask it, etc
+ */
+ this.movie.position.set(300);
+ this.movie.anchor.set(0.5);
+ this.movie.animationSpeed = 0.5;
+ this.movie.play();
+
+ this.stage.addChild(this.movie);
+
+ this.animate();
+
+ });
+
+ }
+
+ private animate = (): void => {
+
+ this.movie.rotation += 0.01;
+
+ //render the stage container
+ this.renderer.render(this.stage);
+
+ requestAnimationFrame(this.animate);
+
+ }
+
+ }
+
+}
+
+module basics {
+
+ export class Text {
+
+ private renderer: PIXI.CanvasRenderer | PIXI.WebGLRenderer;
+
+ private stage: PIXI.Container;
+
+ private basicText: PIXI.Text;
+
+ private richText: PIXI.Text;
+
+ constructor() {
+
+ this.renderer = PIXI.autoDetectRenderer(800, 600, { backgroundColor: 0x1099bb });
+ document.body.appendChild(this.renderer.view);
+
+ // create the root of the scene graph
+ this.stage = new PIXI.Container();
+
+ this.basicText = new PIXI.Text('Basic Text in Pixi');
+ this.basicText.x = 30;
+ this.basicText.y = 90;
+
+ this.stage.addChild(this.basicText);
+
+ var style: PIXI.TextStyle = {
+ font: '36px Arial bold italic',
+ fill: '#F7EDCA',
+ stroke: '#4a1850',
+ strokeThickness: 5,
+ dropShadow: true,
+ dropShadowColor: '#000000',
+ dropShadowAngle: Math.PI / 6,
+ dropShadowDistance: 6,
+ wordWrap: true,
+ wordWrapWidth: 440
+ };
+
+ this.richText = new PIXI.Text('Rich Text with a lot of options and across multiple lines', style);
+ this.richText.x = 30;
+ this.richText.y = 180;
+
+ this.stage.addChild(this.richText);
+
+ // start animating
+ this.animate();
+
+ }
+
+ private animate = (): void => {
+
+ requestAnimationFrame(this.animate);
+
+ this.renderer.render(this.stage);
+
+ }
+
+ }
+
+}
+
+module basics {
+
+ export class TexturedMesh {
+
+ private renderer: PIXI.CanvasRenderer | PIXI.WebGLRenderer;
+
+ private stage: PIXI.Container;
+
+ private strip: PIXI.mesh.Rope;
+
+ private graphics: PIXI.Graphics;
+
+ private count: number;
+
+ private points: PIXI.Point[];
+
+ private ropeLength: number;
+
+ constructor() {
+
+ this.renderer = PIXI.autoDetectRenderer(800, 600, { backgroundColor: 0x1099bb });
+ document.body.appendChild(this.renderer.view);
+
+ // create the root of the scene graph
+ this.stage = new PIXI.Container();
+
+ this.count = 0;
+
+ this.ropeLength = 918 / 20;
+ this.ropeLength = 45;
+
+ this.points = [];
+
+ for (var i = 0; i < 25; i++) {
+ this.points.push(new PIXI.Point(i * this.ropeLength, 0));
+ };
+
+ this.strip = new PIXI.mesh.Rope(PIXI.Texture.fromImage('../../_assets/snake.png'), this.points);
+ this.strip.position.x = -40;
+ this.strip.position.y = 300;
+ this.stage.addChild(this.strip);
+
+ this.graphics = new PIXI.Graphics();
+ this.graphics.x = this.strip.x;
+ this.graphics.y = this.strip.y;
+ this.stage.addChild(this.graphics);
+
+ //start animating
+ this.animate();
+
+ }
+
+ private animate = (): void => {
+
+ this.count += 0.1;
+
+ //make the snake
+ for (var i = 0; i < this.points.length; i++) {
+
+ this.points[i].y = Math.sin((i * 0.5) + this.count) * 30;
+
+ this.points[i].x = i * this.ropeLength + Math.cos((i * 0.3) + this.count) * 20;
+
+ };
+
+ //render the stage
+ this.renderer.render(this.stage);
+
+ this.renderPoints();
+
+ requestAnimationFrame(this.animate);
+
+ }
+
+ private renderPoints(): void {
+
+ this.graphics.clear();
+
+ this.graphics.lineStyle(2, 0xffc2c2);
+ this.graphics.moveTo(this.points[0].x, this.points[0].y);
+
+ for (var i = 1; i < this.points.length; i++) {
+ this.graphics.lineTo(this.points[i].x, this.points[i].y);
+ };
+
+ for (var i = 1; i < this.points.length; i++) {
+ this.graphics.beginFill(0xff0022);
+ this.graphics.drawCircle(this.points[i].x, this.points[i].y, 10);
+ this.graphics.endFill();
+ };
+
+ }
+
+ }
+
+}
+
+module basics {
+
+ export class TilingSprite {
+
+ private renderer: PIXI.CanvasRenderer | PIXI.WebGLRenderer;
+
+ private stage: PIXI.Container;
+
+ private texture: PIXI.Texture;
+
+ private tilingSprite: PIXI.extras.TilingSprite;
+
+ private count: number;
+
+ constructor() {
+
+ this.renderer = PIXI.autoDetectRenderer(800, 600, { backgroundColor: 0x1099bb });
+ document.body.appendChild(this.renderer.view);
+
+ // create the root of the scene graph
+ this.stage = new PIXI.Container();
+
+ //create a texture from an image path
+ this.texture = PIXI.Texture.fromImage('../../_assets/p2.jpeg');
+
+ /* create a tiling sprite ...
+ * requires a texture, a width and a height
+ * in WebGL the image size should preferably be a power of two
+ */
+ this.tilingSprite = new PIXI.extras.TilingSprite(this.texture, this.renderer.width, this.renderer.height);
+ this.stage.addChild(this.tilingSprite);
+
+ this.count = 0;
+
+ this.animate();
+
+ }
+
+ private animate = (): void => {
+
+ this.count += 0.005;
+
+ this.tilingSprite.tileScale.x = 2 + Math.sin(this.count);
+ this.tilingSprite.tileScale.y = 2 + Math.cos(this.count);
+
+ this.tilingSprite.tilePosition.x += 1;
+ this.tilingSprite.tilePosition.y += 1;
+
+ // render the root container
+ this.renderer.render(this.stage);
+
+ requestAnimationFrame(this.animate);
+
+ }
+
+ }
+
+}
+
+module basics {
+
+ export class Video {
+
+ private renderer: PIXI.CanvasRenderer | PIXI.WebGLRenderer;
+
+ private stage: PIXI.Container;
+
+ private texture: PIXI.Texture;
+
+ private videoSprite: PIXI.Sprite;
+
+ constructor() {
+
+ this.renderer = PIXI.autoDetectRenderer(800, 600, { backgroundColor: 0x1099bb });
+ document.body.appendChild(this.renderer.view);
+
+ // create the root of the scene graph
+ this.stage = new PIXI.Container();
+
+ //create a video texture from a path
+ this.texture = PIXI.Texture.fromVideo('../../_assets/testVideo.mp4');
+
+ //create a new sprite using the video texture (yes it's that easy)
+ this.videoSprite = new PIXI.Sprite(this.texture);
+ this.videoSprite.width = this.renderer.width;
+ this.videoSprite.height = this.renderer.height;
+ this.stage.addChild(this.videoSprite);
+
+ this.stage.addChild(this.videoSprite);
+
+ this.animate();
+
+ }
+
+ private animate = (): void => {
+
+ //render the stage
+ this.renderer.render(this.stage);
+
+ requestAnimationFrame(this.animate);
+
+ }
+
+ }
+
+}
+
+module demos {
+
+ export class AlphaMask {
+
+ private renderer: PIXI.CanvasRenderer | PIXI.WebGLRenderer;
+
+ private stage: PIXI.Container;
+
+ private background: PIXI.Container;
+
+ private cells: PIXI.Sprite;
+
+ private mask: PIXI.Sprite;
+
+ private target: PIXI.Point;
+
+ constructor() {
+
+ this.renderer = PIXI.autoDetectRenderer(800, 600, { backgroundColor: 0x1099bb });
+ document.body.appendChild(this.renderer.view);
+
+ // create the root of the scene graph
+ this.stage = new PIXI.Container();
+ this.stage.interactive = true;
+
+ this.background = PIXI.Sprite.fromImage('../../_assets/bkg.jpg');
+ this.stage.addChild(this.background);
+
+ this.cells = PIXI.Sprite.fromImage('../../_assets/cells.png');
+ this.cells.scale.set(1.5, 1.5);
+
+ this.mask = PIXI.Sprite.fromImage('../../_assets/flowerTop.png');
+ this.mask.anchor.set(0.5);
+ this.mask.position.x = 310;
+ this.mask.position.y = 190;
+
+ this.cells.mask = this.mask;
+
+ this.stage.addChild(this.mask);
+
+ this.stage.addChild(this.cells);
+
+ this.target = new PIXI.Point();
+
+ this.reset();
+
+ this.animate();
+
+ }
+
+ private reset(): void {
+
+ this.target.x = Math.floor(Math.random() * 550);
+ this.target.y = Math.floor(Math.random() * 300);
+
+ }
+
+ private animate = (): void => {
+
+ this.mask.position.x += (this.target.x - this.mask.x) * 0.1;
+ this.mask.position.y += (this.target.y - this.mask.y) * 0.1;
+
+ if (Math.abs(this.mask.x - this.target.x) < 1) {
+ this.reset();
+ }
+
+ this.renderer.render(this.stage);
+
+ requestAnimationFrame(this.animate);
+
+ }
+
+ }
+
+}
+
+module demos {
+
+ export class Batch {
+
+ private renderer: PIXI.CanvasRenderer | PIXI.WebGLRenderer;
+
+ private stage: PIXI.Container;
+
+ private sprites: PIXI.ParticleContainer;
+
+ private maggots: BatchDude[];
+
+ private tick: number;
+
+ private dudeBounds: PIXI.Rectangle;
+
+ constructor() {
+
+ this.renderer = PIXI.autoDetectRenderer(800, 600, { backgroundColor: 0x1099bb });
+ document.body.appendChild(this.renderer.view);
+
+ // create the root of the scene graph
+ this.stage = new PIXI.Container();
+
+ this.sprites = new PIXI.ParticleContainer(10000, {
+
+ scale: true,
+ position: true,
+ rotation: true,
+ uvs: true,
+ alpha: true
+
+ });
+ this.stage.addChild(this.sprites);
+
+ // create an array to store all the sprites
+ this.maggots = [];
+
+ var totalSprites = this.renderer instanceof PIXI.WebGLRenderer ? 10000 : 100;
+
+ for (var i = 0; i < totalSprites; i++) {
+
+ // create a new Sprite
+ var dude = new BatchDude(PIXI.Texture.fromImage('../../_assets/tinyMaggot.png'));
+
+ dude.tint = Math.random() * 0xE8D4CD;
+
+ // set the anchor point so the texture is centerd on the sprite
+ dude.anchor.set(0.5);
+
+ // different maggots, different sizes
+ dude.scale.set(0.8 + Math.random() * 0.3);
+
+ // scatter them all
+ dude.x = Math.random() * this.renderer.width;
+ dude.y = Math.random() * this.renderer.height;
+
+ dude.tint = Math.random() * 0x808080;
+
+ // create a random direction in radians
+ dude.direction = Math.random() * Math.PI * 2;
+
+ // this number will be used to modify the direction of the sprite over time
+ dude.turningSpeed = Math.random() - 0.8;
+
+ // create a random speed between 0 - 2, and these maggots are slooww
+ dude.speed = (2 + Math.random() * 2) * 0.2;
+
+ dude.offset = Math.random() * 100;
+
+ // finally we push the dude into the maggots array so it it can be easily accessed later
+ this.maggots.push(dude);
+
+ this.sprites.addChild(dude);
+
+ }
+
+ // create a bounding box box for the little maggots
+ var dudeBoundsPadding = 100;
+ this.dudeBounds = new PIXI.Rectangle(-dudeBoundsPadding,
+ -dudeBoundsPadding,
+ this.renderer.width + dudeBoundsPadding * 2,
+ this.renderer.height + dudeBoundsPadding * 2);
+
+ this.tick = 0;
+
+ // start animating
+ this.animate();
+
+ }
+
+ private animate = (): void => {
+
+ // iterate through the sprites and update their position
+ for (var i = 0; i < this.maggots.length; i++) {
+
+ var dude = this.maggots[i];
+ dude.scale.y = 0.95 + Math.sin(this.tick + dude.offset) * 0.05;
+ dude.direction += dude.turningSpeed * 0.01;
+ dude.position.x += Math.sin(dude.direction) * (dude.speed * dude.scale.y);
+ dude.position.y += Math.cos(dude.direction) * (dude.speed * dude.scale.y);
+ dude.rotation = -dude.direction + Math.PI;
+
+ // wrap the maggots
+ if (dude.position.x < this.dudeBounds.x) {
+ dude.position.x += this.dudeBounds.width;
+ }
+ else if (dude.position.x > this.dudeBounds.x + this.dudeBounds.width) {
+ dude.position.x -= this.dudeBounds.width;
+ }
+
+ if (dude.position.y < this.dudeBounds.y) {
+ dude.position.y += this.dudeBounds.height;
+ }
+ else if (dude.position.y > this.dudeBounds.y + this.dudeBounds.height) {
+ dude.position.y -= this.dudeBounds.height;
+ }
+ }
+
+ // increment the ticker
+ this.tick += 0.1;
+
+ // time to render the stage !
+ this.renderer.render(this.stage);
+
+ // request another animation frame...
+ requestAnimationFrame(this.animate);
+
+ }
+
+ }
+
+ export class BatchDude extends PIXI.Sprite {
+
+ direction: number;
+ speed: number;
+ turningSpeed: number;
+ offset: number;
+
+ constructor(texture: PIXI.Texture) {
+
+ super(texture);
+
+ }
+
+ }
+
+}
+
+module demos {
+
+ export class BlendModes {
+
+ private renderer: PIXI.CanvasRenderer | PIXI.WebGLRenderer;
+
+ private stage: PIXI.Container;
+
+ private background: PIXI.Sprite;
+
+ private dudeArray: BlendModesDude[];
+
+ private totalDudes: number;
+
+ private dudeBounds: PIXI.Rectangle;
+
+ private tick: number;
+
+ constructor() {
+
+ this.renderer = PIXI.autoDetectRenderer(800, 600, { backgroundColor: 0x1099bb });
+ document.body.appendChild(this.renderer.view);
+
+ // create the root of the scene graph
+ this.stage = new PIXI.Container();
+
+ // create a new background sprite
+ this.background = PIXI.Sprite.fromImage('../../_assets/BGrotate.jpg');
+ this.stage.addChild(this.background);
+
+ // create an array to store a reference to the dudes
+ this.dudeArray = [];
+
+ this.totalDudes = 20;
+
+ for (var i = 0; i < this.totalDudes; i++) {
+
+ // create a new Sprite that uses the image name that we just generated as its source
+ var dude = new BlendModesDude(PIXI.Texture.fromImage('../../_assets/flowerTop.png'));
+
+ dude.anchor.set(0.5);
+
+ // set a random scale for the dude
+ dude.scale.set(0.8 + Math.random() * 0.3);
+
+ // finally let's set the dude to be at a random position...
+ dude.position.x = Math.floor(Math.random() * this.renderer.width);
+ dude.position.y = Math.floor(Math.random() * this.renderer.height);
+
+ // The important bit of this example, this is how you change the default blend mode of the sprite
+ dude.blendMode = PIXI.BLEND_MODES.ADD;
+
+ // create some extra properties that will control movement
+ dude.direction = Math.random() * Math.PI * 2;
+
+ // this number will be used to modify the direction of the dude over time
+ dude.turningSpeed = Math.random() - 0.8;
+
+ // create a random speed for the dude between 0 - 2
+ dude.speed = 2 + Math.random() * 2;
+
+ // finally we push the dude into the dudeArray so it it can be easily accessed later
+ this.dudeArray.push(dude);
+
+ this.stage.addChild(dude);
+
+ }
+
+ // create a bounding box box for the little maggots
+ var dudeBoundsPadding = 100;
+ this.dudeBounds = new PIXI.Rectangle(-dudeBoundsPadding,
+ -dudeBoundsPadding,
+ this.renderer.width + dudeBoundsPadding * 2,
+ this.renderer.height + dudeBoundsPadding * 2);
+
+ this.tick = 0;
+
+ // start animating
+ this.animate();
+
+ }
+
+ private animate = (): void => {
+
+ // iterate through the dudes and update the positions
+ for (var i = 0; i < this.dudeArray.length; i++) {
+
+ var dude = this.dudeArray[i];
+ dude.direction += dude.turningSpeed * 0.01;
+ dude.position.x += Math.sin(dude.direction) * dude.speed;
+ dude.position.y += Math.cos(dude.direction) * dude.speed;
+ dude.rotation = -dude.direction - Math.PI / 2;
+
+ // wrap the dudes by testing their bounds...
+ if (dude.position.x < this.dudeBounds.x) {
+ dude.position.x += this.dudeBounds.width;
+ }
+ else if (dude.position.x > this.dudeBounds.x + this.dudeBounds.width) {
+ dude.position.x -= this.dudeBounds.width;
+ }
+
+ if (dude.position.y < this.dudeBounds.y) {
+ dude.position.y += this.dudeBounds.height;
+ }
+ else if (dude.position.y > this.dudeBounds.y + this.dudeBounds.height) {
+ dude.position.y -= this.dudeBounds.height;
+ }
+ }
+
+ // increment the ticker
+ this.tick += 0.1;
+
+ // time to render the stage !
+ this.renderer.render(this.stage);
+
+ // request another animation frame...
+ requestAnimationFrame(this.animate);
+
+ }
+
+ }
+
+ export class BlendModesDude extends PIXI.Sprite {
+
+ direction: number;
+ speed: number;
+ turningSpeed: number;
+ offset: number;
+
+ constructor(texture: PIXI.Texture) {
+
+ super(texture);
+
+ }
+
+ }
+
+}
+
+module demos {
+
+ export class CacheAsBitmap {
+
+ private renderer: PIXI.CanvasRenderer | PIXI.WebGLRenderer;
+
+ private stage: PIXI.Container;
+
+ private aliens: PIXI.Sprite[];
+
+ private alienContainer: PIXI.Container;
+
+ private count: number;
+
+ constructor() {
+
+ this.renderer = PIXI.autoDetectRenderer(800, 600, { backgroundColor: 0x1099bb });
+ document.body.appendChild(this.renderer.view);
+
+ // create the root of the scene graph
+ this.stage = new PIXI.Container();
+
+ // load resources
+ PIXI.loader
+ .add('spritesheet', '../../_assets/monsters.json')
+ .load(this.onAssetsLoaded);
+
+ // holder to store aliens
+ this.aliens = [];
+
+ this.count = 0;
+
+ // create an empty container
+ this.alienContainer = new PIXI.Container();
+ this.alienContainer.position.x = 400;
+ this.alienContainer.position.y = 300;
+
+ // make the stage interactive
+ this.stage.interactive = true;
+
+ this.stage.addChild(this.alienContainer);
+
+ this.stage.on('click', this.onClick);
+ this.stage.on('tap', this.onClick);
+
+ }
+
+ private onClick = (event: PIXI.interaction.InteractionEvent): void => {
+
+ this.alienContainer.cacheAsBitmap = !this.alienContainer.cacheAsBitmap;
+
+ //feel free to play with what's below
+ //var sprite = new PIXI.Sprite(this.alienContainer.generateTexture());
+ //this.stage.addChild(sprite);
+ //sprite.position.x = Math.random() * 800;
+ //sprite.position.y = Math.random() * 600;
+
+ }
+
+ private onAssetsLoaded = (): void => {
+
+ // add a bunch of aliens with textures from image paths
+
+ var alienFrames = ['eggHead.png', 'flowerTop.png', 'helmlok.png', 'skully.png'];
+
+ for (var i = 0; i < 100; i++) {
+
+ var frameName = alienFrames[i % 4];
+
+ // create an alien using the frame name..
+ var alien = PIXI.Sprite.fromFrame(frameName);
+ alien.tint = Math.random() * 0xFFFFFF;
+
+ /*
+ * fun fact for the day :)
+ * another way of doing the above would be
+ * var texture = PIXI.Texture.fromFrame(frameName);
+ * var alien = new PIXI.Sprite(texture);
+ */
+ alien.position.x = Math.random() * 800 - 400;
+ alien.position.y = Math.random() * 600 - 300;
+ alien.anchor.x = 0.5;
+ alien.anchor.y = 0.5;
+ this.aliens.push(alien);
+ this.alienContainer.addChild(alien);
+
+ }
+
+ // start animating
+ this.animate();
+
+ }
+
+ private animate = (): void => {
+
+ // let's rotate the aliens a little bit
+ for (var i = 0; i < 100; i++) {
+ var alien = this.aliens[i];
+ alien.rotation += 0.1;
+ }
+
+ this.count += 0.01;
+
+ this.alienContainer.scale.x = Math.sin(this.count);
+ this.alienContainer.scale.y = Math.sin(this.count);
+
+ this.alienContainer.rotation += 0.01;
+
+ // render the stage
+ this.renderer.render(this.stage);
+
+ requestAnimationFrame(this.animate);
+
+ }
+
+ }
+
+}
+
+module demos {
+
+ export class DraggableBunny extends PIXI.Sprite {
+
+ //todo I dont know what event.data is at this time
+ private data: any;
+
+ private dragging: boolean;
+
+ constructor(texture?: PIXI.Texture) {
+
+ super(texture);
+
+ // enable the bunny to be interactive... this will allow it to respond to mouse and touch events
+ this.interactive = true;
+
+ // this button mode will mean the hand cursor appears when you roll over the bunny with your mouse
+ this.buttonMode = true;
+
+ // center the bunny's anchor point
+ this.anchor.set(0.5);
+
+ // make it a bit bigger, so it's easier to grab
+ this.scale.set(3);
+
+ // setup events
+ this
+ // events for drag start
+ .on('mousedown', this.onDragStart)
+ .on('touchstart', this.onDragStart)
+ // events for drag end
+ .on('mouseup', this.onDragEnd)
+ .on('mouseupoutside', this.onDragEnd)
+ .on('touchend', this.onDragEnd)
+ .on('touchendoutside', this.onDragEnd)
+ // events for drag move
+ .on('mousemove', this.onDragMove)
+ .on('touchmove', this.onDragMove);
+
+ }
+
+ private onDragStart = (event: PIXI.interaction.InteractionEvent): void => {
+
+ // store a reference to the data
+ // the reason for this is because of multitouch
+ // we want to track the movement of this particular touch
+ this.data = event.data;
+ this.alpha = 0.5;
+ this.dragging = true;
+
+ }
+
+ private onDragEnd = (event: PIXI.interaction.InteractionEvent): void => {
+
+ //set interactiondata to null
+ this.data = null;
+ this.alpha = 1;
+ this.dragging = false;
+
+ }
+
+ private onDragMove = (event: PIXI.interaction.InteractionEvent): void => {
+
+ if (this.dragging) {
+ var newPosition = this.data.getLocalPosition(this.parent);
+ this.position.x = newPosition.x;
+ this.position.y = newPosition.y;
+ }
+
+ }
+
+ }
+
+ export class Dragging {
+
+ private renderer: PIXI.CanvasRenderer | PIXI.WebGLRenderer;
+
+ private stage: PIXI.Container;
+
+ private texture: PIXI.Texture;
+
+ private data: PIXI.interaction.InteractionData;
+
+ constructor() {
+
+ this.renderer = PIXI.autoDetectRenderer(800, 600, { backgroundColor: 0x1099bb });
+ document.body.appendChild(this.renderer.view);
+
+ // create the root of the scene graph
+ this.stage = new PIXI.Container();
+
+ //create a texture from an image
+ this.texture = PIXI.Texture.fromImage('../../_assets/bunny.png');
+
+ for (var i = 0; i < 10; i++) {
+ this.createBunny(Math.floor(Math.random() * 800), Math.floor(Math.random() * 600));
+ }
+
+ // start animating
+ this.animate();
+
+ }
+
+ private createBunny(x: number, y: number): void {
+
+ // create our little bunny friend..
+ var bunny = new DraggableBunny(this.texture);
+
+ // move the sprite to its designated position
+ bunny.position.x = x;
+ bunny.position.y = y;
+
+ // add it to the stage
+ this.stage.addChild(bunny);
+
+ }
+
+ private animate = (): void => {
+
+ requestAnimationFrame(this.animate);
+
+ this.renderer.render(this.stage);
+
+ }
+
+ }
+
+}
+
+module demos {
+
+ export class GraphicsDemo {
+
+ private renderer: PIXI.CanvasRenderer | PIXI.WebGLRenderer;
+
+ private stage: PIXI.Container;
+
+ private thing: PIXI.Graphics;
+
+ private graphics: PIXI.Graphics;
+
+ private count: number;
+
+ constructor() {
+
+ this.renderer = PIXI.autoDetectRenderer(800, 600, { backgroundColor: 0x1099bb });
+ document.body.appendChild(this.renderer.view);
+
+ // create the root of the scene graph
+ this.stage = new PIXI.Container();
+ this.stage.interactive = true;
+
+ this.graphics = new PIXI.Graphics();
+
+ // set a fill and line style
+ this.graphics.beginFill(0xFF3300);
+ this.graphics.lineStyle(10, 0xffd900, 1);
+
+ // draw a shape
+ this.graphics.moveTo(50, 50);
+ this.graphics.lineTo(250, 50);
+ this.graphics.lineTo(100, 100);
+ this.graphics.lineTo(250, 220);
+ this.graphics.lineTo(50, 220);
+ this.graphics.lineTo(50, 50);
+ this.graphics.endFill();
+
+ // set a fill and line style again
+ this.graphics.lineStyle(10, 0xFF0000, 0.8);
+ this.graphics.beginFill(0xFF700B, 1);
+
+ // draw a second shape
+ this.graphics.moveTo(210, 300);
+ this.graphics.lineTo(450, 320);
+ this.graphics.lineTo(570, 350);
+ this.graphics.quadraticCurveTo(600, 0, 480, 100);
+ this.graphics.lineTo(330, 120);
+ this.graphics.lineTo(410, 200);
+ this.graphics.lineTo(210, 300);
+ this.graphics.endFill();
+
+ // draw a rectangle
+ this.graphics.lineStyle(2, 0x0000FF, 1);
+ this.graphics.drawRect(50, 250, 100, 100);
+
+ // draw a circle
+ this.graphics.lineStyle(0);
+ this.graphics.beginFill(0xFFFF0B, 0.5);
+ this.graphics.drawCircle(470, 200, 100);
+ this.graphics.endFill();
+
+ this.graphics.lineStyle(20, 0x33FF00);
+ this.graphics.moveTo(30, 30);
+ this.graphics.lineTo(600, 300);
+
+ this.stage.addChild(this.graphics);
+
+ // let's create a moving shape
+ this.thing = new PIXI.Graphics();
+ this.stage.addChild(this.thing);
+ this.thing.position.x = 620 / 2;
+ this.thing.position.y = 380 / 2;
+
+ this.count = 0;
+
+ // Just click on the stage to draw random lines
+ this.stage.on('click', this.onClick);
+ this.stage.on('tap', this.onClick);
+
+ // start animating
+ this.animate();
+
+ }
+
+ private onClick = (event: PIXI.interaction.InteractionEvent): void => {
+
+ this.graphics.lineStyle(Math.random() * 30, Math.random() * 0xFFFFFF, 1);
+ this.graphics.moveTo(Math.random() * 620, Math.random() * 380);
+ this.graphics.bezierCurveTo(Math.random() * 620, Math.random() * 380,
+ Math.random() * 620, Math.random() * 380,
+ Math.random() * 620, Math.random() * 380);
+ }
+
+ private animate = (): void => {
+
+ this.thing.clear();
+
+ this.count += 0.1;
+
+ this.thing.clear();
+ this.thing.lineStyle(10, 0xff0000, 1);
+ this.thing.beginFill(0xffFF00, 0.5);
+
+ this.thing.moveTo(-120 + Math.sin(this.count) * 20, -100 + Math.cos(this.count) * 20);
+ this.thing.lineTo(120 + Math.cos(this.count) * 20, -100 + Math.sin(this.count) * 20);
+ this.thing.lineTo(120 + Math.sin(this.count) * 20, 100 + Math.cos(this.count) * 20);
+ this.thing.lineTo(-120 + Math.cos(this.count) * 20, 100 + Math.sin(this.count) * 20);
+ this.thing.lineTo(-120 + Math.sin(this.count) * 20, -100 + Math.cos(this.count) * 20);
+
+ this.thing.rotation = this.count * 0.1;
+
+ this.renderer.render(this.stage);
+
+ requestAnimationFrame(this.animate);
+ }
+
+ }
+
+}
+
+module demos {
+
+ export class Interactivity {
+
+ private renderer: PIXI.CanvasRenderer | PIXI.WebGLRenderer;
+
+ private stage: PIXI.Container;
+
+ private background: PIXI.Sprite;
+
+ private buttons: InteractivityButton[];
+
+ constructor() {
+
+ this.renderer = PIXI.autoDetectRenderer(800, 600, { backgroundColor: 0x1099bb });
+ document.body.appendChild(this.renderer.view);
+
+ // create the root of the scene graph
+ this.stage = new PIXI.Container();
+
+ // create a background...
+ this.background = PIXI.Sprite.fromImage('../../_assets/button_test_BG.jpg');
+ this.background.width = this.renderer.width;
+ this.background.height = this.renderer.height;
+
+ // add background to stage...
+ this.stage.addChild(this.background);
+
+ this.buttons = [];
+
+ var buttonPositions = [
+ 175, 75,
+ 655, 75,
+ 410, 325,
+ 150, 465,
+ 685, 445
+ ];
+
+ function noop(): void {
+ console.log('click');
+ }
+
+ // create some textures from an image path
+ var textureButton = PIXI.Texture.fromImage('../../_assets/button.png');
+ var textureButtonDown = PIXI.Texture.fromImage('../../_assets/buttonDown.png');
+ var textureButtonOver = PIXI.Texture.fromImage('../../_assets/buttonOver.png');
+
+ for (var i = 0; i < 5; i++) {
+
+ var button = new InteractivityButton(textureButton, textureButtonDown, textureButtonOver);
+
+ button.position.x = buttonPositions[i * 2];
+ button.position.y = buttonPositions[i * 2 + 1];
+
+ button.tap = noop;
+ button.click = noop;
+
+ // add it to the stage
+ this.stage.addChild(button);
+
+ // add button to array
+ this.buttons.push(button);
+
+ }
+
+ // set some silly values...
+ this.buttons[0].scale.set(1.2);
+
+ this.buttons[2].rotation = Math.PI / 10;
+
+ this.buttons[3].scale.set(0.8);
+
+ this.buttons[4].scale.set(0.8, 1.2);
+ this.buttons[4].rotation = Math.PI;
+
+ // start animating
+ this.animate();
+
+ }
+
+ private animate = (): void => {
+
+ requestAnimationFrame(this.animate);
+
+ this.renderer.render(this.stage);
+
+ }
+
+ }
+
+ export class InteractivityButton extends PIXI.Sprite {
+
+ private textureButton: PIXI.Texture;
+ private textureButtonDown: PIXI.Texture;
+ private textureButtonOver: PIXI.Texture;
+
+ tap: Function;
+ click: Function;
+
+ isdown: boolean;
+ isOver: boolean;
+
+ constructor(textureButton: PIXI.Texture, textureButtonDown: PIXI.Texture, textureButtonOver: PIXI.Texture) {
+
+ super(textureButton);
+
+ // create some textures from an image path
+ this.textureButton = textureButton;
+ this.textureButtonDown = textureButtonDown;
+ this.textureButtonOver = textureButtonOver;
+
+ this.buttonMode = true;
+ this.anchor.set(0.5);
+
+ // make the button interactive...
+ this.interactive = true;
+
+ this
+ // set the mousedown and touchstart callback...
+ .on('mousedown', this.onButtonDown)
+ .on('touchstart', this.onButtonDown)
+
+ // set the mouseup and touchend callback...
+ .on('mouseup', this.onButtonUp)
+ .on('touchend', this.onButtonUp)
+ .on('mouseupoutside', this.onButtonUp)
+ .on('touchendoutside', this.onButtonUp)
+
+ // set the mouseover callback...
+ .on('mouseover', this.onButtonOver)
+
+ // set the mouseout callback...
+ .on('mouseout', this.onButtonOut)
+
+ // you can also listen to click and tap events :
+ //.on('click', this.noop)
+
+ }
+
+ private onButtonDown = (event: PIXI.interaction.InteractionEvent): void => {
+
+ this.isdown = true;
+ this.texture = this.textureButtonDown;
+ this.alpha = 1;
+
+ }
+
+ private onButtonUp = (event: PIXI.interaction.InteractionEvent): void => {
+
+ this.isdown = false;
+
+ if (this.isOver) {
+ this.texture = this.textureButtonOver;
+ }
+ else {
+ this.texture = this.textureButton;
+ }
+ }
+
+ private onButtonOver = (event: PIXI.interaction.InteractionEvent): void => {
+
+ this.isOver = true;
+
+ if (this.isdown) {
+ return;
+ }
+
+ this.texture = this.textureButtonOver;
+
+ }
+
+ private onButtonOut = (event: PIXI.interaction.InteractionEvent): void => {
+
+ this.isOver = false;
+
+ if (this.isdown) {
+ return;
+ }
+
+ this.texture = this.textureButton;
+ }
+
+ }
+
+}
+
+module demos {
+
+ export class Masking {
+
+ private renderer: PIXI.CanvasRenderer | PIXI.WebGLRenderer;
+
+ private stage: PIXI.Container;
+
+ private bg: PIXI.Sprite;
+
+ private container: PIXI.Container;
+
+ private bgFront: PIXI.Sprite;
+
+ private light1: PIXI.Sprite;
+
+ private light2: PIXI.Sprite;
+
+ private panda: PIXI.Sprite;
+
+ private thing: PIXI.Graphics;
+
+ private count: number;
+
+ private help: PIXI.Text;
+
+ constructor() {
+
+ this.renderer = PIXI.autoDetectRenderer(800, 600, { backgroundColor: 0x1099bb, antialias: true });
+ document.body.appendChild(this.renderer.view);
+
+ // create the root of the scene graph
+ this.stage = new PIXI.Container();
+ this.stage.interactive = true;
+
+ this.bg = PIXI.Sprite.fromImage('../../_assets/BGrotate.jpg');
+ this.bg.anchor.x = 0.5;
+ this.bg.anchor.y = 0.5;
+
+ this.bg.position.x = this.renderer.width / 2;
+ this.bg.position.y = this.renderer.height / 2;
+
+ this.stage.addChild(this.bg);
+
+ this.container = new PIXI.Container();
+ this.container.position.x = this.renderer.width / 2;
+ this.container.position.y = this.renderer.height / 2;
+
+ // add a bunch of sprites
+
+ this.bgFront = PIXI.Sprite.fromImage('../../_assets/SceneRotate.jpg');
+ this.bgFront.anchor.x = 0.5;
+ this.bgFront.anchor.y = 0.5;
+
+ this.container.addChild(this.bgFront);
+
+ this.light2 = PIXI.Sprite.fromImage('../../_assets/LightRotate2.png');
+ this.light2.anchor.x = 0.5;
+ this.light2.anchor.y = 0.5;
+ this.container.addChild(this.light2);
+
+ this.light1 = PIXI.Sprite.fromImage('../../_assets/LightRotate1.png');
+ this.light1.anchor.x = 0.5;
+ this.light1.anchor.y = 0.5;
+ this.container.addChild(this.light1);
+
+ this.panda = PIXI.Sprite.fromImage('../../_assets/panda.png');
+ this.panda.anchor.x = 0.5;
+ this.panda.anchor.y = 0.5;
+
+ this.container.addChild(this.panda);
+
+ this.stage.addChild(this.container);
+
+ // let's create a moving shape
+ this.thing = new PIXI.Graphics();
+ this.stage.addChild(this.thing);
+ this.thing.position.x = this.renderer.width / 2;
+ this.thing.position.y = this.renderer.height / 2;
+ this.thing.lineStyle(0);
+
+ this.container.mask = this.thing;
+
+ this.count = 0;
+
+ this.stage.on('click', this.onClick);
+ this.stage.on('tap', this.onClick);
+
+ this.help = new PIXI.Text('Click to turn masking on / off.', { font: 'bold 12pt Arial', fill: 'white' });
+ this.help.position.y = this.renderer.height - 26;
+ this.help.position.x = 10;
+ this.stage.addChild(this.help);
+
+ // start animating
+ this.animate();
+
+ }
+
+ private animate = (): void => {
+
+ this.bg.rotation += 0.01;
+ this.bgFront.rotation -= 0.01;
+
+ this.light1.rotation += 0.02;
+ this.light2.rotation += 0.01;
+
+ this.panda.scale.x = 1 + Math.sin(this.count) * 0.04;
+ this.panda.scale.y = 1 + Math.cos(this.count) * 0.04;
+
+ this.count += 0.1;
+
+ this.thing.clear();
+
+ this.thing.beginFill(0x8bc5ff, 0.4);
+ this.thing.moveTo(-120 + Math.sin(this.count) * 20, -100 + Math.cos(this.count) * 20);
+ this.thing.lineTo(-320 + Math.cos(this.count) * 20, 100 + Math.sin(this.count) * 20);
+ this.thing.lineTo(120 + Math.cos(this.count) * 20, -100 + Math.sin(this.count) * 20);
+ this.thing.lineTo(120 + Math.sin(this.count) * 20, 100 + Math.cos(this.count) * 20);
+ this.thing.lineTo(-120 + Math.cos(this.count) * 20, 100 + Math.sin(this.count) * 20);
+ this.thing.lineTo(-120 + Math.sin(this.count) * 20, -300 + Math.cos(this.count) * 20);
+ this.thing.lineTo(-320 + Math.sin(this.count) * 20, -100 + Math.cos(this.count) * 20);
+ this.thing.rotation = this.count * 0.1;
+
+ requestAnimationFrame(this.animate);
+
+ this.renderer.render(this.stage);
+
+ }
+
+ private onClick = (event: PIXI.interaction.InteractionEvent): void => {
+
+ if (!this.container.mask) {
+ this.container.mask = this.thing;
+ }
+ else {
+ this.container.mask = null;
+ }
+ }
+
+ }
+
+}
+
+module demos {
+
+ export class MovieClipDemo {
+
+ private renderer: PIXI.CanvasRenderer | PIXI.WebGLRenderer;
+
+ private stage: PIXI.Container;
+
+ constructor() {
+
+ this.renderer = PIXI.autoDetectRenderer(800, 600, { backgroundColor: 0x1099bb });
+ document.body.appendChild(this.renderer.view);
+
+ // create the root of the scene graph
+ this.stage = new PIXI.Container();
+
+ PIXI.loader
+ .add('spritesheet', '../../_assets/mc.json')
+ .load(this.onAssetsLoaded);
+
+ // start animating
+ this.animate();
+
+ }
+
+ private onAssetsLoaded = (loader: PIXI.loaders.Loader): void => {
+
+ // create an array to store the textures
+ var explosionTextures: PIXI.Texture[] = [];
+ var i: number;
+
+ for (i = 0; i < 26; i++) {
+
+ var texture = PIXI.Texture.fromFrame('Explosion_Sequence_A ' + (i + 1) + '.png');
+ explosionTextures.push(texture);
+
+ }
+
+ for (i = 0; i < 50; i++) {
+
+ // create an explosion MovieClip
+ var explosion = new PIXI.extras.MovieClip(explosionTextures);
+
+ explosion.position.x = Math.random() * 800;
+ explosion.position.y = Math.random() * 600;
+ explosion.anchor.x = 0.5;
+ explosion.anchor.y = 0.5;
+
+ explosion.rotation = Math.random() * Math.PI;
+
+ explosion.scale.set(0.75 + Math.random() * 0.5);
+
+ explosion.gotoAndPlay(Math.random() * 27);
+
+ this.stage.addChild(explosion);
+
+ }
+
+ // start animating
+ this.animate();
+ }
+
+ private animate = (): void => {
+
+ requestAnimationFrame(this.animate);
+
+ this.renderer.render(this.stage);
+
+ }
+
+ }
+
+}
+
+module demos {
+
+ export class RenderTextureDemo {
+
+ private renderer: PIXI.CanvasRenderer | PIXI.WebGLRenderer;
+
+ private stage: PIXI.Container;
+
+ private renderTexture: PIXI.RenderTexture;
+ private renderTexture2: PIXI.RenderTexture;
+ private currentTexture: PIXI.RenderTexture;
+
+ private outputSprite: PIXI.Sprite;
+ private stuffContainer: PIXI.Container;
+ private items: PIXI.Sprite[];
+
+ private count: number;
+
+ constructor() {
+
+ this.renderer = PIXI.autoDetectRenderer(800, 600, { backgroundColor: 0x1099bb });
+ document.body.appendChild(this.renderer.view);
+
+ // create the root of the scene graph
+ this.stage = new PIXI.Container();
+
+ // create two render textures... these dynamic textures will be used to draw the scene into itself
+ this.renderTexture = new PIXI.RenderTexture(this.renderer, this.renderer.width, this.renderer.height);
+ this.renderTexture2 = new PIXI.RenderTexture(this.renderer, this.renderer.width, this.renderer.height);
+ this.currentTexture = this.renderTexture;
+
+ // create a new sprite that uses the render texture we created above
+ this.outputSprite = new PIXI.Sprite(this.currentTexture);
+
+ // align the sprite
+ this.outputSprite.position.x = 400;
+ this.outputSprite.position.y = 300;
+ this.outputSprite.anchor.set(0.5);
+
+ // add to stage
+ this.stage.addChild(this.outputSprite);
+
+ this.stuffContainer = new PIXI.Container();
+
+ this.stuffContainer.position.x = 400;
+ this.stuffContainer.position.y = 300;
+
+ this.stage.addChild(this.stuffContainer);
+
+ // create an array of image ids..
+ var fruits = [
+ '../../_assets/spinObj_01.png',
+ '../../_assets/spinObj_02.png',
+ '../../_assets/spinObj_03.png',
+ '../../_assets/spinObj_04.png',
+ '../../_assets/spinObj_05.png',
+ '../../_assets/spinObj_06.png',
+ '../../_assets/spinObj_07.png',
+ '../../_assets/spinObj_08.png'
+ ];
+
+ // create an array of items
+ this.items = [];
+
+ // now create some items and randomly position them in the stuff container
+ for (var i = 0; i < 20; i++) {
+
+ var item = PIXI.Sprite.fromImage(fruits[i % fruits.length]);
+ item.position.x = Math.random() * 400 - 200;
+ item.position.y = Math.random() * 400 - 200;
+
+ item.anchor.set(0.5);
+
+ this.stuffContainer.addChild(item);
+
+ this.items.push(item);
+
+ }
+
+ // used for spinning!
+ this.count = 0;
+
+ // start animating
+ this.animate();
+
+ }
+
+ private animate = (): void => {
+
+ for (var i = 0; i < this.items.length; i++) {
+ // rotate each item
+ var item = this.items[i];
+ item.rotation += 0.1;
+ }
+
+ this.count += 0.01;
+
+ // swap the buffers ...
+ var temp = this.renderTexture;
+ this.renderTexture = this.renderTexture2;
+ this.renderTexture2 = temp;
+
+ // set the new texture
+ this.outputSprite.texture = this.renderTexture;
+
+ // twist this up!
+ this.stuffContainer.rotation -= 0.01;
+ this.outputSprite.scale.set(1 + Math.sin(this.count) * 0.2);
+
+ // render the stage to the texture
+ // the 'true' clears the texture before the content is rendered
+ this.renderTexture2.render(this.stage, null, false);
+
+ // and finally render the stage
+ this.renderer.render(this.stage);
+
+ requestAnimationFrame(this.animate);
+
+ }
+
+ }
+
+}
+
+module demos {
+
+ export class StripDemo {
+
+ private renderer: PIXI.CanvasRenderer | PIXI.WebGLRenderer;
+
+ private stage: PIXI.Container;
+
+ private count: number;
+
+ private points: PIXI.Point[];
+
+ private strip: PIXI.mesh.Rope;
+
+ private snakeContainer: PIXI.Container;
+
+ private ropeLength: number;
+
+ constructor() {
+
+ this.renderer = PIXI.autoDetectRenderer(800, 600, { backgroundColor: 0x1099bb });
+ document.body.appendChild(this.renderer.view);
+
+ // create the root of the scene graph
+ this.stage = new PIXI.Container();
+
+ this.count = 0;
+
+ // build a rope!
+ this.ropeLength = 918 / 20;
+
+ this.points = [];
+
+ for (var i = 0; i < 20; i++) {
+ this.points.push(new PIXI.Point(i * this.ropeLength, 0));
+ }
+
+ this.strip = new PIXI.mesh.Rope(PIXI.Texture.fromImage('../../_assets/snake.png'), this.points);
+ this.strip.x = -459;
+
+ this.snakeContainer = new PIXI.Container();
+ this.snakeContainer.position.x = 400;
+ this.snakeContainer.position.y = 300;
+
+ this.snakeContainer.scale.set(800 / 1100);
+ this.stage.addChild(this.snakeContainer);
+
+ this.snakeContainer.addChild(this.strip);
+
+ // start animating
+ this.animate();
+
+ }
+
+ private animate = (): void => {
+
+ this.count += 0.1;
+
+ // make the snake
+ for (var i = 0; i < this.points.length; i++) {
+
+ this.points[i].y = Math.sin((i * 0.5) + this.count) * 30;
+
+ this.points[i].x = i * this.ropeLength + Math.cos((i * 0.3) + this.count) * 20;
+
+ }
+
+ this.renderer.render(this.stage);
+
+ requestAnimationFrame(this.animate);
+
+ }
+
+ }
+
+}
+
+module demos {
+
+ export class TextDemo {
+
+ private renderer: PIXI.CanvasRenderer | PIXI.WebGLRenderer;
+
+ private stage: PIXI.Container;
+
+ private bitmapFontText: PIXI.extras.BitmapText;
+
+ private background: PIXI.Sprite;
+
+ private textSample: PIXI.Text;
+
+ private spinningText: PIXI.Text;
+
+ private countingText: PIXI.Text;
+
+ private count: number;
+
+ constructor() {
+
+ this.renderer = PIXI.autoDetectRenderer(800, 600, { backgroundColor: 0x1099bb });
+ document.body.appendChild(this.renderer.view);
+
+ // create the root of the scene graph
+ this.stage = new PIXI.Container();
+
+ PIXI.loader
+ .add('desyrel', '../../_assets/desyrel.xml')
+ .load(this.onAssetsLoaded);
+
+ // start animating
+ this.animate();
+
+ }
+
+ private onAssetsLoaded = (): void => {
+
+ this.bitmapFontText = new PIXI.extras.BitmapText('bitmap fonts are\n now supported!', { font: '35px Desyrel', align: 'right' });
+
+ this.bitmapFontText.position.x = 600 - this.bitmapFontText.textWidth;
+ this.bitmapFontText.position.y = 20;
+
+ this.stage.addChild(this.bitmapFontText);
+
+ // add a shiny background...
+ this.background = PIXI.Sprite.fromImage('../../_assets/textDemoBG.jpg');
+ this.stage.addChild(this.background);
+
+ // create some white text using the Snippet webfont
+ this.textSample = new PIXI.Text('Pixi.js can has\n multiline text!', { font: '35px Snippet', fill: 'white', align: 'left' });
+ this.textSample.position.set(20);
+
+ // create a text object with a nice stroke
+ this.spinningText = new PIXI.Text('I\'m fun!', { font: 'bold 60px Arial', fill: '#cc00ff', align: 'center', stroke: '#FFFFFF', strokeThickness: 6 });
+
+ // setting the anchor point to 0.5 will center align the text... great for spinning!
+ this.spinningText.anchor.set(0.5);
+ this.spinningText.position.x = 310;
+ this.spinningText.position.y = 200;
+
+ // create a text object that will be updated...
+ this.countingText = new PIXI.Text('COUNT 4EVAR: 0', { font: 'bold italic 60px Arvo', fill: '#3e1707', align: 'center', stroke: '#a4410e', strokeThickness: 7 });
+
+ this.countingText.position.x = 310;
+ this.countingText.position.y = 320;
+ this.countingText.anchor.x = 0.5;
+
+ this.stage.addChild(this.textSample);
+ this.stage.addChild(this.spinningText);
+ this.stage.addChild(this.countingText);
+
+ this.count = 0;
+
+ }
+
+ private animate = (): void => {
+
+
+ this.renderer.render(this.stage);
+
+ this.count += 0.05;
+
+ // update the text with a new string
+ this.countingText.text = 'COUNT 4EVAR: ' + Math.floor(this.count);
+
+ // let's spin the spinning text
+ this.spinningText.rotation += 0.03;
+
+ requestAnimationFrame(this.animate);
+ }
+
+ }
+
+}
+
+module demos {
+
+ export class TextureSwap {
+
+ private renderer: PIXI.CanvasRenderer | PIXI.WebGLRenderer;
+
+ private stage: PIXI.Container;
+
+ private bol: boolean;
+
+ private texture: PIXI.Texture;
+ private secondTexture: PIXI.Texture;
+
+ private dude: PIXI.Sprite;
+
+ constructor() {
+
+ this.renderer = PIXI.autoDetectRenderer(800, 600, { backgroundColor: 0x1099bb });
+ document.body.appendChild(this.renderer.view);
+
+ // create the root of the scene graph
+ this.stage = new PIXI.Container();
+
+ this.bol = false;
+
+ //an image path
+ this.texture = PIXI.Texture.fromImage('../../_assets/flowerTop.png');
+
+ // create a second texture
+ this.secondTexture = PIXI.Texture.fromImage('../../_assets/eggHead.png');
+
+ // create a new Sprite using the texture
+ this.dude = new PIXI.Sprite(this.texture);
+
+ // center the sprites anchor point
+ this.dude.anchor.set(0.5);
+
+ // move the sprite to the center of the screen
+ this.dude.position.x = this.renderer.width / 2;
+ this.dude.position.y = this.renderer.height / 2;
+
+ this.stage.addChild(this.dude);
+
+ // make the sprite interactive
+ this.dude.interactive = true;
+
+ this.dude.on('click', (): void => {
+ this.bol = !this.bol;
+
+ if (this.bol) {
+ this.dude.texture = this.secondTexture;
+ }
+ else {
+ this.dude.texture = this.texture;
+ }
+ });
+
+ // start animating
+ this.animate();
+
+ }
+
+ private animate = (): void => {
+
+ // just for fun, let's rotate mr rabbit a little
+ this.dude.rotation += 0.1;
+
+ this.renderer.render(this.stage);
+
+ requestAnimationFrame(this.animate);
+
+ }
+
+ }
+
+}
+
+module demos {
+
+ export class Tinting {
+
+ private renderer: PIXI.CanvasRenderer | PIXI.WebGLRenderer;
+
+ private stage: PIXI.Container;
+
+ private totalDudes: number = 10;
+ private aliens: TintingDude[];
+
+ private dudeBounds: PIXI.Rectangle;
+
+ private tick: number;
+
+ constructor() {
+
+ this.renderer = PIXI.autoDetectRenderer(800, 600, { backgroundColor: 0x1099bb });
+ document.body.appendChild(this.renderer.view);
+
+ // create the root of the scene graph
+ this.stage = new PIXI.Container();
+
+ // holder to store the aliens
+ this.aliens = [];
+
+ this.tick = 0;
+
+ for (var i = 0; i < this.totalDudes; i++) {
+
+ // create a new Sprite that uses the image name that we just generated as its source
+ var dude = new TintingDude();
+
+ // set the anchor point so the texture is centerd on the sprite
+ dude.anchor.set(0.5);
+
+ // set a random scale for the dude - no point them all being the same size!
+ dude.scale.set(0.8 + Math.random() * 0.3);
+
+ // finally lets set the dude to be at a random position..
+ dude.position.x = Math.random() * this.renderer.width;
+ dude.position.y = Math.random() * this.renderer.height;
+
+ dude.tint = Math.random() * 0xFFFFFF;
+
+ // create some extra properties that will control movement :
+ // create a random direction in radians. This is a number between 0 and PI*2 which is the equivalent of 0 - 360 degrees
+ dude.direction = Math.random() * Math.PI * 2;
+
+ // this number will be used to modify the direction of the dude over time
+ dude.turningSpeed = Math.random() - 0.8;
+
+ // create a random speed for the dude between 0 - 2
+ dude.speed = 2 + Math.random() * 2;
+
+ // finally we push the dude into the aliens array so it it can be easily accessed later
+ this.aliens.push(dude);
+
+ this.stage.addChild(dude);
+
+ }
+
+ // create a bounding box for the little dudes
+ var dudeBoundsPadding = 100;
+ this.dudeBounds = new PIXI.Rectangle(-dudeBoundsPadding,
+ -dudeBoundsPadding,
+ this.renderer.width + dudeBoundsPadding * 2,
+ this.renderer.height + dudeBoundsPadding * 2);
+
+ // start animating
+ this.animate();
+
+ }
+
+ private animate = (): void => {
+
+ // iterate through the dudes and update their position
+ for (var i = 0; i < this.aliens.length; i++) {
+
+ var dude = this.aliens[i];
+ dude.direction += dude.turningSpeed * 0.01;
+ dude.position.x += Math.sin(dude.direction) * dude.speed;
+ dude.position.y += Math.cos(dude.direction) * dude.speed;
+ dude.rotation = -dude.direction - Math.PI / 2;
+
+ // wrap the dudes by testing their bounds...
+ if (dude.position.x < this.dudeBounds.x) {
+ dude.position.x += this.dudeBounds.width;
+ }
+ else if (dude.position.x > this.dudeBounds.x + this.dudeBounds.width) {
+ dude.position.x -= this.dudeBounds.width;
+ }
+
+ if (dude.position.y < this.dudeBounds.y) {
+ dude.position.y += this.dudeBounds.height;
+ }
+ else if (dude.position.y > this.dudeBounds.y + this.dudeBounds.height) {
+ dude.position.y -= this.dudeBounds.height;
+ }
+
+ }
+
+ // increment the ticker
+ this.tick += 0.1;
+
+ requestAnimationFrame(this.animate);
+
+ this.renderer.render(this.stage);
+
+ }
+
+ }
+
+ export class TintingDude extends PIXI.Sprite {
+
+ direction: number;
+ speed: number;
+ turningSpeed: number;
+
+ constructor() {
+ super(PIXI.Texture.fromImage('../../_assets/eggHead.png'));
+ }
+
+ }
+
+}
+
+module demos {
+
+ export class TransparentBackground {
+
+ private renderer: PIXI.CanvasRenderer | PIXI.WebGLRenderer;
+
+ private stage: PIXI.Container;
+
+ private bunny: PIXI.Sprite;
+
+ constructor() {
+
+ this.renderer = PIXI.autoDetectRenderer(800, 600, { backgroundColor: 0x1099bb, transparent: true });
+ document.body.appendChild(this.renderer.view);
+
+ // create the root of the scene graph
+ this.stage = new PIXI.Container();
+
+ // create a new Sprite from an image path.
+ this.bunny = PIXI.Sprite.fromImage('../../_assets/bunny.png');
+
+ // center the sprite's anchor point
+ this.bunny.anchor.set(0.5);
+
+ // move the sprite to the center of the screen
+ this.bunny.position.x = 200;
+ this.bunny.position.y = 150;
+
+ this.stage.addChild(this.bunny);
+
+ // start animating
+ this.animate();
+
+ }
+
+ private animate = (): void => {
+
+ // just for fun, let's rotate mr rabbit a little
+ this.bunny.rotation += 0.1;
+
+ this.renderer.render(this.stage);
+
+ requestAnimationFrame(this.animate);
+
+ }
+
+ }
+
+}
+
+module filters {
+
+ export class Blur {
+
+ private renderer: PIXI.CanvasRenderer | PIXI.WebGLRenderer;
+
+ private stage: PIXI.Container;
+
+ private bg: PIXI.Sprite;
+
+ private littleDudes: PIXI.Sprite;
+ private littleRobot: PIXI.Sprite;
+
+ private blurFilter1: PIXI.filters.BlurFilter;
+ private blurFilter2: PIXI.filters.BlurFilter;
+
+ private count: number;
+
+ constructor() {
+
+ this.renderer = PIXI.autoDetectRenderer(800, 600);
+ document.body.appendChild(this.renderer.view);
+
+ // create the root of the scene graph
+ this.stage = new PIXI.Container();
+
+ this.bg = PIXI.Sprite.fromImage('../../_assets/depth_blur_BG.jpg');
+ this.bg.width = this.renderer.width;
+ this.bg.height = this.renderer.height;
+ this.stage.addChild(this.bg);
+
+ this.littleDudes = PIXI.Sprite.fromImage('../../_assets/depth_blur_dudes.jpg');
+ this.littleDudes.position.x = (this.renderer.width / 2) - 315;
+ this.littleDudes.position.y = 200;
+ this.stage.addChild(this.littleDudes);
+
+ this.littleRobot = PIXI.Sprite.fromImage('../../_assets/depth_blur_moby.jpg');
+ this.littleRobot.position.x = (this.renderer.width / 2) - 200;
+ this.littleRobot.position.y = 100;
+ this.stage.addChild(this.littleRobot);
+
+ this.blurFilter1 = new PIXI.filters.BlurFilter();
+ this.blurFilter2 = new PIXI.filters.BlurFilter();
+
+ this.littleDudes.filters = [this.blurFilter1];
+ this.littleRobot.filters = [this.blurFilter2];
+
+ this.count = 0;
+
+ //nimate
+ this.animate();
+
+ }
+
+ private animate = (): void => {
+
+ this.count += 0.005;
+
+ var blurAmount = Math.cos(this.count);
+ var blurAmount2 = Math.sin(this.count);
+
+ this.blurFilter1.blur = 20 * (blurAmount);
+ this.blurFilter2.blur = 20 * (blurAmount2);
+
+ this.renderer.render(this.stage);
+
+ requestAnimationFrame(this.animate);
+
+ }
+
+ }
+
+}
+
+module filters {
+
+ export class DisplacementMap {
+
+ private renderer: PIXI.CanvasRenderer | PIXI.WebGLRenderer;
+
+ private stage: PIXI.Container;
+
+ private container: PIXI.Container;
+
+ private padding: number;
+
+ private bounds: PIXI.Rectangle;
+
+ private maggots: DisplacementMapDude[];
+
+ private displacementSprite: PIXI.Sprite;
+
+ private displacementFilter: PIXI.filters.DisplacementFilter;
+
+ private ring: PIXI.Sprite;
+
+ private bg: PIXI.Sprite;
+
+ private count: number;
+
+ constructor() {
+
+ this.renderer = PIXI.autoDetectRenderer(800, 600);
+ document.body.appendChild(this.renderer.view);
+
+ // create the root of the scene graph
+ this.stage = new PIXI.Container();
+ this.stage.interactive = true;
+
+ this.container = new PIXI.Container();
+ this.stage.addChild(this.container);
+
+ this.padding = 100;
+
+ this.bounds = new PIXI.Rectangle(-this.padding, -this.padding, this.renderer.width + this.padding * 2, this.renderer.height + this.padding * 2);
+ this.maggots = [];
+
+ for (var i = 0; i < 20; i++) {
+
+ var maggot = new DisplacementMapDude();
+ maggot.anchor.set(0.5);
+ this.container.addChild(maggot);
+
+ maggot.direction = Math.random() * Math.PI * 2;
+ maggot.speed = 1;
+ maggot.turnSpeed = Math.random() - 0.8;
+
+ maggot.position.x = Math.random() * this.bounds.width;
+ maggot.position.y = Math.random() * this.bounds.height;
+
+ maggot.scale.set(1 + Math.random() * 0.3);
+ maggot.original = maggot.scale.clone();
+ this.maggots.push(maggot);
+
+ }
+
+ this.displacementSprite = PIXI.Sprite.fromImage('../../_assets/displace.png');
+ this.displacementFilter = new PIXI.filters.DisplacementFilter(this.displacementSprite);
+
+ this.stage.addChild(this.displacementSprite);
+
+ this.container.filters = [this.displacementFilter];
+
+ this.displacementFilter.scale.x = 110;
+ this.displacementFilter.scale.y = 110;
+
+ this.ring = PIXI.Sprite.fromImage('../../_assets/ring.png');
+
+ this.ring.anchor.set(0.5);
+
+ this.ring.visible = false;
+
+ this.stage.addChild(this.ring);
+
+ this.bg = PIXI.Sprite.fromImage('../../_assets/bkg-grass.jpg');
+ this.bg.width = this.renderer.width;
+ this.bg.height = this.renderer.height;
+
+ this.bg.alpha = 0.4;
+
+ this.container.addChild(this.bg);
+
+ this.stage
+ .on('mousemove', this.onPointerMove)
+ .on('touchmove', this.onPointerMove);
+
+ this.count = 0;
+
+ this.animate();
+
+ }
+
+ private onPointerMove = (eventData: PIXI.interaction.InteractionEvent): void => {
+
+ this.ring.visible = true;
+
+ this.displacementSprite.x = eventData.data.global.x - 100;
+ this.displacementSprite.y = eventData.data.global.y - this.displacementSprite.height / 2;
+
+ this.ring.position.x = eventData.data.global.x - 25;
+ this.ring.position.y = eventData.data.global.y;
+
+ };
+
+ private animate = (): void => {
+
+ this.count += 0.05;
+
+ for (var i = 0; i < this.maggots.length; i++) {
+ var maggot = this.maggots[i];
+
+ maggot.direction += maggot.turnSpeed * 0.01;
+ maggot.position.x += Math.sin(maggot.direction) * maggot.speed;
+ maggot.position.y += Math.cos(maggot.direction) * maggot.speed;
+
+ maggot.rotation = -maggot.direction - Math.PI / 2;
+
+ maggot.scale.x = maggot.original.x + Math.sin(this.count) * 0.2;
+
+ // wrap the maggots around as the crawl
+ if (maggot.position.x < this.bounds.x) {
+ maggot.position.x += this.bounds.width;
+ }
+ else if (maggot.position.x > this.bounds.x + this.bounds.width) {
+ maggot.position.x -= this.bounds.width;
+ }
+
+ if (maggot.position.y < this.bounds.y) {
+ maggot.position.y += this.bounds.height;
+ }
+ else if (maggot.position.y > this.bounds.y + this.bounds.height) {
+ maggot.position.y -= this.bounds.height;
+ }
+ }
+
+ this.renderer.render(this.stage);
+
+ requestAnimationFrame(this.animate);
+
+ };
+
+ }
+
+ export class DisplacementMapDude extends PIXI.Sprite {
+
+ direction: number;
+ speed: number;
+ turnSpeed: number;
+ original: PIXI.Point;
+
+ constructor() {
+
+ super(PIXI.Texture.fromImage('../../_assets/maggot.png'));
+
+ }
+
+ }
+
+}
+
+module filters {
+
+ export class Filter {
+
+ private renderer: PIXI.CanvasRenderer | PIXI.WebGLRenderer;
+
+ private stage: PIXI.Container;
+
+ private background: PIXI.Sprite;
+
+ private filter: PIXI.filters.ColorMatrixFilter;
+
+ private container: PIXI.Container;
+
+ private bgFront: PIXI.Sprite;
+ private light2: PIXI.Sprite;
+ private light1: PIXI.Sprite;
+ private panda: PIXI.Sprite;
+
+ private count: number;
+ private switchy: boolean;
+
+ private help: PIXI.Text;
+
+ constructor() {
+
+ this.renderer = PIXI.autoDetectRenderer(800, 600);
+ document.body.appendChild(this.renderer.view);
+
+ // create the root of the scene graph
+ this.stage = new PIXI.Container();
+ this.stage.interactive = true;
+
+ // create a texture from an image path
+ var texture: PIXI.Texture = PIXI.Texture.fromImage("../../_assets/basics/bunny.png");
+
+ this.background = PIXI.Sprite.fromImage('_assets/BGrotate.jpg');
+ this.background.anchor.set(0.5);
+
+ this.background.position.x = this.renderer.width / 2;
+ this.background.position.y = this.renderer.height / 2;
+
+ this.filter = new PIXI.filters.ColorMatrixFilter();
+
+ this.container = new PIXI.Container();
+ this.container.position.x = this.renderer.width / 2;
+ this.container.position.y = this.renderer.height / 2;
+
+ this.bgFront = PIXI.Sprite.fromImage('../../_assets/SceneRotate.jpg');
+ this.bgFront.anchor.set(0.5);
+
+ this.container.addChild(this.bgFront);
+
+ this.light2 = PIXI.Sprite.fromImage('../../_assets/LightRotate2.png');
+ this.light2.anchor.set(0.5);
+ this.container.addChild(this.light2);
+
+ this.light1 = PIXI.Sprite.fromImage('../../_assets/LightRotate1.png');
+ this.light1.anchor.set(0.5);
+ this.container.addChild(this.light1);
+
+ this.panda = PIXI.Sprite.fromImage('../../_assets/panda.png');
+ this.panda.anchor.set(0.5);
+
+ this.container.addChild(this.panda);
+
+ this.stage.addChild(this.container);
+
+ this.stage.filters = [this.filter];
+
+ this.count = 0;
+ this.switchy = false;
+
+ this.stage.on('click', this.onClick);
+ this.stage.on('tap', this.onClick);
+
+
+ this.help = new PIXI.Text('Click to turn filters on / off.', { font: 'bold 12pt Arial', fill: 'white' });
+ this.help.position.y = this.renderer.height - 25;
+ this.help.position.x = 10;
+
+ this.stage.addChild(this.help);
+
+ //nimate
+ this.animate();
+
+ }
+
+ private onClick = (): void => {
+
+ this.switchy = !this.switchy;
+
+ if (!this.switchy) {
+ this.stage.filters = [this.filter];
+ }
+ else {
+ this.stage.filters = null;
+ }
+
+ }
+
+ private animate = (): void => {
+
+ this.background.rotation += 0.01;
+ this.bgFront.rotation -= 0.01;
+
+ this.light1.rotation += 0.02;
+ this.light2.rotation += 0.01;
+
+ this.panda.scale.x = 1 + Math.sin(this.count) * 0.04;
+ this.panda.scale.y = 1 + Math.cos(this.count) * 0.04;
+
+ this.count += 0.1;
+
+ var matrix = this.filter.matrix;
+
+ matrix[1] = Math.sin(this.count) * 3;
+ matrix[2] = Math.cos(this.count);
+ matrix[3] = Math.cos(this.count) * 1.5;
+ matrix[4] = Math.sin(this.count / 3) * 2;
+ matrix[5] = Math.sin(this.count / 2);
+ matrix[6] = Math.sin(this.count / 4);
+
+ this.renderer.render(this.stage);
+
+ requestAnimationFrame(this.animate);
+
+ }
+
+ }
+
+}
diff --git a/pixi.js/pixi.js.d.ts b/pixi.js/pixi.js.d.ts
new file mode 100644
index 000000000..8e83cbf1e
--- /dev/null
+++ b/pixi.js/pixi.js.d.ts
@@ -0,0 +1,1720 @@
+// Type definitions for Pixi.js 3.0.7
+// Project: https://github.com/GoodBoyDigital/pixi.js/
+// Definitions by: clark-stevenson
+// Definitions: https://github.com/borisyankov/DefinitelyTyped
+
+declare class PIXI {
+
+ static VERSION: string;
+ static PI_2: number;
+ static RAD_TO_DEG: number;
+ static DEG_TO_RAD: number;
+ static TARGET_FPMS: number;
+ static RENDER_TYPE: {
+ UNKNOWN: number;
+ WEBGL: number;
+ CANVAS: number;
+ };
+ static BLEND_MODES: {
+ NORMAL: number;
+ ADD: number;
+ MULTIPLY: number;
+ SCREEN: number;
+ OVERLAY: number;
+ DARKEN: number;
+ LIGHTEN: number;
+ COLOR_DODGE: number;
+ COLOR_BURN: number;
+ HARD_LIGHT: number;
+ SOFT_LIGHT: number;
+ DIFFERENCE: number;
+ EXCLUSION: number;
+ HUE: number;
+ SATURATION: number;
+ COLOR: number;
+ LUMINOSITY: number;
+
+ };
+ static DRAW_MODES: {
+ POINTS: number;
+ LINES: number;
+ LINE_LOOP: number;
+ LINE_STRIP: number;
+ TRIANGLES: number;
+ TRIANGLE_STRIP: number;
+ TRIANGLE_FAN: number;
+ };
+ static SCALE_MODES: {
+ DEFAULT: number;
+ LINEAR: number;
+ NEAREST: number;
+ };
+ static RETINA_PREFIX: string;
+ static RESOLUTION: number;
+ static FILTER_RESOLUTION: number;
+ static DEFAULT_RENDER_OPTIONS: {
+ view: HTMLCanvasElement;
+ resolution: number;
+ antialias: boolean;
+ forceFXAA: boolean;
+ autoResize: boolean;
+ transparent: boolean;
+ backgroundColor: number;
+ clearBeforeRender: boolean;
+ preserveDrawingBuffer: boolean;
+ roundPixels: boolean;
+ };
+ static SHAPES: {
+ POLY: number;
+ RECT: number;
+ CIRC: number;
+ ELIP: number;
+ RREC: number;
+ };
+ static SPRITE_BATCH_SIZE: number;
+
+}
+
+declare module PIXI {
+
+ export function autoDetectRenderer(width: number, height: number, options?: PIXI.RendererOptions, noWebGL?: boolean): PIXI.WebGLRenderer | PIXI.CanvasRenderer;
+ export var loader: PIXI.loaders.Loader;
+
+ //https://github.com/primus/eventemitter3
+ export class EventEmitter {
+
+ listeners(event: string): Function[];
+ emit(event: string, ...args: any[]): boolean;
+ on(event: string, fn: Function, context?: any): EventEmitter;
+ once(event: string, fn: Function, context?: any): EventEmitter;
+ removeListener(event: string, fn: Function, once?: boolean): EventEmitter;
+ removeAllListeners(event: string): EventEmitter;
+
+ off(event: string, fn: Function, once?: boolean): EventEmitter;
+ addListener(event: string, fn: Function, context?: any): EventEmitter;
+
+ }
+
+ //////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////CORE//////////////////////////////////////////
+ //////////////////////////////////////////////////////////////////////////////
+
+ //display
+
+ export class DisplayObject extends EventEmitter implements interaction.InteractiveTarget {
+
+ //begin extras.cacheAsBitmap see https://github.com/pixijs/pixi-typescript/commit/1207b7f4752d79a088d6a9a465a3ec799906b1db
+ protected _originalRenderWebGL: WebGLRenderer;
+ protected _originalRenderCanvas: CanvasRenderer;
+ protected _originalUpdateTransform: boolean;
+ protected _originalHitTest: any;
+ protected _cachedSprite: any;
+ protected _originalDestroy: any;
+
+ cacheAsBitmap: boolean;
+
+ protected _renderCachedWebGL(renderer: WebGLRenderer): void;
+ protected _initCachedDisplayObject(renderer: WebGLRenderer): void;
+ protected _renderCachedCanvas(renderer: CanvasRenderer): void;
+ protected _initCachedDisplayObjectCanvas(renderer: CanvasRenderer): void;
+ protected _getCachedBounds(): Rectangle;
+ protected _destroyCachedDisplayObject(): void;
+ protected _cacheAsBitmapDestroy(): void;
+ //end extras.cacheAsBitmap
+
+ protected _sr: number;
+ protected _cr: number;
+ protected _bounds: Rectangle;
+ protected _currentBounds: Rectangle;
+ protected _mask: Rectangle;
+ protected _cachedObject: any;
+
+ updateTransform(): void;
+
+ position: Point;
+ scale: Point;
+ pivot: Point;
+ rotation: number;
+ renderable: boolean;
+ alpha: number;
+ visible: boolean;
+ parent: Container;
+ worldAlpha: number;
+ worldTransform: Matrix;
+ filterArea: Rectangle;
+
+ x: number;
+ y: number;
+ worldVisible: boolean;
+ mask: Graphics | Sprite;
+ filters: AbstractFilter[];
+ name: string;
+
+ getBounds(matrix?: Matrix): Rectangle;
+ getLocalBounds(): Rectangle;
+ toGlobal(position: Point): Point;
+ toLocal(position: Point, from?: DisplayObject): Point;
+ generateTexture(renderer: CanvasRenderer | WebGLRenderer, scaleMode: number, resolution: number): Texture;
+ destroy(): void;
+ getChildByName(name: string): DisplayObject;
+ getGlobalPosition(point: Point): Point;
+
+ interactive: boolean;
+ buttonMode: boolean;
+ interactiveChildren: boolean;
+ defaultCursor: string;
+ hitArea: HitArea;
+
+ on(event: 'click', fn: (event: interaction.InteractionEvent) => void, context?: any): EventEmitter;
+ on(event: 'mousedown', fn: (event: interaction.InteractionEvent) => void, context?: any): EventEmitter;
+ on(event: 'mouseout', fn: (event: interaction.InteractionEvent) => void, context?: any): EventEmitter;
+ on(event: 'mouseover', fn: (event: interaction.InteractionEvent) => void, context?: any): EventEmitter;
+ on(event: 'mouseup', fn: (event: interaction.InteractionEvent) => void, context?: any): EventEmitter;
+ on(event: 'mouseclick', fn: (event: interaction.InteractionEvent) => void, context?: any): EventEmitter;
+ on(event: 'mouseupoutside', fn: (event: interaction.InteractionEvent) => void, context?: any): EventEmitter;
+ on(event: 'rightclick', fn: (event: interaction.InteractionEvent) => void, context?: any): EventEmitter;
+ on(event: 'rightdown', fn: (event: interaction.InteractionEvent) => void, context?: any): EventEmitter;
+ on(event: 'rightup', fn: (event: interaction.InteractionEvent) => void, context?: any): EventEmitter;
+ on(event: 'rightupoutside', fn: (event: interaction.InteractionEvent) => void, context?: any): EventEmitter;
+ on(event: 'tap', fn: (event: interaction.InteractionEvent) => void, context?: any): EventEmitter;
+ on(event: 'touchend', fn: (event: interaction.InteractionEvent) => void, context?: any): EventEmitter;
+ on(event: 'touchendoutside', fn: (event: interaction.InteractionEvent) => void, context?: any): EventEmitter;
+ on(event: 'touchmove', fn: (event: interaction.InteractionEvent) => void, context?: any): EventEmitter;
+ on(event: 'touchstart', fn: (event: interaction.InteractionEvent) => void, context?: any): EventEmitter;
+ on(event: string, fn: Function, context?: any): EventEmitter;
+
+ once(event: 'click', fn: (event: interaction.InteractionEvent) => void, context?: any): EventEmitter;
+ once(event: 'mousedown', fn: (event: interaction.InteractionEvent) => void, context?: any): EventEmitter;
+ once(event: 'mouseout', fn: (event: interaction.InteractionEvent) => void, context?: any): EventEmitter;
+ once(event: 'mouseover', fn: (event: interaction.InteractionEvent) => void, context?: any): EventEmitter;
+ once(event: 'mouseup', fn: (event: interaction.InteractionEvent) => void, context?: any): EventEmitter;
+ once(event: 'mouseclick', fn: (event: interaction.InteractionEvent) => void, context?: any): EventEmitter;
+ once(event: 'mouseupoutside', fn: (event: interaction.InteractionEvent) => void, context?: any): EventEmitter;
+ once(event: 'rightclick', fn: (event: interaction.InteractionEvent) => void, context?: any): EventEmitter;
+ once(event: 'rightdown', fn: (event: interaction.InteractionEvent) => void, context?: any): EventEmitter;
+ once(event: 'rightup', fn: (event: interaction.InteractionEvent) => void, context?: any): EventEmitter;
+ once(event: 'rightupoutside', fn: (event: interaction.InteractionEvent) => void, context?: any): EventEmitter;
+ once(event: 'tap', fn: (event: interaction.InteractionEvent) => void, context?: any): EventEmitter;
+ once(event: 'touchend', fn: (event: interaction.InteractionEvent) => void, context?: any): EventEmitter;
+ once(event: 'touchendoutside', fn: (event: interaction.InteractionEvent) => void, context?: any): EventEmitter;
+ once(event: 'touchmove', fn: (event: interaction.InteractionEvent) => void, context?: any): EventEmitter;
+ once(event: 'touchstart', fn: (event: interaction.InteractionEvent) => void, context?: any): EventEmitter;
+ once(event: string, fn: Function, context?: any): EventEmitter;
+
+ }
+
+ export class Container extends DisplayObject {
+
+ protected _renderWebGL(renderer: WebGLRenderer): void;
+ protected _renderCanvas(renderer: CanvasRenderer): void;
+
+ protected onChildrenChange: () => void;
+
+ children: DisplayObject[];
+
+ width: number;
+ height: number;
+
+ addChild(child: DisplayObject): DisplayObject;
+ addChildAt(child: DisplayObject, index: number): DisplayObject;
+ swapChildren(child: DisplayObject, child2: DisplayObject): void;
+ getChildIndex(child: DisplayObject): number;
+ setChildIndex(child: DisplayObject, index: number): void;
+ getChildAt(index: number): DisplayObject;
+ removeChild(child: DisplayObject): DisplayObject;
+ removeChildAt(index: number): DisplayObject;
+ removeChildren(beginIndex?: number, endIndex?: number): DisplayObject[];
+ destroy(destroyChildren?: boolean): void;
+ generateTexture(renderer: PIXI.CanvasRenderer | PIXI.WebGLRenderer, resolution?: number, scaleMode?: number): Texture;
+
+ renderWebGL(renderer: WebGLRenderer): void;
+ renderCanvas(renderer: CanvasRenderer): void;
+
+ once(event: 'added', fn: (event: interaction.InteractionEvent) => void, context?: any): EventEmitter;
+ once(event: string, fn: Function, context?: any): EventEmitter;
+ once(event: 'removed', fn: (event: interaction.InteractionEvent) => void, context?: any): EventEmitter;
+ once(event: string, fn: Function, context?: any): EventEmitter;
+ on(event: 'added', fn: (event: interaction.InteractionEvent) => void, context?: any): EventEmitter;
+ on(event: string, fn: Function, context?: any): EventEmitter;
+ on(event: 'removed', fn: (event: interaction.InteractionEvent) => void, context?: any): EventEmitter;
+ on(event: string, fn: Function, context?: any): EventEmitter;
+
+ }
+
+ //graphics
+
+ export class GraphicsData {
+
+ constructor(lineWidth: number, lineColor: number, lineAlpha: number, fillColor: number, fillAlpha: number, fill: boolean, shape: Circle | Rectangle | Ellipse | Polygon);
+
+ lineWidth: number;
+ lineColor: number;
+ lineAlpha: number;
+ fillColor: number;
+ fillAlpha: number;
+ fill: boolean;
+ shape: Circle | Rectangle | Ellipse | Polygon;
+ type: number;
+
+ clone(): GraphicsData;
+
+ protected _lineTint: number;
+ protected _fillTint: number;
+
+ }
+ export class Graphics extends Container {
+
+ protected boundsDirty: boolean;
+ protected dirty: boolean;
+ protected glDirty: boolean;
+
+ fillAlpha: number;
+ lineWidth: number;
+ lineColor: number;
+ tint: number;
+ blendMode: number;
+ isMask: boolean;
+ boundsPadding: number;
+
+ clone(): Graphics;
+ lineStyle(lineWidth?: number, color?: number, alpha?: number): Graphics;
+ moveTo(x: number, y: number): Graphics;
+ lineTo(x: number, y: number): Graphics;
+ quadraticCurveTo(cpX: number, cpY: number, toX: number, toY: number): Graphics;
+ bezierCurveTo(cpX: number, cpY: number, cpX2: number, cpY2: number, toX: number, toY: number): Graphics;
+ arcTo(x1: number, y1: number, x2: number, y2: number, radius: number): Graphics;
+ arc(cx: number, cy: number, radius: number, startAngle: number, endAngle: number, anticlockwise?: boolean): Graphics;
+ beginFill(color: number, alpha?: number): Graphics;
+ endFill(): Graphics;
+ drawRect(x: number, y: number, width: number, height: number): Graphics;
+ drawRoundedRect(x: number, y: number, width: number, height: number, radius: number): Graphics;
+ drawCircle(x: number, y: number, radius: number): Graphics;
+ drawEllipse(x: number, y: number, width: number, height: number): Graphics;
+ drawPolygon(path: number[]| Point[]): Graphics;
+ clear(): Graphics;
+ //todo
+ generateTexture(renderer: WebGLRenderer | CanvasRenderer, resolution?: number, scaleMode?: number): Texture;
+ getBounds(matrix?: Matrix): Rectangle;
+ containsPoint(point: Point): boolean;
+ updateLocalBounds(): void;
+ drawShape(shape: Circle | Rectangle | Ellipse | Polygon): GraphicsData;
+
+ }
+ export interface GraphicsRenderer extends ObjectRenderer {
+ //yikes todo
+ }
+ export interface WebGLGraphicsData {
+ //yikes todo!
+ }
+
+ //math
+
+ export class Point {
+
+ x: number;
+ y: number;
+
+ constructor(x?: number, y?: number);
+
+ clone(): Point;
+ copy(p: Point): void;
+ equals(p: Point): boolean;
+ set(x?: number, y?: number): void;
+
+ }
+ export class Matrix {
+
+ a: number;
+ b: number;
+ c: number;
+ d: number;
+ tx: number;
+ ty: number;
+
+ fromArray(array: number[]): void;
+ toArray(transpose?: boolean, out?: number[]): number[];
+ apply(pos: Point, newPos?: Point): Point;
+ applyInverse(pos: Point, newPos?: Point): Point;
+ translate(x: number, y: number): Matrix;
+ scale(x: number, y: number): Matrix;
+ rotate(angle: number): Matrix;
+ append(matrix: Matrix): Matrix;
+ prepend(matrix: Matrix): Matrix;
+ invert(): Matrix;
+ identity(): Matrix;
+ clone(): Matrix;
+ copy(matrix: Matrix): Matrix;
+
+ static IDENTITY: Matrix;
+ static TEMP_MATRIX: Matrix;
+
+ }
+
+ export interface HitArea {
+
+ contains(x: number, y: number): boolean;
+
+ }
+
+ export class Circle implements HitArea {
+
+ constructor(x?: number, y?: number, radius?: number);
+
+ x: number;
+ y: number;
+ radius: number;
+ type: number;
+
+ clone(): Circle;
+ contains(x: number, y: number): boolean;
+ getBounds(): Rectangle;
+
+ }
+ export class Ellipse implements HitArea {
+
+ constructor(x?: number, y?: number, width?: number, height?: number);
+
+ x: number;
+ y: number;
+ width: number;
+ height: number;
+ type: number;
+
+ clone(): Ellipse;
+ contains(x: number, y: number): boolean;
+ getBounds(): Rectangle;
+
+ }
+ export class Polygon implements HitArea {
+
+ constructor(points: Point[]);
+ constructor(points: number[]);
+ constructor(...points: Point[]);
+ constructor(...points: number[]);
+
+ closed: boolean;
+ points: number[];
+ type: number;
+
+ clone(): Polygon;
+ contains(x: number, y: number): boolean;
+
+
+ }
+ export class Rectangle implements HitArea {
+
+ constructor(x?: number, y?: number, width?: number, height?: number);
+
+ x: number;
+ y: number;
+ width: number;
+ height: number;
+ type: number;
+
+ static EMPTY: Rectangle;
+
+ clone(): Rectangle;
+ contains(x: number, y: number): boolean;
+
+ }
+ export class RoundedRectangle implements HitArea {
+
+ constructor(x?: number, y?: number, width?: number, height?: number, radius?: number);
+
+ x: number;
+ y: number;
+ width: number;
+ height: number;
+ radius: number;
+ type: number;
+
+ static EMPTY: Rectangle;
+
+ clone(): Rectangle;
+ contains(x: number, y: number): boolean;
+
+ }
+
+ //particles
+
+ export interface ParticleContainerProperties {
+
+ scale?: boolean;
+ position?: boolean;
+ rotation?: boolean;
+ uvs?: boolean;
+ alpha?: boolean;
+ }
+ export class ParticleContainer extends Container {
+
+ constructor(size?: number, properties?: ParticleContainerProperties, batchSize?: number);
+
+ protected _maxSize: number;
+ protected _batchSize: number;
+
+ protected onChildrenChange: () => void;
+
+ interactiveChildren: boolean;
+ blendMode: number;
+ roundPixels: boolean;
+
+ setProperties(properties: ParticleContainerProperties): void;
+
+ }
+ export interface ParticleBuffer {
+
+ gl: WebGLRenderingContext;
+ vertSize: number;
+ vertByteSize: number;
+ size: number;
+ dynamicProperties: any[];
+ staticProperties: any[];
+
+ staticStride: number;
+ staticBuffer: any;
+ staticData: any;
+ dynamicStride: number;
+ dynamicBuffer: any;
+ dynamicData: any;
+
+ initBuffers(): void;
+ bind(): void;
+ destroy(): void;
+
+ }
+ export interface ParticleRenderer {
+
+ }
+ export interface ParticleShader {
+
+ }
+
+ //renderers
+
+ export interface RendererOptions {
+
+ view?: HTMLCanvasElement;
+ transparent?: boolean
+ antialias?: boolean;
+ resolution?: number;
+ clearBeforeRendering?: boolean;
+ preserveDrawingBuffer?: boolean;
+ forceFXAA?: boolean;
+ roundPixels?: boolean;
+
+ }
+ export class SystemRenderer extends EventEmitter {
+
+ protected _backgroundColor: number;
+ protected _backgroundColorRgb: number[];
+ protected _backgroundColorString: string;
+ protected _tempDisplayObjectParent: any;
+ protected _lastObjectRendered: DisplayObject;
+
+ constructor(system: string, width?: number, height?: number, options?: RendererOptions);
+
+ type: number;
+ width: number;
+ height: number;
+ view: HTMLCanvasElement;
+ resolution: number;
+ transparent: boolean;
+ autoResize: boolean;
+ blendModes: any; //todo?
+ preserveDrawingBuffer: boolean;
+ clearBeforeRender: boolean;
+ backgroundColor: number;
+
+ render(object: DisplayObject): void;
+ resize(width: number, height: number): void;
+ destroy(removeView?: boolean): void;
+
+ }
+ export class CanvasRenderer extends SystemRenderer {
+
+ protected renderDisplayObject(displayObject: DisplayObject, context: CanvasRenderingContext2D): void;
+ protected _mapBlendModes(): void;
+
+ constructor(width?: number, height?: number, options?: RendererOptions);
+
+ context: CanvasRenderingContext2D;
+ refresh: boolean;
+ maskManager: CanvasMaskManager;
+ roundPixels: boolean;
+ currentScaleMode: number;
+ currentBlendMode: number;
+ smoothProperty: string;
+
+ render(object: DisplayObject): void;
+ resize(w: number, h: number): void;
+
+ }
+ export class CanvasBuffer {
+
+ protected clear(): void;
+
+ constructor(width: number, height: number);
+
+ canvas: HTMLCanvasElement;
+ context: CanvasRenderingContext2D;
+
+ width: number;
+ height: number;
+
+ resize(width: number, height: number): void;
+ destroy(): void;
+
+ }
+ export class CanvasGraphics {
+
+ static renderGraphicsMask(graphics: Graphics, context: CanvasRenderingContext2D): void;
+ static updateGraphicsTint(graphics: Graphics): void;
+
+ static renderGraphics(graphics: Graphics, context: CanvasRenderingContext2D): void;
+
+ }
+ export class CanvasMaskManager {
+
+ pushMask(maskData: any, renderer: WebGLRenderer | CanvasRenderer): void;
+ popMask(renderer: WebGLRenderer | CanvasRenderer): void;
+ destroy(): void;
+
+ }
+ export class CanvasTinter {
+
+ static getTintedTexture(sprite: DisplayObject, color: number): HTMLCanvasElement;
+ static tintWithMultiply(texture: Texture, color: number, canvas: HTMLDivElement): void;
+ static tintWithOverlay(texture: Texture, color: number, canvas: HTMLCanvasElement): void;
+ static tintWithPerPixel(texture: Texture, color: number, canvas: HTMLCanvasElement): void;
+ static roundColor(color: number): number;
+ static cacheStepsPerColorChannel: number;
+ static convertTintToImage: boolean;
+ static vanUseMultiply: boolean;
+ static tintMethod: Function;
+
+ }
+ export class WebGLRenderer extends SystemRenderer {
+
+ protected _useFXAA: boolean;
+ protected _FXAAFilter: filters.FXAAFilter;
+ protected _contextOptions: {
+ alpha: boolean;
+ antiAlias: boolean;
+ premultipliedAlpha: boolean;
+ stencil: boolean;
+ preseveDrawingBuffer: boolean;
+ }
+ protected _renderTargetStack: RenderTarget[];
+
+ protected _initContext(): void;
+ protected _createContext(): void;
+ protected handleContextLost: (event: WebGLContextEvent) => void;
+ protected _mapGlModes(): void;
+
+ constructor(width?: number, height?: number, options?: RendererOptions);
+
+ drawCount: number;
+ shaderManager: ShaderManager;
+ maskManager: MaskManager;
+ stencilManager: StencilManager;
+ filterManager: FilterManager;
+ blendModeManager: BlendModeManager;
+ currentRenderTarget: RenderTarget;
+ currentRenderer: ObjectRenderer;
+
+ render(object: DisplayObject): void;
+ renderDisplayObject(displayObject: DisplayObject, renderTarget: RenderTarget, clear: boolean): void;
+ setObjectRenderer(objectRenderer: ObjectRenderer): void;
+ setRenderTarget(renderTarget: RenderTarget): void;
+ updateTexture(texture: BaseTexture | Texture): BaseTexture | Texture;
+ destroyTexture(texture: BaseTexture | Texture): void;
+
+ }
+ export class AbstractFilter {
+
+ protected vertexSrc: string[];
+ protected fragmentSrc: string[];
+
+ constructor(vertexSrc?: string | string[], fragmentSrc?: string | string[], uniforms?: any);
+
+ uniforms: any;
+
+ padding: number;
+
+ getShader(renderer: WebGLRenderer): Shader;
+ applyFilter(renderer: WebGLRenderer, input: RenderTarget, output: RenderTarget, clear?: boolean): void;
+ syncUniform(uniform: WebGLUniformLocation): void;
+
+ }
+ export class SpriteMaskFilter extends AbstractFilter {
+
+ constructor(sprite: Sprite);
+
+ maskSprite: Sprite;
+ maskMatrix: Matrix;
+
+ applyFilter(renderer: WebGLRenderbuffer, input: RenderTarget, output: RenderTarget): void;
+ map: Texture;
+ offset: Point;
+
+ }
+ export class BlendModeManager extends WebGLManager {
+
+ constructor(renderer: WebGLRenderer);
+
+ setBlendMode(blendMode: number): boolean;
+
+ }
+
+ export class FilterManager extends WebGLManager {
+
+ constructor(renderer: WebGLRenderer);
+
+ filterStack: any[];
+ renderer: WebGLRenderer;
+ texturePool: any[];
+
+ onContextChange: () => void;
+ setFilterStack(filterStack: any[]): void;
+ pushFilter(target: RenderTarget, filters: any[]): void;
+ popFilter(): AbstractFilter;
+ getRenderTarget(clear?: boolean): RenderTarget;
+ protected returnRenderTarget(renderTarget: RenderTarget): void;
+ applyFilter(shader: Shader, inputTarget: RenderTarget, outputTarget: RenderTarget, clear?: boolean): void;
+ calculateMappedMatrix(filterArea: Rectangle, sprite: Sprite, outputMatrix?: Matrix): Matrix;
+ capFilterArea(filterArea: Rectangle): void;
+ resize(width: number, height: number): void;
+ destroy(): void;
+
+ }
+
+ export class MaskManager extends WebGLManager {
+
+ stencilStack: StencilMaskStack;
+ reverse: boolean;
+ count: number;
+ alphaMaskPool: any[];
+
+ pushMask(target: RenderTarget, maskData: any): void;
+ popMask(target: RenderTarget, maskData: any): void;
+ pushSpriteMask(target: RenderTarget, maskData: any): void;
+ popSpriteMask(): void;
+ pushStencilMask(target: RenderTarget, maskData: any): void;
+ popStencilMask(target: RenderTarget, maskData: any): void;
+
+ }
+ export class ShaderManager extends WebGLManager {
+
+ protected _currentId: number;
+ protected currentShader: Shader;
+
+ constructor(renderer: WebGLRenderer);
+
+ maxAttibs: number;
+ attribState: any[];
+ tempAttribState: any[];
+ stack: any[];
+
+ setAttribs(attribs: any[]): void;
+ setShader(shader: Shader): boolean;
+ destroy(): void;
+
+ }
+ export class StencilManager extends WebGLManager {
+
+ constructor(renderer: WebGLRenderer);
+
+ setMaskStack(stencilMaskStack: StencilMaskStack): void;
+ pushStencil(graphics: Graphics, webGLData: WebGLGraphicsData): void;
+ bindGraphics(graphics: Graphics, webGLData: WebGLGraphicsData): void;
+ popStencil(graphics: Graphics, webGLData: WebGLGraphicsData): void;
+ destroy(): void;
+ pushMask(maskData: any[]): void;
+ popMask(maskData: any[]): void;
+
+ }
+ export class WebGLManager {
+
+ protected onContextChange: () => void;
+
+ constructor(renderer: WebGLRenderer);
+
+ renderer: WebGLRenderer;
+
+ destroy(): void;
+
+ }
+ export class Shader {
+
+ protected attributes: any;
+ protected textureCount: number;
+ protected uniforms: any;
+
+ protected _glCompile(type: any, src: any): Shader;
+
+ constructor(shaderManager: ShaderManager, vertexSrc: string, fragmentSrc: string, uniforms: any, attributes: any);
+
+ uuid: number;
+ gl: WebGLRenderingContext;
+ shaderManager: ShaderManager;
+ program: WebGLProgram;
+ vertexSrc: string;
+ fragmentSrc: string;
+
+ init(): void;
+ cachUniformLocations(keys: string): void;
+ cacheAttributeLocations(keys: string): void;
+ compile(): WebGLProgram;
+ syncUniform(uniform: any): void;
+ syncUniforms(): void;
+ initSampler2D(uniform: any): void;
+ destroy(): void;
+
+ }
+ export class ComplexPrimitiveShader extends Shader {
+
+ constructor(shaderManager: ShaderManager);
+
+ }
+ export class PrimitiveShader extends Shader {
+
+ constructor(shaderManager: ShaderManager);
+
+ }
+ export class TextureShader extends Shader {
+
+ constructor(shaderManager: ShaderManager, vertexSrc?: string, fragmentSrc?: string, customUniforms?: any, customAttributes?: any);
+
+ }
+ export interface StencilMaskStack {
+
+ stencilStack: any[];
+ reverse: boolean;
+ count: number;
+
+ }
+ export class ObjectRenderer extends WebGLManager {
+
+ start(): void;
+ stop(): void;
+ flush(): void;
+ render(object?: any): void;
+
+ }
+ export class RenderTarget {
+
+ constructor(gl: WebGLRenderingContext, width: number, height: number, scaleMode: number, resolution: number, root: boolean);
+
+ gl: WebGLRenderingContext;
+ frameBuffer: WebGLFramebuffer;
+ texture: Texture;
+ size: Rectangle;
+ resolution: number;
+ projectionMatrix: Matrix;
+ transform: Matrix;
+ frame: Rectangle;
+ stencilBuffer: WebGLRenderbuffer;
+ stencilMaskStack: StencilMaskStack;
+ filterStack: any[];
+ scaleMode: number;
+ root: boolean;
+
+ clear(bind?: boolean): void;
+ attachStencilBuffer(): void;
+ activate(): void;
+ calculateProjection(protectionFrame: Matrix): void;
+ resize(width: number, height: number): void;
+ destroy(): void;
+
+ }
+ export interface Quad {
+
+ gl: WebGLRenderingContext;
+ vertices: number[];
+ uvs: number[];
+ colors: number[];
+ indices: number[];
+ vertexBuffer: WebGLBuffer;
+ indexBuffer: WebGLBuffer;
+
+ map(rect: Rectangle, rect2: Rectangle): void;
+ upload(): void;
+
+ }
+
+ //sprites
+
+ export class Sprite extends Container {
+
+ static fromFrame(frameId: string): Sprite;
+ static fromImage(imageId: string, crossorigin?: boolean, scaleMode?: number): Sprite;
+
+ protected _texture: Texture;
+ protected _width: number;
+ protected _height: number;
+ protected cachedTint: number;
+
+ protected _onTextureUpdate(): void;
+
+ constructor(texture?: Texture);
+
+ anchor: Point;
+ tint: number;
+ blendMode: number;
+ shader: Shader;
+ texture: Texture;
+
+ width: number;
+ height: number;
+
+ getBounds(matrix?: Matrix): Rectangle;
+ getLocalBounds(): Rectangle;
+ containsPoint(point: Point): boolean;
+ destroy(destroyTexture?: boolean, destroyBaseTexture?: boolean): void;
+
+ }
+ export class SpriteRenderer extends ObjectRenderer {
+
+ protected renderBatch(texture: Texture, size: number, startIndex: number): void;
+
+ vertSize: number;
+ vertByteSize: number;
+ size: number;
+ vertices: number[];
+ positions: number[];
+ colors: number[];
+ indices: number[];
+ currentBatchSize: number;
+ sprites: Sprite[];
+ shader: Shader;
+
+ render(sprite: Sprite): void;
+ flush(): void;
+ start(): void;
+ destroy(): void;
+
+ }
+
+ //text
+
+ export interface TextStyle {
+
+ font?: string;
+ fill?: string | number;
+ align?: string;
+ stroke?: string | number;
+ strokeThickness?: number;
+ wordWrap?: boolean;
+ wordWrapWidth?: number;
+ lineHeight?: number;
+ dropShadow?: boolean;
+ dropShadowColor?: string | number;
+ dropShadowAngle?: number;
+ dropShadowDistance?: number;
+ padding?: number;
+ textBaseline?: string;
+ lineJoin?: string;
+ miterLimit?: number;
+
+ }
+ export class Text extends Sprite {
+
+ static fontPropertiesCache: any;
+ static fontPropertiesCanvas: HTMLCanvasElement;
+ static fontPropertiesContext: CanvasRenderingContext2D;
+
+ protected _text: string;
+ protected _style: TextStyle;
+
+ protected updateText(): void;
+ protected updateTexture(): void;
+ protected determineFontProperties(fontStyle: TextStyle): TextStyle;
+ protected wordWrap(text: string): boolean;
+
+ constructor(text?: string, style?: TextStyle, resolution?: number);
+
+ canvas: HTMLCanvasElement;
+ context: CanvasRenderingContext2D;
+ dirty: boolean;
+ resolution: number;
+ text: string;
+ style: TextStyle;
+
+ width: number;
+ height: number;
+
+ }
+
+ //textures
+
+ export class BaseTexture extends EventEmitter {
+
+ static fromImage(imageUrl: string, crossorigin?: boolean, scaleMode?: number): BaseTexture;
+ static fromCanvas(canvas: HTMLCanvasElement, scaleMode?: number): BaseTexture;
+
+ protected _glTextures: any[];
+
+ protected _sourceLoaded(): void;
+
+ constructor(source: HTMLImageElement | HTMLCanvasElement, scaleMode?: number, resolution?: number);
+
+ uuid: number;
+ resolution: number;
+ width: number;
+ height: number;
+ realWidth: number;
+ realHeight: number;
+ scaleMode: number;
+ hasLoaded: boolean;
+ isLoading: boolean;
+ source: HTMLImageElement | HTMLCanvasElement;
+ premultipliedAlpha: boolean;
+ imageUrl: string;
+ isPowerOfTwo: boolean;
+ mipmap: boolean;
+
+ update(): void;
+ loadSource(source: HTMLImageElement | HTMLCanvasElement): void;
+ destroy(): void;
+ dispose(): void;
+ updateSourceImage(newSrc: string): void;
+
+ on(event: 'dispose', fn: (baseTexture: BaseTexture) => void, context?: any): EventEmitter;
+ on(event: 'error', fn: (baseTexture: BaseTexture) => void, context?: any): EventEmitter;
+ on(event: 'loaded', fn: (baseTexture: BaseTexture) => void, context?: any): EventEmitter;
+ on(event: 'update', fn: (baseTexture: BaseTexture) => void, context?: any): EventEmitter;
+ on(event: string, fn: Function, context?: any): EventEmitter;
+
+ once(event: 'dispose', fn: (baseTexture: BaseTexture) => void, context?: any): EventEmitter;
+ once(event: 'error', fn: (baseTexture: BaseTexture) => void, context?: any): EventEmitter;
+ once(event: 'loaded', fn: (baseTexture: BaseTexture) => void, context?: any): EventEmitter;
+ once(event: 'update', fn: (baseTexture: BaseTexture) => void, context?: any): EventEmitter;
+ once(event: string, fn: Function, context?: any): EventEmitter;
+
+ }
+ export class RenderTexture extends Texture {
+
+ protected renderWebGL(displayObject: DisplayObject, matrix?: Matrix, clear?: boolean, updateTransform?: boolean): void;
+ protected renderCanvas(displayObject: DisplayObject, matrix?: Matrix, clear?: boolean, updateTransform?: boolean): void;
+
+ constructor(renderer: CanvasRenderer | WebGLRenderer, width?: number, height?: number, scaleMode?: number, resolution?: number);
+
+ width: number;
+ height: number;
+ resolution: number;
+ renderer: CanvasRenderer | WebGLRenderer;
+ valid: boolean;
+
+ render(displayObject: DisplayObject, matrix?: Matrix, clear?: boolean, updateTransform?: boolean): void;
+ resize(width: number, height: number, updateBase?: boolean): void;
+ clear(): void;
+ destroy(): void;
+ getImage(): HTMLImageElement;
+ getPixels(): number[];
+ getPixel(x: number, y: number): number[];
+ getBase64(): string;
+ getCanvas(): HTMLCanvasElement;
+
+ }
+ export class Texture extends BaseTexture {
+
+ static fromImage(imageUrl: string, crossOrigin?: boolean, scaleMode?: number): Texture;
+ static fromFrame(frameId: string): Texture;
+ static fromCanvas(canvas: HTMLCanvasElement, scaleMode?: number): Texture;
+ static fromVideo(video: HTMLVideoElement | string, scaleMode?: number): Texture;
+ static fromVideoUrl(videoUrl: string, scaleMode?: number): Texture;
+ static addTextureToCache(texture: Texture, id: string): void;
+ static removeTextureFromCache(id: string): Texture;
+ static EMPTY: Texture;
+
+ protected _frame: Rectangle;
+ protected _uvs: TextureUvs;
+
+ protected onBaseTextureUpdated(baseTexture: BaseTexture): void;
+ protected onBaseTextureLoaded(baseTexture: BaseTexture): void;
+ protected _updateUvs(): void;
+
+ constructor(baseTexture: BaseTexture, frame?: Rectangle, crop?: Rectangle, trim?: Rectangle, rotate?: boolean);
+
+ noFrame: boolean;
+ baseTexture: BaseTexture;
+ trim: Rectangle;
+ valid: boolean;
+ requiresUpdate: boolean;
+ width: number;
+ height: number;
+ crop: Rectangle;
+ rotate: boolean;
+
+ frame: Rectangle;
+
+ update(): void;
+ destroy(destroyBase?: boolean): void;
+ clone(): Texture;
+
+ }
+ export class TextureUvs {
+
+ x0: number;
+ y0: number;
+ x1: number;
+ y1: number;
+ x2: number;
+ y2: number;
+ x3: number;
+ y3: number;
+
+ set(frame: Rectangle, baseFrame: Rectangle, rotate: boolean): void;
+
+ }
+ export class VideoBaseTexture extends BaseTexture {
+
+ static fromVideo(video: HTMLVideoElement, scaleMode?: number): VideoBaseTexture;
+ static fromUrl(videoSrc: string | any | string[]| any[]): VideoBaseTexture;
+
+ protected _loaded: boolean;
+
+ protected _onUpdate(): void;
+ protected _onPlayStart(): void;
+ protected _onPlayStop(): void;
+ protected _onCanPlay(): void;
+
+ constructor(source: HTMLVideoElement, scaleMode?: number);
+
+ autoUpdate: boolean;
+
+ destroy(): void;
+
+ }
+
+ //utils
+
+ export class utils {
+
+ static uuid(): number;
+ static hex2rgb(hex: number, out?: number[]): number[];
+ static hex2String(hex: number): string;
+ static rbg2hex(rgb: Number[]): number;
+ static canUseNewCanvasBlendModel(): boolean;
+ static getNextPowerOfTwo(number: number): number;
+ static isPowerOfTwo(width: number, height: number): boolean;
+ static getResolutionOfUrl(url: string): boolean;
+ static sayHello(type: string): void;
+ static isWebGLSupported(): boolean;
+ static sign(n: number): number;
+ static TextureCache: any;
+ static BaseTextureCache: any;
+
+ }
+
+ //////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////EXTRAS////////////////////////////////////////////
+ //////////////////////////////////////////////////////////////////////////////
+
+ export module extras {
+
+ export interface BitmapTextStyle {
+
+ font?: string | {
+
+ name?: string;
+ size?: number;
+
+ };
+ align?: string;
+ tint?: number;
+
+ }
+ export class BitmapText extends Container {
+
+ static fonts: any;
+
+ protected _glyphs: Sprite[];
+ protected _font: string | {
+ tint: number;
+ align: string;
+ name: string;
+ size: number;
+ }
+ protected _text: string;
+
+ protected updateText(): void;
+
+ constructor(text: string, style?: BitmapTextStyle);
+
+ textWidth: number;
+ textHeight: number;
+ maxWidth: number;
+ dirty: boolean;
+
+ tint: number;
+ align: string;
+ font: string | {
+ tint: number;
+ align: string;
+ name: string;
+ size: number;
+ }
+ text: string;
+
+ }
+ export class MovieClip extends Sprite {
+
+ static fromFrames(frame: string[]): MovieClip;
+ static fromImages(images: string[]): MovieClip;
+
+ protected _textures: Texture;
+ protected _currentTime: number;
+
+ protected update(deltaTime: number): void;
+
+ constructor(textures: Texture[]);
+
+ animationSpeed: number;
+ loop: boolean;
+ onComplete: () => void;
+ currentFrame: number;
+ playing: boolean;
+
+ totalFrames: number;
+ textures: Texture[];
+
+ stop(): void;
+ play(): void;
+ gotoAndStop(frameName: number): void;
+ gotoAndPlay(frameName: number): void;
+ destroy(): void;
+
+ }
+ export class TilingSprite extends Sprite {
+
+ //This is really unclean but is the only way :(
+ //See http://stackoverflow.com/questions/29593905/typescript-declaration-extending-class-with-static-method/29595798#29595798
+ //Thanks bas!
+ static fromFrame(frameId: string): Sprite;
+ static fromImage(imageId: string, crossorigin?: boolean, scaleMode?: number): Sprite;
+
+ static fromFrame(frameId: string, width?: number, height?: number): TilingSprite;
+ static fromImage(imageId: string, width?: number, height?: number, crossorigin?: boolean, scaleMode?: number): TilingSprite;
+
+ protected _tileScaleOffset: Point;
+ protected _tilingTexture: boolean;
+ protected _refreshTexture: boolean;
+ protected _uvs: TextureUvs[];
+
+ constructor(texture: Texture, width: number, height: number);
+
+ tileScale: Point;
+ tilePosition: Point;
+
+ width: number;
+ height: number;
+ originalTexture: Texture;
+
+ getBounds(): Rectangle;
+ generateTilingTexture(renderer: WebGLRenderer | CanvasRenderer, texture: Texture, forcePowerOfTwo?: boolean): Texture;
+ containsPoint(point: Point): boolean;
+ destroy(): void;
+
+ }
+
+ }
+
+ //////////////////////////////////////////////////////////////////////////////
+ ///////////////////////////////FILTERS////////////////////////////////////////
+ //////////////////////////////////////////////////////////////////////////////
+
+ module filters {
+
+ export class AsciiFilter extends AbstractFilter {
+ size: number;
+ }
+ export class BloomFilter extends AbstractFilter {
+
+ blur: number;
+ blurX: number;
+ blurY: number;
+
+ }
+ export class BlurFilter extends AbstractFilter {
+
+ protected blurXFilter: BlurXFilter;
+ protected blurYFilter: BlurYFilter;
+
+ blur: number;
+ passes: number;
+ blurX: number;
+ blurY: number;
+
+ }
+ export class BlurXFilter extends AbstractFilter {
+
+ passes: number;
+ strength: number;
+ blur: number;
+
+ }
+ export class BlurYFilter extends AbstractFilter {
+
+ passes: number;
+ strength: number;
+ blur: number;
+
+ }
+ export class SmartBlurFilter extends AbstractFilter {
+
+ }
+ export class ColorMatrixFilter extends AbstractFilter {
+
+ protected _loadMatrix(matrix: number[], multiply: boolean): void;
+ protected _multiply(out: number[], a: number[], b: number[]): void;
+ protected _colorMatrix(matrix: number[]): void;
+
+ matrix: number[];
+
+ brightness(b: number, multiply?: boolean): void;
+ greyscale(scale: number, multiply?: boolean): void;
+ blackAndWhite(multiply?: boolean): void;
+ hue(rotation: number, multiply?: boolean): void;
+ contrast(amount: number, multiply?: boolean): void;
+ saturate(amount: number, multiply?: boolean): void;
+ desaturate(multiply?: boolean): void;
+ negative(multiply?: boolean): void;
+ sepia(multiply?: boolean): void;
+ technicolor(multiply?: boolean): void;
+ polaroid(multiply?: boolean): void;
+ toBGR(multiply?: boolean): void;
+ kodachrome(multiply?: boolean): void;
+ browni(multiply?: boolean): void;
+ vintage(multiply?: boolean): void;
+ colorTone(desaturation: number, toned: number, lightColor: string, darkColor: string, multiply?: boolean): void;
+ night(intensity: number, multiply?: boolean): void;
+ predator(amount: number, multiply?: boolean): void;
+ lsd(multiply?: boolean): void;
+ reset(): void;
+
+ }
+ export class ColorStepFilter extends AbstractFilter {
+
+ step: number;
+
+ }
+ export class ConvolutionFilter extends AbstractFilter {
+
+ constructor(matrix: number[], width: number, height: number);
+
+ matrix: number[];
+ width: number;
+ height: number;
+
+ }
+ export class CrossHatchFilter extends AbstractFilter {
+
+ }
+ export class DisplacementFilter extends AbstractFilter {
+
+ constructor(sprite: Sprite, scale?: number);
+
+ map: Texture;
+
+ scale: Point;
+
+ }
+ export class DotScreenFilter extends AbstractFilter {
+
+ scale: number;
+ angle: number;
+
+ }
+ export class BlurYTintFilter extends AbstractFilter {
+
+ blur: number;
+
+ }
+ export class DropShadowFilter extends AbstractFilter {
+
+ blur: number;
+ blurX: number;
+ blurY: number;
+ color: number;
+ alpha: number;
+ distance: number;
+ angle: number;
+
+ }
+ export class GrayFilter extends AbstractFilter {
+
+ gray: number;
+
+ }
+ export class InvertFilter extends AbstractFilter {
+
+ invert: number;
+
+ }
+ export class NoiseFilter extends AbstractFilter {
+
+ noise: number;
+
+ }
+ export class PixelateFilter extends AbstractFilter {
+
+ size: Point;
+
+ }
+ export class RGBSplitFilter extends AbstractFilter {
+
+ red: number;
+ green: number;
+ blue: number;
+
+ }
+ export class SepiaFilter extends AbstractFilter {
+
+ sepia: number;
+
+ }
+ export class ShockwaveFilter extends AbstractFilter {
+
+ center: number[];
+ params: any;
+ time: number;
+
+ }
+ export class TiltShiftAxisFilter extends AbstractFilter {
+
+ blur: number;
+ gradientBlur: number;
+ start: number;
+ end: number;
+
+ updateDelta(): void;
+
+ }
+ export class TiltShiftFilter extends AbstractFilter {
+
+ blur: number;
+ gradientBlur: number;
+ start: number;
+ end: number;
+
+ }
+ export class TiltShiftXFilter extends AbstractFilter {
+
+ updateDelta(): void;
+
+ }
+ export class TiltShiftYFilter extends AbstractFilter {
+
+ updateDelta(): void;
+
+ }
+ export class TwistFilter extends AbstractFilter {
+
+ offset: Point;
+ radius: number;
+ angle: number;
+
+ }
+ export class FXAAFilter extends AbstractFilter {
+
+ applyFilter(renderer: WebGLRenderer, input: RenderTarget, output: RenderTarget): void;
+
+ }
+ }
+
+ //////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////INTERACTION///////////////////////////////////////
+ //////////////////////////////////////////////////////////////////////////////
+
+ export module interaction {
+
+ export interface InteractionEvent {
+
+ stopped: boolean;
+ target: any;
+ type: string;
+ data: InteractionData;
+ stopPropagation(): void;
+
+ }
+
+ export class InteractionData {
+
+ global: Point;
+ target: DisplayObject;
+ originalEvent: Event;
+
+ getLocalPosition(displayObject: DisplayObject, point?: Point, globalPos?: Point): Point;
+
+ }
+
+ export class InteractionManager {
+
+ protected interactionDOMElement: HTMLElement;
+ protected eventsAdded: boolean;
+ protected _tempPoint: Point;
+
+ protected setTargetElement(element: HTMLElement, resolution: number): void;
+ protected addEvents(): void;
+ protected removeEvents(): void;
+ protected dispatchEvent(displayObject: DisplayObject, eventString: string, eventData: any): void;
+ protected onMouseDown: (event: Event) => void;
+ protected processMouseDown: (displayObject: DisplayObject, hit: boolean) => void;
+ protected onMouseUp: (event: Event) => void;
+ protected processMouseUp: (displayObject: DisplayObject, hit: boolean) => void;
+ protected onMouseMove: (event: Event) => void;
+ protected processMouseMove: (displayObject: DisplayObject, hit: boolean) => void;
+ protected onMouseOut: (event: Event) => void;
+ protected processMouseOverOut: (displayObject: DisplayObject, hit: boolean) => void;
+ protected onTouchStart: (event: Event) => void;
+ protected processTouchStart: (DisplayObject: DisplayObject, hit: boolean) => void;
+ protected onTouchEnd: (event: Event) => void;
+ protected processTouchEnd: (displayObject: DisplayObject, hit: boolean) => void;
+ protected onTouchMove: (event: Event) => void;
+ protected processTouchMove: (displayObject: DisplayObject, hit: boolean) => void;
+ protected getTouchData(touchEvent: InteractionData): InteractionData;
+ protected returnTouchData(touchData: InteractionData): void;
+
+ constructor(renderer: CanvasRenderer | WebGLRenderer, options?: { autoPreventDefault?: boolean; interactionFrequence?: number; });
+
+ renderer: CanvasRenderer | WebGLRenderer;
+ autoPreventDefault: boolean;
+ interactionFrequency: number;
+ mouse: InteractionData;
+ eventData: {
+ stopped: boolean;
+ target: any;
+ type: any;
+ data: InteractionData;
+ };
+ interactiveDataPool: InteractionData[];
+ last: number;
+ currentCursorStyle: string;
+ resolution: number;
+ update(deltaTime: number): void;
+
+ mapPositionToPoint(point: Point, x: number, y: number): void;
+ processInteractive(point: Point, displayObject: DisplayObject, func: (displayObject: DisplayObject, hit: boolean) => void, hitTest: boolean, interactive: boolean): boolean;
+ destroy(): void;
+
+ }
+
+ export interface InteractiveTarget {
+
+ interactive: boolean;
+ buttonMode: boolean;
+ interactiveChildren: boolean;
+ defaultCursor: string;
+ hitArea: HitArea;
+
+ }
+
+ }
+
+ //////////////////////////////////////////////////////////////////////////////
+ ///////////////////////////////LOADER/////////////////////////////////////////
+ //////////////////////////////////////////////////////////////////////////////
+ //https://github.com/englercj/resource-loader/blob/master/src/Loader.js
+
+ export module loaders {
+ export interface LoaderOptions {
+
+ crossOrigin?: boolean;
+ loadType?: number;
+ xhrType?: string;
+
+ }
+ export class Loader extends EventEmitter {
+
+ constructor(baseUrl?: string, concurrency?: number);
+
+ baseUrl: string;
+ progress: number;
+ loading: boolean;
+ resources: Resource[];
+
+ add(name: string, url: string, options?: LoaderOptions, cb?: () => void): Loader;
+ add(url: string, options?: LoaderOptions, cb?: () => void): Loader;
+ //todo I am not sure of object literal notional (or its options) so just allowing any but would love to improve this
+ add(obj: any, options?: LoaderOptions, cb?: () => void): Loader;
+
+ on(event: 'complete', fn: (loader: loaders.Loader, object: any) => void, context?: any): EventEmitter;
+ on(event: 'error', fn: (error: Error, loader: loaders.Loader, resource: Resource) => void, context?: any): EventEmitter;
+ on(event: 'load', fn: (loader: loaders.Loader, resource: Resource) => void, context?: any): EventEmitter;
+ on(event: 'progress', fn: (loader: loaders.Loader, resource: Resource) => void, context?: any): EventEmitter;
+ on(event: 'start', fn: (loader: loaders.Loader) => void, context?: any): EventEmitter;
+ on(event: string, fn: Function, context?: any): EventEmitter;
+
+ once(event: 'complete', fn: (loader: loaders.Loader, object: any) => void, context?: any): EventEmitter;
+ once(event: 'error', fn: (error: Error, loader: loaders.Loader, resource: Resource) => void, context?: any): EventEmitter;
+ once(event: 'load', fn: (loader: loaders.Loader, resource: Resource) => void, context?: any): EventEmitter;
+ once(event: 'progress', fn: (loader: loaders.Loader, resource: Resource) => void, context?: any): EventEmitter;
+ once(event: 'start', fn: (loader: loaders.Loader) => void, context?: any): EventEmitter;
+ once(event: string, fn: Function, context?: any): EventEmitter;
+
+ before(fn: Function): Loader;
+ pre(fn: Function): Loader;
+
+ after(fn: Function): Loader;
+ use(fn: Function): Loader;
+
+ reset(): void;
+
+ load(cb?: (loader: loaders.Loader, object: any) => void): Loader;
+
+ }
+ export class Resource extends EventEmitter {
+
+ static LOAD_TYPE: {
+ XHR: number;
+ IMAGE: number;
+ AUDIO: number;
+ VIDEO: number;
+ };
+
+ static XHR_READ_STATE: {
+ UNSENT: number;
+ OPENED: number;
+ HEADERS_RECIEVED: number;
+ LOADING: number;
+ DONE: number;
+ };
+
+ static XHR_RESPONSE_TYPE: {
+ DEFAULT: number;
+ BUFFER: number;
+ BLOB: number;
+ DOCUMENT: number;
+ JSON: number;
+ TEXT: number;
+ };
+
+ constructor(name?: string, url?: string | string[], options?: LoaderOptions);
+
+ name: string;
+ texture: Texture;
+ url: string;
+ data: any;
+ crossOrigin: string;
+ loadType: number;
+ xhrType: string;
+ error: Error;
+ xhr: XMLHttpRequest;
+
+ complete(): void;
+ load(cb?: () => void): void;
+
+ }
+ }
+
+ //////////////////////////////////////////////////////////////////////////////
+ ///////////////////////////////MESH///////////////////////////////////////////
+ //////////////////////////////////////////////////////////////////////////////
+
+ export module mesh {
+
+ export class Mesh extends Container {
+
+ static DRAW_MODES: {
+ TRIANGLE_MESH: number;
+ TRIANGLES: number;
+ }
+
+ constructor(texture: Texture, vertices?: number[], uvs?: number[], indices?: number[], drawMode?: number);
+
+ texture: Texture;
+ uvs: number[];
+ vertices: number[];
+ indices: number[];
+ dirty: boolean;
+ blendMode: number;
+ canvasPadding: number;
+ drawMode: number;
+
+ getBounds(matrix?: Matrix): Rectangle;
+ containsPoint(point: Point): boolean;
+
+ protected _texture: Texture;
+
+ protected _renderCanvasTriangleMesh(context: CanvasRenderingContext2D): void;
+ protected _renderCanvasTriangles(context: CanvasRenderingContext2D): void;
+ protected _renderCanvasDrawTriangle(context: CanvasRenderingContext2D, vertices: number, uvs: number, index0: number, index1: number, index2: number): void;
+ protected renderMeshFlat(Mesh: Mesh): void;
+ protected _onTextureUpdate(): void;
+
+ }
+ export class Rope extends Mesh {
+
+ protected _ready: boolean;
+
+ protected getTextureUvs(): TextureUvs;
+
+ constructor(texture: Texture, points: Point[]);
+
+ points: Point[];
+ colors: number[];
+
+ refresh(): void;
+
+ }
+
+ export class MeshRenderer extends ObjectRenderer {
+
+ protected _initWebGL(mesh: Mesh): void;
+
+ indices: number[];
+
+ constructor(renderer: WebGLRenderer);
+
+ render(mesh: Mesh): void;
+ flush(): void;
+ start(): void;
+ destroy(): void;
+
+ }
+
+ export interface MeshShader extends Shader { }
+
+ }
+
+ module ticker {
+
+ export var shared: Ticker;
+
+ export class Ticker {
+
+ protected _tick(time: number): void;
+ protected _emitter: EventEmitter;
+ protected _requestId: number;
+ protected _maxElapsedMS: number;
+
+ protected _requestIfNeeded(): void;
+ protected _cancelIfNeeded(): void;
+ protected _startIfPossible(): void;
+
+ autoStart: boolean;
+ deltaTime: number;
+ elapsedMS: number;
+ lastTime: number;
+ speed: number;
+ started: boolean;
+
+ FPS: number;
+ minFPS: number;
+
+ add(fn: (deltaTime: number) => void, context?: any): Ticker;
+ addOnce(fn: (deltaTime: number) => void, context?: any): Ticker;
+ remove(fn: (deltaTime: number) => void, context?: any): Ticker;
+ start(): void;
+ stop(): void;
+ update(): void;
+
+ }
+
+ }
+}
+
+declare module 'pixi.js' {
+ export = PIXI;
+}
\ No newline at end of file
diff --git a/pixi/pixi-tests.ts b/pixi/pixi-tests.ts
deleted file mode 100644
index 6600bb121..000000000
--- a/pixi/pixi-tests.ts
+++ /dev/null
@@ -1,1193 +0,0 @@
-///
-
-function PixiTests()
-{
-
-var stage = new PIXI.Stage(0xFFFFFF, true);
-
-stage.interactive = true;
-
-var bg = PIXI.Sprite.fromImage("BGrotate.jpg");
-bg.anchor.x = 0.5;
-bg.anchor.y = 0.5;
-
-bg.position.x = 620/2;
-bg.position.y = 380/2;
-
-stage.addChild(bg);
-
-var container = new PIXI.DisplayObjectContainer();
-container.position.x = 620/2;
-container.position.y = 380/2;
-
-var bgFront = PIXI.Sprite.fromImage("SceneRotate.jpg");
-bgFront.anchor.x = 0.5;
-bgFront.anchor.y = 0.5;
-
-container.addChild(bgFront);
-
-var light2 = PIXI.Sprite.fromImage("LightRotate2.png");
-light2.anchor.x = 0.5;
-light2.anchor.y = 0.5;
-container.addChild(light2);
-
-var light1 = PIXI.Sprite.fromImage("LightRotate1.png");
-light1.anchor.x = 0.5;
-light1.anchor.y = 0.5;
-container.addChild(light1);
-
-var panda = PIXI.Sprite.fromImage("panda.png");
-panda.anchor.x = 0.5;
-panda.anchor.y = 0.5;
-
-container.addChild(panda);
-
-stage.addChild(container);
-
-// create a renderer instance
-var renderer = PIXI.autoDetectRenderer(620, 380);
-
-renderer.view.style.position = "absolute"
-renderer.view.style.marginLeft = "-310px";
-renderer.view.style.marginTop = "-190px";
-renderer.view.style.top = "50%";
-renderer.view.style.left = "50%";
-renderer.view.style.display = "block";
-
-// add render view to DOM
-document.body.appendChild(renderer.view);
-
-// lets create moving shape
-var thing = new PIXI.Graphics();
-stage.addChild(thing);
-thing.position.x = 620/2;
-thing.position.y = 380/2;
-thing.lineStyle(0);
-
-container.mask = thing;
-
-var count = 0;
-
-stage.click = stage.tap = function()
-{
- if(!container.filter)
- {
- container.mask = thing;
- PIXI.runList(stage);
- }
- else
- {
- container.mask = null;
- }
-}
-
-/*
- * Add a pixi Logo!
- */
-var logo = PIXI.Sprite.fromImage("../../logo_small.png")
-stage.addChild(logo);
-
-logo.anchor.x = 1;
-logo.position.x = 620
-logo.scale.x = logo.scale.y = 0.5;
-logo.position.y = 320
-logo.interactive = true;
-logo.buttonMode = true;
-
-logo.click = logo.tap = function()
-{
- window.open("https://github.com/GoodBoyDigital/pixi.js", "_blank")
-}
-
-var help = new PIXI.Text("Click to turn masking on / off.", {font:"bold 12pt Arial", fill:"white"});
-help.position.y = 350;
-help.position.x = 10;
-stage.addChild(help);
-
-requestAnimFrame(animate);
-
-function animate() {
-
- bg.rotation += 0.01;
- bgFront.rotation -= 0.01;
-
- light1.rotation += 0.02;
- light2.rotation += 0.01;
-
- panda.scale.x = 1 + Math.sin(count) * 0.04;
- panda.scale.y = 1 + Math.cos(count) * 0.04;
-
- count += 0.1;
-
- thing.clear();
- thing.lineStyle(5, 0x16f1ff, 1);
- thing.beginFill(0x8bc5ff, 0.4);
- thing.moveTo(-120 + Math.sin(count) * 20, -100 + Math.cos(count)* 20);
- thing.lineTo(120 + Math.cos(count) * 20, -100 + Math.sin(count)* 20);
- thing.lineTo(120 + Math.sin(count) * 20, 100 + Math.cos(count)* 20);
- thing.lineTo(-120 + Math.cos(count)* 20, 100 + Math.sin(count)* 20);
- thing.lineTo(-120 + Math.sin(count) * 20, -100 + Math.cos(count)* 20);
- thing.rotation = count * 0.1;
-
- renderer.render(stage);
- requestAnimFrame( animate );
-}
-
-/* 13 */
-
-// create an new instance of a pixi stage
-var stage = new PIXI.Stage(0xFFFFFF, true);
-
-stage.setInteractive(true);
-
-var sprite= PIXI.Sprite.fromImage("spinObj_02.png");
-//stage.addChild(sprite);
-// create a renderer instance
-// the 5the parameter is the anti aliasing
-var renderer = PIXI.autoDetectRenderer(620, 380, null, false, true);
-
-// set the canvas width and height to fill the screen
-//renderer.view.style.width = window.innerWidth + "px";
-//renderer.view.style.height = window.innerHeight + "px";
-renderer.view.style.display = "block";
-
-// add render view to DOM
-document.body.appendChild(renderer.view);
-
-var graphics = new PIXI.Graphics();
-
-
-// set a fill and line style
-graphics.beginFill(0xFF3300);
-graphics.lineStyle(10, 0xffd900, 1);
-
-// draw a shape
-graphics.moveTo(50,50);
-graphics.lineTo(250, 50);
-graphics.lineTo(100, 100);
-graphics.lineTo(250, 220);
-graphics.lineTo(50, 220);
-graphics.lineTo(50, 50);
-graphics.endFill();
-
-// set a fill and line style again
-graphics.lineStyle(10, 0xFF0000, 0.8);
-graphics.beginFill(0xFF700B, 1);
-
-// draw a second shape
-graphics.moveTo(210,300);
-graphics.lineTo(450,320);
-graphics.lineTo(570,350);
-graphics.lineTo(580,20);
-graphics.lineTo(330,120);
-graphics.lineTo(410,200);
-graphics.lineTo(210,300);
-graphics.endFill();
-
-// draw a rectangel
-graphics.lineStyle(2, 0x0000FF, 1);
-graphics.drawRect(50, 250, 100, 100);
-
-// draw a circle
-graphics.lineStyle(0);
-graphics.beginFill(0xFFFF0B, 0.5);
-graphics.drawCircle(470, 200,100);
-
-graphics.lineStyle(20, 0x33FF00);
-graphics.moveTo(30,30);
-graphics.lineTo(600, 300);
-
-
-stage.addChild(graphics);
-
-// lets create moving shape
-var thing = new PIXI.Graphics();
-stage.addChild(thing);
-thing.position.x = 620/2;
-thing.position.y = 380/2;
-
-var count = 0;
-
-stage.click = stage.tap = function()
-{
- graphics.lineStyle(Math.random() * 30, Math.random() * 0xFFFFFF, 1);
- graphics.moveTo(Math.random() * 620,Math.random() * 380);
- graphics.lineTo(Math.random() * 620,Math.random() * 380);
-}
-
-requestAnimFrame(animate);
-
-function animate1() {
-
- thing.clear();
-
- count += 0.1;
-
- thing.clear();
- thing.lineStyle(30, 0xff0000, 1);
- thing.beginFill(0xffFF00, 0.5);
-
- thing.moveTo(-120 + Math.sin(count) * 20, -100 + Math.cos(count)* 20);
- thing.lineTo(120 + Math.cos(count) * 20, -100 + Math.sin(count)* 20);
- thing.lineTo(120 + Math.sin(count) * 20, 100 + Math.cos(count)* 20);
- thing.lineTo(-120 + Math.cos(count)* 20, 100 + Math.sin(count)* 20);
- thing.lineTo(-120 + Math.sin(count) * 20, -100 + Math.cos(count)* 20);
-
- thing.rotation = count * 0.1;
- renderer.render(stage);
- requestAnimFrame( animate );
-}
-
-
-// create an new instance of a pixi stage
-var stage = new PIXI.Stage(0x000000);
-
-// create a renderer instance
-var renderer = PIXI.autoDetectRenderer(800, 600);
-
-// set the canvas width and height to fill the screen
-renderer.view.style.width = window.innerWidth + "px";
-renderer.view.style.height = window.innerHeight + "px";
-renderer.view.style.display = "block";
-
-// add render view to DOM
-document.body.appendChild(renderer.view);
-
-// OOH! SHINY!
-// create two render textures.. these dynamic textures will be used to draw the scene into itself
-var renderTexture = new PIXI.RenderTexture(800, 600);
-var renderTexture2 = new PIXI.RenderTexture(800, 600);
-var currentTexture = renderTexture;
-
-// create a new sprite that uses the render texture we created above
-var outputSprite = new PIXI.Sprite(currentTexture);
-
-// align the sprite
-outputSprite.position.x = 800/2;
-outputSprite.position.y = 600/2;
-outputSprite.anchor.x = 0.5;
-outputSprite.anchor.y = 0.5;
-
-// add to stage
-stage.addChild(outputSprite);
-
-var stuffContainer = new PIXI.DisplayObjectContainer();
-
-stuffContainer.position.x = 800/2;
-stuffContainer.position.y = 600/2
-
-stage.addChild(stuffContainer);
-
-// create an array of image ids..
-var fruits = ["spinObj_01.png", "spinObj_02.png",
- "spinObj_03.png", "spinObj_04.png",
- "spinObj_05.png", "spinObj_06.png",
- "spinObj_07.png", "spinObj_08.png"];
-
-// create an array of items
-var items = [];
-
-// now create some items and randomly position them in the stuff container
-for (var i=0; i < 20; i++)
-{
- var item = PIXI.Sprite.fromImage(fruits[i % fruits.length]);
- item.position.x = Math.random() * 400 - 200;
- item.position.y = Math.random() * 400 - 200;
-
- item.anchor.x = 0.5;
- item.anchor.y = 0.5;
-
- stuffContainer.addChild(item);
- console.log("_")
- items.push(item);
-};
-
-// used for spinning!
-var count = 0;
-
-
-requestAnimFrame(animate);
-
-function animate2() {
-
- requestAnimFrame( animate );
-
- for (var i=0; i < items.length; i++)
- {
- // rotate each item
- var item = items[i];
- item.rotation += 0.1;
- };
-
- count += 0.01;
-
- // swap the buffers..
- var temp = renderTexture;
- renderTexture = renderTexture2;
- renderTexture2 = temp;
-
-
- // set the new texture
- outputSprite.setTexture(renderTexture);
-
- // twist this up!
- stuffContainer.rotation -= 0.01
- outputSprite.scale.x = outputSprite.scale.y = 1 + Math.sin(count) * 0.2;
-
- // render the stage to the texture
- // the true clears the texture before content is rendered
- renderTexture2.render(stage, new PIXI.Point(0,0), true);
-
- // and finally render the stage
- renderer.render(stage);
-}
-
-
-////
-
-
-
-function init()
-{
- var assetsToLoader = ["desyrel.fnt"];
-
- // create a new loader
- var loader = new PIXI.AssetLoader(assetsToLoader);
-
- // use callback
- loader.onComplete = onAssetsLoaded;
-
- //begin load
-
- // create an new instance of a pixi stage
- var stage = new PIXI.Stage(0x66FF99);
-
- loader.load();
- function onAssetsLoaded()
- {
- var bitmapFontText = new PIXI.BitmapText("bitmap fonts are\n now supported!", {font: "35px Desyrel", align: "right"});
- bitmapFontText.position.x = 620 - bitmapFontText.width - 20;
- bitmapFontText.position.y = 20;
-
- PIXI.runList(bitmapFontText)
- stage.addChild(bitmapFontText);
-
-
- }
-
-
-
- // add a shiney background..
- var background = PIXI.Sprite.fromImage("textDemoBG.jpg");
- stage.addChild(background);
-
- // create a renderer instance
- var renderer = PIXI.autoDetectRenderer(620, 400);
- // add the renderer view element to the DOM
- document.body.appendChild(renderer.view);
-
- requestAnimFrame(animate);
-
- // create some white text using the Snippet webfont
- var textSample = new PIXI.Text("Pixi.js can has\nmultiline text!", {font: "35px Snippet", fill: "white", align: "left"});
- textSample.position.x = 20;
- textSample.position.y = 20;
-
- // create a text object with a nice stroke
- var spinningText = new PIXI.Text("I'm fun!", {font: "bold 60px Podkova", fill: "#cc00ff", align: "center", stroke: "#FFFFFF", strokeThickness: 6});
- // setting the anchor point to 0.5 will center align the text... great for spinning!
- spinningText.anchor.x = spinningText.anchor.y = 0.5;
- spinningText.position.x = 620 / 2;
- spinningText.position.y = 400 / 2;
-
- // create a text object that will be updated..
- var countingText = new PIXI.Text("COUNT 4EVAR: 0", {font: "bold italic 60px Arvo", fill: "#3e1707", align: "center", stroke: "#a4410e", strokeThickness: 7});
- countingText.position.x = 620 / 2;
- countingText.position.y = 320;
- countingText.anchor.x = 0.5;
-
- stage.addChild(textSample);
- stage.addChild(spinningText);
- stage.addChild(countingText);
-
- var count = 0;
- var score = 0;
-
- function animate() {
-
- requestAnimFrame( animate );
- count++;
- if(count == 50)
- {
- count = 0;
- score++;
- // update the text...
- countingText.setText("COUNT 4EVAR: " + score);
-
- }
- // just for fun, lets rotate the text
- spinningText.rotation += 0.03;
-
- // render the stage
- renderer.render(stage);
- }
-}
-
-
-/////
-
-
-
-// create an new instance of a pixi stage
-var stage = new PIXI.Stage(0x97c56e, true);
-
-// create a renderer instance
-var renderer = PIXI.autoDetectRenderer(window.innerWidth, window.innerHeight, null);
-
-// add the renderer view element to the DOM
-document.body.appendChild(renderer.view);
-renderer.view.style.position = "absolute";
-renderer.view.style.top = "0px";
-renderer.view.style.left = "0px";
-requestAnimFrame( animate );
-
-// create a texture from an image path
-var texture = PIXI.Texture.fromImage("p2.jpeg");
-
-// create a tiling sprite..
-// requires a texture, width and height
-// to work in webGL the texture size must be a power of two
-var tilingSprite = new PIXI.TilingSprite(texture, window.innerWidth, window.innerHeight)
-
-var count = 0;
-
-stage.addChild(tilingSprite);
-
-function animate33() {
-
- requestAnimFrame( animate );
-
-
- count += 0.005
- tilingSprite.tileScale.x = 2 + Math.sin(count);
- tilingSprite.tileScale.y = 2 + Math.cos(count);
-
- tilingSprite.tilePosition.x += 1;
- tilingSprite.tilePosition.y += 1;
-
- // just for fun, lets rotate mr rabbit a little
- //stage.interactionManager.update();
- // render the stage
- renderer.render(stage);
-}
-
-
-
-/////
-
-
-// create an new instance of a pixi stage
-var stage = new PIXI.Stage(0x97c56e, true);
-
-// create a renderer instance
-var renderer = PIXI.autoDetectRenderer(window.innerWidth, window.innerHeight, null);
-
-// add the renderer view element to the DOM
-document.body.appendChild(renderer.view);
-renderer.view.style.position = "absolute";
-renderer.view.style.top = "0px";
-renderer.view.style.left = "0px";
-requestAnimFrame( animate );
-
-// create a texture from an image path
-var texture = PIXI.Texture.fromImage("bunny.png");
-
-for (var i=0; i < 10; i++)
-{
- createBunny(Math.random() * window.innerWidth, Math.random() * window.innerHeight)
-};
-
-
-function createBunny(x, y)
-{
- // create our little bunny friend..
- var bunny = new PIXI.Sprite(texture);
- // bunny.width = 300;
- // enable the bunny to be interactive.. this will allow it to respond to mouse and touch events
- bunny.interactive = true;
- // this button mode will mean the hand cursor appears when you rollover the bunny with your mouse
- bunny.buttonMode = true;
-
- // center the bunnys anchor point
- bunny.anchor.x = 0.5;
- bunny.anchor.y = 0.5;
- // make it a bit bigger, so its easier to touch
- bunny.scale.x = bunny.scale.y = 3;
-
-
- // use the mousedown and touchstart
- bunny.mousedown = bunny.touchstart = function(data)
- {
- // stop the default event...
- data.originalEvent.preventDefault();
-
- // store a refference to the data
- // The reason for this is because of multitouch
- // we want to track the movement of this particular touch
- this.data = data;
- this.alpha = 0.9;
- this.dragging = true;
- };
-
- // set the events for when the mouse is released or a touch is released
- bunny.mouseup = bunny.mouseupoutside = bunny.touchend = bunny.touchendoutside = function(data)
- {
- this.alpha = 1
- this.dragging = false;
- // set the interaction data to null
- this.data = null;
- };
-
- // set the callbacks for when the mouse or a touch moves
- bunny.mousemove = bunny.touchmove = function(data)
- {
- if(this.dragging)
- {
- // need to get parent coords..
- var newPosition = this.data.getLocalPosition(this.parent);
- this.position.x = newPosition.x;
- this.position.y = newPosition.y;
- }
- }
-
- // move the sprite to its designated position
- bunny.position.x = x;
- bunny.position.y = y;
-
- // add it to the stage
- stage.addChild(bunny);
-}
-
-function animate44() {
-
- requestAnimFrame( animate );
-
- // just for fun, lets rotate mr rabbit a little
- //stage.interactionManager.update();
- // render the stage
- renderer.render(stage);
-}
-
-
-
-////
-
-// create an new instance of a pixi stage
-var stage = new PIXI.Stage(0x66FF99);
-
-// create a renderer instance
-var renderer = PIXI.autoDetectRenderer(400, 300, null, true);
-
-// add the renderer view element to the DOM
-document.body.appendChild(renderer.view);
-renderer.view.style.position = "absolute";
-renderer.view.style.top = "0px";
-renderer.view.style.left = "0px";
-requestAnimFrame( animate );
-
-// create a texture from an image path
-var texture = PIXI.Texture.fromImage("bunny.png");
-// create a new Sprite using the texture
-var bunny = new PIXI.Sprite(texture);
-
-// center the sprites anchor point
-bunny.anchor.x = 0.5;
-bunny.anchor.y = 0.5;
-
-// move the sprite t the center of the screen
-bunny.position.x = 200;
-bunny.position.y = 150;
-
-stage.addChild(bunny);
-
-function animate55() {
-
- requestAnimFrame( animate );
-
- // just for fun, lets rotate mr rabbit a little
- bunny.rotation += 0.1;
-
- // render the stage
- renderer.render(stage);
-}
-
-
-
-///////
-
-
-
-// create an new instance of a pixi stage
-// the second parameter is interactivity...
-var interactive = true;
-var stage = new PIXI.Stage(0x000000, interactive);
-
-// create a renderer instance.
-var renderer = PIXI.autoDetectRenderer(620, 400);
-
-// add the renderer view element to the DOM
-document.body.appendChild(renderer.view);
-
-requestAnimFrame( animate );
-
-// create a background..
-var background = PIXI.Sprite.fromImage("button_test_BG.jpg");
-
-// add background to stage..
-stage.addChild(background);
-
-// create some textures from an image path
-var textureButton = PIXI.Texture.fromImage("button.png");
-var textureButtonDown = PIXI.Texture.fromImage("buttonDown.png");
-var textureButtonOver = PIXI.Texture.fromImage("buttonOver.png");
-
-var buttons = [];
-
-var buttonPositions = [175,75,
- 600-145, 75,
- 600/2 - 20, 400/2 + 10,
- 175, 400-75,
- 600-115, 400-95];
-
-
-for (var i=0; i < 5; i++)
-{
- var button = new PIXI.Sprite(textureButton);
- button.buttonMode = true;
-
- button.anchor.x = 0.5;
- button.anchor.y = 0.5;
-
- button.position.x = buttonPositions[i*2];
- button.position.y = buttonPositions[i*2 + 1];
-
- // make the button interactive..
- button.interactive = true;
-
- // set the mousedown and touchstart callback..
- button.mousedown = button.touchstart = function(data){
-
- this.isdown = true;
- this.setTexture(textureButtonDown);
- this.alpha = 1;
- }
-
- // set the mouseup and touchend callback..
- button.mouseup = button.touchend = button.mouseupoutside = button.touchendoutside = function(data){
- this.isdown = false;
-
- if(this.isOver)
- {
- this.setTexture(textureButtonOver);
- }
- else
- {
- this.setTexture(textureButton);
- }
- }
-
- // set the mouseover callback..
- button.mouseover = function(data){
-
- this.isOver = true;
-
- if(this.isdown)return
-
- this.setTexture(textureButtonOver)
- }
-
- // set the mouseout callback..
- button.mouseout = function(data){
-
- this.isOver = false;
- if(this.isdown)return
- this.setTexture(textureButton)
- }
-
- button.click = function(data){
- // click!
- console.log("CLICK!");
- // alert("CLICK!")
- }
-
- button.tap = function(data){
- // click!
- console.log("TAP!!");
- //this.alpha = 0.5;
- }
-
- // add it to the stage
- stage.addChild(button);
-
- // add button to array
- buttons.push(button);
-};
-
-// set some silly values..
-
-buttons[0].scale.x = 1.2;
-
-buttons[1].scale.y = 1.2;
-
-buttons[2].rotation = Math.PI/10;
-
-buttons[3].scale.x = 0.8;
-buttons[3].scale.y = 0.8;
-
-buttons[4].scale.x = 0.8;
-buttons[4].scale.y = 1.2;
-buttons[4].rotation = Math.PI;
-// var button1 =
-function animate66() {
-
- requestAnimFrame( animate );
- // render the stage
-
- // do a test..
-
- renderer.render(stage);
-}
-
-// add a logo!
-var pixiLogo = PIXI.Sprite.fromImage("pixi.png");
-stage.addChild(pixiLogo);
-
-pixiLogo.position.x = 620 - 56;
-pixiLogo.position.y = 400- 32;
-
-pixiLogo.setInteractive(true);
-
-pixiLogo.click = pixiLogo.tap = function(){
-
- var win=window.open("https://github.com/GoodBoyDigital/pixi.js", '_blank');
-
-}
-
-
-//////
-
-
-
-var w = 1024;
-var h = 768;
-
-var n = 2000;
-var d = 1;
-var current = 1;
-var objs = 17;
-var vx = 0;
-var vy = 0;
-var vz = 0;
-var points1 = [];
-var points2 = [];
-var points3 = [];
-var tpoint1 = [];
-var tpoint2 = [];
-var tpoint3 = [];
-var balls = [];
-
-function start() {
-
- var ballTexture = PIXI.Texture.fromImage("assets/pixel.png");
-
- renderer = PIXI.autoDetectRenderer(w, h);
-
- stage = new PIXI.Stage(0x000000);
-
- document.body.appendChild(renderer.view);
-
- makeObject(0);
-
- for (var i = 0; i < n; i++)
- {
- tpoint1[i] = points1[i];
- tpoint2[i] = points2[i];
- tpoint3[i] = points3[i];
-
- var tempBall = new PIXI.Sprite(ballTexture);
- tempBall.anchor.x = 0.5;
- tempBall.anchor.y = 0.5;
- tempBall.alpha = 0.5;
- balls[i] = tempBall;
-
- stage.addChild(tempBall);
- }
-
-
-
- setTimeout(nextObject, 5000);
-
- requestAnimFrame(update);
-
-}
-
-function nextObject () {
-
- current++;
-
- if (current > objs)
- {
- current = 0;
- }
-
- makeObject(current);
-
- setTimeout(nextObject, 8000);
-
-}
-
-function makeObject ( t ) {
-
- var xd;
-
- switch (t)
- {
- case 0:
-
- for (var i = 0; i < n; i++)
- {
- points1[i] = -50 + Math.round(Math.random() * 100);
- points2[i] = 0;
- points3[i] = 0;
- }
- break;
-
- case 1:
-
- for (var i = 0; i < n; i++)
- {
- xd = -90 + Math.round(Math.random() * 180);
- points1[i] = (Math.cos(xd) * 10) * (Math.cos(t * 360 / n) * 10);
- points2[i] = (Math.cos(xd) * 10) * (Math.sin(t * 360 / n) * 10);
- points3[i] = Math.sin(xd) * 100;
- }
- break;
-
- case 2:
-
- for (var i = 0; i < n; i++)
- {
- xd = -90 + Math.round(Math.random() * 180);
- points1[i] = (Math.cos(xd) * 10) * (Math.cos(t * 360 / n) * 10);
- points2[i] = (Math.cos(xd) * 10) * (Math.sin(t * 360 / n) * 10);
- points3[i] = Math.sin(i * 360 / n) * 100;
- }
- break;
-
- case 3:
-
- for (var i = 0; i < n; i++)
- {
- xd = -90 + Math.round(Math.random() * 180);
- points1[i] = (Math.cos(xd) * 10) * (Math.cos(xd) * 10);
- points2[i] = (Math.cos(xd) * 10) * (Math.sin(xd) * 10);
- points3[i] = Math.sin(xd) * 100;
- }
- break;
-
- case 4:
-
- for (var i = 0; i < n; i++)
- {
- xd = -90 + Math.round(Math.random() * 180);
- points1[i] = (Math.cos(xd) * 10) * (Math.cos(xd) * 10);
- points2[i] = (Math.cos(xd) * 10) * (Math.sin(xd) * 10);
- points3[i] = Math.sin(i * 360 / n) * 100;
- }
- break;
-
- case 5:
-
- for (var i = 0; i < n; i++)
- {
- xd = -90 + Math.round(Math.random() * 180);
- points1[i] = (Math.cos(xd) * 10) * (Math.cos(xd) * 10);
- points2[i] = (Math.cos(i * 360 / n) * 10) * (Math.sin(xd) * 10);
- points3[i] = Math.sin(i * 360 / n) * 100;
- }
- break;
-
- case 6:
-
- for (var i = 0; i < n; i++)
- {
- xd = -90 + Math.round(Math.random() * 180);
- points1[i] = (Math.cos(i * 360 / n) * 10) * (Math.cos(i * 360 / n) * 10);
- points2[i] = (Math.cos(i * 360 / n) * 10) * (Math.sin(xd) * 10);
- points3[i] = Math.sin(i * 360 / n) * 100;
- }
- break;
-
- case 7:
-
- for (var i = 0; i < n; i++)
- {
- xd = -90 + Math.round(Math.random() * 180);
- points1[i] = (Math.cos(i * 360 / n) * 10) * (Math.cos(i * 360 / n) * 10);
- points2[i] = (Math.cos(i * 360 / n) * 10) * (Math.sin(i * 360 / n) * 10);
- points3[i] = Math.sin(i * 360 / n) * 100;
- }
- break;
-
- case 8:
-
- for (var i = 0; i < n; i++)
- {
- xd = -90 + Math.round(Math.random() * 180);
- points1[i] = (Math.cos(xd) * 10) * (Math.cos(i * 360 / n) * 10);
- points2[i] = (Math.cos(i * 360 / n) * 10) * (Math.sin(i * 360 / n) * 10);
- points3[i] = Math.sin(xd) * 100;
- }
- break;
-
- case 9:
-
- for (var i = 0; i < n; i++)
- {
- xd = -90 + Math.round(Math.random() * 180);
- points1[i] = (Math.cos(xd) * 10) * (Math.cos(i * 360 / n) * 10);
- points2[i] = (Math.cos(i * 360 / n) * 10) * (Math.sin(xd) * 10);
- points3[i] = Math.sin(xd) * 100;
- }
- break;
-
- case 10:
-
- for (var i = 0; i < n; i++)
- {
- xd = -90 + Math.round(Math.random() * 180);
- points1[i] = (Math.cos(i * 360 / n) * 10) * (Math.cos(i * 360 / n) * 10);
- points2[i] = (Math.cos(xd) * 10) * (Math.sin(xd) * 10);
- points3[i] = Math.sin(i * 360 / n) * 100;
- }
- break;
-
- case 11:
-
- for (var i = 0; i < n; i++)
- {
- xd = -90 + Math.round(Math.random() * 180);
- points1[i] = (Math.cos(xd) * 10) * (Math.cos(i * 360 / n) * 10);
- points2[i] = (Math.sin(xd) * 10) * (Math.sin(i * 360 / n) * 10);
- points3[i] = Math.sin(xd) * 100;
- }
- break;
-
- case 12:
-
- for (var i = 0; i < n; i++)
- {
- xd = -90 + Math.round(Math.random() * 180);
- points1[i] = (Math.cos(xd) * 10) * (Math.cos(xd) * 10);
- points2[i] = (Math.sin(xd) * 10) * (Math.sin(xd) * 10);
- points3[i] = Math.sin(i * 360 / n) * 100;
- }
- break;
-
- case 13:
-
- for (var i = 0; i < n; i++)
- {
- xd = -90 + Math.round(Math.random() * 180);
- points1[i] = (Math.cos(xd) * 10) * (Math.cos(i * 360 / n) * 10);
- points2[i] = (Math.sin(i * 360 / n) * 10) * (Math.sin(xd) * 10);
- points3[i] = Math.sin(i * 360 / n) * 100;
- }
- break;
-
- case 14:
-
- for (var i = 0; i < n; i++)
- {
- xd = -90 + Math.round(Math.random() * 180);
- points1[i] = (Math.sin(xd) * 10) * (Math.cos(xd) * 10);
- points2[i] = (Math.sin(xd) * 10) * (Math.sin(i * 360 / n) * 10);
- points3[i] = Math.sin(i * 360 / n) * 100;
- }
- break;
-
- case 15:
-
- for (var i = 0; i < n; i++)
- {
- xd = -90 + Math.round(Math.random() * 180);
- points1[i] = (Math.cos(i * 360 / n) * 10) * (Math.cos(i * 360 / n) * 10);
- points2[i] = (Math.sin(i * 360 / n) * 10) * (Math.sin(xd) * 10);
- points3[i] = Math.sin(i * 360 / n) * 100;
- }
- break;
-
- case 16:
-
- for (var i = 0; i < n; i++)
- {
- xd = -90 + Math.round(Math.random() * 180);
- points1[i] = (Math.cos(xd) * 10) * (Math.cos(i * 360 / n) * 10);
- points2[i] = (Math.sin(i * 360 / n) * 10) * (Math.sin(xd) * 10);
- points3[i] = Math.sin(xd) * 100;
- }
- break;
-
- case 17:
-
- for (var i = 0; i < n; i++)
- {
- xd = -90 + Math.round(Math.random() * 180);
- points1[i] = (Math.cos(xd) * 10) * (Math.cos(xd) * 10);
- points2[i] = (Math.cos(i * 360 / n) * 10) * (Math.sin(i * 360 / n) * 10);
- points3[i] = Math.sin(i * 360 / n) * 100;
- }
- break;
- }
-
-}
-
-
-
-function update()
-{
- var x3d, y3d, z3d, tx, ty, tz, ox;
-
- if (d < 250)
- {
- d++;
- }
-
- vx += 0.0075;
- vy += 0.0075;
- vz += 0.0075;
-
- for (var i = 0; i < n; i++)
- {
- if (points1[i] > tpoint1[i]) { tpoint1[i] = tpoint1[i] + 1; }
- if (points1[i] < tpoint1[i]) { tpoint1[i] = tpoint1[i] - 1; }
- if (points2[i] > tpoint2[i]) { tpoint2[i] = tpoint2[i] + 1; }
- if (points2[i] < tpoint2[i]) { tpoint2[i] = tpoint2[i] - 1; }
- if (points3[i] > tpoint3[i]) { tpoint3[i] = tpoint3[i] + 1; }
- if (points3[i] < tpoint3[i]) { tpoint3[i] = tpoint3[i] - 1; }
-
- x3d = tpoint1[i];
- y3d = tpoint2[i];
- z3d = tpoint3[i];
-
- ty = (y3d * Math.cos(vx)) - (z3d * Math.sin(vx));
- tz = (y3d * Math.sin(vx)) + (z3d * Math.cos(vx));
- tx = (x3d * Math.cos(vy)) - (tz * Math.sin(vy));
- tz = (x3d * Math.sin(vy)) + (tz * Math.cos(vy));
- ox = tx;
- tx = (tx * Math.cos(vz)) - (ty * Math.sin(vz));
- ty = (ox * Math.sin(vz)) + (ty * Math.cos(vz));
-
- balls[i].position.x = (512 * tx) / (d - tz) + w / 2;
- balls[i].position.y = (h/2) - (512 * ty) / (d - tz);
-
- }
-
- renderer.render(stage);
-
- requestAnimFrame(update);
-}
-
-
-
-///////
-
-
-
-// Globals, globals everywhere and not a drop to drink
-var w = 1024;
-var h = 768;
-var starCount = 2500;
-var sx = 1.0 + (Math.random() / 20);
-var sy = 1.0 + (Math.random() / 20);
-var slideX = w / 2;
-var slideY = h / 2;
-var stars = [];
-
-function start2() {
-
- var ballTexture = PIXI.Texture.fromImage("assets/bubble_32x32.png");
-
- renderer = PIXI.autoDetectRenderer(w, h);
-
- stage = new PIXI.Stage(0x000000);
-
- document.body.appendChild(renderer.view);
-
- for (var i = 0; i < starCount; i++)
- {
- var tempBall = new PIXI.Sprite(ballTexture);
-
- tempBall.position.x = (Math.random() * w) - slideX;
- tempBall.position.y = (Math.random() * h) - slideY;
- tempBall.anchor.x = 0.5;
- tempBall.anchor.y = 0.5;
-
- stars.push({ sprite: tempBall, x: tempBall.position.x, y: tempBall.position.y });
-
- stage.addChild(tempBall);
- }
-
- document.getElementById('rnd').onclick = newWave;
- document.getElementById('sx').innerHTML = 'SX: ' + sx + '
SY: ' + sy;
-
-
-
- requestAnimFrame(update);
-
-}
-
-function newWave () {
-
- sx = 1.0 + (Math.random() / 20);
- sy = 1.0 + (Math.random() / 20);
- document.getElementById('sx').innerHTML = 'SX: ' + sx + '
SY: ' + sy;
-
-}
-
-
-
-function update22()
-{
- for (var i = 0; i < starCount; i++)
- {
- stars[i].sprite.position.x = stars[i].x + slideX;
- stars[i].sprite.position.y = stars[i].y + slideY;
- stars[i].x = stars[i].x * sx;
- stars[i].y = stars[i].y * sy;
-
- if (stars[i].x > w)
- {
- stars[i].x = stars[i].x - w;
- }
- else if (stars[i].x < -w)
- {
- stars[i].x = stars[i].x + w;
- }
-
- if (stars[i].y > h)
- {
- stars[i].y = stars[i].y - h;
- }
- else if (stars[i].y < -h)
- {
- stars[i].y = stars[i].y + h;
- }
- }
-
- renderer.render(stage);
-
- requestAnimFrame(update);
-}
-
-}
\ No newline at end of file
diff --git a/pixi/pixi-tests.ts.tscparams b/pixi/pixi-tests.ts.tscparams
deleted file mode 100644
index d3f5a12fa..000000000
--- a/pixi/pixi-tests.ts.tscparams
+++ /dev/null
@@ -1 +0,0 @@
-
diff --git a/pixi/pixi.d.ts b/pixi/pixi.d.ts
deleted file mode 100644
index c86c1bd47..000000000
--- a/pixi/pixi.d.ts
+++ /dev/null
@@ -1,448 +0,0 @@
-// Type definitions for PIXI 1.3
-// Project: https://github.com/GoodBoyDigital/pixi.js/
-// Definitions by: xperiments
-// Definitions: https://github.com/borisyankov/DefinitelyTyped
-
-declare module PIXI
-{
-
- /* STATICS */
- export var gl:WebGLRenderingContext;
- export var BaseTextureCache: {};
- export var texturesToUpdate: BaseTexture[];
- export var texturesToDestroy: BaseTexture[];
- export var TextureCache: {};
- export var FrameCache: {};
- export var blendModes:{ NORMAL:number; SCREEN:number; };
-
-
- /* MODULE FUNCTIONS */
- export function autoDetectRenderer(width: number, height: number, view?: HTMLCanvasElement, transparent?: boolean, antialias?: boolean): IPixiRenderer;
- export function FilterBlock( mask:Graphics ):void;
- export function MaskFilter( graphics:Graphics ):void;
-
-
- /* DEBUG METHODS */
-
- export function runList( x ):void;
-
- /*INTERFACES*/
-
- export interface IBasicCallback
- {
- ():void
- }
-
- export interface IEvent
- {
- type: string;
- content: any;
- }
-
- export interface IHitArea
- {
- contains(x: number, y: number):boolean;
- }
-
- export interface IInteractionDataCallback
- {
- (interactionData: InteractionData):void
- }
-
- export interface IPixiRenderer
- {
- view: HTMLCanvasElement;
- render(stage: Stage): void;
- }
-
- export interface IBitmapTextStyle
- {
- font?: string;
- align?: string;
- }
-
- export interface ITextStyle
- {
- font?: string;
- stroke?: string;
- fill?: string;
- align?: string;
- strokeThickness?: number;
- wordWrap?: boolean;
- wordWrapWidth?:number;
- }
-
-
-
- /* CLASES */
-
- export class AssetLoader extends EventTarget
- {
- assetURLs: string[];
- onComplete: IBasicCallback;
- onProgress: IBasicCallback;
- constructor(assetURLs: string[], crossorigin?:boolean );
- load(): void;
- }
-
- export class BaseTexture extends EventTarget
- {
- height: number;
- width: number;
- source: string;
-
- constructor(source: HTMLImageElement);
- constructor(source: HTMLCanvasElement);
- destroy():void;
-
- static fromImage(imageUrl: string, crossorigin?:boolean ): BaseTexture;
- }
-
- export class BitmapFontLoader extends EventTarget
- {
- baseUrl:string;
- crossorigin:boolean;
- texture:Texture;
- url:string;
- constructor(url: string, crossorigin?: boolean);
- load():void;
- }
-
- export class BitmapText extends DisplayObjectContainer
- {
- width:number;
- height:number;
- constructor(text: string, style: IBitmapTextStyle);
- setStyle(style: IBitmapTextStyle): void;
- setText(text: string): void;
- }
-
- export class CanvasRenderer implements IPixiRenderer
- {
- context: CanvasRenderingContext2D;
- height: number;
- view: HTMLCanvasElement;
- width: number;
- constructor(width: number, height: number, view?: HTMLCanvasElement, transparent?: boolean);
- render(stage: Stage): void;
- resize(width: number, height: number):void;
- }
-
- export class Circle implements IHitArea
- {
- x: number;
- y: number;
- radius: number;
- constructor(x: number, y: number, radius: number);
- clone(): Circle;
- contains(x: number, y: number):boolean;
- }
-
- // TODO what is renderGroup
- export class CustomRenderable extends DisplayObject
- {
- constructor();
- renderCanvas(renderer: CanvasRenderer): void;
- initWebGL(renderer: WebGLRenderer): void;
- renderWebGL(renderGroup: any, projectionMatrix: any): void;
- }
-
- export class DisplayObject
- {
- x: number;
- y: number;
- alpha: number;
- buttonMode: boolean;
- filter:boolean;
- hitArea: IHitArea;
- parent: DisplayObjectContainer;
- pivot: Point;
- position: Point;
- rotation: number;
- renderable: boolean;
- scale: Point;
- stage: Stage;
- visible: boolean;
- worldAlpha: number;
- constructor();
- static autoDetectRenderer(width: number, height: number, view?: HTMLCanvasElement, transparent?: boolean): IPixiRenderer;
- click: IInteractionDataCallback;
- mousedown: IInteractionDataCallback;
- mouseout: IInteractionDataCallback;
- mouseover: IInteractionDataCallback;
- mouseup: IInteractionDataCallback;
- mouseupoutside: IInteractionDataCallback;
- mousemove: IInteractionDataCallback;
- tap: IInteractionDataCallback;
- touchend: IInteractionDataCallback;
- touchendoutside: IInteractionDataCallback;
- touchstart: IInteractionDataCallback;
- touchmove: IInteractionDataCallback;
-
- //deprecated
- setInteractive(interactive: boolean): void;
-
- // getters setters
- interactive:boolean;
- mask:Graphics;
- }
-
- export class DisplayObjectContainer extends DisplayObject
- {
- children: DisplayObject[];
- constructor();
-
- addChild(child: DisplayObject): void;
- addChildAt(child: DisplayObject, index: number): void;
- getChildAt(index:number):DisplayObject;
- removeChild(child: DisplayObject): void;
- swapChildren(child: DisplayObject, child2: DisplayObject): void;
- }
-
- export class Ellipse implements IHitArea
- {
- x: number;
- y: number;
- width: number;
- height: number;
-
- constructor(x: number, y: number, width: number, height: number);
- clone(): Ellipse;
- contains(x: number, y: number):boolean;
- getBounds():Rectangle;
- }
-
- export class EventTarget
- {
- addEventListener(type: string, listener: (event: IEvent) => void );
- removeEventListener(type: string, listener: (event: IEvent) => void );
- dispatchEvent(event: IEvent);
- }
-
- export class Graphics extends DisplayObjectContainer
- {
- lineWidth:number;
- lineColor:string;
- constructor();
-
- beginFill(color?: number, alpha?: number): void;
- clear(): void;
- drawCircle(x: number, y: number, radius: number): void;
- drawElipse(x: number, y: number, width: number, height: number): void;
- drawRect(x: number, y: number, width: number, height: number): void;
- endFill(): void;
- lineStyle(lineWidth?: number, color?: number, alpha?: number ): void;
- lineTo(x: number, y: number): void;
- moveTo(x: number, y: number): void;
-
- static POLY:number;
- static RECT:number;
- static CIRC:number;
- static ELIP:number;
- }
-
- export class ImageLoader extends EventTarget
- {
- texture:Texture;
- constructor(url: string, crossorigin?: boolean);
- load(): void;
- }
-
- /* TODO determine type of originalEvent*/
- export class InteractionData
- {
- global: Point;
- target: Sprite;
- constructor();
- originalEvent:any;
- getLocalPosition(displayObject: DisplayObject): Point;
- }
-
- export class InteractionManager
- {
- mouse: InteractionData;
- stage: Stage;
- touchs:{ [id:string]:InteractionData };
- constructor(stage: Stage);
- }
-
- export class JsonLoader extends EventTarget
- {
- url:string;
- crossorigin: boolean;
- baseUrl:string;
- loaded:boolean;
- constructor(url: string, crossorigin?: boolean);
- load(): void;
- }
-
- export class MovieClip extends Sprite
- {
- animationSpeed: number;
- currentFrame:number;
- loop: boolean;
- playing: boolean;
- textures: Texture[];
- constructor(textures: Texture[]);
- onComplete:IBasicCallback;
- gotoAndPlay(frameNumber: number): void;
- gotoAndStop(frameNumber: number): void;
- play(): void;
- stop(): void;
- }
-
- export class Point
- {
- x: number;
- y: number;
- constructor(x: number, y: number);
- clone(): Point;
- }
-
- export class Polygon implements IHitArea
- {
- points: Point[];
-
- constructor(points: Point[]);
- constructor(points: number[]);
- constructor(...points: Point[]);
- constructor(...points: number[]);
-
- clone(): Polygon;
- contains( x:number, y:number ):boolean;
- }
-
- export class Rectangle implements IHitArea
- {
- x: number;
- y: number;
- width: number;
- height: number;
- constructor(x: number, y: number, width: number, height: number);
- clone(): Rectangle;
- contains(x: number, y: number):boolean;
- }
-
- export class RenderTexture extends Texture
- {
- constructor(width: number, height: number);
- resize(width: number, height: number): void;
- }
-
- export class Sprite extends DisplayObjectContainer
- {
- anchor: Point;
- blendMode: number;
- texture: Texture;
-
- //getters setters
- height: number;
- width: number;
-
- constructor(texture: Texture);
-
- static fromFrame(frameId: string): Sprite;
- static fromImage(url: string): Sprite;
- setTexture(texture: Texture): void;
- }
-
- /* TODO determine type of frames */
- export class SpriteSheetLoader extends EventTarget
- {
- url:string;
- crossorigin:boolean;
- baseUrl:string;
- texture:Texture;
- frames:Object;
- constructor(url: string, crossorigin?: boolean);
- load();
- }
-
- export class Stage extends DisplayObjectContainer
- {
- interactive:boolean;
- interactionManager:InteractionManager;
- constructor(backgroundColor: number, interactive?: boolean);
- getMousePosition(): Point;
- setBackgroundColor(backgroundColor: number): void;
- }
-
- export class Text extends Sprite
- {
- constructor(text: string, style: ITextStyle);
- destroy(destroyTexture:boolean):void;
- setText(text: string): void;
- setStyle(style: ITextStyle): void;
- }
-
- export class Texture extends EventTarget
- {
- baseTexture: BaseTexture;
- frame: Rectangle;
- trim:Point;
- render( displayObject:DisplayObject, position:Point, clear:boolean ):void;
- constructor(baseTexture: BaseTexture, frame?: Rectangle);
- destroy(destroyBase:boolean):void;
- setFrame(frame: Rectangle): void;
-
- static addTextureToCache(texture: Texture, id: string): void;
- static fromCanvas(canvas: HTMLCanvasElement): Texture;
- static fromFrame(frameId: string): Texture;
- static fromImage(imageUrl: string, crossorigin?: boolean): Texture;
- static removeTextureFromCache(id: any): Texture;
- }
-
- export class TilingSprite extends DisplayObjectContainer
- {
- width:number;
- height:number;
- texture:Texture;
- tilePosition: Point;
- tileScale: Point;
- constructor(texture: Texture, width: number, height: number);
- setTexture( texture: Texture ):void;
- }
-
- export class WebGLBatch
- {
- constructor(webGLContext: WebGLRenderingContext);
- clean():void;
- restoreLostContext(gl:WebGLRenderingContext);
- init(sprite: Sprite): void;
- insertAfter(sprite: Sprite, previousSprite: Sprite): void;
- insertBefore(sprite: Sprite, nextSprite: Sprite): void;
- growBatch(): void;
- merge(batch: WebGLBatch): void;
- refresh(): void;
- remove(sprite: Sprite): void;
- render(): void;
- split(sprite: Sprite): WebGLBatch;
- update(): void;
- }
-
- /* Determine type of Object */
- export class WebGLRenderGroup
- {
- render(projection:Object):void;
- }
-
- export class WebGLRenderer implements IPixiRenderer
- {
- view: HTMLCanvasElement;
- constructor(width: number, height: number, view?: HTMLCanvasElement, transparent?: boolean, antialias?:boolean );
- render(stage: Stage): void;
- resize(width: number, height: number): void;
- }
-
-}
-
-declare function requestAnimFrame( animate: PIXI.IBasicCallback );
-
-
-declare module PIXI.PolyK
-{
- export function Triangulate( p:number[]):number[];
-}
-
-
-
diff --git a/pixi/pixi.d.ts.tscparams b/pixi/pixi.d.ts.tscparams
deleted file mode 100644
index d3f5a12fa..000000000
--- a/pixi/pixi.d.ts.tscparams
+++ /dev/null
@@ -1 +0,0 @@
-