I found an issue with a big project I am working on. I left it on jan 25 and I am restarting with it now. so I am not sure which version started to fail. Since it is a huge project it is slightly difficult to track the exact point but, I would be able to Isolate the problem to a few lines of code.
I have this class:
class Sprite3D extends Sprite
{
private var bmpData:BitmapData;
public var pProjection:PerspectiveProjection;
private var plane:Sprite = new Sprite();
private var mat:Matrix3D = new Matrix3D();
public var proj:Matrix3D;
private var vertices:Vector<Float>;
private var uvt:Vector<Float>=Vector.ofArray([0.0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0]);
private var indices:Vector<Int>=Vector.ofArray([0, 1, 3, 1, 2, 3]);
private var projectedPoints:Vector<Float>;
public var posX:Float;
public var posY:Float;
public var posZ:Float;//480.245531742791;
public var rotX:Float;
public var rotY:Float;
public var rotZ:Float;
public var scX:Float = 1.0;
public var scY:Float = 1.0;
public var scZ:Float = 1.0;
public function new(inputDisplayObject:BitmapData){
super();
//this.blendMode = blendMode.ADD;
//trace('creando ' + inputDisplayObject.image.src);
bmpData = new BitmapData(Math.ceil(inputDisplayObject.width), Math.ceil(inputDisplayObject.height), true);
bmpData.copyPixels(inputDisplayObject, inputDisplayObject.rect, new Point(0, 0));
vertices = Vector.ofArray([ -Math.ceil(inputDisplayObject.width) / 2, -Math.ceil(inputDisplayObject.height) / 2, 0, Math.ceil(inputDisplayObject.width) / 2, -Math.ceil(inputDisplayObject.height) / 2, 0, Math.ceil(inputDisplayObject.width) / 2, Math.ceil(inputDisplayObject.height) / 2, 0, -Math.ceil(inputDisplayObject.width) / 2, Math.ceil(inputDisplayObject.height) / 2, 0.0]);
pProjection = new PerspectiveProjection();
pProjection.fieldOfView = 55;
proj = pProjection.toMatrix3D();
this.addChild(plane);
render();
//plane.width = bmpData.width;
//plane.height = bmpData.height;
}
public function free(){
this.removeChildren(0, this.numChildren - 1);
}
public function changeColor(newColor:BitmapData){
bmpData.copyPixels(newColor, newColor.rect, new Point(0, 0));
//bmpData = newColor;
this.blendMode = blendMode.ADD;
//this.blendMode = blendMode.OVERLAY;
//this.blendMode = blendMode.SUBTRACT;
//this.width = 256;
//this.height = 256;
this.render();
}
public function render():Void{
mat.identity();
mat.appendRotation(rotX, Vector3D.X_AXIS);
mat.appendRotation(rotY, Vector3D.Y_AXIS);
mat.appendScale(scX, scY, scZ);
mat.appendTranslation(posX, posY, posZ);
mat.append(proj);
projectedPoints = new Vector<Float>();
Utils3D.projectVectors(mat, vertices, projectedPoints, uvt);
plane.graphics.clear();
plane.graphics.beginBitmapFill(bmpData, null, false, true);
//plane.graphics.drawRect(0.0, 0.0, bmpData.width, bmpData.height);
plane.graphics.drawTriangles(projectedPoints, indices, uvt, TriangleCulling.NONE);
plane.graphics.endFill();
var scale:Float = (pProjection.focalLength / posZ);
var inverseScale = 1 - scale;
//var deltaX:Float = 616 * inverseScale;
var deltaX:Float = 614 * inverseScale;
//var deltaY:Float = -1200 * inverseScale;
var deltaY:Float = -1200 * inverseScale;
plane.y = deltaY;
}
}
Now everithing works fine in version 9.2.0, but in the last production version it throws:
CanvasDisplayObject.hx:62 Uncaught InvalidStateError: Failed to execute ‘drawImage’ on ‘CanvasRenderingContext2D’: The image argument is a canvas element with a width or height of 0.
at openfl_display__$internal_CanvasDisplayObject.renderDrawable (CanvasDisplayObject.hx:62:5)
at openfl_display__$internal_CanvasDisplayObjectContainer.renderDrawable (CanvasDisplayObjectContainer.hx:18:3)
at openfl_display_CanvasRenderer._renderDrawable (CanvasRenderer.hx:196:5)
at openfl_display_$internal_CanvasDisplayObjectContainer.renderDrawable (CanvasDisplayObjectContainer.hx:28:5)
at openfl_display_CanvasRenderer._renderDrawable (CanvasRenderer.hx:196:5)
at openfl_display_$internal_CanvasDisplayObjectContainer.renderDrawable (CanvasDisplayObjectContainer.hx:28:5)
at openfl_display_CanvasRenderer._renderDrawable (CanvasRenderer.hx:196:5)
at openfl_display_$internal_CanvasDisplayObjectContainer.renderDrawable (CanvasDisplayObjectContainer.hx:28:5)
at openfl_display_CanvasRenderer._renderDrawable (CanvasRenderer.hx:196:5)
at openfl_display_$internal_CanvasDisplayObjectContainer.renderDrawable (CanvasDisplayObjectContainer.hx:28:5)
If I comment this lines:
plane.graphics.clear(); plane.graphics.beginBitmapFill(bmpData, null, false, true); //plane.graphics.drawRect(0.0, 0.0, bmpData.width, bmpData.height); plane.graphics.drawTriangles(projectedPoints, indices, uvt, TriangleCulling.NONE); plane.graphics.endFill();
everything else seems to work fine. and as I said in version 9.2.0 works perfectly
I hope to contribute with 0.02 cents to the project.
With regards
Luis
