bp74 / StageXL

A fast and universal 2D rendering engine for HTML5 and Dart.
http://www.stagexl.org
Other
880 stars 82 forks source link

Rendering bug introduced in 5c1babe #276

Closed mnordine closed 7 years ago

mnordine commented 7 years ago

Run-time render errors are being thrown due to this commit:

Unsupported operation: Infinity or NaN toInt
dart:core                                                         double.ceil
package:stagexl/src/text/text_field.dart 538:51                   TextField._refreshCache
package:stagexl/src/text/text_field.dart 242:7                    TextField.render
package:stagexl/src/engine/render_state.dart 163:20               RenderState.renderObject
package:stagexl/src/display/display_object_container.dart 426:21  DisplayObjectContainer.render
package:stagexl/src/engine/render_state.dart 163:20               RenderState.renderObject
package:stagexl/src/display/display_object_container.dart 426:21  DisplayObjectContainer.render
package:stagexl/src/display/sprite.dart 157:17                    Sprite.render
package:stagexl/src/engine/render_state.dart 163:20               RenderState.renderObject
package:stagexl/src/display/display_object_container.dart 426:21  DisplayObjectContainer.render
package:stagexl/src/display/sprite.dart 157:17                    Sprite.render
package:stagexl/src/engine/render_state.dart 163:20               RenderState.renderObject
package:stagexl/src/display/display_object_container.dart 426:21  DisplayObjectContainer.render
package:stagexl/src/display/sprite.dart 157:17                    Sprite.render
package:stagexl/src/engine/render_state.dart 163:20               RenderState.renderObject
package:stagexl/src/display/display_object_container.dart 426:21  DisplayObjectContainer.render
package:stagexl/src/display/sprite.dart 157:17                    Sprite.render
package:stagexl/src/engine/render_state.dart 163:20               RenderState.renderObject
package:stagexl/src/display/display_object_container.dart 426:21  DisplayObjectContainer.render
package:stagexl/src/engine/render_state.dart 163:20               RenderState.renderObject
package:stagexl/src/display/stage.dart 388:20                     Stage.materialize
package:stagexl/src/display/render_loop.dart 37:30                RenderLoop.advanceTime.<fn>
dart:core                                                         List.forEach
package:stagexl/src/display/render_loop.dart 37:13                RenderLoop.advanceTime
package:stagexl/src/engine/render_loop_base.dart 46:14            RenderLoopBase._onGlobalFrame
package:stagexl/src/engine/render_loop_base.dart 17:10            _globalFrameRequest.<fn>

and

NoSuchMethodError: The getter 'renderTexture' was called on null.
Receiver: null
Tried calling: renderTexture
dart:core                                                         Object.noSuchMethod
package:stagexl/src/engine/render_context_webgl.dart 189:45       RenderContextWebGL.renderTextureQuad
package:stagexl/src/engine/render_state.dart 91:20                RenderState.renderTextureQuad
package:stagexl/src/text/text_field.dart 243:19                   TextField.render
package:stagexl/src/engine/render_state.dart 163:20               RenderState.renderObject
package:stagexl/src/display/display_object_container.dart 426:21  DisplayObjectContainer.render
package:stagexl/src/engine/render_state.dart 163:20               RenderState.renderObject
package:stagexl/src/display/display_object_container.dart 426:21  DisplayObjectContainer.render
package:stagexl/src/display/sprite.dart 157:17                    Sprite.render
package:stagexl/src/engine/render_state.dart 163:20               RenderState.renderObject
package:stagexl/src/display/display_object_container.dart 426:21  DisplayObjectContainer.render
package:stagexl/src/display/sprite.dart 157:17                    Sprite.render
package:stagexl/src/engine/render_state.dart 163:20               RenderState.renderObject
package:stagexl/src/display/display_object_container.dart 426:21  DisplayObjectContainer.render
package:stagexl/src/display/sprite.dart 157:17                    Sprite.render
package:stagexl/src/engine/render_state.dart 163:20               RenderState.renderObject
package:stagexl/src/display/display_object_container.dart 426:21  DisplayObjectContainer.render
package:stagexl/src/display/sprite.dart 157:17                    Sprite.render
package:stagexl/src/engine/render_state.dart 163:20               RenderState.renderObject
package:stagexl/src/display/display_object_container.dart 426:21  DisplayObjectContainer.render
package:stagexl/src/engine/render_state.dart 163:20               RenderState.renderObject
package:stagexl/src/display/stage.dart 388:20                     Stage.materialize
package:stagexl/src/display/render_loop.dart 37:30                RenderLoop.advanceTime.<fn>
dart:core                                                         List.forEach
package:stagexl/src/display/render_loop.dart 37:13                RenderLoop.advanceTime
package:stagexl/src/engine/render_loop_base.dart 46:14            RenderLoopBase._onGlobalFrame
package:stagexl/src/engine/render_loop_base.dart 17:10            _globalFrameRequest.<fn>
bp74 commented 7 years ago

I just looked at it but can't reproduce the error. Could you please send me a small example?

mnordine commented 7 years ago

I think I've narrowed it down:

import 'dart:html' as html;
import 'package:stagexl/stagexl.dart';

main() {
  var canvas = html.querySelector('#stage');
  var stage = new Stage(canvas, width: 1280, height: 800);

  new RenderLoop()..addStage(stage);

  final holder = new Sprite()..addTo(stage);

  final format = new TextFormat('Helvetica, Arial, sans-serif', 20, Color.Black);

  final t = new TextField('', format)
    ..autoSize = TextFieldAutoSize.CENTER
    ..addTo(holder);

  t.parent.width = 0.0;
  print(t.parent.width); // NaN
}

There was a division by zero in width, height setters:

  set width(num value) {
    var bounds = this.bounds;
    var matrix = this.transformationMatrix;
    var boundsTransformed = matrix.transformRectangle(bounds, bounds);
    var scale = value == 0 ? 0 : value / boundsTransformed.width; // <= Fix
//    var scale = value / boundsTransformed.width; // <= division by zero
    _reverseMatrix(matrix.a * scale, matrix.b, matrix.c * scale, matrix.d);
  }

Would you like me to submit a pull request? Or do you see issues with the fix?

bp74 commented 7 years ago

No need for a pull request. I will do some tests (tomorrow) and then provide a new version. Thanks for the bug report!

bp74 commented 7 years ago

Similar issue discussed here: https://groups.google.com/forum/#!topic/stagexl/hfIUlhmfYE4

bp74 commented 7 years ago

I've pushed an update (20ecb406741a7c53c0e4d3edb73601c327830247). Could you please try if this fixes your problems?

mnordine commented 7 years ago

Looks good!