

enum class E8Dir : int32
{
None,
U,
UR,
R,
DR,
D,
DL,
L,
UL,
Count
};
// 블렌딩을 위한 각 지점을 Enum을 통해 지정해 줍니다.
constexpr int32 TEMP_COUNT = (int32)E8Dir::Count;
static const Vector4f BlendPosByDir[TEMP_COUNT] =
{
{0, 0, 0 ,0}, // None,
{0, 1, 0, 0}, // U,
{0.71, 0.71, 0, 0}, // UR,
{1, 0, 0, 0}, // R,
{0.71, -0.71, 0, 0}, // RD,
{0, -1, 0, 0}, // D,
{-0.71, -0.71, 0, 0}, // DL,
{-1, 0, 0, 0}, // L,
{-0.71, 0.71, 0, 0} // LU,
};
// 각 지점과 좌표를 매칭시킵니다.
constexpr E8Dir Dir0 = E8Dir::None;
E8Dir Dir1;
E8Dir Dir2;
// !! 1. 유저가 지정한 방향을 좌표로 바꿔 어느 애니메이션 에셋을 블렌드할지 결정합니다 !!
if (AngleInRad < XM_PIDIV4) // 0~45
{
Dir1 = E8Dir::UR;
Dir2 = E8Dir::R;
}
else if (AngleInRad < XM_PIDIV4 * 2) // 45~90
{
Dir1 = E8Dir::U;
Dir2 = E8Dir::UR;
}
else if (AngleInRad < XM_PIDIV4 * 3) // 90~135
{
Dir1 = E8Dir::UL;
Dir2 = E8Dir::U;
}
else if (AngleInRad < XM_PIDIV4 * 4) // 135~180
{
Dir1 = E8Dir::L;
Dir2 = E8Dir::UL;
}
else if (AngleInRad < XM_PIDIV4 * 5) // 180~225
{
Dir1 = E8Dir::DL;
Dir2 = E8Dir::L;
}
else if (AngleInRad < XM_PIDIV4 * 6) // 225~270
{
Dir1 = E8Dir::D;
Dir2 = E8Dir::DL;
}
else if (AngleInRad < XM_PIDIV4 * 7) // 270~315
{
Dir1 = E8Dir::DR;
Dir2 = E8Dir::D;
}
else // 315 ~ 360
{
Dir1 = E8Dir::R;
Dir2 = E8Dir::DR;
}
// !! 2. 각 지점의 좌표값을 얻어옵니다. !!
const Vector4f& v0 = BlendPosByDir[(int32)Dir0];
const Vector4f& v1 = BlendPosByDir[(int32)Dir1];
const Vector4f& v2 = BlendPosByDir[(int32)Dir2];
Vector4f BlendPoint4f = { _BlendPoint.X, _BlendPoint.Y, 0, 0 };
// !! 3. 각 지점의 좌표값을 기준으로 블렌드 Wegith를 계산합니다. !!
Vector4f Weights = SS::CalcBarycentricWeight(BlendPoint4f, v0, v1, v2);
// 블렌드 값은 각각 Vector4f.x, Vector4f.y, Vector4f.z에 담깁니다.
float w0 = Weights.X;
float w1 = Weights.Y;
float w2 = Weights.Z;
// !! 4. 블렌드할 애니메이션의 실제 데이터를 들고옵니다 !!
IRenderAnimAsset* FoundRenderAnimAsset0 =
AssetManager->FindAssetByName<IRenderAnimAsset>(_RenderAnimAssetNames[static_cast<int32>(Dir0)]);
const RenderAnimRawData* AnimRawData0 = FoundRenderAnimAsset0->GetKeyFrameAnimData();
IRenderAnimAsset* FoundRenderAnimAsset1 =
AssetManager->FindAssetByName<IRenderAnimAsset>(_RenderAnimAssetNames[static_cast<int32>(Dir1)]);
const RenderAnimRawData* AnimRawData1 = FoundRenderAnimAsset1->GetKeyFrameAnimData();
IRenderAnimAsset* FoundRenderAnimAsset2 =
AssetManager->FindAssetByName<IRenderAnimAsset>(_RenderAnimAssetNames[static_cast<int32>(Dir2)]);
const RenderAnimRawData* AnimRawData2 = FoundRenderAnimAsset2->GetKeyFrameAnimData();
EvaluatePose와 BlendThreePoses내부적으로 많은 일이 일어나긴 합니다. // !! 5. 위에서 골라낸 애니메이션 에셋들을 기준으로 각 포즈를 구해줍니다. !!
EvaluatePose(_BlendPose0, _BindingIdxByName, AnimRawData0, TimeRatio, _RootToIgnore);
EvaluatePose(_BlendPose1, _BindingIdxByName, AnimRawData1, TimeRatio, _RootToIgnore);
EvaluatePose(_BlendPose2, _BindingIdxByName, AnimRawData2, TimeRatio, _RootToIgnore);
// !! 6. 위에서 계산한 가중치를 기준으로 각 포즈를 블렌딩 해줍니다. !!!
BlendThreePoses(
_ResultPose,
_BlendPose0, w0,
_BlendPose1, w1,
_BlendPose2, w2
);
