Initial works for actial animation sampling and graph evaluation.

This commit is contained in:
Martin Felis
2022-04-11 16:46:09 +02:00
parent bf0c7a7daa
commit eeef635c64
9 changed files with 430 additions and 158 deletions
+23 -26
View File
@@ -9,6 +9,7 @@
#include "AnimGraphData.h"
#include "SyncTrack.h"
#include "ozz/animation/runtime/sampling_job.h"
struct AnimNode;
@@ -46,6 +47,8 @@ struct AnimNode {
virtual ~AnimNode(){};
virtual bool Init(AnimGraphContext& context) { return true; };
virtual void MarkActiveInputs(const std::vector<AnimGraphConnection>& inputs) {
for (size_t i = 0, n = inputs.size(); i < n; i++) {
AnimNode* input_node = inputs[i].m_source_node;
@@ -73,7 +76,7 @@ struct AnimNode {
m_state = AnimNodeEvalState::TimeUpdated;
}
virtual void Evaluate(){};
virtual void Evaluate(AnimGraphContext& context){};
};
@@ -116,26 +119,7 @@ struct Blend2Node : public AnimNode {
}
}
virtual void UpdateTime(float dt, std::vector<NodeInput>& inputs) {
if (!m_sync_blend) {
m_time_now = m_time_now + dt;
}
for (size_t i = 0, n = inputs.size(); i < n; i++) {
AnimNode* input_node = inputs[i].m_node;
if (input_node == nullptr) {
continue;
}
if (input_node->m_state != AnimNodeEvalState::Deactivated) {
if (!m_sync_blend) {
input_node->m_time_now = m_time_now;
}
input_node->m_state = AnimNodeEvalState::TimeUpdated;
continue;
}
}
}
virtual void Evaluate(AnimGraphContext& context) override;
};
template <>
@@ -171,14 +155,21 @@ struct NodeSocketAccessor<Blend2Node> : public NodeSocketAccessorBase {
//
struct SpeedScaleNode : public AnimNode {
AnimData* i_input = nullptr;
AnimData* i_output = nullptr;
AnimData* o_output = nullptr;
float* i_speed_scale = nullptr;
virtual void UpdateTime(float time_last, float time_now) {
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_state = AnimNodeEvalState::TimeUpdated;
}
void Evaluate(AnimGraphContext& context) override {
assert (i_input != nullptr);
assert (o_output != nullptr);
o_output->m_local_matrices = i_input->m_local_matrices;
};
};
template <>
@@ -191,7 +182,7 @@ struct NodeSocketAccessor<SpeedScaleNode> : public NodeSocketAccessorBase {
SocketFlags::SocketFlagAffectsTime);
RegisterInput("Input", &node->i_input);
RegisterOutput("Output", &node->i_output);
RegisterOutput("Output", &node->o_output);
}
};
@@ -201,6 +192,12 @@ struct NodeSocketAccessor<SpeedScaleNode> : public NodeSocketAccessorBase {
struct AnimSamplerNode : public AnimNode {
AnimData* o_output = nullptr;
std::string m_filename;
ozz::animation::SamplingCache m_sampling_cache;
ozz::animation::Animation* m_animation = nullptr;
virtual ~AnimSamplerNode();
virtual bool Init(AnimGraphContext& context) override;
virtual void Evaluate(AnimGraphContext& context) override;
};
template <>
@@ -221,7 +218,7 @@ struct MathAddNode : public AnimNode {
float* i_input1 = nullptr;
float o_output = 0.f;
void Evaluate() override {
void Evaluate(AnimGraphContext& context) override {
assert (i_input0 != nullptr);
assert (i_input1 != nullptr);
@@ -249,7 +246,7 @@ struct MathFloatToVec3Node : public AnimNode {
float* i_input2 = nullptr;
Vec3 o_output = {0.f, 0.f, 0.f};
void Evaluate() override {
void Evaluate(AnimGraphContext& context) override {
assert (i_input0 != nullptr);
assert (i_input1 != nullptr);
assert (i_input2 != nullptr);