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; }