All Downloads are FREE. Search and download functionalities are using the official Maven repository.

scaffold.libs_as.starling.display.Quad.as Maven / Gradle / Ivy

// =================================================================================================
//
//	Starling Framework
//	Copyright 2011-2015 Gamua. All Rights Reserved.
//
//	This program is free software. You can redistribute and/or modify it
//	in accordance with the terms of the accompanying license agreement.
//
// =================================================================================================

package starling.display
{
    import flash.geom.Matrix;
    import flash.geom.Matrix3D;
    import flash.geom.Point;
    import flash.geom.Rectangle;
    import flash.geom.Vector3D;

    import starling.rendering.IndexData;
    import starling.rendering.MeshStyle;
    import starling.rendering.VertexData;
    import starling.textures.Texture;
    import starling.utils.RectangleUtil;

    /** A Quad represents a colored and/or textured rectangle.
     *
     *  

Quads may have a color and a texture. When assigning a texture, the colors of the * vertices will "tint" the texture, i.e. the vertex color will be multiplied with the color * of the texture at the same position. That's why the default color of a quad is pure white: * tinting with white does not change the texture color (that's a multiplication with one).

* *

A quad is, by definition, always rectangular. The basic quad class will always contain * exactly four vertices, arranged like this:

* *
     *  0 - 1
     *  | / |
     *  2 - 3
     *  
* *

You can set the color of each vertex individually; and since the colors will smoothly * fade into each other over the area of the quad, you can use this to create simple linear * color gradients (e.g. by assigning one color to vertices 0 and 1 and another to vertices * 2 and 3).

* *

However, note that the number of vertices may be different in subclasses. * Check the property numVertices if you are unsure.

* * @see starling.textures.Texture * @see Image */ public class Quad extends Mesh { private var _bounds:Rectangle; // helper objects private static var sPoint3D:Vector3D = new Vector3D(); private static var sMatrix:Matrix = new Matrix(); private static var sMatrix3D:Matrix3D = new Matrix3D(); /** Creates a quad with a certain size and color. */ public function Quad(width:Number, height:Number, color:uint=0xffffff) { _bounds = new Rectangle(0, 0, width, height); var vertexData:VertexData = new VertexData(MeshStyle.VERTEX_FORMAT, 4); var indexData:IndexData = new IndexData(6); super(vertexData, indexData); if (width == 0.0 || height == 0.0) throw new ArgumentError("Invalid size: width and height must not be zero"); setupVertices(); this.color = color; } /** Sets up vertex- and index-data according to the current settings. */ protected function setupVertices():void { var posAttr:String = "position"; var texAttr:String = "texCoords"; var texture:Texture = style.texture; var vertexData:VertexData = this.vertexData; var indexData:IndexData = this.indexData; indexData.numIndices = 0; indexData.addQuad(0, 1, 2, 3); vertexData.numVertices = 4; if (texture) { texture.setupVertexPositions(vertexData, 0, "position", _bounds); texture.setupTextureCoordinates(vertexData, 0, texAttr); } else { vertexData.setPoint(0, posAttr, _bounds.left, _bounds.top); vertexData.setPoint(1, posAttr, _bounds.right, _bounds.top); vertexData.setPoint(2, posAttr, _bounds.left, _bounds.bottom); vertexData.setPoint(3, posAttr, _bounds.right, _bounds.bottom); vertexData.setPoint(0, texAttr, 0.0, 0.0); vertexData.setPoint(1, texAttr, 1.0, 0.0); vertexData.setPoint(2, texAttr, 0.0, 1.0); vertexData.setPoint(3, texAttr, 1.0, 1.0); } setRequiresRedraw(); } /** @inheritDoc */ public override function getBounds(targetSpace:DisplayObject, out:Rectangle=null):Rectangle { if (out == null) out = new Rectangle(); if (targetSpace == this) // optimization { out.copyFrom(_bounds); } else if (targetSpace == parent && rotation == 0.0) // optimization { var scaleX:Number = this.scaleX; var scaleY:Number = this.scaleY; out.setTo( x - pivotX * scaleX, y - pivotY * scaleY, _bounds.width * scaleX, _bounds.height * scaleY); if (scaleX < 0) { out.width *= -1; out.x -= out.width; } if (scaleY < 0) { out.height *= -1; out.y -= out.height; } } else if (is3D && stage) { stage.getCameraPosition(targetSpace, sPoint3D); getTransformationMatrix3D(targetSpace, sMatrix3D); RectangleUtil.getBoundsProjected(_bounds, sMatrix3D, sPoint3D, out); } else { getTransformationMatrix(targetSpace, sMatrix); RectangleUtil.getBounds(_bounds, sMatrix, out); } return out; } /** @inheritDoc */ override public function hitTest(localPoint:Point):DisplayObject { if (!visible || !touchable || !hitTestMask(localPoint)) return null; else if (_bounds.containsPoint(localPoint)) return this; else return null; } /** Readjusts the dimensions of the quad. Use this method without any arguments to * synchronize quad and texture size after assigning a texture with a different size. * You can also force a certain width and height by passing positive, non-zero * values for width and height. */ public function readjustSize(width:Number=-1, height:Number=-1):void { if (width <= 0) width = texture ? texture.frameWidth : _bounds.width; if (height <= 0) height = texture ? texture.frameHeight : _bounds.height; if (width != _bounds.width || height != _bounds.height) { _bounds.setTo(0, 0, width, height); setupVertices(); } } /** Creates a quad from the given texture. * The quad will have the same size as the texture. */ public static function fromTexture(texture:Texture):Quad { var quad:Quad = new Quad(100, 100); quad.texture = texture; quad.readjustSize(); return quad; } /** The texture that is mapped to the quad (or null, if there is none). * Per default, it is mapped to the complete quad, i.e. to the complete area between the * top left and bottom right vertices. This can be changed with the * setTexCoords-method. * *

Note that the size of the quad will not change when you assign a texture, which * means that the texture might be distorted at first. Call readjustSize to * synchronize quad and texture size.

* *

You could also set the texture via the style.texture property. * That way, however, the texture frame won't be taken into account. Since only rectangular * objects can make use of a texture frame, only a property on the Quad class can do that. *

*/ override public function set texture(value:Texture):void { if (value != texture) { super.texture = value; setupVertices(); } } } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy