From e55b0af41ff296efc886dfaccf3f663f751f6502 Mon Sep 17 00:00:00 2001 From: Rudolf Polzer Date: Thu, 24 May 2012 10:38:35 +0200 Subject: [PATCH] support functions: cubic speed function for "whatever use" :P --- qcsrc/common/util.qc | 52 ++++++++++++++++++++++++++++++++++++++++++++ qcsrc/common/util.qh | 14 ++++++++++++ 2 files changed, 66 insertions(+) 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); -- 2.39.2