From: Rudolf Polzer <divverent@xonotic.org>
Date: Thu, 24 May 2012 08:38:35 +0000 (+0200)
Subject: support functions: cubic speed function for "whatever use" :P
X-Git-Tag: xonotic-v0.7.0~314^2
X-Git-Url: https://git.rm.cloudns.org/?a=commitdiff_plain;h=e55b0af41ff296efc886dfaccf3f663f751f6502;p=xonotic%2Fxonotic-data.pk3dir.git

support functions: cubic speed function for "whatever use" :P
---

diff --git a/qcsrc/common/util.qc b/qcsrc/common/util.qc
index b973850cc..6e534ffc1 100644
--- a/qcsrc/common/util.qc
+++ b/qcsrc/common/util.qc
@@ -2364,3 +2364,55 @@ void queue_to_execute_next_frame(string s)
 	}
 	to_execute_next_frame = strzone(s);
 }
+
+float cubic_speedfunc(float startspeedfactor, float endspeedfactor, float x)
+{
+	return
+		(((     startspeedfactor + endspeedfactor - 2
+		) * x - 2 * startspeedfactor - endspeedfactor + 3
+		) * x + startspeedfactor
+		) * x;
+}
+
+float cubic_speedfunc_is_sane(float startspeedfactor, float endspeedfactor)
+{
+	if(startspeedfactor < 0 || endspeedfactor < 0)
+		return FALSE;
+
+	/*
+	// if this is the case, the possible zeros of the first derivative are outside
+	// 0..1
+	We can calculate this condition as condition 
+	if(se <= 3)
+		return TRUE;
+	*/
+
+	// better, see below:
+	if(startspeedfactor <= 3 && endspeedfactor <= 3)
+		return TRUE;
+
+	// if this is the case, the first derivative has no zeros at all
+	float se = startspeedfactor + endspeedfactor;
+	float s_e = startspeedfactor - endspeedfactor;
+	if(3 * (se - 4) * (se - 4) + s_e * s_e <= 12) // an ellipse
+		return TRUE;
+
+	// Now let s <= 3, s <= 3, s+e >= 3 (triangle) then we get se <= 6 (top right corner).
+	// we also get s_e <= 6 - se
+	// 3 * (se - 4)^2 + (6 - se)^2
+	// is quadratic, has value 12 at 3 and 6, and value < 12 in between.
+	// Therefore, above "better" check works!
+
+	return FALSE;
+
+	// known good cases:
+	// (0, [0..3])
+	// (0.5, [0..3.8])
+	// (1, [0..4])
+	// (1.5, [0..3.9])
+	// (2, [0..3.7])
+	// (2.5, [0..3.4])
+	// (3, [0..3])
+	// (3.5, [0.2..2.3])
+	// (4, 1)
+}
diff --git a/qcsrc/common/util.qh b/qcsrc/common/util.qh
index c409de354..3ce173bf6 100644
--- a/qcsrc/common/util.qh
+++ b/qcsrc/common/util.qh
@@ -320,3 +320,17 @@ void queue_to_execute_next_frame(string s);
 
 // for marking written-to values as unused where it's a good idea to do this
 noref float unused_float;
+
+
+
+// a function f with:
+// f(0) = 0
+// f(1) = 1
+// f'(0) = startspeedfactor
+// f'(1) = endspeedfactor
+float cubic_speedfunc(float startspeedfactor, float endspeedfactor, float x);
+
+// checks whether f'(x) = 0 anywhere from 0 to 1
+// because if this is the case, the function is not usable for platforms
+// as it may exceed 0..1 bounds, or go in reverse
+float cubic_speedfunc_is_sane(float startspeedfactor, float endspeedfactor);