bool VAnimationComponent::AddAnimationSequence(const char * szAnimSequence) { if (szAnimSequence == NULL || GetOwner() == NULL) return false; VDynamicMesh * pMesh = ((VisBaseEntity_cl *)m_pOwner)->GetMesh(); if(pMesh==NULL) { hkvLog::Warning("AddAnimationSequence: No mesh present!"); return false; } VASSERT_MSG(pMesh->GetSequenceSetCollection()!=NULL, "No animation sequence set present!"); VisAnimSequenceSet_cl *pSet = Vision::Animations.GetSequenceSetManager()->LoadAnimSequenceSet(szAnimSequence); if(pSet==NULL) { hkvLog::Warning("AddAnimationSequence: Could not load '%s' animation sequence.", szAnimSequence); return false; } pMesh->GetSequenceSetCollection()->Add(pSet); return true; }
BOOL VLineFollowerComponent::StartAnimation(const char *szAnimName) { VisBaseEntity_cl* pOwner = (VisBaseEntity_cl *)GetOwner(); if (!pOwner) return false; m_bPlayingAnim = false; // Check for animation sequences VDynamicMesh *pMesh = pOwner->GetMesh(); if (!pMesh || !pMesh->GetSequenceSetCollection() || !pMesh->GetSequenceSetCollection()->GetSequenceSetCount()) return false; VisAnimFinalSkeletalResult_cl* pFinalSkeletalResult = NULL; VisVertexAnimDeformer_cl* pVertexAnimDeformer = NULL; // Get the sequence(s) for vertex and skeletal animation VisSkeletalAnimSequence_cl* pAnimSequenceSkeletal = (VisSkeletalAnimSequence_cl*)pMesh->GetSequence(szAnimName, VIS_MODELANIM_SKELETAL); VisVertexAnimSequence_cl* pAnimSequenceVertex = (VisVertexAnimSequence_cl*)pMesh->GetSequence(szAnimName, VIS_MODELANIM_VERTEX); // If no sequence with the given name is present if ((!pAnimSequenceSkeletal) && (!pAnimSequenceVertex)) { VisAnimSequenceSet_cl * pSequenceSet = pMesh->GetSequenceSetCollection()->GetSequenceSet(0); // Find the first skeletal or vertex animation and use it for (int i=0; i< pSequenceSet->GetSequenceCount(); ++i) { VisAnimSequence_cl* pTempAnimSequence = pSequenceSet->GetSequence(i); if (pTempAnimSequence->GetType() == VIS_MODELANIM_SKELETAL) { // If it is a skeletal animation, create a config for it VisAnimConfig_cl* pConfig = VisAnimConfig_cl::CreateSkeletalConfig(pMesh, &pFinalSkeletalResult); VisSkeletalAnimControl_cl* pSkeletalAnimControl = VisSkeletalAnimControl_cl::Create(pMesh->GetSkeleton(), (VisSkeletalAnimSequence_cl*)pTempAnimSequence, VANIMCTRL_LOOP|VSKELANIMCTRL_DEFAULTS, 1.0f, true); pFinalSkeletalResult->SetSkeletalAnimInput(pSkeletalAnimControl); pOwner->SetAnimConfig(pConfig); m_bPlayingAnim = true; return true; } else if (pTempAnimSequence->GetType() == VIS_MODELANIM_VERTEX) { // If it is a vertex animation, create a config for it VisAnimConfig_cl* pConfig = VisAnimConfig_cl::CreateVertexConfig(pMesh, &pVertexAnimDeformer); VisVertexAnimControl_cl* pVertexAnimControl = VisVertexAnimControl_cl::Create((VisVertexAnimSequence_cl*)pTempAnimSequence, VANIMCTRL_LOOP|VSKELANIMCTRL_DEFAULTS, 1.0f, true); pVertexAnimDeformer->AddVertexAnimControl(pVertexAnimControl, 1.0f); pOwner->SetAnimConfig(pConfig); m_bPlayingAnim = true; return true; } } // If neither a skeletal nor a vertex animation has been found, report failure return false; } // If both a vertex and a skeletal animation with the given name has been found // create a combined config for skeletal and vertex animation. VisAnimConfig_cl* pConfig = NULL; if ((pAnimSequenceSkeletal) && (pAnimSequenceVertex)) pConfig = VisAnimConfig_cl::CreateSkeletalVertexConfig(pMesh, &pFinalSkeletalResult, &pVertexAnimDeformer); // If it is just a skeletal animation, create a config for it if (pAnimSequenceSkeletal) { if (!pConfig) pConfig = VisAnimConfig_cl::CreateSkeletalConfig(pMesh, &pFinalSkeletalResult); // If a skeletal animation has been found create a control for it VisSkeletalAnimControl_cl* pSkeletalAnimControl = VisSkeletalAnimControl_cl::Create(pMesh->GetSkeleton(), pAnimSequenceSkeletal, VANIMCTRL_LOOP|VSKELANIMCTRL_DEFAULTS, 1.0f, true); // And set it as the input for the final skeletal result pFinalSkeletalResult->SetSkeletalAnimInput(pSkeletalAnimControl); } // If it is just a vertex animation, create a config for it if (pAnimSequenceVertex) { if (!pConfig) pConfig = VisAnimConfig_cl::CreateVertexConfig(pMesh, &pVertexAnimDeformer); // If a vertex animation has been found create a control for it VisVertexAnimControl_cl* pVertexAnimControl = VisVertexAnimControl_cl::Create(pAnimSequenceVertex, VANIMCTRL_LOOP|VSKELANIMCTRL_DEFAULTS, 1.0f, true); // And set add it to the vertex anim deformer pVertexAnimDeformer->AddVertexAnimControl(pVertexAnimControl, 1.0f); } // Set the current config pOwner->SetAnimConfig(pConfig); // Make sure we get the motion delta from the animation pOwner->GetAnimConfig()->SetFlags(pOwner->GetAnimConfig()->GetFlags() | APPLY_MOTION_DELTA | MULTITHREADED_ANIMATION); // And report success m_bPlayingAnim = true; return true; }