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