⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 morphtargetmixer.cpp

📁 Cal3D实现虚拟角色 Cal3D实现虚拟角色
💻 CPP
字号:
//****************************************************************************//// morphtargetmixer.cpp                                                       //// Copyright (C) 2001, 2002 Bruno 'Beosil' Heidelberger                       ////****************************************************************************//// This library is free software; you can redistribute it and/or modify it    //// under the terms of the GNU Lesser General Public License as published by   //// the Free Software Foundation; either version 2.1 of the License, or (at    //// your option) any later version.                                            ////****************************************************************************//#ifdef HAVE_CONFIG_H#include "config.h"#endif//****************************************************************************//// Includes                                                                   ////****************************************************************************//#include "cal3d/error.h"#include "cal3d/morphtargetmixer.h"#include "cal3d/model.h"#include "cal3d/mesh.h"#include "cal3d/submesh.h"#include "cal3d/coremorphanimation.h"#include "cal3d/coremodel.h"#include "cal3d/coremesh.h"#include "cal3d/coresubmesh.h" /*****************************************************************************//** Constructs the morph target mixer instance.  *  * This function is the default constructor of the morph target mixer instance.  *****************************************************************************/CalMorphTargetMixer::CalMorphTargetMixer(CalModel* pModel){  assert(pModel);  m_pModel = pModel;  if(pModel->getCoreModel()->getCoreMorphAnimationCount() != 0)  {    int morphAnimationCount = pModel->getCoreModel()->getCoreMorphAnimationCount();    // reserve the space needed in all the vectors    m_vectorCurrentWeight.resize(morphAnimationCount);    m_vectorEndWeight.resize(morphAnimationCount);    m_vectorDuration.resize(morphAnimationCount);    std::vector<float>::iterator iteratorCurrentWeight = m_vectorCurrentWeight.begin();    std::vector<float>::iterator iteratorEndWeight = m_vectorEndWeight.begin();    std::vector<float>::iterator iteratorDuration = m_vectorDuration.begin();    while(iteratorCurrentWeight!=m_vectorCurrentWeight.end())    {      (*iteratorCurrentWeight) = 0.0f;      (*iteratorEndWeight) = 0.0f;      (*iteratorDuration) = 0.0f;      ++iteratorCurrentWeight;      ++iteratorEndWeight;      ++iteratorDuration;    }  }}/*****************************************************************************//** Interpolates the weight of a morph target.  *  * This function interpolates the weight of a morph target a new value  * in a given amount of time.  *  * @param id The ID of the morph target that should be blended.  * @param weight The weight to interpolate the morph target to.  * @param delay The time in seconds until the new weight should be reached.  *  * @return One of the following values:  *         \li \b true if successful  *         \li \b false if an error happend  *****************************************************************************/bool CalMorphTargetMixer::blend(int id, float weight, float delay){  if((id < 0) || (id >= (int)m_vectorCurrentWeight.size()))  {    CalError::setLastError(CalError::INVALID_HANDLE, __FILE__, __LINE__);    return false;  }  m_vectorEndWeight[id] = weight;  m_vectorDuration[id] = delay;  return true;} /*****************************************************************************//** Fades a morph target out.  *  * This function fades a morph target out in a given amount of time.  *  * @param id The ID of the morph target that should be faded out.  * @param delay The time in seconds until the the morph target is  *              completely removed.  *  * @return One of the following values:  *         \li \b true if successful  *         \li \b false if an error happend  *****************************************************************************/bool CalMorphTargetMixer::clear(int id, float delay){  if((id < 0) || (id >= (int)m_vectorCurrentWeight.size()))  {    CalError::setLastError(CalError::INVALID_HANDLE, __FILE__, __LINE__);    return false;  }  m_vectorEndWeight[id] = 0.0f;  m_vectorDuration[id] = delay;  return true;} /*****************************************************************************//** Get the weight of a morph target.  *  * @param id The id of the morph target which weight you want.  *  * @return The weight of the morph target with the given id.  *****************************************************************************/float CalMorphTargetMixer::getCurrentWeight(int id){  if((id < 0) || (id >= (int)m_vectorCurrentWeight.size()))  {    CalError::setLastError(CalError::INVALID_HANDLE, __FILE__, __LINE__);    return false;  }  return m_vectorCurrentWeight[id];} /*****************************************************************************//** Get the weight of the base vertices.  *  * @return The weight of the base vertices.  *****************************************************************************/float CalMorphTargetMixer::getCurrentWeightBase(){  float currentWeight = 1.0f;  std::vector<float>::iterator iteratorCurrentWeight = m_vectorCurrentWeight.begin();  while(iteratorCurrentWeight!=m_vectorCurrentWeight.end())  {    currentWeight -=(*iteratorCurrentWeight);    ++iteratorCurrentWeight;  }  return currentWeight;} /*****************************************************************************//** Updates all morph targets.  *  * This function updates all morph targets of the mixer instance for a  * given amount of time.  *  * @param deltaTime The elapsed time in seconds since the last update.  *****************************************************************************/void CalMorphTargetMixer::update(float deltaTime){  std::vector<float>::iterator iteratorCurrentWeight = m_vectorCurrentWeight.begin();  std::vector<float>::iterator iteratorEndWeight = m_vectorEndWeight.begin();  std::vector<float>::iterator iteratorDuration = m_vectorDuration.begin();  while(iteratorCurrentWeight!=m_vectorCurrentWeight.end())  {    if(deltaTime >= (*iteratorDuration))    {      (*iteratorCurrentWeight) = (*iteratorEndWeight);      (*iteratorDuration) = 0.0f;    }    else    {      (*iteratorCurrentWeight) += ((*iteratorEndWeight)-(*iteratorCurrentWeight)) *                                  deltaTime/(*iteratorDuration);      (*iteratorDuration) -= deltaTime;    }    ++iteratorCurrentWeight;    ++iteratorEndWeight;    ++iteratorDuration;  }  int morphAnimationID = 0;  while(morphAnimationID<getMorphTargetCount())  {    CalCoreMorphAnimation* pCoreMorphAnimation =                    m_pModel->getCoreModel()->getCoreMorphAnimation(morphAnimationID);    std::vector<int>& vectorCoreMeshID = pCoreMorphAnimation->getVectorCoreMeshID();    std::vector<int>& vectorMorphTargetID = pCoreMorphAnimation->getVectorMorphTargetID();    size_t meshIterator = 0;    while(meshIterator<vectorCoreMeshID.size())    {       std::vector<CalSubmesh *> &vectorSubmesh =              m_pModel->getMesh(vectorCoreMeshID[meshIterator])->getVectorSubmesh();       int submeshCount = vectorSubmesh.size();       int submeshId;       for(submeshId=0;submeshId<submeshCount;++submeshId)       {         vectorSubmesh[submeshId]->setMorphTargetWeight                   (vectorMorphTargetID[meshIterator],m_vectorCurrentWeight[morphAnimationID]);       }       ++meshIterator;    }    ++morphAnimationID;  }} /*****************************************************************************//** Returns the number of morph targets this morph target mixer mixes.  *  * @return The number of morph targets this morph target mixer mixes.  *****************************************************************************/int CalMorphTargetMixer::getMorphTargetCount(){  return m_vectorCurrentWeight.size();}//****************************************************************************//

⌨️ 快捷键说明

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