From caf1bd5b9a18b628869e00ff5641d58cab6bcec1 Mon Sep 17 00:00:00 2001 From: badlogic Date: Thu, 26 Sep 2019 16:50:47 +0200 Subject: [PATCH] [cpp] Store timeline ids inside set in Animation for O(1) lookup. See #1462. --- spine-cpp/spine-cpp/include/spine/Animation.h | 4 ++++ spine-cpp/spine-cpp/include/spine/AnimationState.h | 2 -- spine-cpp/spine-cpp/src/spine/Animation.cpp | 7 +++++++ spine-cpp/spine-cpp/src/spine/AnimationState.cpp | 11 ++--------- 4 files changed, 13 insertions(+), 11 deletions(-) diff --git a/spine-cpp/spine-cpp/include/spine/Animation.h b/spine-cpp/spine-cpp/include/spine/Animation.h index 11546b57e..eb38b7188 100644 --- a/spine-cpp/spine-cpp/include/spine/Animation.h +++ b/spine-cpp/spine-cpp/include/spine/Animation.h @@ -31,6 +31,7 @@ #define Spine_Animation_h #include +#include #include #include #include @@ -94,6 +95,8 @@ public: Vector &getTimelines(); + bool hasTimeline(int id); + float getDuration(); void setDuration(float inValue); @@ -102,6 +105,7 @@ public: private: Vector _timelines; + HashMap _timelineIds; float _duration; String _name; diff --git a/spine-cpp/spine-cpp/include/spine/AnimationState.h b/spine-cpp/spine-cpp/include/spine/AnimationState.h index 1145af569..ea8090692 100644 --- a/spine-cpp/spine-cpp/include/spine/AnimationState.h +++ b/spine-cpp/spine-cpp/include/spine/AnimationState.h @@ -429,8 +429,6 @@ namespace spine { void computeHold(TrackEntry *entry); void computeNotLast(TrackEntry *entry); - - bool hasTimeline(TrackEntry *entry, int inId); }; } diff --git a/spine-cpp/spine-cpp/src/spine/Animation.cpp b/spine-cpp/spine-cpp/src/spine/Animation.cpp index 4ac7b2a71..81776644f 100644 --- a/spine-cpp/spine-cpp/src/spine/Animation.cpp +++ b/spine-cpp/spine-cpp/src/spine/Animation.cpp @@ -44,9 +44,16 @@ using namespace spine; Animation::Animation(const String &name, Vector &timelines, float duration) : _timelines(timelines), + _timelineIds(), _duration(duration), _name(name) { assert(_name.length() > 0); + for (int i = 0; i < (int)timelines.size(); i++) + _timelineIds.put(timelines[i]->getPropertyId(), true); +} + +bool Animation::hasTimeline(int id) { + return _timelineIds.containsKey(id); } Animation::~Animation() { diff --git a/spine-cpp/spine-cpp/src/spine/AnimationState.cpp b/spine-cpp/spine-cpp/src/spine/AnimationState.cpp index afa1dcab2..17166778f 100644 --- a/spine-cpp/spine-cpp/src/spine/AnimationState.cpp +++ b/spine-cpp/spine-cpp/src/spine/AnimationState.cpp @@ -995,11 +995,11 @@ void AnimationState::computeHold(TrackEntry *entry) { if (to == NULL || timeline->getRTTI().isExactly(AttachmentTimeline::rtti) || timeline->getRTTI().isExactly(DrawOrderTimeline::rtti) || - timeline->getRTTI().isExactly(EventTimeline::rtti) || !hasTimeline(to, id)) { + timeline->getRTTI().isExactly(EventTimeline::rtti) || !to->_animation->hasTimeline(id)) { timelineMode[i] = First; } else { for (TrackEntry *next = to->_mixingTo; next != NULL; next = next->_mixingTo) { - if (hasTimeline(next, id)) continue; + if (next->_animation->hasTimeline(id)) continue; if (entry->_mixDuration > 0) { timelineMode[i] = HoldMix; timelineHoldMix[i] = entry; @@ -1029,10 +1029,3 @@ void AnimationState::computeNotLast(TrackEntry *entry) { } } } - -bool AnimationState::hasTimeline(TrackEntry* entry, int inId) { - Vector &timelines = entry->_animation->_timelines; - for (size_t i = 0, n = timelines.size(); i < n; ++i) - if (timelines[i]->getPropertyId() == inId) return true; - return false; -}