CCAffineTransform absoluteTransform()
        {
            CCAffineTransform transform = CCAffineTransform.Identity;

            LHScene scene = ((LHNodeProtocol)_node).getScene();

            b2Vec2  b2Pos     = _body.Position;
            CCPoint globalPos = new CCPoint(b2Pos.x, b2Pos.y);            //[scene pointFromMeters:b2Pos];

            transform = CCAffineTransform.Translate(transform, globalPos.X, globalPos.Y);
            transform = CCAffineTransform.Rotate(transform, _body.Angle);


            transform = CCAffineTransform.Translate(transform, -_node.ContentSize.Width * 0.5f, -_node.ContentSize.Height * 0.5f);

            return(transform);
        }
        void CreateSlicedSprites()
        {
            float height = originalSize.Height;
            float width  = originalSize.Width;

            CCPoint offsetPosition = CCPoint.Zero;

            offsetPosition.X = (float)System.Math.Ceiling(offset.X + (originalSize.Width - spriteRect.Size.Width) / 2);
            offsetPosition.Y = (float)System.Math.Ceiling(offset.Y + (originalSize.Height - spriteRect.Size.Height) / 2);

            // If there is no specified center region
            if (capInsetsInternal == CCRect.Zero)
            {
                capInsetsInternal = new CCRect(width / 3, height / 3, width / 3, height / 3);
            }

            var originalRect = spriteRect;

            if (spriteFrameRotated)
            {
                originalRect = new CCRect(spriteRect.Origin.X - offsetPosition.Y,
                                          spriteRect.Origin.Y - offsetPosition.X,
                                          originalSize.Width, originalSize.Height);
            }
            else
            {
                originalRect = new CCRect(spriteRect.Origin.X - offsetPosition.Y,
                                          spriteRect.Origin.Y - offsetPosition.Y,
                                          originalSize.Width, originalSize.Height);
            }

            float leftWidth   = capInsetsInternal.Origin.X;
            float centerWidth = capInsetsInternal.Size.Width;
            float rightWidth  = originalRect.Size.Width - (leftWidth + centerWidth);

            float topHeight    = capInsetsInternal.Origin.Y;
            float centerHeight = capInsetsInternal.Size.Height;
            float bottomHeight = originalRect.Size.Height - (topHeight + centerHeight);

            // calculate rects

            // ... top row
            float x = 0.0f;
            float y = 0.0f;
            //why do we need pixelRect?
            var pixelRect = new CCRect(offsetPosition.X, offsetPosition.Y,
                                       spriteRect.Size.Width, spriteRect.Size.Height);

            // top left
            var leftTopBoundsOriginal = new CCRect(x, y, leftWidth, topHeight);
            var leftTopBounds         = leftTopBoundsOriginal;

            // top center
            x += leftWidth;
            var centerTopBounds = new CCRect(x, y, centerWidth, topHeight);

            // top right
            x += centerWidth;
            var rightTopBounds = new CCRect(x, y, rightWidth, topHeight);

            // ... center row
            x  = 0.0f;
            y  = 0.0f;
            y += topHeight;

            // center left
            var leftCenterBounds = new CCRect(x, y, leftWidth, centerHeight);

            // center center
            x += leftWidth;
            var centerBoundsOriginal = new CCRect(x, y, centerWidth, centerHeight);
            var centerBounds         = centerBoundsOriginal;

            // center right
            x += centerWidth;
            var rightCenterBounds = new CCRect(x, y, rightWidth, centerHeight);

            // ... bottom row
            x  = 0.0f;
            y  = 0.0f;
            y += topHeight;
            y += centerHeight;

            // bottom left
            var leftBottomBounds = new CCRect(x, y, leftWidth, bottomHeight);

            // bottom center
            x += leftWidth;
            var centerBottomBounds = new CCRect(x, y, centerWidth, bottomHeight);

            // bottom right
            x += centerWidth;
            var rightBottomBoundsOriginal = new CCRect(x, y, rightWidth, bottomHeight);
            var rightBottomBounds         = rightBottomBoundsOriginal;

            if ((capInsetsInternal.Origin.X + capInsetsInternal.Size.Width) <= originalSize.Width ||
                (capInsetsInternal.Origin.Y + capInsetsInternal.Size.Height) <= originalSize.Height)
            //in general case it is error but for legacy support we will check it
            {
                leftTopBounds      = intersectRect(leftTopBounds, pixelRect);
                centerTopBounds    = intersectRect(centerTopBounds, pixelRect);
                rightTopBounds     = intersectRect(rightTopBounds, pixelRect);
                leftCenterBounds   = intersectRect(leftCenterBounds, pixelRect);
                centerBounds       = intersectRect(centerBounds, pixelRect);
                rightCenterBounds  = intersectRect(rightCenterBounds, pixelRect);
                leftBottomBounds   = intersectRect(leftBottomBounds, pixelRect);
                centerBottomBounds = intersectRect(centerBottomBounds, pixelRect);
                rightBottomBounds  = intersectRect(rightBottomBounds, pixelRect);
            }
            else
            {
                //it is error but for legacy turn off clip system
                CCLog.Log("Scale9Sprite capInsetsInternal > originalSize");
            }

            var rotatedLeftTopBoundsOriginal     = leftTopBoundsOriginal;
            var rotatedCenterBoundsOriginal      = centerBoundsOriginal;
            var rotatedRightBottomBoundsOriginal = rightBottomBoundsOriginal;

            var rotatedCenterBounds       = centerBounds;
            var rotatedRightBottomBounds  = rightBottomBounds;
            var rotatedLeftBottomBounds   = leftBottomBounds;
            var rotatedRightTopBounds     = rightTopBounds;
            var rotatedLeftTopBounds      = leftTopBounds;
            var rotatedRightCenterBounds  = rightCenterBounds;
            var rotatedLeftCenterBounds   = leftCenterBounds;
            var rotatedCenterBottomBounds = centerBottomBounds;
            var rotatedCenterTopBounds    = centerTopBounds;

            if (!spriteFrameRotated)
            {
                CCAffineTransform t = CCAffineTransform.Identity;
                t = CCAffineTransform.Translate(t, originalRect.Origin.X, originalRect.Origin.Y);

                rotatedLeftTopBoundsOriginal     = CCAffineTransform.Transform(rotatedLeftTopBoundsOriginal, t);
                rotatedCenterBoundsOriginal      = CCAffineTransform.Transform(rotatedCenterBoundsOriginal, t);
                rotatedRightBottomBoundsOriginal = CCAffineTransform.Transform(rotatedRightBottomBoundsOriginal, t);

                rotatedCenterBounds       = CCAffineTransform.Transform(rotatedCenterBounds, t);
                rotatedRightBottomBounds  = CCAffineTransform.Transform(rotatedRightBottomBounds, t);
                rotatedLeftBottomBounds   = CCAffineTransform.Transform(rotatedLeftBottomBounds, t);
                rotatedRightTopBounds     = CCAffineTransform.Transform(rotatedRightTopBounds, t);
                rotatedLeftTopBounds      = CCAffineTransform.Transform(rotatedLeftTopBounds, t);
                rotatedRightCenterBounds  = CCAffineTransform.Transform(rotatedRightCenterBounds, t);
                rotatedLeftCenterBounds   = CCAffineTransform.Transform(rotatedLeftCenterBounds, t);
                rotatedCenterBottomBounds = CCAffineTransform.Transform(rotatedCenterBottomBounds, t);
                rotatedCenterTopBounds    = CCAffineTransform.Transform(rotatedCenterTopBounds, t);
            }
            else
            {
                // set up transformation of coordinates
                // to handle the case where the sprite is stored rotated
                // in the spritesheet
                // log("rotated");

                CCAffineTransform t = CCAffineTransform.Identity;
                t = CCAffineTransform.Translate(t, originalRect.Size.Height + originalRect.Origin.X,
                                                originalRect.Origin.Y);

                t = CCAffineTransform.Rotate(t, 1.57079633f);

                leftTopBoundsOriginal     = CCAffineTransform.Transform(leftTopBoundsOriginal, t);
                centerBoundsOriginal      = CCAffineTransform.Transform(centerBoundsOriginal, t);
                rightBottomBoundsOriginal = CCAffineTransform.Transform(rightBottomBoundsOriginal, t);

                centerBounds       = CCAffineTransform.Transform(centerBounds, t);
                rightBottomBounds  = CCAffineTransform.Transform(rightBottomBounds, t);
                leftBottomBounds   = CCAffineTransform.Transform(leftBottomBounds, t);
                rightTopBounds     = CCAffineTransform.Transform(rightTopBounds, t);
                leftTopBounds      = CCAffineTransform.Transform(leftTopBounds, t);
                rightCenterBounds  = CCAffineTransform.Transform(rightCenterBounds, t);
                leftCenterBounds   = CCAffineTransform.Transform(leftCenterBounds, t);
                centerBottomBounds = CCAffineTransform.Transform(centerBottomBounds, t);
                centerTopBounds    = CCAffineTransform.Transform(centerTopBounds, t);

                rotatedLeftTopBoundsOriginal.Origin     = leftTopBoundsOriginal.Origin;
                rotatedCenterBoundsOriginal.Origin      = centerBoundsOriginal.Origin;
                rotatedRightBottomBoundsOriginal.Origin = rightBottomBoundsOriginal.Origin;

                rotatedCenterBounds.Origin       = centerBounds.Origin;
                rotatedRightBottomBounds.Origin  = rightBottomBounds.Origin;
                rotatedLeftBottomBounds.Origin   = leftBottomBounds.Origin;
                rotatedRightTopBounds.Origin     = rightTopBounds.Origin;
                rotatedLeftTopBounds.Origin      = leftTopBounds.Origin;
                rotatedRightCenterBounds.Origin  = rightCenterBounds.Origin;
                rotatedLeftCenterBounds.Origin   = leftCenterBounds.Origin;
                rotatedCenterBottomBounds.Origin = centerBottomBounds.Origin;
                rotatedCenterTopBounds.Origin    = centerTopBounds.Origin;
            }

            topLeftSize     = rotatedLeftTopBoundsOriginal.Size;
            centerSize      = rotatedCenterBoundsOriginal.Size;
            bottomRightSize = rotatedRightBottomBoundsOriginal.Size;

            if (spriteFrameRotated)
            {
                float offsetX = (rotatedCenterBounds.Origin.X + rotatedCenterBounds.Size.Height / 2)
                                - (rotatedCenterBoundsOriginal.Origin.X + rotatedCenterBoundsOriginal.Size.Height / 2);
                float offsetY = (rotatedCenterBoundsOriginal.Origin.Y + rotatedCenterBoundsOriginal.Size.Width / 2)
                                - (rotatedCenterBounds.Origin.Y + rotatedCenterBounds.Size.Width / 2);
                centerOffset.X = -offsetY;
                centerOffset.Y = offsetX;
            }
            else
            {
                float offsetX = (rotatedCenterBounds.Origin.X + rotatedCenterBounds.Size.Width / 2)
                                - (rotatedCenterBoundsOriginal.Origin.X + rotatedCenterBoundsOriginal.Size.Width / 2);
                float offsetY = (rotatedCenterBoundsOriginal.Origin.Y + rotatedCenterBoundsOriginal.Size.Height / 2)
                                - (rotatedCenterBounds.Origin.Y + rotatedCenterBounds.Size.Height / 2);
                centerOffset.X = offsetX;
                centerOffset.Y = offsetY;
            }

            // Centre
            if (rotatedCenterBounds.Size.Width > 0 && rotatedCenterBounds.Size.Height > 0)
            {
                centerSprite = new CCSprite(scale9Image.Texture,
                                            rotatedCenterBounds,
                                            spriteFrameRotated);
                AddProtectedChild(centerSprite);
            }

            // Top
            if (rotatedCenterTopBounds.Size.Width > 0 && rotatedCenterTopBounds.Size.Height > 0)
            {
                topSprite = new CCSprite(scale9Image.Texture,
                                         rotatedCenterTopBounds,
                                         spriteFrameRotated);
                AddProtectedChild(topSprite);
            }

            // Bottom
            if (rotatedCenterBottomBounds.Size.Width > 0 && rotatedCenterBottomBounds.Size.Height > 0)
            {
                bottomSprite = new CCSprite(scale9Image.Texture,
                                            rotatedCenterBottomBounds,
                                            spriteFrameRotated);
                AddProtectedChild(bottomSprite);
            }

            // Left
            if (rotatedLeftCenterBounds.Size.Width > 0 && rotatedLeftCenterBounds.Size.Height > 0)
            {
                leftSprite = new CCSprite(scale9Image.Texture,
                                          rotatedLeftCenterBounds,
                                          spriteFrameRotated);
                AddProtectedChild(leftSprite);
            }

            // Right
            if (rotatedRightCenterBounds.Size.Width > 0 && rotatedRightCenterBounds.Size.Height > 0)
            {
                rightSprite = new CCSprite(scale9Image.Texture,
                                           rotatedRightCenterBounds,
                                           spriteFrameRotated);
                AddProtectedChild(rightSprite);
            }

            // Top left
            if (rotatedLeftTopBounds.Size.Width > 0 && rotatedLeftTopBounds.Size.Height > 0)
            {
                topLeftSprite = new CCSprite(scale9Image.Texture,
                                             rotatedLeftTopBounds,
                                             spriteFrameRotated);
                AddProtectedChild(topLeftSprite);
            }

            // Top right
            if (rotatedRightTopBounds.Size.Width > 0 && rotatedRightTopBounds.Size.Height > 0)
            {
                topRightSprite = new CCSprite(scale9Image.Texture,
                                              rotatedRightTopBounds,
                                              spriteFrameRotated);
                AddProtectedChild(topRightSprite);
            }

            // Bottom left
            if (rotatedLeftBottomBounds.Size.Width > 0 && rotatedLeftBottomBounds.Size.Height > 0)
            {
                bottomLeftSprite = new CCSprite(scale9Image.Texture,
                                                rotatedLeftBottomBounds,
                                                spriteFrameRotated);
                AddProtectedChild(bottomLeftSprite);
            }

            // Bottom right
            if (rotatedRightBottomBounds.Size.Width > 0 && rotatedRightBottomBounds.Size.Height > 0)
            {
                bottomRightSprite = new CCSprite(scale9Image.Texture,
                                                 rotatedRightBottomBounds,
                                                 spriteFrameRotated);
                AddProtectedChild(bottomRightSprite);
            }
        }