Fixed SpeedScale node not properly propagating time.
parent
abf44a875a
commit
7c8b44247b
|
@ -188,6 +188,31 @@ struct Socket {
|
|||
m_value_string = value;
|
||||
}
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
T GetValue() const {
|
||||
if constexpr (std::is_same<T, bool>::value) {
|
||||
return m_value.flag;
|
||||
}
|
||||
|
||||
if constexpr (std::is_same<T, float>::value) {
|
||||
return m_value.float_value;
|
||||
}
|
||||
|
||||
if constexpr (std::is_same<T, Vec3>::value) {
|
||||
return m_value.vec3;
|
||||
}
|
||||
|
||||
if constexpr (std::is_same<T, Quat>::value) {
|
||||
return m_value.quat;
|
||||
}
|
||||
|
||||
if constexpr (std::is_same<T, std::string>::value) {
|
||||
return m_value_string;
|
||||
}
|
||||
|
||||
return T();
|
||||
}
|
||||
};
|
||||
|
||||
template <typename T>
|
||||
|
@ -356,6 +381,13 @@ struct NodeDescriptorBase {
|
|||
return *static_cast<T*>(socket->m_reference.ptr);
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
T GetPropertyValue(const char* name) {
|
||||
Socket* socket = FindSocket(name, m_properties);
|
||||
assert(GetSocketType<T>() == socket->m_type);
|
||||
return socket->GetValue<T>();
|
||||
}
|
||||
|
||||
virtual void UpdateFlags(){};
|
||||
|
||||
protected:
|
||||
|
|
|
@ -172,9 +172,12 @@ void AnimGraphEditorRenderSidebar(
|
|||
-100.f,
|
||||
100.f);
|
||||
} else if (property.m_type == SocketType::SocketTypeBool) {
|
||||
ImGui::Checkbox(
|
||||
bool flag_value = property.GetValue<bool>();
|
||||
if (ImGui::Checkbox(
|
||||
property.m_name.c_str(),
|
||||
reinterpret_cast<bool*>(property.m_reference.ptr));
|
||||
&flag_value)) {
|
||||
property.SetValue(flag_value);
|
||||
}
|
||||
} else if (property.m_type == SocketType::SocketTypeString) {
|
||||
char string_buf[1024];
|
||||
memset(string_buf, '\0', sizeof(string_buf));
|
||||
|
|
|
@ -82,7 +82,7 @@ void AnimSamplerNode::Evaluate(AnimGraphContext& context) {
|
|||
ozz::animation::SamplingJob sampling_job;
|
||||
sampling_job.animation = m_animation;
|
||||
sampling_job.context = &m_sampling_context;
|
||||
sampling_job.ratio = m_time_now;
|
||||
sampling_job.ratio = fmodf(m_time_now, m_animation->duration());
|
||||
sampling_job.output = make_span(o_output->m_local_matrices);
|
||||
|
||||
if (!sampling_job.Run()) {
|
||||
|
|
|
@ -138,7 +138,7 @@ struct NodeDescriptor<Blend2Node> : public NodeDescriptorBase {
|
|||
Socket* weight_input_socket = FindSocket("Weight", m_inputs);
|
||||
assert(weight_input_socket != nullptr);
|
||||
|
||||
if (GetProperty<bool>("Sync") == true) {
|
||||
if (GetPropertyValue<bool>("Sync") == true) {
|
||||
weight_input_socket->m_flags = SocketFlags::SocketFlagAffectsTime;
|
||||
} else {
|
||||
weight_input_socket->m_flags = SocketFlags::SocketFlagNone;
|
||||
|
@ -156,8 +156,8 @@ struct SpeedScaleNode : public AnimNode {
|
|||
float* i_speed_scale = nullptr;
|
||||
|
||||
void UpdateTime(float time_last, float time_now) override {
|
||||
m_time_last = time_last;
|
||||
m_time_now = time_last + (time_now - time_last) * (*i_speed_scale);
|
||||
m_time_last = m_time_now;
|
||||
m_time_now = m_time_last + (time_now - time_last) * (*i_speed_scale);
|
||||
m_state = AnimNodeEvalState::TimeUpdated;
|
||||
}
|
||||
|
||||
|
@ -196,7 +196,7 @@ struct AnimSamplerNode : public AnimNode {
|
|||
virtual bool Init(AnimGraphContext& context) override;
|
||||
void UpdateTime(float time_last, float time_now) override {
|
||||
m_time_last = time_last;
|
||||
m_time_now = fmodf(time_last + (time_now - time_last), m_animation->duration());
|
||||
m_time_now = time_now;
|
||||
m_state = AnimNodeEvalState::TimeUpdated;
|
||||
}
|
||||
virtual void Evaluate(AnimGraphContext& context) override;
|
||||
|
|
11
src/main.cc
11
src/main.cc
|
@ -76,6 +76,7 @@ static struct {
|
|||
} loaded;
|
||||
struct {
|
||||
double frame;
|
||||
double anim_update_time;
|
||||
float absolute;
|
||||
uint64_t laptime;
|
||||
float factor;
|
||||
|
@ -511,7 +512,10 @@ int main() {
|
|||
stm_round_to_common_refresh_rate(stm_laptime(&state.time.laptime)));
|
||||
|
||||
if (!state.time.paused) {
|
||||
state.time.anim_update_time = state.time.frame;
|
||||
state.time.absolute += state.time.frame * state.time.factor;
|
||||
} else {
|
||||
state.time.anim_update_time = 0.;
|
||||
}
|
||||
|
||||
if (state.ozz.animation != nullptr) {
|
||||
|
@ -725,7 +729,8 @@ int main() {
|
|||
|
||||
ImGui::SameLine();
|
||||
if (ImGui::Button("Step")) {
|
||||
state.time.absolute += state.time.frame;
|
||||
state.time.anim_update_time = 1. / 30.f;
|
||||
state.time.absolute += state.time.anim_update_time;
|
||||
}
|
||||
|
||||
if (state.ozz.animation != nullptr) {
|
||||
|
@ -758,9 +763,9 @@ int main() {
|
|||
skinned_mesh.CalcModelMatrices();
|
||||
}
|
||||
|
||||
if (state.time.use_graph && anim_graph.m_nodes.size() > 0) {
|
||||
if (state.time.use_graph && anim_graph.m_nodes.size() > 0 && state.time.anim_update_time > 0.) {
|
||||
anim_graph.markActiveNodes();
|
||||
anim_graph.updateTime(state.time.frame);
|
||||
anim_graph.updateTime(state.time.anim_update_time);
|
||||
anim_graph.evaluate(anim_graph_context);
|
||||
skinned_mesh.m_local_matrices = anim_graph_output.m_local_matrices;
|
||||
|
||||
|
|
Loading…
Reference in New Issue