Example #1
0
    private void UpdateShader(SimpleRainDrawerContainer dc, int index)
    {
        float progress = GetProgress(dc);

        dc.Drawer.RenderQueue   = RenderQueue + index;
        dc.Drawer.NormalMap     = Variables.NormalMap;
        dc.Drawer.ReliefTexture = Variables.OverlayTexture;
        dc.Drawer.OverlayColor  = new Color(
            Variables.OverlayColor.r,
            Variables.OverlayColor.g,
            Variables.OverlayColor.b,
            Variables.OverlayColor.a * Variables.AlphaOverLifetime.Evaluate(progress) * Alpha
            );
        dc.Drawer.DistortionStrength = Variables.DistortionValue * Variables.DistortionOverLifetime.Evaluate(progress) * Alpha;
        dc.Drawer.ReliefValue        = Variables.ReliefValue * Variables.ReliefOverLifetime.Evaluate(progress) * Alpha;
        dc.Drawer.Blur          = Variables.Blur * Variables.BlurOverLifetime.Evaluate(progress) * Alpha;
        dc.Drawer.Darkness      = Variables.Darkness * Alpha;
        dc.transform.localScale = dc.startSize * Variables.SizeOverLifetime.Evaluate(progress);
        // old
        //dc.transform.localPosition = dc.startPos + Vector3.up * Variables.PosYOverLifetime.Evaluate(progress);
        Vector3 gforced = RainDropTools.GetGForcedScreenMovement(this.camera.transform, this.GForceVector);

        gforced = gforced.normalized;
        dc.transform.localPosition += new Vector3(-gforced.x, -gforced.y, 0f) * 0.01f * Variables.PosYOverLifetime.Evaluate(progress);
        dc.transform.localPosition += progress * new Vector3(GlobalWind.x, GlobalWind.y, 0f);
        dc.transform.localPosition  = new Vector3(dc.transform.localPosition.x, dc.transform.localPosition.y, 0f);
        dc.Drawer.ShaderType        = this.ShaderType;
        dc.Drawer.Show();
    }
    private void UpdateTransform(FlowRainDrawerContainer dc)
    {
        Action initRnd = () =>
        {
            dc.rnd1   = RainDropTools.Random(-0.1f * Variables.Amplitude, 0.1f * Variables.Amplitude);
            dc.posXDt = 0f;
        };

        if (dc.posXDt == 0f)
        {
            StartCoroutine(
                Wait(
                    0.01f,
                    0.01f,
                    (int)(1f / dc.fluctuationRate * 100),
                    () =>
            {
                initRnd();
            }
                    )
                );
        }

        dc.posXDt += 0.01f * Variables.Smooth * Time.deltaTime;

        if (dc.rnd1 == 0f)
        {
            initRnd();
        }

        float t = dc.TimeElapsed;

        Vector3 downward = RainDropTools.GetGForcedScreenMovement(this.camera.transform, this.GForceVector);

        downward = -downward.normalized;

        Vector3 nextPos = new Vector3(
            Vector3.Slerp(dc.transform.localPosition, dc.transform.localPosition + downward * dc.rnd1, dc.posXDt).x,
            dc.startPos.y - downward.y * (1 / 2f) * t * t * dc.acceleration - Variables.InitialVelocity * t,
            0.001f // TODO: Work around
            );

        dc.transform.localPosition = nextPos;

        dc.transform.localPosition += GetProgress(dc) * new Vector3(GlobalWind.x, GlobalWind.y, 0f);
    }
    private Vector3 GetNextPositionWithFriction(FrictionFlowRainDrawerContainer dc, float downValue, int resolution, int widthResolution, float dt)
    {
        dummy.parent        = dc.Drawer.transform.parent;
        dummy.localRotation = dc.Drawer.transform.localRotation;
        dummy.localPosition = dc.Drawer.transform.localPosition;

        int texW = Variables.FrictionMap.width;
        int texH = Variables.FrictionMap.height;
        int iter = (int)(Mathf.Clamp(resolution * dt, 2, 5));
        //Vector3 frictionWay = dc.Drawer.transform.localPosition;
        Dictionary <Vector3, float> widthPixels = new Dictionary <Vector3, float>();

        // Get the gravity forced vector
        Vector3 downward = RainDropTools.GetGForcedScreenMovement(this.camera.transform, this.GForceVector);

        downward = downward.normalized;

        float angl = Mathf.Rad2Deg * Mathf.Atan2(downward.y, downward.x);

        //dummy.localPosition += downValue * new Vector3(downward.x, downward.y, 0f);
        dummy.localRotation = Quaternion.AngleAxis(angl + 90f, Vector3.forward);

        float step  = downValue * (1f / iter) * 3f / widthResolution;
        int   resol = Mathf.Clamp(2 * widthResolution, 2, 5);

        for (int i = 0; i < iter; i++)
        {
            dummy.localPosition += downValue * (1f / iter) * new Vector3(downward.x, downward.y, 0f);

            for (int j = 0; j <= resol; j++)
            {
                float   ww      = (j * step - (resol / 2f) * step);
                Vector3 downPos = dummy.TransformPoint(new Vector3(ww, 0f, 0f));
                Vector3 downVector2viewPoint = this.camera.WorldToViewportPoint(downPos);

                // Get the pixel grayscale
                float pixel = Variables.FrictionMap.GetPixel(
                    (int)(texW * downVector2viewPoint.x),
                    (int)(texH * -downVector2viewPoint.y)
                    ).grayscale;

                // If never added to the list, we add it
                if (!widthPixels.ContainsKey(downPos))
                {
                    widthPixels.Add(downPos, 1.0f - pixel);
                }
            }
        }

        Vector3 frictionWay = PickRandomWeightedElement(widthPixels).Key;

        frictionWay  = dc.Drawer.transform.parent.InverseTransformPoint(frictionWay);
        dummy.parent = null;

        return(frictionWay);

        // OLD

        /*for (int i = 0; i < iter; i++)
         * {
         *  float dv = downValue * ((float)i / iter);
         *  widthPixels.Clear();
         *
         *  for (int j = 0; j <= 2*widthResolution; j++)
         *  {
         *      Vector3 downVector = frictionWay + (downward * dv);
         *
         *      // TODO: Use normal vector of downward to search pixels
         *      if (Mathf.Abs(downward.y) > Mathf.Abs(downward.x))
         *          downVector += Vector3.left * dv + Vector3.right * dv * ((float)j / widthResolution);
         *      else
         *          downVector += Vector3.up * dv + Vector3.down * dv * ((float)j / widthResolution);
         *      // END OF todo
         *
         *      Vector3 downVector2viewPoint = camera.WorldToViewportPoint(downVector);
         *      float pixel = Variables.FrictionMap.GetPixel(
         *          (int)(texW * downVector2viewPoint.x),
         *          (int)(texH * -downVector2viewPoint.y)
         *      ).grayscale;
         *      if (!widthPixels.ContainsKey(downVector))
         *          widthPixels.Add(downVector, 1.0f-pixel);
         *  }
         *
         *  Vector3 keyVector = PickRandomWeightedElement(widthPixels).Key;
         *  frictionWay = keyVector;
         * }
         *
         * return frictionWay;*/
    }