Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions engine/includes/components/animator.h
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,8 @@ class ENGINE_EXPORT Animator : public NativeBehaviour {

void rebind();

void resume();

private:
void start() override;
void update() override;
Expand Down
22 changes: 9 additions & 13 deletions engine/includes/components/private/baseanimationblender.h
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@

#include <propertyanimation.h>

class AnimationTrack;

class BaseAnimationBlender : public PropertyAnimation {
public:
BaseAnimationBlender();
Expand All @@ -15,26 +17,20 @@ class BaseAnimationBlender : public PropertyAnimation {

void setCurrentTime(uint32_t position) override;

AnimationCurve *previousCurve(int32_t component) const;

void setPreviousCurve(AnimationCurve *curve, int32_t component = 0);
void setPreviousTrack(AnimationTrack &track);

void setPreviousDuration(int32_t duration);

private:
float mix(float value, int32_t component, float position);

Quaternion mix(Quaternion &value, float position);

std::unordered_map<int32_t, AnimationCurve *> m_PrevCurve;
AnimationTrack *m_previousTrack;

float m_Factor;
float m_Offset;
float m_TransitionTime;
float m_factor;
float m_offset;
float m_transitionTime;

uint32_t m_PrevDuration;
uint32_t m_previousDuration;

uint32_t m_PreviousTime;
uint32_t m_previousTime;
};

#endif //BASEANIMATIONBLENDER_H
1 change: 1 addition & 0 deletions engine/includes/editor/converters/animconverter.h
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ class AnimConverter : public AssetConverter {
private:
Variant readJson(const std::string &data, AssetConverterSettings *settings);
void toVersion1(Variant &variant);
void toVersion3(Variant &variant);
};

#endif // ANIMCONVERTER_H
9 changes: 4 additions & 5 deletions engine/includes/resources/animationclip.h
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,6 @@ class ENGINE_EXPORT AnimationTrack {
A_METHOD(int, AnimationTrack::hash)
)

typedef std::map<int32_t, AnimationCurve> CurveMap;

public:
AnimationTrack();

Expand All @@ -34,7 +32,7 @@ class ENGINE_EXPORT AnimationTrack {

void fixCurves();

CurveMap &curves();
AnimationCurve &curve();

private:
std::string m_path;
Expand All @@ -45,7 +43,8 @@ class ENGINE_EXPORT AnimationTrack {

int m_duration;

CurveMap m_curves;
AnimationCurve m_curve;

};
typedef std::list<AnimationTrack> AnimationTrackList;

Expand All @@ -61,7 +60,7 @@ class ENGINE_EXPORT AnimationClip : public Resource {
int duration() const;

public:
AnimationTrackList m_Tracks;
AnimationTrackList m_tracks;

void loadUserData(const VariantMap &data) override;
VariantMap saveUserData() const override;
Expand Down
63 changes: 36 additions & 27 deletions engine/src/components/animator.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,17 @@ void Animator::start() {

setPosition(0);
}
/*!
\internal
*/
void Animator::resume() {
for(auto it : m_properties) {
if(it.second->state() == Animation::STOPPED) {
it.second->resume(true);
}
}
}

/*!
\internal
*/
Expand Down Expand Up @@ -111,13 +122,13 @@ void Animator::setStateMachine(AnimationStateMachine *machine) {
m_stateMachine = machine;
m_currentState = nullptr;
if(m_stateMachine) {
m_stateMachine->subscribe(&Animator::stateMachineUpdated, this);

m_currentVariables = m_stateMachine->variables();
AnimationState *initialState = m_stateMachine->initialState();
if(initialState) {
setStateHash(initialState->m_hash);
}

m_stateMachine->subscribe(&Animator::stateMachineUpdated, this);
}
}
}
Expand All @@ -138,10 +149,8 @@ void Animator::setPosition(uint32_t position) {
PROFILE_FUNCTION();

m_time = position;

for(auto it : m_properties) {
if(it.second->state() == Animation::STOPPED) {
it.second->start();
}
it.second->setCurrentTime(m_time);
}
}
Expand Down Expand Up @@ -234,17 +243,17 @@ void Animator::rebind() {

if(m_currentClip) {
Actor *a = actor();
for(auto &it : m_currentClip->m_Tracks) {
for(auto &it : m_currentClip->m_tracks) {
BaseAnimationBlender *property = nullptr;
auto target = m_properties.find(it.hash());
if(target != m_properties.end()) {
property = target->second;
} else {
property = new BaseAnimationBlender();
property = new BaseAnimationBlender();
Object *object = a->find(it.path());
#ifdef SHARED_DEFINE
if(object == nullptr) {
aDebug() << "Can't resolve animation path:" << it.path().c_str();
aDebug() << "Can't resolve animation path:" << it.path();
}
#endif
property->setTarget(object, it.property().c_str());
Expand All @@ -253,9 +262,7 @@ void Animator::rebind() {

property->setValid(true);
property->setDuration(it.duration());
for(auto &i : it.curves()) {
property->setCurve(&i.second, i.first);
}
property->setCurve(it.curve());
}
}
}
Expand Down Expand Up @@ -332,12 +339,14 @@ int Animator::duration() const {
void Animator::loadUserData(const VariantMap &data) {
PROFILE_FUNCTION();

Component::loadUserData(data);

auto it = data.find(CLIP);
if(it != data.end()) {
setStateMachine(Engine::loadResource<AnimationStateMachine>((*it).second.toString()));
std::string guid = (*it).second.toString();
AnimationStateMachine *stateMachine = Engine::loadResource<AnimationStateMachine>(guid);
setStateMachine(stateMachine);
}

Component::loadUserData(data);
}
/*!
\internal
Expand All @@ -361,19 +370,17 @@ void Animator::setClips(AnimationClip *start, AnimationClip *end, float duration
PROFILE_FUNCTION();

if(start) {
for(auto &it : start->m_Tracks) {
for(auto &it : start->m_tracks) {
BaseAnimationBlender *property = nullptr;
auto target = m_properties.find(it.hash());
if(target != m_properties.end()) {
property = target->second;
property->setValid(true);
property->setLoopCount(1);
property->setPreviousDuration(it.duration());
for(auto &i : it.curves()) {
property->setPreviousCurve(&i.second, i.first);
property->setOffset(time);
property->setTransitionTime(duration);
}
property->setPreviousTrack(it);
property->setOffset(time);
property->setTransitionTime(duration);
}
}
}
Expand All @@ -386,7 +393,7 @@ void Animator::setClips(AnimationClip *start, AnimationClip *end, float duration

Actor *a = actor();

for(auto &it : end->m_Tracks) {
for(auto &it : end->m_tracks) {
BaseAnimationBlender *property;
auto target = m_properties.find(it.hash());
if(target != m_properties.end()) {
Expand All @@ -396,7 +403,7 @@ void Animator::setClips(AnimationClip *start, AnimationClip *end, float duration
Object *object = a->find(it.path());
#ifdef SHARED_DEFINE
if(object == nullptr) {
aDebug() << "Can't resolve animation path:" << it.path().c_str();
aDebug() << "Can't resolve animation path:" << it.path();
}
#endif
property->setTarget(object, it.property().c_str());
Expand All @@ -409,12 +416,11 @@ void Animator::setClips(AnimationClip *start, AnimationClip *end, float duration
} else {
property->setLoopCount(-1);
}

property->setDuration(it.duration());
property->setCurve(it.curve());
property->setTransitionTime(duration);

for(auto &i : it.curves()) {
property->setCurve(&i.second, i.first);
property->setTransitionTime(duration);
}
property->start();
}
}
Expand All @@ -435,7 +441,10 @@ void Animator::stateMachineUpdated(int state, void *ptr) {
p->m_currentState = nullptr;
if(p->m_stateMachine) {
p->m_currentVariables = p->m_stateMachine->variables();
p->setStateHash(p->m_stateMachine->initialState()->m_hash);
AnimationState *initialState = p->m_stateMachine->initialState();
if(initialState) {
p->setStateHash(initialState->m_hash);
}
}
}
}
1 change: 1 addition & 0 deletions engine/src/components/particlerender.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -237,6 +237,7 @@ void ParticleRender::effectUpdated(int state, void *ptr) {
for(auto it : p->m_materials) {
delete it;
}
p->m_materials.clear();

if(p->m_effect->material()) {
p->m_materials.push_back(p->m_effect->material()->createInstance(Material::Billboard));
Expand Down
Loading