private void CastRay(int xOrig, int yOrig, int xDest, int yDest, int radiusSquared, bool lightWalls) { int xCur = xOrig; int yCur = yOrig; bool inMap = false; bool blocked = false; bool end = false; var lineData = new BresenhamLineData(); InitLineData(xOrig, yOrig, xDest, yDest, lineData); if (xCur.Between(0, Width) && yCur.Between(0, Height)) { inMap = true; Tiles[xCur, yCur].InView = true; } while (!end) { end = StepLineData(ref xCur, ref yCur, lineData); if (radiusSquared > 0) { int curRadius = (xCur - xOrig) * (xCur - xOrig) + (yCur - yOrig) * (yCur - yOrig); if (curRadius > radiusSquared) { return; } } if (xCur.Between(0, Width) && yCur.Between(0, Height)) { inMap = true; if (!blocked && !Tiles[xCur, yCur].Transparent) { blocked = true; } else if (blocked) { return; } if (lightWalls || !blocked) { Tiles[xCur, yCur].InView = true; } } else if (inMap) { return; } } }
private void InitLineData(int xOrig, int yOrig, int xDest, int yDest, BresenhamLineData data) { data.OrigX = xOrig; data.OrigY = yOrig; data.DestX = xDest; data.DestY = yDest; data.DeltaX = xDest - xOrig; data.DeltaY = yDest - yOrig; if (data.DeltaX > 0) { data.StepX = 1; } else if (data.DeltaX < 0) { data.StepX = -1; } else { data.StepX = 0; } if (data.DeltaY > 0) { data.StepY = 1; } else if (data.DeltaY < 0) { data.StepY = -1; } else { data.StepY = 0; } if (data.StepX * data.DeltaX > data.StepY * data.DeltaY) { data.E = data.StepX * data.DeltaX; data.DeltaX *= 2; data.DeltaY *= 2; } else { data.E = data.StepY * data.DeltaY; data.DeltaX *= 2; data.DeltaY *= 2; } }
private bool StepLineData(ref int xCur, ref int yCur, BresenhamLineData data) { if (data.StepX * data.DeltaX > data.StepY * data.DeltaY) { if (data.OrigX == data.DestX) { return(true); } data.OrigX += data.StepX; data.E -= data.StepY * data.DeltaY; if (data.E < 0) { data.OrigY += data.StepY; data.E += data.StepX * data.DeltaX; } } else { if (data.OrigY == data.DestY) { return(true); } data.OrigY += data.StepY; data.E -= data.StepX * data.DeltaX; if (data.E < 0) { data.OrigX += data.StepX; data.E += data.StepY * data.DeltaY; } } xCur = data.OrigX; yCur = data.OrigY; return(false); }