mirror of
https://github.com/barkeser2002/flower.git
synced 2026-09-25 17:16:14 +03:00
137 lines
2.4 KiB
C++
137 lines
2.4 KiB
C++
//
|
|
// Copyright(c) 2016-2017 benikabocha.
|
|
// Distributed under the MIT License (http://opensource.org/licenses/MIT)
|
|
//
|
|
|
|
#include "MMDNode.h"
|
|
|
|
#include <Saba/Base/Log.h>
|
|
|
|
#include <glm/gtc/matrix_transform.hpp>
|
|
|
|
namespace saba
|
|
{
|
|
MMDNode::MMDNode()
|
|
: m_index(0)
|
|
, m_enableIK(false)
|
|
, m_parent(nullptr)
|
|
, m_child(nullptr)
|
|
, m_next(nullptr)
|
|
, m_prev(nullptr)
|
|
, m_translate(0)
|
|
, m_rotate(1, 0, 0, 0)
|
|
, m_scale(1)
|
|
, m_animTranslate(0)
|
|
, m_animRotate(1, 0, 0, 0)
|
|
, m_baseAnimTranslate(0)
|
|
, m_baseAnimRotate(1, 0, 0, 0)
|
|
, m_ikRotate(1, 0, 0, 0)
|
|
, m_local(1)
|
|
, m_global(1)
|
|
, m_inverseInit(1)
|
|
, m_initTranslate(0)
|
|
, m_initRotate(1, 0, 0, 0)
|
|
, m_initScale(1)
|
|
{
|
|
}
|
|
|
|
void MMDNode::AddChild(MMDNode * child)
|
|
{
|
|
SABA_ASSERT(child != nullptr);
|
|
if (child == nullptr)
|
|
{
|
|
return;
|
|
}
|
|
|
|
SABA_ASSERT(child->m_parent == nullptr);
|
|
SABA_ASSERT(child->m_next == nullptr);
|
|
SABA_ASSERT(child->m_prev == nullptr);
|
|
child->m_parent = this;
|
|
if (m_child == nullptr)
|
|
{
|
|
m_child = child;
|
|
m_child->m_next = nullptr;
|
|
m_child->m_prev = m_child;
|
|
}
|
|
else
|
|
{
|
|
auto lastNode = m_child->m_prev;
|
|
lastNode->m_next = child;
|
|
child->m_prev = lastNode;
|
|
|
|
m_child->m_prev = child;
|
|
}
|
|
}
|
|
|
|
void MMDNode::BeginUpdateTransform()
|
|
{
|
|
LoadInitialTRS();
|
|
SetIKRotate(glm::quat(1, 0, 0, 0));
|
|
OnBeginUpdateTransform();
|
|
}
|
|
|
|
void MMDNode::EndUpdateTransform()
|
|
{
|
|
OnEndUpdateTransfrom();
|
|
}
|
|
|
|
void MMDNode::UpdateLocalTransform()
|
|
{
|
|
OnUpdateLocalTransform();
|
|
}
|
|
|
|
void MMDNode::UpdateGlobalTransform()
|
|
{
|
|
if (m_parent == nullptr)
|
|
{
|
|
m_global = m_local;
|
|
}
|
|
else
|
|
{
|
|
m_global = m_parent->m_global * m_local;
|
|
}
|
|
MMDNode* child = m_child;
|
|
while (child != nullptr)
|
|
{
|
|
child->UpdateGlobalTransform();
|
|
child = child->m_next;
|
|
}
|
|
}
|
|
|
|
void MMDNode::UpdateChildTransform()
|
|
{
|
|
MMDNode* child = m_child;
|
|
while (child != nullptr)
|
|
{
|
|
child->UpdateGlobalTransform();
|
|
child = child->m_next;
|
|
}
|
|
}
|
|
|
|
void MMDNode::CalculateInverseInitTransform()
|
|
{
|
|
m_inverseInit = glm::inverse(m_global);
|
|
}
|
|
|
|
void MMDNode::OnBeginUpdateTransform()
|
|
{
|
|
}
|
|
|
|
void MMDNode::OnEndUpdateTransfrom()
|
|
{
|
|
}
|
|
|
|
void MMDNode::OnUpdateLocalTransform()
|
|
{
|
|
auto s = glm::scale(glm::mat4(1), GetScale());
|
|
auto r = glm::mat4_cast(AnimateRotate());
|
|
auto t = glm::translate(glm::mat4(1), AnimateTranslate());
|
|
if (m_enableIK)
|
|
{
|
|
r = glm::mat4_cast(m_ikRotate) * r;
|
|
}
|
|
m_local = t * r * s;
|
|
}
|
|
|
|
}
|