2018-02-12 16:01:20 +00:00
|
|
|
/**
|
|
|
|
* @author Richard Davey <rich@photonstorm.com>
|
|
|
|
* @copyright 2018 Photon Storm Ltd.
|
|
|
|
* @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
|
|
|
|
*/
|
|
|
|
|
2017-02-28 21:12:14 +00:00
|
|
|
var Commands = require('./Commands');
|
2017-09-12 23:58:25 +00:00
|
|
|
var GameObject = require('../GameObject');
|
2017-03-02 02:06:37 +00:00
|
|
|
|
2018-02-06 00:56:09 +00:00
|
|
|
/**
|
|
|
|
* Renders this Game Object with the Canvas Renderer to the given Camera.
|
|
|
|
* The object will not render if any of its renderFlags are set or it is being actively filtered out by the Camera.
|
|
|
|
* This method should not be called directly. It is a utility function of the Render module.
|
|
|
|
*
|
|
|
|
* @method Phaser.GameObjects.Graphics#renderCanvas
|
|
|
|
* @since 3.0.0
|
|
|
|
* @private
|
|
|
|
*
|
|
|
|
* @param {Phaser.Renderer.CanvasRenderer} renderer - A reference to the current active Canvas renderer.
|
|
|
|
* @param {Phaser.GameObjects.Graphics} src - The Game Object being rendered in this call.
|
|
|
|
* @param {number} interpolationPercentage - Reserved for future use and custom pipelines.
|
|
|
|
* @param {Phaser.Cameras.Scene2D.Camera} camera - The Camera that is rendering the Game Object.
|
2018-03-19 11:54:31 +00:00
|
|
|
* @param {CanvasRenderingContext2D} renderTargetCtx - [description]
|
2018-02-06 00:56:09 +00:00
|
|
|
* @param {boolean} allowClip - [description]
|
|
|
|
*/
|
2017-11-21 23:21:43 +00:00
|
|
|
var GraphicsCanvasRenderer = function (renderer, src, interpolationPercentage, camera, renderTargetCtx, allowClip)
|
2017-02-28 14:49:39 +00:00
|
|
|
{
|
2017-09-12 23:58:25 +00:00
|
|
|
if (GameObject.RENDER_MASK !== src.renderFlags || (src.cameraFilter > 0 && (src.cameraFilter & camera._id)))
|
2017-02-28 14:49:39 +00:00
|
|
|
{
|
|
|
|
return;
|
|
|
|
}
|
2017-03-02 02:06:37 +00:00
|
|
|
|
2017-06-22 02:19:03 +00:00
|
|
|
var cameraScrollX = camera.scrollX * src.scrollFactorX;
|
|
|
|
var cameraScrollY = camera.scrollY * src.scrollFactorY;
|
2017-03-02 02:06:37 +00:00
|
|
|
var srcX = src.x;
|
2017-02-28 21:12:14 +00:00
|
|
|
var srcY = src.y;
|
|
|
|
var srcScaleX = src.scaleX;
|
|
|
|
var srcScaleY = src.scaleY;
|
|
|
|
var srcRotation = src.rotation;
|
|
|
|
var commandBuffer = src.commandBuffer;
|
2017-05-11 00:24:57 +00:00
|
|
|
var ctx = renderTargetCtx || renderer.currentContext;
|
2017-03-01 17:30:04 +00:00
|
|
|
var lineAlpha = 1.0;
|
|
|
|
var fillAlpha = 1.0;
|
|
|
|
var lineColor = 0;
|
|
|
|
var fillColor = 0;
|
|
|
|
var lineWidth = 1.0;
|
|
|
|
var red = 0;
|
|
|
|
var green = 0;
|
|
|
|
var blue = 0;
|
2017-02-28 21:12:14 +00:00
|
|
|
|
|
|
|
// Blend Mode
|
|
|
|
if (renderer.currentBlendMode !== src.blendMode)
|
|
|
|
{
|
|
|
|
renderer.currentBlendMode = src.blendMode;
|
|
|
|
ctx.globalCompositeOperation = renderer.blendModes[src.blendMode];
|
|
|
|
}
|
|
|
|
|
|
|
|
// Alpha
|
|
|
|
if (renderer.currentAlpha !== src.alpha)
|
|
|
|
{
|
|
|
|
renderer.currentAlpha = src.alpha;
|
|
|
|
ctx.globalAlpha = src.alpha;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Smoothing
|
|
|
|
if (renderer.currentScaleMode !== src.scaleMode)
|
|
|
|
{
|
|
|
|
renderer.currentScaleMode = src.scaleMode;
|
|
|
|
}
|
|
|
|
|
|
|
|
ctx.save();
|
2017-03-01 17:56:04 +00:00
|
|
|
ctx.translate(srcX - cameraScrollX, srcY - cameraScrollY);
|
2017-02-28 21:12:14 +00:00
|
|
|
ctx.rotate(srcRotation);
|
|
|
|
ctx.scale(srcScaleX, srcScaleY);
|
|
|
|
ctx.fillStyle = '#fff';
|
|
|
|
ctx.globalAlpha = src.alpha;
|
|
|
|
|
|
|
|
for (var index = 0, length = commandBuffer.length; index < length; ++index)
|
|
|
|
{
|
|
|
|
var commandID = commandBuffer[index];
|
|
|
|
|
2017-03-02 02:06:37 +00:00
|
|
|
switch (commandID)
|
2017-02-28 21:12:14 +00:00
|
|
|
{
|
|
|
|
case Commands.ARC:
|
|
|
|
ctx.arc(
|
2017-03-02 02:06:37 +00:00
|
|
|
commandBuffer[index + 1],
|
|
|
|
commandBuffer[index + 2],
|
|
|
|
commandBuffer[index + 3],
|
|
|
|
commandBuffer[index + 4],
|
|
|
|
commandBuffer[index + 5],
|
2017-02-28 21:12:14 +00:00
|
|
|
commandBuffer[index + 6]
|
|
|
|
);
|
|
|
|
index += 6;
|
|
|
|
break;
|
2017-03-02 02:06:37 +00:00
|
|
|
|
2017-03-01 17:30:04 +00:00
|
|
|
case Commands.LINE_STYLE:
|
|
|
|
lineWidth = commandBuffer[index + 1];
|
2017-03-02 02:06:37 +00:00
|
|
|
lineColor = commandBuffer[index + 2];
|
2017-03-01 17:30:04 +00:00
|
|
|
lineAlpha = commandBuffer[index + 3];
|
2017-03-08 00:51:09 +00:00
|
|
|
red = ((lineColor & 0xFF0000) >>> 16);
|
|
|
|
green = ((lineColor & 0xFF00) >>> 8);
|
|
|
|
blue = (lineColor & 0xFF);
|
2017-03-08 22:08:20 +00:00
|
|
|
ctx.strokeStyle = 'rgba(' + red + ',' + green + ',' + blue + ',' + lineAlpha + ')';
|
2017-03-08 00:51:09 +00:00
|
|
|
ctx.lineWidth = lineWidth;
|
2017-03-01 17:30:04 +00:00
|
|
|
index += 3;
|
|
|
|
break;
|
2017-03-02 02:06:37 +00:00
|
|
|
|
2017-03-01 17:30:04 +00:00
|
|
|
case Commands.FILL_STYLE:
|
|
|
|
fillColor = commandBuffer[index + 1];
|
|
|
|
fillAlpha = commandBuffer[index + 2];
|
2017-03-08 00:51:09 +00:00
|
|
|
red = ((fillColor & 0xFF0000) >>> 16);
|
|
|
|
green = ((fillColor & 0xFF00) >>> 8);
|
|
|
|
blue = (fillColor & 0xFF);
|
2017-03-08 22:08:20 +00:00
|
|
|
ctx.fillStyle = 'rgba(' + red + ',' + green + ',' + blue + ',' + fillAlpha + ')';
|
2017-03-01 17:30:04 +00:00
|
|
|
index += 2;
|
|
|
|
break;
|
2017-03-02 02:06:37 +00:00
|
|
|
|
2017-03-01 17:30:04 +00:00
|
|
|
case Commands.BEGIN_PATH:
|
2017-02-28 21:12:14 +00:00
|
|
|
ctx.beginPath();
|
|
|
|
break;
|
2017-03-02 02:06:37 +00:00
|
|
|
|
2017-03-01 17:30:04 +00:00
|
|
|
case Commands.CLOSE_PATH:
|
2017-02-28 21:12:14 +00:00
|
|
|
ctx.closePath();
|
|
|
|
break;
|
2017-03-02 02:06:37 +00:00
|
|
|
|
2017-03-01 17:30:04 +00:00
|
|
|
case Commands.FILL_PATH:
|
2017-12-07 04:52:07 +00:00
|
|
|
if (!allowClip)
|
2017-11-21 23:21:43 +00:00
|
|
|
{
|
|
|
|
ctx.fill();
|
|
|
|
}
|
2017-03-01 17:30:04 +00:00
|
|
|
break;
|
2017-03-02 02:06:37 +00:00
|
|
|
|
2017-03-01 17:30:04 +00:00
|
|
|
case Commands.STROKE_PATH:
|
2017-11-21 23:21:43 +00:00
|
|
|
if (!allowClip)
|
|
|
|
{
|
|
|
|
ctx.stroke();
|
|
|
|
}
|
2017-03-01 17:30:04 +00:00
|
|
|
break;
|
2017-03-02 02:06:37 +00:00
|
|
|
|
2017-03-01 17:30:04 +00:00
|
|
|
case Commands.FILL_RECT:
|
2017-11-21 23:21:43 +00:00
|
|
|
if (!allowClip)
|
|
|
|
{
|
|
|
|
ctx.fillRect(
|
|
|
|
commandBuffer[index + 1],
|
|
|
|
commandBuffer[index + 2],
|
|
|
|
commandBuffer[index + 3],
|
|
|
|
commandBuffer[index + 4]
|
|
|
|
);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
ctx.rect(
|
|
|
|
commandBuffer[index + 1],
|
|
|
|
commandBuffer[index + 2],
|
|
|
|
commandBuffer[index + 3],
|
|
|
|
commandBuffer[index + 4]
|
|
|
|
);
|
|
|
|
}
|
2017-02-28 21:12:14 +00:00
|
|
|
index += 4;
|
|
|
|
break;
|
2017-03-08 00:51:09 +00:00
|
|
|
|
|
|
|
case Commands.FILL_TRIANGLE:
|
|
|
|
ctx.beginPath();
|
|
|
|
ctx.moveTo(commandBuffer[index + 1], commandBuffer[index + 2]);
|
|
|
|
ctx.lineTo(commandBuffer[index + 3], commandBuffer[index + 4]);
|
|
|
|
ctx.lineTo(commandBuffer[index + 5], commandBuffer[index + 6]);
|
|
|
|
ctx.closePath();
|
2017-12-07 04:52:07 +00:00
|
|
|
if (!allowClip)
|
2017-11-21 23:21:43 +00:00
|
|
|
{
|
|
|
|
ctx.fill();
|
|
|
|
}
|
2017-03-08 00:51:09 +00:00
|
|
|
index += 6;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case Commands.STROKE_TRIANGLE:
|
|
|
|
ctx.beginPath();
|
|
|
|
ctx.moveTo(commandBuffer[index + 1], commandBuffer[index + 2]);
|
|
|
|
ctx.lineTo(commandBuffer[index + 3], commandBuffer[index + 4]);
|
|
|
|
ctx.lineTo(commandBuffer[index + 5], commandBuffer[index + 6]);
|
|
|
|
ctx.closePath();
|
2017-11-21 23:21:43 +00:00
|
|
|
if (!allowClip)
|
|
|
|
{
|
|
|
|
ctx.stroke();
|
|
|
|
}
|
2017-03-08 00:51:09 +00:00
|
|
|
index += 6;
|
|
|
|
break;
|
|
|
|
|
2017-02-28 21:12:14 +00:00
|
|
|
case Commands.LINE_TO:
|
|
|
|
ctx.lineTo(
|
|
|
|
commandBuffer[index + 1],
|
|
|
|
commandBuffer[index + 2]
|
|
|
|
);
|
|
|
|
index += 2;
|
|
|
|
break;
|
2017-03-02 02:06:37 +00:00
|
|
|
|
2017-02-28 21:12:14 +00:00
|
|
|
case Commands.MOVE_TO:
|
|
|
|
ctx.moveTo(
|
|
|
|
commandBuffer[index + 1],
|
|
|
|
commandBuffer[index + 2]
|
|
|
|
);
|
|
|
|
index += 2;
|
|
|
|
break;
|
2017-03-01 17:30:04 +00:00
|
|
|
|
2017-03-15 19:23:10 +00:00
|
|
|
case Commands.LINE_FX_TO:
|
2017-03-14 22:13:31 +00:00
|
|
|
ctx.lineTo(
|
|
|
|
commandBuffer[index + 1],
|
|
|
|
commandBuffer[index + 2]
|
|
|
|
);
|
2017-03-15 19:23:10 +00:00
|
|
|
index += 5;
|
2017-03-14 22:13:31 +00:00
|
|
|
break;
|
|
|
|
|
2017-03-15 19:23:10 +00:00
|
|
|
case Commands.MOVE_FX_TO:
|
2017-03-14 22:13:31 +00:00
|
|
|
ctx.moveTo(
|
|
|
|
commandBuffer[index + 1],
|
|
|
|
commandBuffer[index + 2]
|
|
|
|
);
|
2017-03-15 19:23:10 +00:00
|
|
|
index += 5;
|
2017-03-14 22:13:31 +00:00
|
|
|
break;
|
|
|
|
|
2017-05-08 20:13:48 +00:00
|
|
|
case Commands.SAVE:
|
|
|
|
ctx.save();
|
|
|
|
break;
|
|
|
|
|
|
|
|
case Commands.RESTORE:
|
|
|
|
ctx.restore();
|
|
|
|
break;
|
|
|
|
|
|
|
|
case Commands.TRANSLATE:
|
|
|
|
ctx.translate(
|
|
|
|
commandBuffer[index + 1],
|
|
|
|
commandBuffer[index + 2]
|
|
|
|
);
|
|
|
|
index += 2;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case Commands.SCALE:
|
|
|
|
ctx.scale(
|
|
|
|
commandBuffer[index + 1],
|
|
|
|
commandBuffer[index + 2]
|
|
|
|
);
|
|
|
|
index += 2;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case Commands.ROTATE:
|
|
|
|
ctx.rotate(
|
|
|
|
commandBuffer[index + 1]
|
|
|
|
);
|
|
|
|
index += 1;
|
|
|
|
break;
|
|
|
|
|
2017-02-28 21:12:14 +00:00
|
|
|
default:
|
2018-02-16 19:08:50 +00:00
|
|
|
// console.error('Phaser: Invalid Graphics Command ID ' + commandID);
|
2017-02-28 21:12:14 +00:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
ctx.restore();
|
2017-03-02 02:06:37 +00:00
|
|
|
};
|
2017-02-28 14:49:39 +00:00
|
|
|
|
|
|
|
module.exports = GraphicsCanvasRenderer;
|