private void DrawFlareOverlay(bool useStrong)
        {
            ticksSinceFlare = 0;
            var overlay = useStrong ? Resources.Graphics.FlareOverlayStrong : Resources.Graphics.FlareOverlayNormal;

            RemoteTechUtility.DrawFlareOverlay(overlay, DrawPos, BlinkerData);
        }
        public override void Draw()
        {
            base.Draw();
            if (compPower == null || !compPower.PowerOn)
            {
                return;
            }
            // limit the number of possible alpha levels to avoid leaking materials
            var props = BlinkerData;
            var alpha = Mathf.Round(Mathf.Max(0f, Mathf.Sin(((Find.TickManager.TicksGame + thingIDNumber * 1000) * Mathf.PI) / Mathf.Max(.1f, props.blinkerIntervalNormal))) * FlareAlphaLevels) / FlareAlphaLevels;

            if (alpha > 0)
            {
                RemoteTechUtility.DrawFlareOverlay(Resources.Graphics.FlareOverlayGreen, DrawPos, props, alpha);
            }
        }
 public override void PostDraw()
 {
     base.PostDraw();
     if (blinker != null && Enabled)
     {
         var currentTick = GenTicks.TicksGame;
         RefreshCurrentTargetPosition(false);
         if (nextBlinkTick <= currentTick)
         {
             nextBlinkTick = currentTick + Mathf.Round(Rand.Range(BlinkMaxInterval / 2f, BlinkMaxInterval)).SecondsToTicks();
             blinkAnim.StartInterpolation(0f, BlinkAnimDuration / 2f, CurveType.CubicInOut);
             blinkAnim.SetFinishedCallback((interpolator, value, duration, curve) =>
                                           interpolator.StartInterpolation(1f, duration, curve).SetFinishedCallback(null)
                                           );
         }
         if (blinkSquintAnim.finished)
         {
             // squint if target is a dirty humanlike
             var isHumanlike  = currentTarget is Pawn p && p.RaceProps != null && p.RaceProps.Humanlike;
             var targetSquint = isHumanlike ? .5f : 1f;
             if (!blinkSquintAnim.value.ApproximatelyEquals(targetSquint))
             {
                 blinkSquintAnim.StartInterpolation(targetSquint, SquintAnimDuration, CurveType.CubicInOut);
             }
         }
         if (currentTarget != null && targetExpirationTick <= GenTicks.TicksGame)
         {
             SetLookTarget(null, false);
         }
         blinkAnim.UpdateIfUnpaused();
         blinkSquintAnim.UpdateIfUnpaused();
         offsetXAnim.UpdateIfUnpaused();
         offsetZAnim.UpdateIfUnpaused();
         RemoteTechUtility.DrawFlareOverlay(Resources.Graphics.FlareOverlayNormal,
                                            parent.DrawPos + new Vector3(offsetXAnim.value, 0, offsetZAnim.value) + Altitudes.AltIncVect, blinker, 1f, blinkAnim.value * blinkSquintAnim.value);
     }
 }