m2anicontroller.cpp

来自「3D游戏展示程序」· C++ 代码 · 共 232 行

CPP
232
字号
//--------------------------------------------------
//  Desc: M2 Animation Controller
//  From: WOW Model Viewer
//  I just coding in my own ways!
//
//--------------------------------------------------

#include "M2AniController.h"
#include "M2Header.h"

M2AniController::M2AniController(ModelAnimation *pAni)
{
	m_pAni = pAni;

	// 默认只第一通道第一组, 循环播放
	m_AniGroup[0][0].m_AnimID = 0;
	m_AniGroup[1][0].m_AnimID = 0;
	m_AniGroup[0][0].m_Loops = 0;
	m_AniGroup[1][0].m_Loops = 0;
	m_AniGroup[0][0].m_bEnable = true;
	m_AniGroup[1][0].m_bEnable = true;
	m_Index[0] = 0;
	m_Index[1] = 0;
	m_bChannelEnable[0] = true;
	if(m_pAni != NULL)
	{
		m_Frame[0] = m_pAni[0].timeStart;
		m_Frame[1] = m_pAni[0].timeStart;
	}
	else
	{
		m_Frame[0] = 0;
		m_Frame[1] = 0;
	}

	m_bChannelEnable[1] = false;
	m_fSpeed = 1.0f;
	m_bPause = false;
}

M2AniController::~M2AniController()
{
	m_pAni = NULL;
}

void M2AniController::Clear()
{
	Stop(0);
	Stop(1);
	m_bPause = true;
}

bool M2AniController::IsChannelEnable(int channel)
{
	if(channel>=0 && channel<CHANNELNUM)
	{
		return m_bChannelEnable[channel];
	}
	return false;
}

void M2AniController::EnableChannel(int channel)
{
	if(channel>=0 && channel<CHANNELNUM)
	{
		m_bChannelEnable[channel] = true;
	}
}

void M2AniController::DisableChannel(int channel)
{
	if(channel>=0 && channel<CHANNELNUM)
	{
		m_bChannelEnable[channel] = false;
	}
}

void M2AniController::EnableGroup(int channel, int group)
{
}

void M2AniController::DisableGroup(int channel, int group)
{
}

void M2AniController::AddAni(unsigned int id, int loop)
{
	/*
	if(m_AniCount > 3)
		return;

	m_AniGroupOne[m_AniCount].m_AnimID = id;
	m_AniGroupOne[m_AniCount].m_Loops = loop;
	m_AniCount++;
	*/
}

//--------------------------------------------------
// 
//--------------------------------------------------
void M2AniController::SetAni(int channel, int group, unsigned int id, int loop)
{
	if(channel<0 || channel>=CHANNELNUM)
		return;
	if(group<0 || group>=ANIGROUPNUM)
		return;

	if(channel==1)	m_bChannelEnable[1] = true;
	if(channel==0)	m_bPause = false;

	if(m_AniGroup[channel][group].m_AnimID==id)
		return;

	m_AniGroup[channel][group].m_AnimID = id;
	m_AniGroup[channel][group].m_Loops = loop;
	m_AniGroup[channel][group].m_bEnable = true;

	if(m_Index[channel] == group)
	{
		m_Frame[channel] = m_pAni[id].timeStart;
	}
}

void M2AniController::Play()
{
	for(int i=0; i<CHANNELNUM; i++)
	{
		m_Index[i] = 0;
		m_Frame[i] = m_pAni[m_AniGroup[i][0].m_AnimID].timeStart;
	}
	m_bPause = false;
}

bool M2AniController::IsPause(void)
{
	return m_bPause;
}

void M2AniController::Stop(int channel)
{
	if(m_bChannelEnable[channel])
	{
		m_Index[channel] = 0;
		m_Frame[channel] = m_pAni[m_AniGroup[channel][0].m_AnimID].timeStart;
		if(channel == 1)	m_bChannelEnable[1] = false;
		if(channel == 0)	m_bPause = true;
	}
//	m_bPause = true;
}

void M2AniController::Pause(bool bForce /* = false */)
{
	if(m_bPause && bForce == false)
	{
		m_bPause = false;
	}
	else
	{
		m_bPause = true;
	}
}

void M2AniController::Next(int channel)
{
	if(channel<0 || channel>=CHANNELNUM)
		return;

	if(m_AniGroup[channel][m_Index[channel]].m_Loops == 1)
	{
		do 
		{
			m_Index[channel]++;
			if(m_Index[channel] >= ANIGROUPNUM)
			{
				Stop(channel);
				return;
			}	
		}while(m_AniGroup[channel][m_Index[channel]].m_bEnable==false);
	} 
	else if(m_AniGroup[channel][m_Index[channel]].m_Loops > 1) 
	{
		m_AniGroup[channel][m_Index[channel]].m_Loops--;
	}

	m_Frame[channel] = m_pAni[m_AniGroup[channel][m_Index[channel]].m_AnimID].timeStart;
}

int M2AniController::GetAnim(int channel /* = 0 */)
{
	if(channel<0 || channel>=CHANNELNUM)
		return -1;

	return m_AniGroup[channel][m_Index[channel]].m_AnimID;
}

int M2AniController::GetFrame(int channel /* = 0 */)
{
	if(channel<0 || channel>=CHANNELNUM)
		return -1;

	return m_Frame[channel];
}

int M2AniController::GetFrameCount(int channel /* = 0 */)
{
	if(channel<0 || channel>=CHANNELNUM)
		return -1;

	return m_pAni[m_AniGroup[channel][m_Index[channel]].m_AnimID].timeEnd - 
		m_pAni[m_AniGroup[channel][m_Index[channel]].m_AnimID].timeStart;
}

int M2AniController::Update(int Deltatime)
{
	if(m_bPause)	return -1;

	for(int i=0; i<CHANNELNUM; i++)
	{
		if(m_bChannelEnable[i])
		{
			m_Frame[i] += (unsigned int)(Deltatime*m_fSpeed);
			if(m_Frame[i] >= m_pAni[m_AniGroup[i][m_Index[i]].m_AnimID].timeEnd)
			{
				Next(i);
				continue;
			}
		}
	}
	
	return 0;
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?