void FPoseLinkBase::AttemptRelink(const FAnimationBaseContext& Context) { // Do the linkage if ((LinkedNode == NULL) && (LinkID != INDEX_NONE)) { IAnimClassInterface* AnimBlueprintClass = Context.GetAnimClass(); check(AnimBlueprintClass); // adding ensure. We had a crash on here if ( ensure(AnimBlueprintClass->GetAnimNodeProperties().IsValidIndex(LinkID)) ) { UProperty* LinkedProperty = AnimBlueprintClass->GetAnimNodeProperties()[LinkID]; void* LinkedNodePtr = LinkedProperty->ContainerPtrToValuePtr<void>(Context.AnimInstanceProxy->GetAnimInstanceObject()); LinkedNode = (FAnimNode_Base*)LinkedNodePtr; } } }
void FAnimNode_StateMachine::Initialize(const FAnimationInitializeContext& Context) { FAnimNode_Base::Initialize(Context); IAnimClassInterface* AnimBlueprintClass = Context.GetAnimClass(); if (const FBakedAnimationStateMachine* Machine = GetMachineDescription()) { ElapsedTime = 0.0f; CurrentState = INDEX_NONE; if (Machine->States.Num() > 0) { // Create a pose link for each state we can reach StatePoseLinks.Reset(); StatePoseLinks.Reserve(Machine->States.Num()); for (int32 StateIndex = 0; StateIndex < Machine->States.Num(); ++StateIndex) { const FBakedAnimationState& State = Machine->States[StateIndex]; FPoseLink* StatePoseLink = new (StatePoseLinks) FPoseLink(); // because conduits don't contain bound graphs, this link is no longer guaranteed to be valid if (State.StateRootNodeIndex != INDEX_NONE) { StatePoseLink->LinkID = AnimBlueprintClass->GetAnimNodeProperties().Num() - 1 - State.StateRootNodeIndex; //@TODO: Crazysauce } // also initialize transitions if(State.EntryRuleNodeIndex != INDEX_NONE) { if (FAnimNode_TransitionResult* TransitionNode = GetNodeFromPropertyIndex<FAnimNode_TransitionResult>(Context.AnimInstanceProxy->GetAnimInstanceObject(), AnimBlueprintClass, State.EntryRuleNodeIndex)) { TransitionNode->Initialize(Context); } } for(int32 TransitionIndex = 0; TransitionIndex < State.Transitions.Num(); ++TransitionIndex) { const FBakedStateExitTransition& TransitionRule = State.Transitions[TransitionIndex]; if (TransitionRule.CanTakeDelegateIndex != INDEX_NONE) { if (FAnimNode_TransitionResult* TransitionNode = GetNodeFromPropertyIndex<FAnimNode_TransitionResult>(Context.AnimInstanceProxy->GetAnimInstanceObject(), AnimBlueprintClass, TransitionRule.CanTakeDelegateIndex)) { TransitionNode->Initialize(Context); } } } } // Reset transition related variables StatesUpdated.Reset(); ActiveTransitionArray.Reset(); StateCacheBoneCounters.Reset(Machine->States.Num()); StateCacheBoneCounters.AddDefaulted(Machine->States.Num()); // Move to the default state SetState(Context, Machine->InitialState); // initialize first update bFirstUpdate = true; } } }