Blitter support

This commit is contained in:
photonstorm 2017-01-24 12:55:45 +00:00
parent b223627935
commit f2c75c6243
5 changed files with 75 additions and 57 deletions

View file

@ -1,4 +1,4 @@
var CHECKSUM = {
build: '07360840-e1c4-11e6-a539-73ab52eda7a7'
build: '635b8da0-e234-11e6-9dac-3feadd6ebdbc'
};
module.exports = CHECKSUM;

View file

@ -5,13 +5,19 @@
*/
var CONST = require('../../const');
var Bob = require('./Bob');
var GameObject = require('../GameObject');
var Children = require('../../components/Children');
/**
* An Image is a light-weight object you can use to display anything that doesn't need physics or animation.
* It can still rotate, scale, crop and receive input events. This makes it perfect for logos, backgrounds, simple buttons and other non-Sprite graphics.
* A Blitter Game Object.
*
* @class Phaser.GameObject.Blitter
* The Blitter Game Object is a special type of Container, that contains Blitter.Bob objects.
* These objects can be thought of as just texture frames with a transform, and nothing more.
* Bobs don't have any update methods, or the ability to have children, or any kind of special effects.
* They are essentially just texture renderers, and the Blitter object creates and manages them.
*
* @class Blitter
* @extends Phaser.GameObject
* @constructor
* @param {Phaser.Game} game - A reference to the currently running game.
@ -28,48 +34,68 @@ var Blitter = function (state, x, y, key, frame)
GameObject.call(this, state, x, y, _texture, _frame);
this.type = CONST.BLITTER;
this.children = new Children(this);
};
Blitter.prototype = Object.create(GameObject.prototype);
Blitter.prototype.constructor = Blitter;
Blitter.prototype.renderCanvas = require('./BlitterCanvasRenderer');
// Blitter.prototype.renderCanvas = require('./BlitterCanvasRenderer');
Blitter.prototype.renderWebGL = require('./BlitterWebGLRenderer');
Object.defineProperties(Blitter.prototype, {
// frame MUST be part of the Blitter texture
Blitter.prototype.create = function (x, y, frame, visible, index)
{
if (frame === undefined) { frame = this.frame; }
if (visible === undefined) { visible = true; }
if (index === undefined) { index = 0; }
width: {
var bob = new Bob(this, x, y, frame, visible);
enumerable: true,
this.children.addAt(bob, index, false);
get: function ()
{
return this.transform._scaleX * this.frame.realWidth;
},
return bob;
};
set: function (value)
{
this.scaleX = value / this.frame.realWidth;
}
// frame MUST be part of the Blitter texture
Blitter.prototype.createFromCallback = function (callback, quantity, frame, visible)
{
var bobs = this.createMultiple(quantity, key, frame, visible);
},
height: {
enumerable: true,
get: function ()
{
return this.transform._scaleY * this.frame.realHeight;
},
set: function (value)
{
this.scaleY = value / this.frame.realHeight;
}
for (var i = 0; i < bobs.length; i++)
{
var bob = bobs[i];
callback.call(this, bob, i);
}
});
return bobs;
};
// frame MUST be part of the Blitter texture
Blitter.prototype.createMultiple = function (quantity, frame, visible)
{
if (frame === undefined) { frame = 0; }
if (visible === undefined) { visible = true; }
if (!Array.isArray(frame))
{
frame = [ frame ];
}
var bobs = [];
var _this = this;
frame.forEach(function (singleFrame)
{
for (var i = 0; i < quantity; i++)
{
bobs.push(_this.create(0, 0, singleFrame, visible));
}
});
return bobs;
};
module.exports = Blitter;

View file

@ -1,49 +1,29 @@
var BlitterWebGLRenderer = function (renderer, src, interpolationPercentage)
{
// var frame = src.frame;
var worldAlpha = src.color.worldAlpha * 255 << 24;
var len = src.children.list.length;
// Skip rendering?
if (src.skipRender || !src.visible || worldAlpha === 0)
if (src.skipRender || !src.visible || worldAlpha === 0 || len === 0)
{
return;
}
// var verts = src.transform.getVertexData(interpolationPercentage, renderer);
// var index = src.frame.source.glTextureIndex;
// var tint = src.color._glTint;
// var bg = src.color._glBg;
// renderer.batch.add(frame.source, src.blendMode, verts, frame.uvs, index, alpha, tint, bg);
// var transform = src.transform;
// Render children
for (var i = 0; i < src.children.list.length; i++)
for (var i = 0; i < len; i++)
{
var bob = src.children.list[i];
var frame = bob.frame;
var alpha = (worldAlpha * bob.alpha) * 255 << 24;
if (!bob.visible || alpha === 0 || !frame.cutWidth || !frame.cutHeight)
if (!bob.visible || !frame.cutWidth || !frame.cutHeight)
{
continue;
}
var index = frame.source.glTextureIndex;
var verts = bob.transform.getVertexData(interpolationPercentage);
// tint and bg values come from the parent Blitter object, not the Bob
renderer.batch.add(frame.source, src.blendMode, verts, frame.uvs, index, alpha, tint, bg);
renderer.blitterBatch.add(bob.x, bob.y, frame);
}
// renderer.spriteBatch.add(
// frame,
// transform._pivotX, transform._pivotY,
// transform.world.tx, transform.world.ty,
// transform._worldScaleX, transform._worldScaleY,
// transform._worldRotation
// );
};
module.exports = BlitterWebGLRenderer;

View file

@ -0,0 +1,11 @@
var Bob = function (blitter, x, y, frame, visible)
{
this.parent = blitter;
this.x = x;
this.y = y;
this.frame = frame;
this.visible = visible;
};
module.exports = Bob;

View file

@ -41,6 +41,7 @@ var Phaser = {
// Required, but don't need Phaser level exports
require('./gameobjects/blitter/BlitterFactory');
require('./gameobjects/image/ImageFactory');
require('./gameobjects/container/ContainerFactory');