Last active
October 4, 2020 18:00
-
-
Save celechii/9625779fa906036ea8bcb48716ff10a3 to your computer and use it in GitHub Desktop.
a smoothdamp function for unity colours. not optimized or rlly thought thru, i just replaced a bunch of shit
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// based on how ive been told unity did it: | |
// https://stackoverflow.com/questions/61372498/how-does-mathf-smoothdamp-work-what-is-it-algorithm | |
public static Color ColourSmoothDamp(Color current, Color target, ref Vector4 currentVelocity, float smoothTime) => | |
ColourSmoothDamp(current, target, ref currentVelocity, smoothTime, Mathf.Infinity, Time.deltaTime); | |
public static Color ColourSmoothDamp(Color current, Color target, ref Vector4 currentVelocity, float smoothTime, float maxSpeed) => | |
ColourSmoothDamp(current, target, ref currentVelocity, smoothTime, maxSpeed, Time.deltaTime); | |
public static Color ColourSmoothDamp(Color current, Color target, ref Vector4 currentVelocity, float smoothTime, float maxSpeed, float deltaTime) { | |
// Based on Game Programming Gems 4 Chapter 1.10 | |
smoothTime = Mathf.Max(0.0001f, smoothTime); | |
float omega = 2f / smoothTime; | |
Vector4 currentColour = new Vector4(current.r, current.g, current.b, current.a); | |
Vector4 targetColour = new Vector4(target.r, target.g, target.b, target.a); | |
float x = omega * deltaTime; | |
float exp = 1f / (1f + x + 0.48f * x * x + 0.235f * x * x * x); | |
Vector4 change = currentColour - targetColour; | |
Vector4 originalTo = targetColour; | |
// Clamp maximum speed | |
Vector4 maxChange = maxSpeed * smoothTime * Vector4.one; | |
change.x = Mathf.Clamp(change.x, -maxChange.x, maxChange.x); | |
change.y = Mathf.Clamp(change.y, -maxChange.y, maxChange.y); | |
change.z = Mathf.Clamp(change.z, -maxChange.z, maxChange.z); | |
change.w = Mathf.Clamp(change.w, -maxChange.w, maxChange.w); | |
targetColour = currentColour - change; | |
Vector4 temp = (currentVelocity + (omega * change)) * deltaTime; | |
currentVelocity = (currentVelocity - omega * temp) * exp; | |
Vector4 output = targetColour + (change + temp) * exp; | |
// Prevent overshooting | |
if (originalTo.x - currentColour.x > 0.0f == output.x > originalTo.x) { | |
output.x = originalTo.x; | |
currentVelocity.x = (output.x - originalTo.x) / deltaTime; | |
} | |
if (originalTo.y - currentColour.y > 0.0f == output.y > originalTo.y) { | |
output.y = originalTo.y; | |
currentVelocity.y = (output.y - originalTo.y) / deltaTime; | |
} | |
if (originalTo.z - currentColour.z > 0.0f == output.z > originalTo.z) { | |
output.z = originalTo.z; | |
currentVelocity.z = (output.z - originalTo.z) / deltaTime; | |
} | |
if (originalTo.w - currentColour.w > 0.0f == output.w > originalTo.w) { | |
output.w = originalTo.w; | |
currentVelocity.w = (output.w - originalTo.w) / deltaTime; | |
} | |
return new Color(output.x, output.y, output.z, output.w); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment