client/EterGrnLib/ModelInstanceMotion.cpp

149 lines
4.1 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "StdAfx.h"
#include "ModelInstance.h"
#include "Model.h"
void CGrannyModelInstance::CopyMotion(CGrannyModelInstance * pModelInstance, bool bIsFreeSourceControl)
{
if (!pModelInstance->IsMotionPlaying())
return;
if (m_pgrnCtrl)
GrannyFreeControl(m_pgrnCtrl);
float localTime = GetLocalTime();
m_pgrnAni = pModelInstance->m_pgrnAni;
m_pgrnCtrl = GrannyPlayControlledAnimation(localTime, m_pgrnAni, m_pgrnModelInstance);
if (!m_pgrnCtrl)
return;
GrannySetControlSpeed(m_pgrnCtrl, GrannyGetControlSpeed(pModelInstance->m_pgrnCtrl));
GrannySetControlLoopCount(m_pgrnCtrl, GrannyGetControlLoopCount(pModelInstance->m_pgrnCtrl));
GrannySetControlEaseIn(m_pgrnCtrl, true);
GrannySetControlEaseOut(m_pgrnCtrl, false);
GrannySetControlRawLocalClock(m_pgrnCtrl, GrannyGetControlRawLocalClock(pModelInstance->m_pgrnCtrl));
GrannyFreeControlOnceUnused(m_pgrnCtrl);
if (bIsFreeSourceControl)
{
GrannyFreeControl(pModelInstance->m_pgrnCtrl);
pModelInstance->m_pgrnCtrl = NULL;
}
}
bool CGrannyModelInstance::IsMotionPlaying()
{
if (!m_pgrnCtrl)
return false;
if (GrannyControlIsComplete(m_pgrnCtrl))
return false;
return true;
}
void CGrannyModelInstance::SetMotionPointer(const CGrannyMotion * pMotion, float blendTime, int loopCount, float speedRatio)
{
// TEST
if (!m_pgrnWorldPoseReal)
return;
// END_OF_TEST
granny_model_instance * pgrnModelInstance = m_pgrnModelInstance;
if (!pgrnModelInstance)
return;
float localTime = GetLocalTime();
bool isFirst=false;
if (m_pgrnCtrl)
{
//float durationLeft = GrannyGetControlDurationLeft(m_pgrnCtrl);
//float easeOutTime = (blendTime < durationLeft) ? blendTime : durationLeft;
//float oldCtrlFinishTime = GrannyEaseControlOut(m_pgrnCtrl, blendTime); //easeOutTime);
GrannySetControlEaseOutCurve(m_pgrnCtrl, localTime, localTime + blendTime, 1.0f, 1.0f, 0.0f, 0.0f);
GrannySetControlEaseIn(m_pgrnCtrl, false);
GrannySetControlEaseOut(m_pgrnCtrl, true);
//Tracef("easeOut %f\n", easeOutTime);
GrannyCompleteControlAt(m_pgrnCtrl, localTime + blendTime);
//GrannyCompleteControlAt(m_pgrnCtrl, oldCtrlFinishTime);
//GrannyCompleteControlAt(m_pgrnCtrl, localTime);
GrannyFreeControlIfComplete(m_pgrnCtrl);
}
else
{
isFirst=true;
}
m_pgrnAni = pMotion->GetGrannyAnimationPointer();
m_pgrnCtrl = GrannyPlayControlledAnimation(localTime, m_pgrnAni, pgrnModelInstance);
if (!m_pgrnCtrl)
return;
GrannySetControlSpeed(m_pgrnCtrl, speedRatio);
GrannySetControlLoopCount(m_pgrnCtrl, loopCount);
if (isFirst)
{
GrannySetControlEaseIn(m_pgrnCtrl, false);
GrannySetControlEaseOut(m_pgrnCtrl, false);
}
else
{
GrannySetControlEaseIn(m_pgrnCtrl, true);
GrannySetControlEaseOut(m_pgrnCtrl, false);
if (blendTime > 0.0f)
GrannySetControlEaseInCurve(m_pgrnCtrl, localTime, localTime + blendTime, 0.0f, 0.0f, 1.0f, 1.0f);
}
//GrannyEaseControlIn(m_pgrnCtrl, blendTime, false);
GrannyFreeControlOnceUnused(m_pgrnCtrl);
//Tracef("easeIn %f\n", blendTime);
}
void CGrannyModelInstance::ChangeMotionPointer(const CGrannyMotion* pMotion, int loopCount, float speedRatio)
{
granny_model_instance * pgrnModelInstance = m_pgrnModelInstance;
if (!pgrnModelInstance)
return;
// <20><><EFBFBD><EFBFBD> <20>Ǵ<EFBFBD> <20>պκ<D5BA><CEBA><EFBFBD> <20><>ŵ <20>ϱ<EFBFBD> <20><><EFBFBD><EFBFBD> LocalTime <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>. - [levites]
float fSkipTime = 0.3f;
float localTime = GetLocalTime() - fSkipTime;
if (m_pgrnCtrl)
{
GrannySetControlEaseIn(m_pgrnCtrl, false);
GrannySetControlEaseOut(m_pgrnCtrl, false);
GrannyCompleteControlAt(m_pgrnCtrl, localTime);
GrannyFreeControlIfComplete(m_pgrnCtrl);
}
m_pgrnAni = pMotion->GetGrannyAnimationPointer();
m_pgrnCtrl = GrannyPlayControlledAnimation(localTime, m_pgrnAni, pgrnModelInstance);
if (!m_pgrnCtrl)
return;
GrannySetControlSpeed(m_pgrnCtrl, speedRatio);
GrannySetControlLoopCount(m_pgrnCtrl, loopCount);
GrannySetControlEaseIn(m_pgrnCtrl, false);
GrannySetControlEaseOut(m_pgrnCtrl, false);
GrannyFreeControlOnceUnused(m_pgrnCtrl);
}
void CGrannyModelInstance::SetMotionAtEnd()
{
if (!m_pgrnCtrl)
return;
//Tracef("%f\n", endingTime);
float endingTime = GrannyGetControlLocalDuration(m_pgrnCtrl);
GrannySetControlRawLocalClock(m_pgrnCtrl, endingTime);
}