From 8e54698f54c338ea62ce26d431ba1ef5c7024f3e Mon Sep 17 00:00:00 2001 From: Bryce Covert Date: Mon, 8 Aug 2016 09:29:18 -0700 Subject: [PATCH] hopefully made math faster. --- desktop/src-common/advent/tween.clj | 71 +++++++++++++++-------------- desktop/src-common/advent/utils.clj | 14 +++--- 2 files changed, 45 insertions(+), 40 deletions(-) diff --git a/desktop/src-common/advent/tween.clj b/desktop/src-common/advent/tween.clj index fee6c997..f0991a6b 100644 --- a/desktop/src-common/advent/tween.clj +++ b/desktop/src-common/advent/tween.clj @@ -1,19 +1,22 @@ (ns advent.tween) -(defn ease-in-expo [power t start delta duration] - (let [pct-done (/ t duration) +(set! *unchecked-math* :warn-on-boxed) + +(defn ease-in-expo-maker [^double power ] + (fn ^double [^double t ^double start ^double delta ^double duration] + (let [pct-done (/ t duration) pct-done (Math/pow pct-done power)] (+ start - (* delta pct-done)))) + (* delta pct-done))))) -(def ease-linear (partial ease-in-expo 1.0)) -(def ease-in-quadratic (partial ease-in-expo 2.0)) -(def ease-in-cubic (partial ease-in-expo 3.0)) -(def ease-in-quartic (partial ease-in-expo 4.0)) -(def ease-in-quintic (partial ease-in-expo 5.0)) -(def ease-in-dectic (partial ease-in-expo 10.0)) +(def ease-linear (ease-in-expo-maker 1.0)) +(def ease-in-quadratic (ease-in-expo-maker 2.0)) +(def ease-in-cubic (ease-in-expo-maker 3.0)) +(def ease-in-quartic (ease-in-expo-maker 4.0)) +(def ease-in-quintic (ease-in-expo-maker 5.0)) +(def ease-in-dectic (ease-in-expo-maker 10.0)) -(defn ease-in-out-quadratic [t start delta duration] +(defn ease-in-out-quadratic [^double t ^double start ^double delta ^double duration] (let [t (/ t (/ duration 2))] (if (< t 1) (+ (* (/ delta 2) @@ -25,27 +28,28 @@ start))))) (defn ease-in-out-quintic ^double [^double t ^double start ^double delta ^double duration] - (binding [*unchecked-math* true] - (let [t (/ t (/ duration (double 2.0)))] - (if (< t (double 1)) - (let [result (+ (* (/ delta (double 2.0)) - t t t t t) start)] - result) - - (let [t (- t (double 2.0)) - result (+ (* (/ (- delta) (double 2.0)) - (- (* t t t t) (double 2.0))) - start)] - result - ))))) + (let [t (/ t (/ duration (double 2.0)))] + (if (< t (double 1)) + (let [result (+ (* (/ delta (double 2.0)) + t t t t t) start)] + result) + + (let [t (- t (double 2.0)) + result (+ (* (/ (- delta) (double 2.0)) + (- (* t t t t) (double 2.0))) + start)] + result)))) -(defn ease-out-quadratic [t start delta duration] +(defn ease-out-quadratic ^double [^double t ^double start ^double delta ^double duration] (let [t (/ t duration)] - (+ (* (- delta) t (- t 2)) start))) + (unchecked-add (-> (unchecked-subtract 1 delta) + (unchecked-multiply t) + (unchecked-multiply (unchecked-subtract t 2))) + start))) -(defn ease-out-cubic [t start delta duration] - (let [t (dec (/ t duration))] - (+ (* delta (inc (* t t t))) start))) +(defn ease-out-cubic ^double [^double t ^double start ^double delta ^double duration] + (let [t (unchecked-subtract (/ t duration) 1)] + (unchecked-add (unchecked-multiply delta (unchecked-add 1 (Math/pow t 3))) start))) (defn tween [id screen path start end duration & {:keys [finish ease entities]}] (let [ease (or ease ease-linear) @@ -54,11 +58,11 @@ start (if (and entities (= start :current)) (get-in entities path) start) - delta (- end start) + delta (unchecked-subtract ^double end ^double start) ] - (fn [e total-time] - (let [delta-time (- total-time start-time) - pct-done (min (/ delta-time duration) 1.0) + (fn [e ^double total-time] + (let [delta-time (- total-time ^double start-time) + pct-done (min (/ delta-time ^double duration) 1.0) new-val (ease delta-time start delta duration) e (assoc-in e path (if (= 1.0 pct-done) end @@ -66,4 +70,5 @@ (if (= 1.0 pct-done) (finish (update-in e [:tweens] dissoc id)) - e))))) + e)) + ))) diff --git a/desktop/src-common/advent/utils.clj b/desktop/src-common/advent/utils.clj index 054bdee1..5ba0605f 100644 --- a/desktop/src-common/advent/utils.clj +++ b/desktop/src-common/advent/utils.clj @@ -35,15 +35,15 @@ (def selected-save (atom nil)) -(defn current-music-volume [& [factor]] - (* (Math/pow (/ (:music-volume @settings) 100.0) 2) - 0.25 - (or factor 1.0))) +(defn current-music-volume [& [^double factor]] + (-> (Math/pow (unchecked-multiply (:music-volume @settings) 0.01) 2) + (unchecked-multiply 0.25) + (unchecked-multiply (or factor 1.0)))) (defn current-sound-volume [& [factor]] - (* (Math/pow (/ (:sound-volume @settings) 100.0) 2) - 0.5 - (or factor 1.0))) + (-> (Math/pow (unchecked-multiply (:sound-volume @settings) 0.01) 2) + (unchecked-multiply 0.5) + (unchecked-multiply (or factor 1.0)))) (defn cursor [filename which] (let [scale 4