Skip to content

Commit faa72ad

Browse files
committed
Removed ComputedSize component as we need the values read-only.
Fixed renderer for DOM Elements inside of Containers, or outside, or in a scaled canvas.
1 parent cdd9d85 commit faa72ad

3 files changed

Lines changed: 91 additions & 15 deletions

File tree

src/dom/CreateDOMContainer.js

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,6 @@ var CreateDOMContainer = function (game)
3030
'transform-origin: left top;'
3131
].join(' ');
3232

33-
34-
3533
game.domContainer = div;
3634

3735
AddToDOM(div, config.parent);

src/gameobjects/domelement/DOMElement.js

Lines changed: 33 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@ var Vector4 = require('../../math/Vector4');
2424
*
2525
* @extends Phaser.GameObjects.Components.Alpha
2626
* @extends Phaser.GameObjects.Components.BlendMode
27-
* @extends Phaser.GameObjects.Components.ComputedSize
2827
* @extends Phaser.GameObjects.Components.Depth
2928
* @extends Phaser.GameObjects.Components.Origin
3029
* @extends Phaser.GameObjects.Components.ScrollFactor
@@ -45,7 +44,6 @@ var DOMElement = new Class({
4544
Mixins: [
4645
Components.Alpha,
4746
Components.BlendMode,
48-
Components.ComputedSize,
4947
Components.Depth,
5048
Components.Origin,
5149
Components.ScrollFactor,
@@ -79,6 +77,35 @@ var DOMElement = new Class({
7977

8078
this.setPosition(x, y);
8179

80+
/**
81+
* The native (un-scaled) width of this Game Object.
82+
*
83+
* Changing this value will not change the size that the Game Object is rendered in-game.
84+
* For that you need to either set the scale of the Game Object (`setScale`) or use
85+
* the `displayWidth` property.
86+
*
87+
* @name Phaser.GameObjects.Components.ComputedSize#width
88+
* @type {number}
89+
* @since 3.0.0
90+
*/
91+
this.width = 0;
92+
93+
/**
94+
* The native (un-scaled) height of this Game Object.
95+
*
96+
* Changing this value will not change the size that the Game Object is rendered in-game.
97+
* For that you need to either set the scale of the Game Object (`setScale`) or use
98+
* the `displayHeight` property.
99+
*
100+
* @name Phaser.GameObjects.Components.ComputedSize#height
101+
* @type {number}
102+
* @since 3.0.0
103+
*/
104+
this.height = 0;
105+
106+
this.displayWidth = 0;
107+
this.displayHeight = 0;
108+
82109
if (typeof element === 'string')
83110
{
84111
// hash?
@@ -227,7 +254,10 @@ var DOMElement = new Class({
227254

228255
var nodeBounds = target.getBoundingClientRect();
229256

230-
this.setSize(nodeBounds.width || 0, nodeBounds.height || 0);
257+
this.width = target.clientWidth;
258+
this.height = target.clientHeight;
259+
this.displayWidth = nodeBounds.width || 0;
260+
this.displayHeight = nodeBounds.height || 0;
231261

232262
return this;
233263
},

src/gameobjects/domelement/DOMElementCSSRenderer.js

Lines changed: 58 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ var GameObject = require('../GameObject');
2121
* @param {number} interpolationPercentage - Reserved for future use and custom pipelines.
2222
* @param {Phaser.Cameras.Scene2D.Camera} camera - The Camera that is rendering the Game Object.
2323
*/
24-
var DOMElementCSSRenderer = function (renderer, src, interpolationPercentage, camera)
24+
var DOMElementCSSRenderer = function (renderer, src, interpolationPercentage, camera, parentTransformMatrix)
2525
{
2626
var node = src.node;
2727
var style = node.style;
@@ -36,23 +36,66 @@ var DOMElementCSSRenderer = function (renderer, src, interpolationPercentage, ca
3636
return;
3737
}
3838

39+
var parent = src.parentContainer;
40+
var alpha = camera.alpha * src.alpha;
41+
42+
if (parent)
43+
{
44+
alpha *= parent.alpha;
45+
}
46+
3947
var camMatrix = renderer._tempMatrix1;
40-
var spriteMatrix = renderer._tempMatrix2;
48+
var srcMatrix = renderer._tempMatrix2;
4149
var calcMatrix = renderer._tempMatrix3;
4250

43-
var x = src.originX * src.width;
44-
var y = src.originY * src.height;
51+
var dx = 0;
52+
var dy = 0;
53+
54+
var tx = '0%';
55+
var ty = '0%';
4556

46-
spriteMatrix.applyITRS(src.x - x - (camera.scrollX * src.scrollFactorX), src.y - y - (camera.scrollY * src.scrollFactorY), src.rotation, src.scaleX, src.scaleY);
57+
if (parentTransformMatrix)
58+
{
59+
dx = (src.width * src.scaleX) * src.originX;
60+
dy = (src.height * src.scaleY) * src.originY;
61+
62+
srcMatrix.applyITRS(src.x - dx, src.y - dy, src.rotation, src.scaleX, src.scaleY);
63+
64+
camMatrix.copyFrom(camera.matrix);
4765

48-
camMatrix.copyFrom(camera.matrix);
49-
50-
camMatrix.multiply(spriteMatrix, calcMatrix);
66+
// Multiply the camera by the parent matrix
67+
camMatrix.multiplyWithOffset(parentTransformMatrix, -camera.scrollX * src.scrollFactorX, -camera.scrollY * src.scrollFactorY);
68+
69+
// Undo the camera scroll
70+
srcMatrix.e = src.x - dx;
71+
srcMatrix.f = src.y - dy;
72+
73+
// Multiply by the src matrix, store result in calcMatrix
74+
camMatrix.multiply(srcMatrix, calcMatrix);
75+
}
76+
else
77+
{
78+
dx = (src.width) * src.originX;
79+
dy = (src.height) * src.originY;
80+
81+
srcMatrix.applyITRS(src.x - dx, src.y - dy, src.rotation, src.scaleX, src.scaleY);
82+
83+
camMatrix.copyFrom(camera.matrix);
84+
85+
tx = (100 * src.originX) + '%';
86+
ty = (100 * src.originY) + '%';
87+
88+
srcMatrix.e -= camera.scrollX * src.scrollFactorX;
89+
srcMatrix.f -= camera.scrollY * src.scrollFactorY;
90+
91+
// Multiply by the src matrix, store result in calcMatrix
92+
camMatrix.multiply(srcMatrix, calcMatrix);
93+
}
5194

5295
if (!src.transformOnly)
5396
{
5497
style.display = 'block';
55-
style.opacity = src.alpha;
98+
style.opacity = alpha;
5699
style.zIndex = src._depth;
57100
style.pointerEvents = 'auto';
58101
style.mixBlendMode = CSSBlendModes[src._blendMode];
@@ -65,7 +108,12 @@ var DOMElementCSSRenderer = function (renderer, src, interpolationPercentage, ca
65108
' skew(' + src.skewX + 'rad, ' + src.skewY + 'rad)' +
66109
' rotate3d(' + src.rotate3d.x + ',' + src.rotate3d.y + ',' + src.rotate3d.z + ',' + src.rotate3d.w + src.rotate3dAngle + ')';
67110

68-
style.transformOrigin = (100 * src.originX) + '% ' + (100 * src.originY) + '%';
111+
style.transformOrigin = tx + ' ' + ty;
112+
113+
var nodeBounds = node.getBoundingClientRect();
114+
115+
src.displayWidth = nodeBounds.width;
116+
src.displayHeight = nodeBounds.height;
69117
};
70118

71119
module.exports = DOMElementCSSRenderer;

0 commit comments

Comments
 (0)