Improved the LayerAdapter to more accurately adjust its size downward if it renders a spritesheet, handle when a single thang is too large, and cancels in-progress async builds if a new one starts.

This commit is contained in:
Scott Erickson 2014-10-02 17:38:50 -07:00
parent 5bb1275cea
commit d02d58ed4e

View file

@ -222,6 +222,8 @@ module.exports = LayerAdapter = class LayerAdapter extends CocoClass
@_renderNewSpriteSheet()
_renderNewSpriteSheet: (async) ->
@asyncBuilder.stopAsync() if @asyncBuilder
async ?= @buildAsync
builder = new createjs.SpriteSheetBuilder()
groups = _.groupBy(@toRenderBundles, ((bundle) -> @renderGroupingKey(bundle.thangType, '', bundle.colorConfig)), @)
@ -259,8 +261,13 @@ module.exports = LayerAdapter = class LayerAdapter extends CocoClass
@renderRasterThangType(thangType, builder)
if async
builder.buildAsync()
try
builder.buildAsync()
catch e
@resolutionFactor *= 0.9
return @_renderNewSpriteSheet(async)
builder.on 'complete', @onBuildSpriteSheetComplete, @, true, builder
@asyncBuilder = builder
else
sheet = builder.build()
@onBuildSpriteSheetComplete({async:async}, builder)
@ -268,10 +275,14 @@ module.exports = LayerAdapter = class LayerAdapter extends CocoClass
onBuildSpriteSheetComplete: (e, builder) ->
return if @initializing
@asyncBuilder = null
if builder.spriteSheet._images.length > 1
@resolutionFactor *= 0.9
console.debug('Sprite sheet is too large... re-rendering at', @resolutionFactor.toFixed(2))
total = 0
# get a rough estimate of how much smaller the spritesheet needs to be
for image, index in builder.spriteSheet._images
total += image.height / builder.maxHeight
@resolutionFactor /= (Math.max(1.1, Math.sqrt(total)))
@_renderNewSpriteSheet(e.async)
return