bool LineOfSightCanSee(FogOfWarShape shape, Vector2 offset, float fogradius) { if (shape.lineOfSight == null) { return(true); } float idx = FogOfWarUtils.ClockwiseAngle(Vector2.up, offset) * shape.lineOfSight.Length / 360.0f; if (idx < 0) { idx += shape.lineOfSight.Length; } // sampling float value; if (_map.filterMode == FilterMode.Point) { value = shape.lineOfSight[Mathf.RoundToInt(idx) % shape.lineOfSight.Length]; } else { int idxlow = Mathf.FloorToInt(idx); int idxhigh = (idxlow + 1) % shape.lineOfSight.Length; value = Mathf.LerpUnclamped(shape.lineOfSight[idxlow], shape.lineOfSight[idxhigh], idx % 1); } float dist = value * fogradius; return(offset.sqrMagnitude < dist * dist); }
public DrawInfo(FogOfWarMap map, FogOfWarShape shape, float xradius, float yradius) { // convert size to fog space fogForward = shape.foward; forwardAngle = FogOfWarUtils.ClockwiseAngle(Vector2.up, fogForward) * Mathf.Deg2Rad; float sin = Mathf.Sin(-forwardAngle); float cos = Mathf.Cos(-forwardAngle); Vector2 relativeoffset = new Vector2(shape.offset.x * cos - shape.offset.y * sin, shape.offset.x * sin + shape.offset.y * cos); fogCenterPos = FogOfWarConversion.WorldToFog(FogOfWarConversion.WorldToFogPlane(shape.eyePosition, map.plane) + relativeoffset, map.offset, map.resolution, map.size); fogEyePos = new Vector2i(FogOfWarConversion.WorldToFog(shape.eyePosition, map.plane, map.offset, map.resolution, map.size)); // find ranges if (shape.visibleCells == null) { xMin = Mathf.Max(0, Mathf.RoundToInt(fogCenterPos.x - xradius)); xMax = Mathf.Min(map.resolution.x - 1, Mathf.RoundToInt(fogCenterPos.x + xradius)); yMin = Mathf.Max(0, Mathf.RoundToInt(fogCenterPos.y - yradius)); yMax = Mathf.Min(map.resolution.y - 1, Mathf.RoundToInt(fogCenterPos.y + yradius)); } else { fogCenterPos = FogOfWarConversion.SnapToNearestFogPixel(fogCenterPos); fogEyePos = new Vector2i(FogOfWarConversion.SnapToNearestFogPixel(FogOfWarConversion.WorldToFog(shape.eyePosition, map.offset, map.resolution, map.size))); Vector2i pos = new Vector2i(Mathf.RoundToInt(fogCenterPos.x), Mathf.RoundToInt(fogCenterPos.y)); Vector2i rad = new Vector2i(Mathf.RoundToInt(xradius), Mathf.RoundToInt(yradius)); xMin = Mathf.Max(0, Mathf.RoundToInt(pos.x - rad.x)); xMax = Mathf.Min(map.resolution.x - 1, Mathf.RoundToInt(pos.x + rad.x)); yMin = Mathf.Max(0, Mathf.RoundToInt(pos.y - rad.y)); yMax = Mathf.Min(map.resolution.y - 1, Mathf.RoundToInt(pos.y + rad.y)); } }
public Texture Apply(Texture2D fogtexture, Vector2Int resolution, int amount, int iterations, FogOfWarBlurType type) { if (amount <= 0 || iterations <= 0) { return(fogtexture); } if (_blurMaterial == null) { _blurMaterial = new Material(FogOfWarUtils.FindShader("Hidden/FogOfWarBlurShader")); } _blurMaterial.SetFloat("_BlurAmount", amount); _blurMaterial.SetKeywordEnabled("GAUSSIAN3", type == FogOfWarBlurType.Gaussian3); _blurMaterial.SetKeywordEnabled("GAUSSIAN5", type == FogOfWarBlurType.Gaussian5); _blurMaterial.SetKeywordEnabled("ANTIALIAS", type == FogOfWarBlurType.Antialias); SetupRenderTarget(resolution, ref _target); if (iterations > 1) { SetupRenderTarget(resolution, ref _source); } _target.MarkRestoreExpected(); Graphics.Blit(fogtexture, _target, _blurMaterial); for (int i = 1; i < iterations; ++i) { FogOfWarUtils.Swap(ref _target, ref _source); _target.MarkRestoreExpected(); Graphics.Blit(_source, _target, _blurMaterial); } return(_target); }
public void Setup(PostProcessRenderContext context) { _context = context; if (_shader == null) { _shader = FogOfWarUtils.FindShader("Hidden/FogOfWarPPSv2"); } _sheet = _context.propertySheets.Get(_shader); }
public DrawInfo(FogOfWarMap map, FogOfWarShape shape) { // convert size to fog space Vector2 radius = shape.CalculateRadius() * map.pixelSize; fogForward = shape.foward; Vector2 relativeoffset; if (shape.absoluteOffset) { forwardAngle = 0; relativeoffset = shape.offset; } else { forwardAngle = FogOfWarUtils.ClockwiseAngle(Vector2.up, fogForward) * Mathf.Deg2Rad; float sin = Mathf.Sin(-forwardAngle); float cos = Mathf.Cos(-forwardAngle); relativeoffset = new Vector2(shape.offset.x * cos - shape.offset.y * sin, shape.offset.x * sin + shape.offset.y * cos); } fogCenterPos = FogOfWarConversion.WorldToFog(FogOfWarConversion.WorldToFogPlane(shape.eyePosition, map.plane) + relativeoffset, map.offset, map.resolution, map.size); fogEyePos = FogOfWarConversion.WorldToFog(shape.eyePosition, map.plane, map.offset, map.resolution, map.size).ToInt(); // find ranges if (shape.visibleCells == null) { xMin = Mathf.Max(0, Mathf.RoundToInt(fogCenterPos.x - radius.x)); xMax = Mathf.Min(map.resolution.x - 1, Mathf.RoundToInt(fogCenterPos.x + radius.x)); yMin = Mathf.Max(0, Mathf.RoundToInt(fogCenterPos.y - radius.y)); yMax = Mathf.Min(map.resolution.y - 1, Mathf.RoundToInt(fogCenterPos.y + radius.y)); } else { fogCenterPos = FogOfWarConversion.SnapToNearestFogPixel(fogCenterPos); fogEyePos = FogOfWarConversion.SnapToNearestFogPixel(FogOfWarConversion.WorldToFog(shape.eyePosition, map.offset, map.resolution, map.size)).ToInt(); Vector2Int pos = fogCenterPos.ToInt(); Vector2Int rad = radius.ToInt(); xMin = Mathf.Max(0, Mathf.RoundToInt(pos.x - rad.x)); xMax = Mathf.Min(map.resolution.x - 1, Mathf.RoundToInt(pos.x + rad.x)); yMin = Mathf.Max(0, Mathf.RoundToInt(pos.y - rad.y)); yMax = Mathf.Min(map.resolution.y - 1, Mathf.RoundToInt(pos.y + rad.y)); } }
protected override void OnInitialise() { if (_material == null) { _material = new Material(FogOfWarUtils.FindShader("Hidden/FogOfWarHardware")); } if (_renderTexture != null) { _renderTexture.Release(); Object.Destroy(_renderTexture); _renderTexture = null; Object.Destroy(_outputTexture); _outputTexture = null; } _renderTexture = new RenderTexture(_map.resolution.x, _map.resolution.y, 16, RenderTextureFormat.ARGB32); _outputTexture = new Texture2D(_map.resolution.x, _map.resolution.y, TextureFormat.ARGB32, false); }
public FogOfWarLegacyManager() { _material = new Material(FogOfWarUtils.FindShader("Hidden/FogOfWarLegacy")); _material.name = "FogOfWarLegacy"; }