示例#1
0
//----------------------------------------------------------------------------
//              
//	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];
}
示例#2
0
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 );
}
示例#3
0
// ----------------------------------------------------------------------- //
//
//	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;
}
示例#4
0
//----------------------------------------------------------------------------
//              
//	ROUTINE:	CAIHumanStateCatch::SetObjectToCatch()
//              
//	PURPOSE:	
//              
//----------------------------------------------------------------------------
void CAIHumanStateCatch::SetObjectToCatch(HOBJECT hObject)
{
	UBER_ASSERT( hObject != LTNULL, "CAIHumanStateCatch::SetObjectToCatch: Bad target handle" );
	m_hObjectToCatch = hObject; 
}