public virtual AsMatrix getTransformationMatrix(AsDisplayObject targetSpace, AsMatrix resultMatrix)
 {
     if(resultMatrix != null)
     {
         resultMatrix.identity();
     }
     else
     {
         resultMatrix = new AsMatrix();
     }
     AsDisplayObject currentObject = this;
     if(targetSpace == this)
     {
         return resultMatrix;
     }
     else
     {
         if(targetSpace == mParent || (targetSpace == null && mParent == null))
         {
             if(mPivotX != 0.0f || mPivotY != 0.0f)
             {
                 resultMatrix.translate(-mPivotX, -mPivotY);
             }
             if(mScaleX != 1.0f || mScaleY != 1.0f)
             {
                 resultMatrix.scale(mScaleX, mScaleY);
             }
             if(mRotation != 0.0f)
             {
                 resultMatrix.rotate(AsMathHelper.toRadians(mRotation));
             }
             if(mX != 0.0f || mY != 0.0f)
             {
                 resultMatrix.translate(mX, mY);
             }
             return resultMatrix;
         }
         else
         {
             if(targetSpace == null)
             {
                 currentObject = this;
                 while(currentObject != null)
                 {
                     currentObject.getTransformationMatrix(currentObject.mParent, sHelperMatrix);
                     resultMatrix.concat(sHelperMatrix);
                     currentObject = currentObject.getParent();
                 }
                 return resultMatrix;
             }
             else
             {
                 if(targetSpace.mParent == this)
                 {
                     targetSpace.getTransformationMatrix(this, resultMatrix);
                     resultMatrix.invert();
                     return resultMatrix;
                 }
             }
         }
     }
     sAncestors.setLength(0);
     AsDisplayObject commonParent = null;
     while(currentObject != null)
     {
         sAncestors.push(currentObject);
         currentObject = currentObject.getParent();
     }
     currentObject = targetSpace;
     while(currentObject != null && sAncestors.indexOf(currentObject) == -1)
     {
         currentObject = currentObject.getParent();
     }
     if(currentObject == null)
     {
         throw new AsArgumentError("Object not connected to target");
     }
     else
     {
         commonParent = currentObject;
     }
     currentObject = this;
     while(currentObject != commonParent)
     {
         currentObject.getTransformationMatrix(currentObject.mParent, sHelperMatrix);
         resultMatrix.concat(sHelperMatrix);
         currentObject = currentObject.getParent();
     }
     sTargetMatrix.identity();
     currentObject = targetSpace;
     while(currentObject != commonParent)
     {
         currentObject.getTransformationMatrix(currentObject.mParent, sHelperMatrix);
         sTargetMatrix.concat(sHelperMatrix);
         currentObject = currentObject.getParent();
     }
     sTargetMatrix.invert();
     resultMatrix.concat(sTargetMatrix);
     return resultMatrix;
 }
 public virtual AsMatrix getTransformationMatrix(AsDisplayObject targetSpace, AsMatrix resultMatrix)
 {
     AsDisplayObject commonParent = null;
     AsDisplayObject currentObject = null;
     if(resultMatrix != null)
     {
         resultMatrix.identity();
     }
     else
     {
         resultMatrix = new AsMatrix();
     }
     if(targetSpace == this)
     {
         return resultMatrix;
     }
     else
     {
         if(targetSpace == mParent || (targetSpace == null && mParent == null))
         {
             resultMatrix.copyFrom(getTransformationMatrix());
             return resultMatrix;
         }
         else
         {
             if(targetSpace == null || targetSpace == get_base())
             {
                 currentObject = this;
                 while(currentObject != targetSpace)
                 {
                     resultMatrix.concat(currentObject.getTransformationMatrix());
                     currentObject = currentObject.mParent;
                 }
                 return resultMatrix;
             }
             else
             {
                 if(targetSpace.mParent == this)
                 {
                     targetSpace.getTransformationMatrix(this, resultMatrix);
                     resultMatrix.invert();
                     return resultMatrix;
                 }
             }
         }
     }
     commonParent = null;
     currentObject = this;
     while(currentObject != null)
     {
         sAncestors.push(currentObject);
         currentObject = currentObject.mParent;
     }
     currentObject = targetSpace;
     while(currentObject != null && sAncestors.indexOf(currentObject) == -1)
     {
         currentObject = currentObject.mParent;
     }
     sAncestors.setLength(0);
     if(currentObject != null)
     {
         commonParent = currentObject;
     }
     else
     {
         throw new AsArgumentError("Object not connected to target");
     }
     currentObject = this;
     while(currentObject != commonParent)
     {
         resultMatrix.concat(currentObject.getTransformationMatrix());
         currentObject = currentObject.mParent;
     }
     if(commonParent == targetSpace)
     {
         return resultMatrix;
     }
     sHelperMatrix.identity();
     currentObject = targetSpace;
     while(currentObject != commonParent)
     {
         sHelperMatrix.concat(currentObject.getTransformationMatrix());
         currentObject = currentObject.mParent;
     }
     sHelperMatrix.invert();
     resultMatrix.concat(sHelperMatrix);
     return resultMatrix;
 }