Refactor KeyFrame ownership management in Animation
authorMikko Rasa <tdb@tdb.fi>
Sat, 8 Jun 2019 06:17:51 +0000 (09:17 +0300)
committerMikko Rasa <tdb@tdb.fi>
Sat, 8 Jun 2019 06:24:02 +0000 (09:24 +0300)
The public add_keyframe functions no longer provide a convenient single
place to set the RefPtr keep flag, so move it into the private function.

source/animation.cpp
source/animation.h

index c58a33d818f5d588a4ced081d35c1ec56ba2f23c..900542dd04bded26a97186b41c98ee949be4dc4f 100644 (file)
@@ -46,9 +46,7 @@ const string &Animation::get_uniform_name(unsigned i) const
 
 void Animation::add_keyframe(const Time::TimeDelta &t, const KeyFrame &kf)
 {
-       RefPtr<const KeyFrame> kfr(&kf);
-       kfr.keep();
-       add_keyframe(t, kfr, false);
+       add_keyframe(t, &kf, false, false);
        create_curves();
 }
 
@@ -67,12 +65,10 @@ void Animation::add_control_keyframe(const KeyFrame &kf)
        if(keyframes.empty())
                throw invalid_operation("Animation::add_control_keyframe");
 
-       RefPtr<const KeyFrame> kfr(&kf);
-       kfr.keep();
-       add_keyframe(keyframes.back().time, kfr, true);
+       add_keyframe(keyframes.back().time, &kf, true, false);
 }
 
-void Animation::add_keyframe(const Time::TimeDelta &t, const RefPtr<const KeyFrame> &kf, bool c)
+void Animation::add_keyframe(const Time::TimeDelta &t, const KeyFrame *kf, bool c, bool owned)
 {
        if(c && keyframes.empty())
                throw invalid_argument("Animation::add_keyframe");
@@ -97,6 +93,8 @@ void Animation::add_keyframe(const Time::TimeDelta &t, const RefPtr<const KeyFra
        TimedKeyFrame tkf;
        tkf.time = t;
        tkf.keyframe = kf;
+       if(!owned)
+               tkf.keyframe.keep();
        tkf.control = c;
 
        keyframes.push_back(tkf);
@@ -392,7 +390,7 @@ void Animation::Loader::finish()
 
 void Animation::Loader::load_kf(const string &n, bool c)
 {
-       obj.add_keyframe(current_time, get_collection().get<KeyFrame>(n), c);
+       obj.add_keyframe(current_time, &get_collection().get<KeyFrame>(n), c, false);
 }
 
 void Animation::Loader::load_kf_inline(bool c)
@@ -403,7 +401,8 @@ void Animation::Loader::load_kf_inline(bool c)
        else
                load_sub(*kf);
 
-       obj.add_keyframe(current_time, kf, c);
+       obj.add_keyframe(current_time, *kf, c, true);
+       kf.release();
 }
 
 void Animation::Loader::control_keyframe(const string &n)
index 43cfc2894013016ec9018244e60c5bff0b2a7f26..7b86eca9b162a56cd38e29ae1c17f05a326bce3b 100644 (file)
@@ -168,7 +168,7 @@ public:
        void add_keyframe(const Time::TimeDelta &, const KeyFrame &, float, float);
        void add_control_keyframe(const KeyFrame &);
 private:
-       void add_keyframe(const Time::TimeDelta &, const RefPtr<const KeyFrame> &, bool);
+       void add_keyframe(const Time::TimeDelta &, const KeyFrame *, bool, bool);
        void prepare_keyframe(TimedKeyFrame &);
        void create_curves();
        template<unsigned N, typename T>