mirror of
https://github.com/photonstorm/phaser
synced 2025-02-16 22:18:29 +00:00
PIXI.Rope and PIXI.Strip have been removed, and all functionality merged in to Phaser.Rope, to cut down on the number of internal classes and inheritance going on.
This commit is contained in:
parent
a2cd364db5
commit
69db3632d6
8 changed files with 641 additions and 669 deletions
|
@ -344,7 +344,8 @@ You can read all about the philosophy behind Lazer [here](http://phaser.io/news/
|
|||
* Math.isPowerOfTwo will return a boolean if the given width and height are a power of two.
|
||||
* Color.hexToRGBArray converts a hex color value to an [R, G, B] array.
|
||||
* Color.RGBArrayToHex converts an RGB color array, in the format: [R, G, B], to a hex color value.
|
||||
* PIXI.AbstractFilter has been merged into the Phaser.Filter class.All references to PIXI.AbstractFilter have been updated to use Phaser.Filter instead.
|
||||
* PIXI.AbstractFilter has been merged into the Phaser.Filter class. All references to PIXI.AbstractFilter have been updated to use Phaser.Filter instead.
|
||||
* PIXI.Rope and PIXI.Strip have been removed, and all functionality merged in to Phaser.Rope, to cut down on the number of internal classes and inheritance going on.
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
|
@ -370,6 +371,7 @@ Please note that Phaser uses a custom build of Pixi and always has done. The fol
|
|||
* PIXI.Utils has been removed. All functionality is now available in Phaser.
|
||||
* PIXI.EventTarget has been removed as it's no longer used internally.
|
||||
* PIXI.AbstractFilter has been removed as it's no longer used internally. All functionality is now available via Phaser.Filter.
|
||||
* PIXI.Strip and PIXI.Rope have been removed. All functionality is now available via Phaser.Rope.
|
||||
|
||||
For changes in previous releases please see the extensive [Version History](https://github.com/photonstorm/phaser/blob/master/CHANGELOG.md).
|
||||
|
||||
|
|
|
@ -80,12 +80,6 @@
|
|||
|
||||
EOL;
|
||||
|
||||
if ($modules['rope'])
|
||||
{
|
||||
echo " <script src=\"$path/src/pixi/extras/Strip.js\"></script>";
|
||||
echo " <script src=\"$path/src/pixi/extras/Rope.js\"></script>";
|
||||
}
|
||||
|
||||
// PIXI Outro + Phaser Global
|
||||
echo <<<EOL
|
||||
|
||||
|
|
|
@ -1,5 +1,7 @@
|
|||
/**
|
||||
* @author Richard Davey <rich@photonstorm.com>
|
||||
* @author Mat Groves (@Doormat23)
|
||||
* @author Rovanion Luckey
|
||||
* @copyright 2016 Photon Storm Ltd, Richard Davey
|
||||
* @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
|
||||
*/
|
||||
|
@ -13,7 +15,7 @@
|
|||
*
|
||||
* @class Phaser.Rope
|
||||
* @constructor
|
||||
* @extends PIXI.Rope
|
||||
* @extends PIXI.DisplayObjectContainer
|
||||
* @extends Phaser.Component.Core
|
||||
* @extends Phaser.Component.Angle
|
||||
* @extends Phaser.Component.Animation
|
||||
|
@ -56,13 +58,60 @@ Phaser.Rope = function (game, x, y, key, frame, points) {
|
|||
*/
|
||||
this.type = Phaser.ROPE;
|
||||
|
||||
PIXI.Rope.call(this, Phaser.Cache.DEFAULT, this.points);
|
||||
this.points = points;
|
||||
|
||||
PIXI.DisplayObjectContainer.call(this);
|
||||
|
||||
this.texture = Phaser.Cache.DEFAULT;
|
||||
|
||||
// set up the main bits..
|
||||
this.uvs = new PIXI.Float32Array([0, 1,
|
||||
1, 1,
|
||||
1, 0,
|
||||
0, 1]);
|
||||
|
||||
this.vertices = new PIXI.Float32Array([0, 0,
|
||||
100, 0,
|
||||
100, 100,
|
||||
0, 100]);
|
||||
|
||||
this.colors = new PIXI.Float32Array([1, 1, 1, 1]);
|
||||
|
||||
this.indices = new PIXI.Uint16Array([0, 1, 2, 3]);
|
||||
|
||||
if (points)
|
||||
{
|
||||
this.vertices = new PIXI.Float32Array(points.length * 4);
|
||||
this.uvs = new PIXI.Float32Array(points.length * 4);
|
||||
this.colors = new PIXI.Float32Array(points.length * 2);
|
||||
this.indices = new PIXI.Uint16Array(points.length * 2);
|
||||
}
|
||||
|
||||
/**
|
||||
* Whether the strip is dirty or not
|
||||
*
|
||||
* @property dirty
|
||||
* @type Boolean
|
||||
*/
|
||||
this.dirty = true;
|
||||
|
||||
/**
|
||||
* Triangles in canvas mode are automatically antialiased, use this value to force triangles to overlap a bit with each other.
|
||||
*
|
||||
* @property canvasPadding
|
||||
* @type Number
|
||||
*/
|
||||
this.canvasPadding = 0;
|
||||
|
||||
this.drawMode = Phaser.Rope.TRIANGLE_STRIP;
|
||||
|
||||
Phaser.Component.Core.init.call(this, game, x, y, key, frame);
|
||||
|
||||
this.refresh();
|
||||
|
||||
};
|
||||
|
||||
Phaser.Rope.prototype = Object.create(PIXI.Rope.prototype);
|
||||
Phaser.Rope.prototype = Object.create(PIXI.DisplayObjectContainer.prototype);
|
||||
Phaser.Rope.prototype.constructor = Phaser.Rope;
|
||||
|
||||
Phaser.Component.Core.install.call(Phaser.Rope.prototype, [
|
||||
|
@ -90,13 +139,16 @@ Phaser.Rope.prototype.preUpdateLifeSpan = Phaser.Component.LifeSpan.preUpdate;
|
|||
Phaser.Rope.prototype.preUpdateInWorld = Phaser.Component.InWorld.preUpdate;
|
||||
Phaser.Rope.prototype.preUpdateCore = Phaser.Component.Core.preUpdate;
|
||||
|
||||
Phaser.Rope.TRIANGLE_STRIP = 0;
|
||||
Phaser.Rope.TRIANGLES = 1;
|
||||
|
||||
/**
|
||||
* Automatically called by World.preUpdate.
|
||||
*
|
||||
* @method Phaser.Rope#preUpdate
|
||||
* @memberof Phaser.Rope
|
||||
*/
|
||||
Phaser.Rope.prototype.preUpdate = function() {
|
||||
Phaser.Rope.prototype.preUpdate = function () {
|
||||
|
||||
if (!this.preUpdatePhysics() || !this.preUpdateLifeSpan() || !this.preUpdateInWorld())
|
||||
{
|
||||
|
@ -133,7 +185,7 @@ Phaser.Rope.prototype.update = function() {
|
|||
* @param {number} y - The y coordinate (in world space) to position the Sprite at.
|
||||
* @return {Phaser.Rope} This instance.
|
||||
*/
|
||||
Phaser.Rope.prototype.reset = function(x, y) {
|
||||
Phaser.Rope.prototype.reset = function (x, y) {
|
||||
|
||||
Phaser.Component.Reset.prototype.reset.call(this, x, y);
|
||||
|
||||
|
@ -141,6 +193,585 @@ Phaser.Rope.prototype.reset = function(x, y) {
|
|||
|
||||
};
|
||||
|
||||
/*
|
||||
* Refreshes the rope texture and UV coordinates.
|
||||
*
|
||||
* @method Phaser.Rope#refresh
|
||||
* @memberof Phaser.Rope
|
||||
*/
|
||||
Phaser.Rope.prototype.refresh = function () {
|
||||
|
||||
var points = this.points;
|
||||
|
||||
if (points.length < 1)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
var uvs = this.uvs;
|
||||
|
||||
var indices = this.indices;
|
||||
var colors = this.colors;
|
||||
|
||||
this.count -= 0.2;
|
||||
|
||||
uvs[0] = 0;
|
||||
uvs[1] = 0;
|
||||
uvs[2] = 0;
|
||||
uvs[3] = 1;
|
||||
|
||||
colors[0] = 1;
|
||||
colors[1] = 1;
|
||||
|
||||
indices[0] = 0;
|
||||
indices[1] = 1;
|
||||
|
||||
var total = points.length;
|
||||
var index;
|
||||
var amount;
|
||||
|
||||
for (var i = 1; i < total; i++)
|
||||
{
|
||||
index = i * 4;
|
||||
|
||||
// time to do some smart drawing!
|
||||
amount = i / (total - 1);
|
||||
|
||||
if (i % 2)
|
||||
{
|
||||
uvs[index] = amount;
|
||||
uvs[index + 1] = 0;
|
||||
|
||||
uvs[index + 2] = amount;
|
||||
uvs[index + 3] = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
uvs[index] = amount;
|
||||
uvs[index + 1] = 0;
|
||||
|
||||
uvs[index + 2] = amount;
|
||||
uvs[index + 3] = 1;
|
||||
}
|
||||
|
||||
index = i * 2;
|
||||
colors[index] = 1;
|
||||
colors[index + 1] = 1;
|
||||
|
||||
index = i * 2;
|
||||
indices[index] = index;
|
||||
indices[index + 1] = index + 1;
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
/*
|
||||
* Updates the Ropes transform ready for rendering.
|
||||
*
|
||||
* @method Phaser.Rope#updateTransform
|
||||
* @memberof Phaser.Rope
|
||||
*/
|
||||
Phaser.Rope.prototype.updateTransform = function () {
|
||||
|
||||
var points = this.points;
|
||||
|
||||
if (points.length < 1)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
var lastPoint = points[0];
|
||||
var nextPoint;
|
||||
var perp = { x:0, y:0 };
|
||||
|
||||
this.count -= 0.2;
|
||||
|
||||
var vertices = this.vertices;
|
||||
var total = points.length;
|
||||
var point;
|
||||
var index;
|
||||
var ratio;
|
||||
var perpLength;
|
||||
var num;
|
||||
|
||||
for (var i = 0; i < total; i++)
|
||||
{
|
||||
point = points[i];
|
||||
index = i * 4;
|
||||
|
||||
if(i < points.length - 1)
|
||||
{
|
||||
nextPoint = points[i + 1];
|
||||
}
|
||||
else
|
||||
{
|
||||
nextPoint = point;
|
||||
}
|
||||
|
||||
perp.y = -(nextPoint.x - lastPoint.x);
|
||||
perp.x = nextPoint.y - lastPoint.y;
|
||||
|
||||
ratio = (1 - (i / (total - 1))) * 10;
|
||||
|
||||
if (ratio > 1)
|
||||
{
|
||||
ratio = 1;
|
||||
}
|
||||
|
||||
perpLength = Math.sqrt((perp.x * perp.x) + (perp.y * perp.y));
|
||||
num = this.texture.height / 2;
|
||||
perp.x /= perpLength;
|
||||
perp.y /= perpLength;
|
||||
|
||||
perp.x *= num;
|
||||
perp.y *= num;
|
||||
|
||||
vertices[index] = point.x + perp.x;
|
||||
vertices[index + 1] = point.y + perp.y;
|
||||
vertices[index + 2] = point.x - perp.x;
|
||||
vertices[index + 3] = point.y - perp.y;
|
||||
|
||||
lastPoint = point;
|
||||
}
|
||||
|
||||
PIXI.DisplayObjectContainer.prototype.updateTransform.call(this);
|
||||
|
||||
};
|
||||
|
||||
/*
|
||||
* Sets the Texture this Rope uses for rendering.
|
||||
*
|
||||
* @method Phaser.Rope#setTexture
|
||||
* @memberof Phaser.Rope
|
||||
* @param {Texture} texture - The texture that will be used.
|
||||
*/
|
||||
Phaser.Rope.prototype.setTexture = function (texture) {
|
||||
|
||||
this.texture = texture;
|
||||
|
||||
};
|
||||
|
||||
/*
|
||||
* Renders the Rope to WebGL.
|
||||
*
|
||||
* @private
|
||||
* @method Phaser.Rope#_renderWebGL
|
||||
* @memberof Phaser.Rope
|
||||
*/
|
||||
Phaser.Rope.prototype._renderWebGL = function (renderSession) {
|
||||
|
||||
if (!this.visible || this.alpha <= 0)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
renderSession.spriteBatch.stop();
|
||||
|
||||
if (!this._vertexBuffer)
|
||||
{
|
||||
this._initWebGL(renderSession);
|
||||
}
|
||||
|
||||
renderSession.shaderManager.setShader(renderSession.shaderManager.stripShader);
|
||||
|
||||
this._renderStrip(renderSession);
|
||||
|
||||
renderSession.spriteBatch.start();
|
||||
|
||||
};
|
||||
|
||||
/*
|
||||
* Builds the Strip.
|
||||
*
|
||||
* @private
|
||||
* @method Phaser.Rope#_initWebGL
|
||||
* @memberof Phaser.Rope
|
||||
*/
|
||||
Phaser.Rope.prototype._initWebGL = function (renderSession) {
|
||||
|
||||
// build the strip!
|
||||
var gl = renderSession.gl;
|
||||
|
||||
this._vertexBuffer = gl.createBuffer();
|
||||
this._indexBuffer = gl.createBuffer();
|
||||
this._uvBuffer = gl.createBuffer();
|
||||
this._colorBuffer = gl.createBuffer();
|
||||
|
||||
gl.bindBuffer(gl.ARRAY_BUFFER, this._vertexBuffer);
|
||||
gl.bufferData(gl.ARRAY_BUFFER, this.vertices, gl.DYNAMIC_DRAW);
|
||||
|
||||
gl.bindBuffer(gl.ARRAY_BUFFER, this._uvBuffer);
|
||||
gl.bufferData(gl.ARRAY_BUFFER, this.uvs, gl.STATIC_DRAW);
|
||||
|
||||
gl.bindBuffer(gl.ARRAY_BUFFER, this._colorBuffer);
|
||||
gl.bufferData(gl.ARRAY_BUFFER, this.colors, gl.STATIC_DRAW);
|
||||
|
||||
gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);
|
||||
gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, this.indices, gl.STATIC_DRAW);
|
||||
|
||||
};
|
||||
|
||||
/*
|
||||
* Renders the Strip to WebGL.
|
||||
*
|
||||
* @private
|
||||
* @method Phaser.Rope#_renderStrip
|
||||
* @memberof Phaser.Rope
|
||||
*/
|
||||
Phaser.Rope.prototype._renderStrip = function (renderSession) {
|
||||
|
||||
var gl = renderSession.gl;
|
||||
var projection = renderSession.projection;
|
||||
var offset = renderSession.offset;
|
||||
var shader = renderSession.shaderManager.stripShader;
|
||||
|
||||
var drawMode = (this.drawMode === Phaser.Rope.TRIANGLE_STRIP) ? gl.TRIANGLE_STRIP : gl.TRIANGLES;
|
||||
|
||||
renderSession.blendModeManager.setBlendMode(this.blendMode);
|
||||
|
||||
// set uniforms
|
||||
gl.uniformMatrix3fv(shader.translationMatrix, false, this.worldTransform.toArray(true));
|
||||
gl.uniform2f(shader.projectionVector, projection.x, -projection.y);
|
||||
gl.uniform2f(shader.offsetVector, -offset.x, -offset.y);
|
||||
gl.uniform1f(shader.alpha, this.worldAlpha);
|
||||
|
||||
if (!this.dirty)
|
||||
{
|
||||
gl.bindBuffer(gl.ARRAY_BUFFER, this._vertexBuffer);
|
||||
gl.bufferSubData(gl.ARRAY_BUFFER, 0, this.vertices);
|
||||
gl.vertexAttribPointer(shader.aVertexPosition, 2, gl.FLOAT, false, 0, 0);
|
||||
|
||||
// update the uvs
|
||||
gl.bindBuffer(gl.ARRAY_BUFFER, this._uvBuffer);
|
||||
gl.vertexAttribPointer(shader.aTextureCoord, 2, gl.FLOAT, false, 0, 0);
|
||||
|
||||
gl.activeTexture(gl.TEXTURE0);
|
||||
|
||||
// check if a texture is dirty..
|
||||
if (this.texture.baseTexture._dirty[gl.id])
|
||||
{
|
||||
renderSession.renderer.updateTexture(this.texture.baseTexture);
|
||||
}
|
||||
else
|
||||
{
|
||||
// bind the current texture
|
||||
gl.bindTexture(gl.TEXTURE_2D, this.texture.baseTexture._glTextures[gl.id]);
|
||||
}
|
||||
|
||||
gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);
|
||||
}
|
||||
else
|
||||
{
|
||||
this.dirty = false;
|
||||
|
||||
gl.bindBuffer(gl.ARRAY_BUFFER, this._vertexBuffer);
|
||||
gl.bufferData(gl.ARRAY_BUFFER, this.vertices, gl.STATIC_DRAW);
|
||||
gl.vertexAttribPointer(shader.aVertexPosition, 2, gl.FLOAT, false, 0, 0);
|
||||
|
||||
// update the uvs
|
||||
gl.bindBuffer(gl.ARRAY_BUFFER, this._uvBuffer);
|
||||
gl.bufferData(gl.ARRAY_BUFFER, this.uvs, gl.STATIC_DRAW);
|
||||
gl.vertexAttribPointer(shader.aTextureCoord, 2, gl.FLOAT, false, 0, 0);
|
||||
|
||||
gl.activeTexture(gl.TEXTURE0);
|
||||
|
||||
// check if a texture is dirty..
|
||||
if (this.texture.baseTexture._dirty[gl.id])
|
||||
{
|
||||
renderSession.renderer.updateTexture(this.texture.baseTexture);
|
||||
}
|
||||
else
|
||||
{
|
||||
gl.bindTexture(gl.TEXTURE_2D, this.texture.baseTexture._glTextures[gl.id]);
|
||||
}
|
||||
|
||||
gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);
|
||||
gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, this.indices, gl.STATIC_DRAW);
|
||||
}
|
||||
|
||||
gl.drawElements(drawMode, this.indices.length, gl.UNSIGNED_SHORT, 0);
|
||||
|
||||
};
|
||||
|
||||
/*
|
||||
* Renders the Strip to Canvas.
|
||||
*
|
||||
* @private
|
||||
* @method Phaser.Rope#_renderCanvas
|
||||
* @memberof Phaser.Rope
|
||||
*/
|
||||
Phaser.Rope.prototype._renderCanvas = function (renderSession) {
|
||||
|
||||
var context = renderSession.context;
|
||||
|
||||
var transform = this.worldTransform;
|
||||
|
||||
var tx = (transform.tx * renderSession.resolution) + renderSession.shakeX;
|
||||
var ty = (transform.ty * renderSession.resolution) + renderSession.shakeY;
|
||||
|
||||
if (renderSession.roundPixels)
|
||||
{
|
||||
context.setTransform(transform.a, transform.b, transform.c, transform.d, tx | 0, ty | 0);
|
||||
}
|
||||
else
|
||||
{
|
||||
context.setTransform(transform.a, transform.b, transform.c, transform.d, tx, ty);
|
||||
}
|
||||
|
||||
if (this.drawMode === Phaser.Rope.TRIANGLE_STRIP)
|
||||
{
|
||||
this._renderCanvasTriangleStrip(context);
|
||||
}
|
||||
else
|
||||
{
|
||||
this._renderCanvasTriangles(context);
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
/*
|
||||
* Renders a Triangle Strip to Canvas.
|
||||
*
|
||||
* @private
|
||||
* @method Phaser.Rope#_renderCanvasTriangleStrip
|
||||
* @memberof Phaser.Rope
|
||||
*/
|
||||
Phaser.Rope.prototype._renderCanvasTriangleStrip = function (context) {
|
||||
|
||||
// draw triangles!!
|
||||
var vertices = this.vertices;
|
||||
var uvs = this.uvs;
|
||||
|
||||
var length = vertices.length / 2;
|
||||
|
||||
this.count++;
|
||||
|
||||
for (var i = 0; i < length - 2; i++)
|
||||
{
|
||||
var index = i * 2;
|
||||
this._renderCanvasDrawTriangle(context, vertices, uvs, index, (index + 2), (index + 4));
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
/*
|
||||
* Renders a Triangle to Canvas.
|
||||
*
|
||||
* @private
|
||||
* @method Phaser.Rope#_renderCanvasTriangles
|
||||
* @memberof Phaser.Rope
|
||||
*/
|
||||
Phaser.Rope.prototype._renderCanvasTriangles = function (context) {
|
||||
|
||||
var vertices = this.vertices;
|
||||
var uvs = this.uvs;
|
||||
var indices = this.indices;
|
||||
|
||||
var length = indices.length;
|
||||
|
||||
this.count++;
|
||||
|
||||
for (var i = 0; i < length; i += 3)
|
||||
{
|
||||
var index0 = indices[i] * 2;
|
||||
var index1 = indices[i + 1] * 2;
|
||||
var index2 = indices[i + 2] * 2;
|
||||
|
||||
this._renderCanvasDrawTriangle(context, vertices, uvs, index0, index1, index2);
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
/*
|
||||
* Renders a Triangle to Canvas.
|
||||
*
|
||||
* @private
|
||||
* @method Phaser.Rope#_renderCanvasDrawTriangle
|
||||
* @memberof Phaser.Rope
|
||||
*/
|
||||
Phaser.Rope.prototype._renderCanvasDrawTriangle = function (context, vertices, uvs, index0, index1, index2) {
|
||||
|
||||
var textureSource = this.texture.baseTexture.source;
|
||||
var textureWidth = this.texture.width;
|
||||
var textureHeight = this.texture.height;
|
||||
|
||||
var x0 = vertices[index0];
|
||||
var x1 = vertices[index1];
|
||||
var x2 = vertices[index2];
|
||||
var y0 = vertices[index0 + 1];
|
||||
var y1 = vertices[index1 + 1];
|
||||
var y2 = vertices[index2 + 1];
|
||||
|
||||
var u0 = uvs[index0] * textureWidth;
|
||||
var u1 = uvs[index1] * textureWidth;
|
||||
var u2 = uvs[index2] * textureWidth;
|
||||
var v0 = uvs[index0 + 1] * textureHeight;
|
||||
var v1 = uvs[index1 + 1] * textureHeight;
|
||||
var v2 = uvs[index2 + 1] * textureHeight;
|
||||
|
||||
if (this.canvasPadding > 0)
|
||||
{
|
||||
var paddingX = this.canvasPadding / this.worldTransform.a;
|
||||
var paddingY = this.canvasPadding / this.worldTransform.d;
|
||||
var centerX = (x0 + x1 + x2) / 3;
|
||||
var centerY = (y0 + y1 + y2) / 3;
|
||||
|
||||
var normX = x0 - centerX;
|
||||
var normY = y0 - centerY;
|
||||
|
||||
var dist = Math.sqrt((normX * normX) + (normY * normY));
|
||||
x0 = centerX + (normX / dist) * (dist + paddingX);
|
||||
y0 = centerY + (normY / dist) * (dist + paddingY);
|
||||
|
||||
normX = x1 - centerX;
|
||||
normY = y1 - centerY;
|
||||
|
||||
dist = Math.sqrt((normX * normX) + (normY * normY));
|
||||
x1 = centerX + (normX / dist) * (dist + paddingX);
|
||||
y1 = centerY + (normY / dist) * (dist + paddingY);
|
||||
|
||||
normX = x2 - centerX;
|
||||
normY = y2 - centerY;
|
||||
|
||||
dist = Math.sqrt((normX * normX) + (normY * normY));
|
||||
x2 = centerX + (normX / dist) * (dist + paddingX);
|
||||
y2 = centerY + (normY / dist) * (dist + paddingY);
|
||||
}
|
||||
|
||||
context.save();
|
||||
context.beginPath();
|
||||
|
||||
context.moveTo(x0, y0);
|
||||
context.lineTo(x1, y1);
|
||||
context.lineTo(x2, y2);
|
||||
|
||||
context.closePath();
|
||||
|
||||
context.clip();
|
||||
|
||||
// Compute matrix transform
|
||||
var delta = (u0 * v1) + (v0 * u2) + (u1 * v2) - (v1 * u2) - (v0 * u1) - (u0 * v2);
|
||||
var deltaA = (x0 * v1) + (v0 * x2) + (x1 * v2) - (v1 * x2) - (v0 * x1) - (x0 * v2);
|
||||
var deltaB = (u0 * x1) + (x0 * u2) + (u1 * x2) - (x1 * u2) - (x0 * u1) - (u0 * x2);
|
||||
var deltaC = (u0 * v1 * x2) + (v0 * x1 * u2) + (x0 * u1 * v2) - (x0 * v1 * u2) - (v0 * u1 * x2) - (u0 * x1 * v2);
|
||||
var deltaD = (y0 * v1) + (v0 * y2) + (y1 * v2) - (v1 * y2) - (v0 * y1) - (y0 * v2);
|
||||
var deltaE = (u0 * y1) + (y0 * u2) + (u1 * y2) - (y1 * u2) - (y0 * u1) - (u0 * y2);
|
||||
var deltaF = (u0 * v1 * y2) + (v0 * y1 * u2) + (y0 * u1 * v2) - (y0 * v1 * u2) - (v0 * u1 * y2) - (u0 * y1 * v2);
|
||||
|
||||
context.transform(
|
||||
deltaA / delta,
|
||||
deltaD / delta,
|
||||
deltaB / delta,
|
||||
deltaE / delta,
|
||||
deltaC / delta,
|
||||
deltaF / delta);
|
||||
|
||||
context.drawImage(textureSource, 0, 0);
|
||||
context.restore();
|
||||
|
||||
};
|
||||
|
||||
/*
|
||||
* Renders a flat strip.
|
||||
*
|
||||
* @method Phaser.Rope#renderStripFlat
|
||||
* @memberof Phaser.Rope
|
||||
*/
|
||||
Phaser.Rope.prototype.renderStripFlat = function (strip) {
|
||||
|
||||
var context = this.context;
|
||||
var vertices = strip.vertices;
|
||||
|
||||
var length = vertices.length / 2;
|
||||
|
||||
this.count++;
|
||||
|
||||
context.beginPath();
|
||||
|
||||
for (var i = 1; i < length - 2; i++)
|
||||
{
|
||||
// draw some triangles!
|
||||
var index = i * 2;
|
||||
|
||||
var x0 = vertices[index];
|
||||
var x1 = vertices[index + 2];
|
||||
var x2 = vertices[index + 4];
|
||||
var y0 = vertices[index + 1];
|
||||
var y1 = vertices[index + 3];
|
||||
var y2 = vertices[index + 5];
|
||||
|
||||
context.moveTo(x0, y0);
|
||||
context.lineTo(x1, y1);
|
||||
context.lineTo(x2, y2);
|
||||
}
|
||||
|
||||
context.fillStyle = '#FF0000';
|
||||
context.fill();
|
||||
context.closePath();
|
||||
|
||||
};
|
||||
|
||||
/*
|
||||
* Returns the bounds of the mesh as a rectangle. The bounds calculation takes the worldTransform into account.
|
||||
*
|
||||
* @method Phaser.Rope#getBounds
|
||||
* @memberof Phaser.Rope
|
||||
* @param {Matrix} matrix - The transformation matrix of the Sprite.
|
||||
* @return {Rectangle} The framing rectangle.
|
||||
*/
|
||||
Phaser.Rope.prototype.getBounds = function (matrix) {
|
||||
|
||||
var worldTransform = matrix || this.worldTransform;
|
||||
|
||||
var a = worldTransform.a;
|
||||
var b = worldTransform.b;
|
||||
var c = worldTransform.c;
|
||||
var d = worldTransform.d;
|
||||
var tx = worldTransform.tx;
|
||||
var ty = worldTransform.ty;
|
||||
|
||||
var maxX = -Infinity;
|
||||
var maxY = -Infinity;
|
||||
|
||||
var minX = Infinity;
|
||||
var minY = Infinity;
|
||||
|
||||
var vertices = this.vertices;
|
||||
|
||||
for (var i = 0; i < vertices.length; i += 2)
|
||||
{
|
||||
var rawX = vertices[i];
|
||||
var rawY = vertices[i + 1];
|
||||
var x = (a * rawX) + (c * rawY) + tx;
|
||||
var y = (d * rawY) + (b * rawX) + ty;
|
||||
|
||||
minX = x < minX ? x : minX;
|
||||
minY = y < minY ? y : minY;
|
||||
|
||||
maxX = x > maxX ? x : maxX;
|
||||
maxY = y > maxY ? y : maxY;
|
||||
}
|
||||
|
||||
if (minX === -Infinity || maxY === Infinity)
|
||||
{
|
||||
return PIXI.EmptyRectangle;
|
||||
}
|
||||
|
||||
var bounds = this._bounds;
|
||||
|
||||
bounds.x = minX;
|
||||
bounds.width = maxX - minX;
|
||||
|
||||
bounds.y = minY;
|
||||
bounds.height = maxY - minY;
|
||||
|
||||
// Store a reference so that if this function gets called again in the render cycle we do not have to recalculate
|
||||
this._currentBounds = bounds;
|
||||
|
||||
return bounds;
|
||||
|
||||
};
|
||||
|
||||
/**
|
||||
* A Rope will call its updateAnimation function on each update loop if it has one.
|
||||
*
|
||||
|
@ -180,7 +811,7 @@ Object.defineProperty(Phaser.Rope.prototype, "updateAnimation", {
|
|||
*/
|
||||
Object.defineProperty(Phaser.Rope.prototype, "segments", {
|
||||
|
||||
get: function() {
|
||||
get: function () {
|
||||
|
||||
var segments = [];
|
||||
var index, x1, y1, x2, y2, width, height, rect;
|
||||
|
|
|
@ -1,174 +0,0 @@
|
|||
/**
|
||||
* @author Mat Groves http://matgroves.com/ @Doormat23
|
||||
* @copyright Mat Groves, Rovanion Luckey
|
||||
*/
|
||||
|
||||
/**
|
||||
*
|
||||
* @class Rope
|
||||
* @constructor
|
||||
* @extends Strip
|
||||
* @param {Texture} texture - The texture to use on the rope.
|
||||
* @param {Array} points - An array of {PIXI.Point}.
|
||||
*
|
||||
*/
|
||||
PIXI.Rope = function(texture, points)
|
||||
{
|
||||
PIXI.Strip.call( this, texture );
|
||||
this.points = points;
|
||||
|
||||
this.vertices = new PIXI.Float32Array(points.length * 4);
|
||||
this.uvs = new PIXI.Float32Array(points.length * 4);
|
||||
this.colors = new PIXI.Float32Array(points.length * 2);
|
||||
this.indices = new PIXI.Uint16Array(points.length * 2);
|
||||
|
||||
|
||||
this.refresh();
|
||||
};
|
||||
|
||||
|
||||
// constructor
|
||||
PIXI.Rope.prototype = Object.create( PIXI.Strip.prototype );
|
||||
PIXI.Rope.prototype.constructor = PIXI.Rope;
|
||||
|
||||
/*
|
||||
* Refreshes
|
||||
*
|
||||
* @method refresh
|
||||
*/
|
||||
PIXI.Rope.prototype.refresh = function()
|
||||
{
|
||||
var points = this.points;
|
||||
if(points.length < 1) return;
|
||||
|
||||
var uvs = this.uvs;
|
||||
|
||||
var lastPoint = points[0];
|
||||
var indices = this.indices;
|
||||
var colors = this.colors;
|
||||
|
||||
this.count-=0.2;
|
||||
|
||||
uvs[0] = 0;
|
||||
uvs[1] = 0;
|
||||
uvs[2] = 0;
|
||||
uvs[3] = 1;
|
||||
|
||||
colors[0] = 1;
|
||||
colors[1] = 1;
|
||||
|
||||
indices[0] = 0;
|
||||
indices[1] = 1;
|
||||
|
||||
var total = points.length,
|
||||
point, index, amount;
|
||||
|
||||
for (var i = 1; i < total; i++)
|
||||
{
|
||||
point = points[i];
|
||||
index = i * 4;
|
||||
// time to do some smart drawing!
|
||||
amount = i / (total-1);
|
||||
|
||||
if(i%2)
|
||||
{
|
||||
uvs[index] = amount;
|
||||
uvs[index+1] = 0;
|
||||
|
||||
uvs[index+2] = amount;
|
||||
uvs[index+3] = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
uvs[index] = amount;
|
||||
uvs[index+1] = 0;
|
||||
|
||||
uvs[index+2] = amount;
|
||||
uvs[index+3] = 1;
|
||||
}
|
||||
|
||||
index = i * 2;
|
||||
colors[index] = 1;
|
||||
colors[index+1] = 1;
|
||||
|
||||
index = i * 2;
|
||||
indices[index] = index;
|
||||
indices[index + 1] = index + 1;
|
||||
|
||||
lastPoint = point;
|
||||
}
|
||||
};
|
||||
|
||||
/*
|
||||
* Updates the object transform for rendering
|
||||
*
|
||||
* @method updateTransform
|
||||
* @private
|
||||
*/
|
||||
PIXI.Rope.prototype.updateTransform = function()
|
||||
{
|
||||
|
||||
var points = this.points;
|
||||
if(points.length < 1)return;
|
||||
|
||||
var lastPoint = points[0];
|
||||
var nextPoint;
|
||||
var perp = {x:0, y:0};
|
||||
|
||||
this.count-=0.2;
|
||||
|
||||
var vertices = this.vertices;
|
||||
var total = points.length,
|
||||
point, index, ratio, perpLength, num;
|
||||
|
||||
for (var i = 0; i < total; i++)
|
||||
{
|
||||
point = points[i];
|
||||
index = i * 4;
|
||||
|
||||
if(i < points.length-1)
|
||||
{
|
||||
nextPoint = points[i+1];
|
||||
}
|
||||
else
|
||||
{
|
||||
nextPoint = point;
|
||||
}
|
||||
|
||||
perp.y = -(nextPoint.x - lastPoint.x);
|
||||
perp.x = nextPoint.y - lastPoint.y;
|
||||
|
||||
ratio = (1 - (i / (total-1))) * 10;
|
||||
|
||||
if(ratio > 1) ratio = 1;
|
||||
|
||||
perpLength = Math.sqrt(perp.x * perp.x + perp.y * perp.y);
|
||||
num = this.texture.height / 2; //(20 + Math.abs(Math.sin((i + this.count) * 0.3) * 50) )* ratio;
|
||||
perp.x /= perpLength;
|
||||
perp.y /= perpLength;
|
||||
|
||||
perp.x *= num;
|
||||
perp.y *= num;
|
||||
|
||||
vertices[index] = point.x + perp.x;
|
||||
vertices[index+1] = point.y + perp.y;
|
||||
vertices[index+2] = point.x - perp.x;
|
||||
vertices[index+3] = point.y - perp.y;
|
||||
|
||||
lastPoint = point;
|
||||
}
|
||||
|
||||
PIXI.DisplayObjectContainer.prototype.updateTransform.call( this );
|
||||
};
|
||||
/*
|
||||
* Sets the texture that the Rope will use
|
||||
*
|
||||
* @method setTexture
|
||||
* @param texture {Texture} the texture that will be used
|
||||
*/
|
||||
PIXI.Rope.prototype.setTexture = function(texture)
|
||||
{
|
||||
// stop current texture
|
||||
this.texture = texture;
|
||||
//this.updateFrame = true;
|
||||
};
|
|
@ -1,472 +0,0 @@
|
|||
/**
|
||||
* @author Mat Groves http://matgroves.com/
|
||||
*/
|
||||
|
||||
/**
|
||||
*
|
||||
* @class Strip
|
||||
* @extends DisplayObjectContainer
|
||||
* @constructor
|
||||
* @param texture {Texture} The texture to use
|
||||
* @param width {Number} the width
|
||||
* @param height {Number} the height
|
||||
*
|
||||
*/
|
||||
PIXI.Strip = function(texture)
|
||||
{
|
||||
PIXI.DisplayObjectContainer.call( this );
|
||||
|
||||
|
||||
/**
|
||||
* The texture of the strip
|
||||
*
|
||||
* @property texture
|
||||
* @type Texture
|
||||
*/
|
||||
this.texture = texture;
|
||||
|
||||
// set up the main bits..
|
||||
this.uvs = new PIXI.Float32Array([0, 1,
|
||||
1, 1,
|
||||
1, 0,
|
||||
0, 1]);
|
||||
|
||||
this.vertices = new PIXI.Float32Array([0, 0,
|
||||
100, 0,
|
||||
100, 100,
|
||||
0, 100]);
|
||||
|
||||
this.colors = new PIXI.Float32Array([1, 1, 1, 1]);
|
||||
|
||||
this.indices = new PIXI.Uint16Array([0, 1, 2, 3]);
|
||||
|
||||
/**
|
||||
* Whether the strip is dirty or not
|
||||
*
|
||||
* @property dirty
|
||||
* @type Boolean
|
||||
*/
|
||||
this.dirty = true;
|
||||
|
||||
/**
|
||||
* The blend mode to be applied to the sprite. Set to PIXI.blendModes.NORMAL to remove any blend mode.
|
||||
*
|
||||
* @property blendMode
|
||||
* @type Number
|
||||
* @default PIXI.blendModes.NORMAL;
|
||||
*/
|
||||
this.blendMode = PIXI.blendModes.NORMAL;
|
||||
|
||||
/**
|
||||
* Triangles in canvas mode are automatically antialiased, use this value to force triangles to overlap a bit with each other.
|
||||
*
|
||||
* @property canvasPadding
|
||||
* @type Number
|
||||
*/
|
||||
this.canvasPadding = 0;
|
||||
|
||||
this.drawMode = PIXI.Strip.DrawModes.TRIANGLE_STRIP;
|
||||
|
||||
};
|
||||
|
||||
// constructor
|
||||
PIXI.Strip.prototype = Object.create(PIXI.DisplayObjectContainer.prototype);
|
||||
PIXI.Strip.prototype.constructor = PIXI.Strip;
|
||||
|
||||
PIXI.Strip.prototype._renderWebGL = function(renderSession)
|
||||
{
|
||||
// if the sprite is not visible or the alpha is 0 then no need to render this element
|
||||
if(!this.visible || this.alpha <= 0)return;
|
||||
// render triangle strip..
|
||||
|
||||
renderSession.spriteBatch.stop();
|
||||
|
||||
// init! init!
|
||||
if(!this._vertexBuffer)this._initWebGL(renderSession);
|
||||
|
||||
renderSession.shaderManager.setShader(renderSession.shaderManager.stripShader);
|
||||
|
||||
this._renderStrip(renderSession);
|
||||
|
||||
///renderSession.shaderManager.activateDefaultShader();
|
||||
|
||||
renderSession.spriteBatch.start();
|
||||
|
||||
//TODO check culling
|
||||
};
|
||||
|
||||
PIXI.Strip.prototype._initWebGL = function(renderSession)
|
||||
{
|
||||
// build the strip!
|
||||
var gl = renderSession.gl;
|
||||
|
||||
this._vertexBuffer = gl.createBuffer();
|
||||
this._indexBuffer = gl.createBuffer();
|
||||
this._uvBuffer = gl.createBuffer();
|
||||
this._colorBuffer = gl.createBuffer();
|
||||
|
||||
gl.bindBuffer(gl.ARRAY_BUFFER, this._vertexBuffer);
|
||||
gl.bufferData(gl.ARRAY_BUFFER, this.vertices, gl.DYNAMIC_DRAW);
|
||||
|
||||
gl.bindBuffer(gl.ARRAY_BUFFER, this._uvBuffer);
|
||||
gl.bufferData(gl.ARRAY_BUFFER, this.uvs, gl.STATIC_DRAW);
|
||||
|
||||
gl.bindBuffer(gl.ARRAY_BUFFER, this._colorBuffer);
|
||||
gl.bufferData(gl.ARRAY_BUFFER, this.colors, gl.STATIC_DRAW);
|
||||
|
||||
gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);
|
||||
gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, this.indices, gl.STATIC_DRAW);
|
||||
};
|
||||
|
||||
PIXI.Strip.prototype._renderStrip = function(renderSession)
|
||||
{
|
||||
var gl = renderSession.gl;
|
||||
var projection = renderSession.projection,
|
||||
offset = renderSession.offset,
|
||||
shader = renderSession.shaderManager.stripShader;
|
||||
|
||||
var drawMode = this.drawMode === PIXI.Strip.DrawModes.TRIANGLE_STRIP ? gl.TRIANGLE_STRIP : gl.TRIANGLES;
|
||||
|
||||
// gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real);
|
||||
|
||||
renderSession.blendModeManager.setBlendMode(this.blendMode);
|
||||
|
||||
|
||||
// set uniforms
|
||||
gl.uniformMatrix3fv(shader.translationMatrix, false, this.worldTransform.toArray(true));
|
||||
gl.uniform2f(shader.projectionVector, projection.x, -projection.y);
|
||||
gl.uniform2f(shader.offsetVector, -offset.x, -offset.y);
|
||||
gl.uniform1f(shader.alpha, this.worldAlpha);
|
||||
|
||||
if(!this.dirty)
|
||||
{
|
||||
|
||||
gl.bindBuffer(gl.ARRAY_BUFFER, this._vertexBuffer);
|
||||
gl.bufferSubData(gl.ARRAY_BUFFER, 0, this.vertices);
|
||||
gl.vertexAttribPointer(shader.aVertexPosition, 2, gl.FLOAT, false, 0, 0);
|
||||
|
||||
// update the uvs
|
||||
gl.bindBuffer(gl.ARRAY_BUFFER, this._uvBuffer);
|
||||
gl.vertexAttribPointer(shader.aTextureCoord, 2, gl.FLOAT, false, 0, 0);
|
||||
|
||||
gl.activeTexture(gl.TEXTURE0);
|
||||
|
||||
// check if a texture is dirty..
|
||||
if(this.texture.baseTexture._dirty[gl.id])
|
||||
{
|
||||
renderSession.renderer.updateTexture(this.texture.baseTexture);
|
||||
}
|
||||
else
|
||||
{
|
||||
// bind the current texture
|
||||
gl.bindTexture(gl.TEXTURE_2D, this.texture.baseTexture._glTextures[gl.id]);
|
||||
}
|
||||
|
||||
// dont need to upload!
|
||||
gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);
|
||||
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
this.dirty = false;
|
||||
gl.bindBuffer(gl.ARRAY_BUFFER, this._vertexBuffer);
|
||||
gl.bufferData(gl.ARRAY_BUFFER, this.vertices, gl.STATIC_DRAW);
|
||||
gl.vertexAttribPointer(shader.aVertexPosition, 2, gl.FLOAT, false, 0, 0);
|
||||
|
||||
// update the uvs
|
||||
gl.bindBuffer(gl.ARRAY_BUFFER, this._uvBuffer);
|
||||
gl.bufferData(gl.ARRAY_BUFFER, this.uvs, gl.STATIC_DRAW);
|
||||
gl.vertexAttribPointer(shader.aTextureCoord, 2, gl.FLOAT, false, 0, 0);
|
||||
|
||||
gl.activeTexture(gl.TEXTURE0);
|
||||
|
||||
// check if a texture is dirty..
|
||||
if(this.texture.baseTexture._dirty[gl.id])
|
||||
{
|
||||
renderSession.renderer.updateTexture(this.texture.baseTexture);
|
||||
}
|
||||
else
|
||||
{
|
||||
gl.bindTexture(gl.TEXTURE_2D, this.texture.baseTexture._glTextures[gl.id]);
|
||||
}
|
||||
|
||||
// dont need to upload!
|
||||
gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);
|
||||
gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, this.indices, gl.STATIC_DRAW);
|
||||
|
||||
}
|
||||
//console.log(gl.TRIANGLE_STRIP)
|
||||
//
|
||||
//
|
||||
gl.drawElements(drawMode, this.indices.length, gl.UNSIGNED_SHORT, 0);
|
||||
|
||||
|
||||
};
|
||||
|
||||
|
||||
|
||||
PIXI.Strip.prototype._renderCanvas = function(renderSession)
|
||||
{
|
||||
var context = renderSession.context;
|
||||
|
||||
var transform = this.worldTransform;
|
||||
|
||||
var tx = (transform.tx * renderSession.resolution) + renderSession.shakeX;
|
||||
var ty = (transform.ty * renderSession.resolution) + renderSession.shakeY;
|
||||
|
||||
if (renderSession.roundPixels)
|
||||
{
|
||||
context.setTransform(transform.a, transform.b, transform.c, transform.d, tx | 0, ty | 0);
|
||||
}
|
||||
else
|
||||
{
|
||||
context.setTransform(transform.a, transform.b, transform.c, transform.d, tx, ty);
|
||||
}
|
||||
|
||||
if (this.drawMode === PIXI.Strip.DrawModes.TRIANGLE_STRIP)
|
||||
{
|
||||
this._renderCanvasTriangleStrip(context);
|
||||
}
|
||||
else
|
||||
{
|
||||
this._renderCanvasTriangles(context);
|
||||
}
|
||||
};
|
||||
|
||||
PIXI.Strip.prototype._renderCanvasTriangleStrip = function(context)
|
||||
{
|
||||
// draw triangles!!
|
||||
var vertices = this.vertices;
|
||||
var uvs = this.uvs;
|
||||
|
||||
var length = vertices.length / 2;
|
||||
this.count++;
|
||||
|
||||
for (var i = 0; i < length - 2; i++) {
|
||||
// draw some triangles!
|
||||
var index = i * 2;
|
||||
this._renderCanvasDrawTriangle(context, vertices, uvs, index, (index + 2), (index + 4));
|
||||
}
|
||||
};
|
||||
|
||||
PIXI.Strip.prototype._renderCanvasTriangles = function(context)
|
||||
{
|
||||
// draw triangles!!
|
||||
var vertices = this.vertices;
|
||||
var uvs = this.uvs;
|
||||
var indices = this.indices;
|
||||
|
||||
var length = indices.length;
|
||||
this.count++;
|
||||
|
||||
for (var i = 0; i < length; i += 3) {
|
||||
// draw some triangles!
|
||||
var index0 = indices[i] * 2, index1 = indices[i + 1] * 2, index2 = indices[i + 2] * 2;
|
||||
this._renderCanvasDrawTriangle(context, vertices, uvs, index0, index1, index2);
|
||||
}
|
||||
};
|
||||
|
||||
PIXI.Strip.prototype._renderCanvasDrawTriangle = function(context, vertices, uvs, index0, index1, index2)
|
||||
{
|
||||
var textureSource = this.texture.baseTexture.source;
|
||||
var textureWidth = this.texture.width;
|
||||
var textureHeight = this.texture.height;
|
||||
|
||||
var x0 = vertices[index0], x1 = vertices[index1], x2 = vertices[index2];
|
||||
var y0 = vertices[index0 + 1], y1 = vertices[index1 + 1], y2 = vertices[index2 + 1];
|
||||
|
||||
var u0 = uvs[index0] * textureWidth, u1 = uvs[index1] * textureWidth, u2 = uvs[index2] * textureWidth;
|
||||
var v0 = uvs[index0 + 1] * textureHeight, v1 = uvs[index1 + 1] * textureHeight, v2 = uvs[index2 + 1] * textureHeight;
|
||||
|
||||
if (this.canvasPadding > 0) {
|
||||
var paddingX = this.canvasPadding / this.worldTransform.a;
|
||||
var paddingY = this.canvasPadding / this.worldTransform.d;
|
||||
var centerX = (x0 + x1 + x2) / 3;
|
||||
var centerY = (y0 + y1 + y2) / 3;
|
||||
|
||||
var normX = x0 - centerX;
|
||||
var normY = y0 - centerY;
|
||||
|
||||
var dist = Math.sqrt(normX * normX + normY * normY);
|
||||
x0 = centerX + (normX / dist) * (dist + paddingX);
|
||||
y0 = centerY + (normY / dist) * (dist + paddingY);
|
||||
|
||||
//
|
||||
|
||||
normX = x1 - centerX;
|
||||
normY = y1 - centerY;
|
||||
|
||||
dist = Math.sqrt(normX * normX + normY * normY);
|
||||
x1 = centerX + (normX / dist) * (dist + paddingX);
|
||||
y1 = centerY + (normY / dist) * (dist + paddingY);
|
||||
|
||||
normX = x2 - centerX;
|
||||
normY = y2 - centerY;
|
||||
|
||||
dist = Math.sqrt(normX * normX + normY * normY);
|
||||
x2 = centerX + (normX / dist) * (dist + paddingX);
|
||||
y2 = centerY + (normY / dist) * (dist + paddingY);
|
||||
}
|
||||
|
||||
context.save();
|
||||
context.beginPath();
|
||||
|
||||
|
||||
context.moveTo(x0, y0);
|
||||
context.lineTo(x1, y1);
|
||||
context.lineTo(x2, y2);
|
||||
|
||||
context.closePath();
|
||||
|
||||
context.clip();
|
||||
|
||||
// Compute matrix transform
|
||||
var delta = (u0 * v1) + (v0 * u2) + (u1 * v2) - (v1 * u2) - (v0 * u1) - (u0 * v2);
|
||||
var deltaA = (x0 * v1) + (v0 * x2) + (x1 * v2) - (v1 * x2) - (v0 * x1) - (x0 * v2);
|
||||
var deltaB = (u0 * x1) + (x0 * u2) + (u1 * x2) - (x1 * u2) - (x0 * u1) - (u0 * x2);
|
||||
var deltaC = (u0 * v1 * x2) + (v0 * x1 * u2) + (x0 * u1 * v2) - (x0 * v1 * u2) - (v0 * u1 * x2) - (u0 * x1 * v2);
|
||||
var deltaD = (y0 * v1) + (v0 * y2) + (y1 * v2) - (v1 * y2) - (v0 * y1) - (y0 * v2);
|
||||
var deltaE = (u0 * y1) + (y0 * u2) + (u1 * y2) - (y1 * u2) - (y0 * u1) - (u0 * y2);
|
||||
var deltaF = (u0 * v1 * y2) + (v0 * y1 * u2) + (y0 * u1 * v2) - (y0 * v1 * u2) - (v0 * u1 * y2) - (u0 * y1 * v2);
|
||||
|
||||
context.transform(deltaA / delta, deltaD / delta,
|
||||
deltaB / delta, deltaE / delta,
|
||||
deltaC / delta, deltaF / delta);
|
||||
|
||||
context.drawImage(textureSource, 0, 0);
|
||||
context.restore();
|
||||
};
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Renders a flat strip
|
||||
*
|
||||
* @method renderStripFlat
|
||||
* @param strip {Strip} The Strip to render
|
||||
* @private
|
||||
*/
|
||||
PIXI.Strip.prototype.renderStripFlat = function(strip)
|
||||
{
|
||||
var context = this.context;
|
||||
var vertices = strip.vertices;
|
||||
|
||||
var length = vertices.length/2;
|
||||
this.count++;
|
||||
|
||||
context.beginPath();
|
||||
for (var i=1; i < length-2; i++)
|
||||
{
|
||||
// draw some triangles!
|
||||
var index = i*2;
|
||||
|
||||
var x0 = vertices[index], x1 = vertices[index+2], x2 = vertices[index+4];
|
||||
var y0 = vertices[index+1], y1 = vertices[index+3], y2 = vertices[index+5];
|
||||
|
||||
context.moveTo(x0, y0);
|
||||
context.lineTo(x1, y1);
|
||||
context.lineTo(x2, y2);
|
||||
}
|
||||
|
||||
context.fillStyle = '#FF0000';
|
||||
context.fill();
|
||||
context.closePath();
|
||||
};
|
||||
|
||||
/*
|
||||
PIXI.Strip.prototype.setTexture = function(texture)
|
||||
{
|
||||
//TODO SET THE TEXTURES
|
||||
//TODO VISIBILITY
|
||||
|
||||
// stop current texture
|
||||
this.texture = texture;
|
||||
this.width = texture.frame.width;
|
||||
this.height = texture.frame.height;
|
||||
this.updateFrame = true;
|
||||
};
|
||||
*/
|
||||
|
||||
/**
|
||||
* When the texture is updated, this event will fire to update the scale and frame
|
||||
*
|
||||
* @method onTextureUpdate
|
||||
* @param event
|
||||
* @private
|
||||
*/
|
||||
|
||||
PIXI.Strip.prototype.onTextureUpdate = function()
|
||||
{
|
||||
this.updateFrame = true;
|
||||
};
|
||||
|
||||
/**
|
||||
* Returns the bounds of the mesh as a rectangle. The bounds calculation takes the worldTransform into account.
|
||||
*
|
||||
* @method getBounds
|
||||
* @param matrix {Matrix} the transformation matrix of the sprite
|
||||
* @return {Rectangle} the framing rectangle
|
||||
*/
|
||||
PIXI.Strip.prototype.getBounds = function(matrix)
|
||||
{
|
||||
var worldTransform = matrix || this.worldTransform;
|
||||
|
||||
var a = worldTransform.a;
|
||||
var b = worldTransform.b;
|
||||
var c = worldTransform.c;
|
||||
var d = worldTransform.d;
|
||||
var tx = worldTransform.tx;
|
||||
var ty = worldTransform.ty;
|
||||
|
||||
var maxX = -Infinity;
|
||||
var maxY = -Infinity;
|
||||
|
||||
var minX = Infinity;
|
||||
var minY = Infinity;
|
||||
|
||||
var vertices = this.vertices;
|
||||
for (var i = 0, n = vertices.length; i < n; i += 2)
|
||||
{
|
||||
var rawX = vertices[i], rawY = vertices[i + 1];
|
||||
var x = (a * rawX) + (c * rawY) + tx;
|
||||
var y = (d * rawY) + (b * rawX) + ty;
|
||||
|
||||
minX = x < minX ? x : minX;
|
||||
minY = y < minY ? y : minY;
|
||||
|
||||
maxX = x > maxX ? x : maxX;
|
||||
maxY = y > maxY ? y : maxY;
|
||||
}
|
||||
|
||||
if (minX === -Infinity || maxY === Infinity)
|
||||
{
|
||||
return PIXI.EmptyRectangle;
|
||||
}
|
||||
|
||||
var bounds = this._bounds;
|
||||
|
||||
bounds.x = minX;
|
||||
bounds.width = maxX - minX;
|
||||
|
||||
bounds.y = minY;
|
||||
bounds.height = maxY - minY;
|
||||
|
||||
// store a reference so that if this function gets called again in the render cycle we do not have to recalculate
|
||||
this._currentBounds = bounds;
|
||||
|
||||
return bounds;
|
||||
};
|
||||
|
||||
/**
|
||||
* Different drawing buffer modes supported
|
||||
*
|
||||
* @property
|
||||
* @type {{TRIANGLE_STRIP: number, TRIANGLES: number}}
|
||||
* @static
|
||||
*/
|
||||
PIXI.Strip.DrawModes = {
|
||||
TRIANGLE_STRIP: 0,
|
||||
TRIANGLES: 1
|
||||
};
|
|
@ -277,7 +277,7 @@ PIXI.CanvasRenderer.prototype.mapBlendModes = function () {
|
|||
{
|
||||
var b = [];
|
||||
var modes = PIXI.blendModes;
|
||||
var useNew = PIXI.canUseNewCanvasBlendModes();
|
||||
var useNew = this.game.device.canUseMultiply;
|
||||
|
||||
b[modes.NORMAL] = 'source-over';
|
||||
b[modes.ADD] = 'lighter';
|
||||
|
|
|
@ -1,4 +0,0 @@
|
|||
[
|
||||
"src/pixi/extras/Strip.js",
|
||||
"src/pixi/extras/Rope.js"
|
||||
]
|
|
@ -35,11 +35,6 @@ module.exports = {
|
|||
dest: '<%= modules_dir %>/pixi-main.js'
|
||||
},
|
||||
|
||||
pixiRope: {
|
||||
src: require('../manifests/pixi-rope'),
|
||||
dest: '<%= modules_dir %>/pixi-rope.js'
|
||||
},
|
||||
|
||||
pixiOutro: {
|
||||
src: require('../manifests/pixi-outro'),
|
||||
dest: '<%= modules_dir %>/pixi-outro.js'
|
||||
|
|
Loading…
Add table
Reference in a new issue