Initial works for actial animation sampling and graph evaluation.
This commit is contained in:
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user