//---------------------------------------------------------------------------- // // ROUTINE: _mapEnumStringsToAlignment::GetRelationMap() // // PURPOSE: Converts a Trait to a RelationMap // //---------------------------------------------------------------------------- RelationSet::_mapEnumStringsToAlignment& RelationSet::GetRelationMap(RelationTraits::eRelationTraits eTrait) { UBER_ASSERT( eTrait >= 0 && eTrait < RelationTraits::kTrait_Count, "Enumerated Trait out of range on AddRelation" ); return m_RelationSet[eTrait]; }
void CTrackedNodeContext::_Init(EnumTrackedNodeGroup eGroup, bool bTrackOnAnim) { UBER_ASSERT( eGroup != kTrack_None, "CTrackedNodeContext::_Init: No tracking group specified." ); // Tracking node groups are optional per skeleton in ModelButes.txt. // A skeleton may not specify all (or any) tracking nodes. if( m_eTrackingNodes[eGroup] == eModelTrackingNodeGroupInvalid ) { return; } HTRACKEDNODE hTrackedNode, hTrackedNodeClone; const char* szName; LTVector vForward, vUp; LTFLOAT fDiscomfortX, fDiscomfortY, fMaxX, fMaxY, fMaxVel; uint32 iNode, iHNode; // Get the number of nodes. // Cloned nodes are specified within the node being cloned. uint32 cNodes = g_pModelButeMgr->GetNumTrackingNodes( m_eTrackingNodes[eGroup] ); uint32 cClonedNodes = g_pModelButeMgr->GetNumClonedTrackingNodes( m_eTrackingNodes[eGroup] ); UBER_ASSERT( cNodes + cClonedNodes > 0, "CTrackedNodeContext::_Init: No tracking nodes in group." ); m_cTrackedNodesPerGroup[eGroup] = cNodes + cClonedNodes; m_aTrackedNodeGroups[eGroup] = debug_newa( HTRACKEDNODE, cNodes + cClonedNodes ); // Keep separate index counters for nodes and node handles. // This is necessary because cloned nodes are specified within nodes being cloned, // so there are more iHNodes than iNodes. iHNode = 0; for( iNode=0; iNode < cNodes; ++iNode ) { // Create a tracking node. szName = g_pModelButeMgr->GetTrackingNodeName( m_eTrackingNodes[eGroup], (ModelTrackingNode)iNode ); hTrackedNode = m_pTrackedNodeMgr->CreateTrackingNode( m_hModel, szName ); // Get tracked node constraints from modelbutes.txt. fDiscomfortX = g_pModelButeMgr->GetTrackingNodeDiscomfortAngleX( m_eTrackingNodes[eGroup], (ModelTrackingNode)iNode ); fDiscomfortY = g_pModelButeMgr->GetTrackingNodeDiscomfortAngleY( m_eTrackingNodes[eGroup], (ModelTrackingNode)iNode ); fMaxX = g_pModelButeMgr->GetTrackingNodeMaxAngleX( m_eTrackingNodes[eGroup], (ModelTrackingNode)iNode ); fMaxY = g_pModelButeMgr->GetTrackingNodeMaxAngleY( m_eTrackingNodes[eGroup], (ModelTrackingNode)iNode ); fMaxVel = g_pModelButeMgr->GetTrackingNodeMaxVelocity( m_eTrackingNodes[eGroup], (ModelTrackingNode)iNode ); // Set tracked node constraints. // Specifying the forward and up vectors are optional. if( g_pModelButeMgr->GetTrackingNodeAxesSpecified( m_eTrackingNodes[eGroup], (ModelTrackingNode)iNode ) ) { g_pModelButeMgr->GetTrackingNodeForward( m_eTrackingNodes[eGroup], (ModelTrackingNode)iNode, &vForward ); g_pModelButeMgr->GetTrackingNodeUp( m_eTrackingNodes[eGroup], (ModelTrackingNode)iNode, &vUp ); m_pTrackedNodeMgr->SetNodeConstraints( hTrackedNode, vForward, vUp, DEG2RAD(fDiscomfortX), DEG2RAD(fDiscomfortY), DEG2RAD(fMaxX), DEG2RAD(fMaxY), DEG2RAD(fMaxVel) ); } else { m_pTrackedNodeMgr->SetNodeConstraints( hTrackedNode, DEG2RAD(fDiscomfortX), DEG2RAD(fDiscomfortY), DEG2RAD(fMaxX), DEG2RAD(fMaxY), DEG2RAD(fMaxVel) ); } // Each node in modelbutes.txt is a child of the subsequent node. if( iNode > 0 ) { m_pTrackedNodeMgr->LinkNodes( m_aTrackedNodeGroups[eGroup][iHNode-1], hTrackedNode ); } // It is optional for a node to have a cloned node (e.g. left eye clones right eye orientation). szName = g_pModelButeMgr->GetTrackingNodeClonedName( m_eTrackingNodes[eGroup], (ModelTrackingNode)iNode ); if( szName[0] ) { hTrackedNodeClone = m_pTrackedNodeMgr->CreateTrackingNode( m_hModel, szName ); m_pTrackedNodeMgr->LinkNodeOrientation( hTrackedNodeClone, hTrackedNode ); m_aTrackedNodeGroups[eGroup][iHNode++] = hTrackedNodeClone; } // Record the new node handle. m_aTrackedNodeGroups[eGroup][iHNode++] = hTrackedNode; } // Track with rotations relative to animation rotations. SetOrientOnAnim( eGroup, bTrackOnAnim ); }
// ----------------------------------------------------------------------- // // // ROUTINE: GetSide // // PURPOSE: Determine whether c1 is on the same side as c2 // // ----------------------------------------------------------------------- // CharacterSide GetSide( const RelationData& c1, const RelationData& c2) { UBER_ASSERT( 0, "GetSide no longer maintained or supported" ); return CS_NEUTRAL; }
//---------------------------------------------------------------------------- // // ROUTINE: CAIHumanStateCatch::SetObjectToCatch() // // PURPOSE: // //---------------------------------------------------------------------------- void CAIHumanStateCatch::SetObjectToCatch(HOBJECT hObject) { UBER_ASSERT( hObject != LTNULL, "CAIHumanStateCatch::SetObjectToCatch: Bad target handle" ); m_hObjectToCatch = hObject; }