private static int GetFrameForPOV(SpriteInfoFromPOV s)
        {
            var r = 360.DegreesToRadians();

            var len = s.Sprite.Frames.Length;

            #region direction translation magic
            var dir = s.Direction;

            dir -= (r / (len)) / 2;

            dir = r - (dir % r);
            dir += s.Sprite.Direction;

            dir += 270.DegreesToRadians();
            #endregion

            // we want to see it from behind...
            //dir += Math.PI / 2;

            var grad = ((dir * len) / r).Floor() % len;
            return grad;
        }
        /// <summary>
        /// renders a single sprite on display honoring zbuffer
        /// </summary>
        /// <param name="s"></param>
        /// <param name="Sprite_x"></param>
        public void RenderSingleSprite(SpriteInfoFromPOV s)
        {
            if (s.LastRenderedClip == null)
                return;

            if (s.LastRenderedClip.width <= 0)
                return;



            var texture = s.Sprite.Frames[GetFrameForPOV(s)];

            var matrix = new Matrix();
            var scale = (double)s.LastRenderedZoom / (double)texWidth;

            var zhalf = s.LastRenderedZoom / 2;

            matrix.scale(scale, scale);
            matrix.translate(-zhalf + s.LastRenderedX, -zhalf + _ViewHeight / 2);

            buffer.draw(texture.Bitmap, matrix, null, null, s.LastRenderedClip, true);

        }
        void UpdateSpriteRenderInfo(SpriteInfoFromPOV s)
        {
            if (this._ZBuffer == null)
                return;

            if (s.ViewInfo.IsInView)
            {
                var Total = (s.ViewInfo.Right - s.ViewInfo.Left);

                var LeftTarget = s.ViewInfo.Target - s.ViewInfo.Left;
                //var RightTarget = s.ViewInfo.Right - s.ViewInfo.Target;

                s.LastRenderedX = (LeftTarget * _ViewWidth / Total).Floor();

                var depth = s.RelativePosition.length;

                // scale down enemies to eye line
                var z = (_ViewHeight / depth).Floor();

                s.LastRenderedZoom = z;

                if (z < 0.1)
                    return;

                //var zmaxed = z.Max(_ViewHeight / 2).Floor();
                var zhalf = z / 2;

                // we are in a mirror? theres definetly a bug somewhere

                var clip = new Rectangle(s.LastRenderedX - zhalf, 0, 0, ViewHeight);

                var min = Math.Max(clip.left.Floor(), 0);
                var max = Math.Min((clip.left + z).Floor(), _ViewWidth);

                if (min < max)
                    for (int i = min; i < max; i++)
                    {
                        if (_ZBuffer[i] > depth)
                        {
                            clip.left = i;

                            for (; i < max; i++)
                            {
                                if (_ZBuffer[i] > depth)
                                {
                                    //buffer.setPixel32(i, _ViewHeight / 2 + 2, 0xffff00);
                                }
                                else
                                {
                                    break;
                                }
                            }


                            clip.width = i - clip.left;

                            for (; i < max; i++)
                            {
                                //buffer.setPixel32(i, _ViewHeight / 2 + 1, 0xff8f0000);
                            }

                            break;
                        }
                        else
                        {
                            //buffer.setPixel32(i, _ViewHeight / 2, 0xffff0000);
                        }
                    }

                s.LastRenderedClip = clip;

            }
            else
                s.LastRenderedClip = null;
        }
        public IEnumerable<SpriteInfoFromPOV> GetVisibleSprites(double arc, IEnumerable<SpriteInfo> source)
        {
            var a = new List<SpriteInfoFromPOV>();

            var fuzzy = 0.000001;

            var ViewDirectionLeftByArc = (this.ViewDirection - arc + 360.DegreesToRadians()) % 360.DegreesToRadians();
            var ViewDirectionRightByArc = (this.ViewDirection + arc + 360.DegreesToRadians()) % 360.DegreesToRadians();

            foreach (var i in source)
            {
                var v = new SpriteInfoFromPOV(i);

                v.Update(this.posX + fuzzy, this.posY + fuzzy, ViewDirectionLeftByArc, ViewDirectionRightByArc);

                if (v.Distance < 0.1)
                    v.ViewInfo.IsInView = false;

                UpdateSpriteRenderInfo(v);

                if (v.ViewInfo.IsInView)
                {
                    if (v.LastRenderedClip != null)
                        if (v.LastRenderedClip.width > 0)
                            a.Add(v);
                }


            }

            return a;
        }