diff --git a/starling/src/starling/display/DisplayObject.as b/starling/src/starling/display/DisplayObject.as index bbc4b655b..9392d260d 100755 --- a/starling/src/starling/display/DisplayObject.as +++ b/starling/src/starling/display/DisplayObject.as @@ -141,6 +141,7 @@ package starling.display private var _orientationChanged:Boolean; private var _is3D:Boolean; private var _maskee:DisplayObject; + private var _sort:uint; // internal members (for fast access on rendering) @@ -1149,6 +1150,10 @@ package starling.display } } + + public function get sort():uint { return _sort; } + public function set sort(value:uint):void { _sort = value;} + /** The display object container that contains this display object. */ public function get parent():DisplayObjectContainer { return _parent; } diff --git a/starling/src/starling/display/DisplayObjectContainer.as b/starling/src/starling/display/DisplayObjectContainer.as index e5d718f70..11a3e8dda 100644 --- a/starling/src/starling/display/DisplayObjectContainer.as +++ b/starling/src/starling/display/DisplayObjectContainer.as @@ -263,7 +263,11 @@ package starling.display public function sortChildren(compareFunction:Function):void { sSortBuffer.length = _children.length; - mergeSort(_children, compareFunction, 0, _children.length, sSortBuffer); + if (compareFunction) { + mergeSort(_children, compareFunction, 0, _children.length, sSortBuffer); + } else { + mergeSortNoFunction(_children, 0, _children.length, sSortBuffer); + } sSortBuffer.length = 0; setRequiresRedraw(); } @@ -493,6 +497,39 @@ package starling.display } } + private static function mergeSortNoFunction(input:Vector., + startIndex:int, length:int, + buffer:Vector.):void { + + if (length > 1) { + var i:int; + var endIndex:int = startIndex + length; + var halfLength:int = length / 2; + var l:int = startIndex; + var r:int = startIndex + halfLength; + + mergeSortNoFunction(input, startIndex, halfLength, buffer); + mergeSortNoFunction(input, startIndex + halfLength, length - halfLength, buffer); + + for (i = 0; i < length; i++) { + if (l < startIndex + halfLength && + (r == endIndex || input[l].sort <= input[r].sort)) + { + buffer[i] = input[l]; + l++; + } + else + { + buffer[i] = input[r]; + r++; + } + } + + for(i = startIndex; i < endIndex; i++) + input[i] = buffer[int(i - startIndex)]; + } + } + /** @private */ internal function getChildEventListeners(object:DisplayObject, eventType:String, listeners:Vector.):void