Пример #1
0
void CBaseFlex::SetModel( const char *szModelName )
{
	BaseClass::SetModel( szModelName );

	for (int i = 0; i < GetNumFlexControllers(); i++)
	{
		SetFlexWeight( i, 0.0 );
	}
}
Пример #2
0
//-----------------------------------------------------------------------------
// Purpose: Default implementation
//-----------------------------------------------------------------------------
void CBaseFlex::ProcessExpressions( void )
{
	// slowly decay to netural expression
	for (int i = 0; i < GetNumFlexControllers(); i++)
	{
		SetFlexWeight( i, GetFlexWeight( i ) * 0.95 );
	}

	AddSceneExpressions();
}
Пример #3
0
LocalFlexController_t CFlextalkActor::LookupFlex( const char *szTarget  )
{
    for (LocalFlexController_t i = LocalFlexController_t(0); i < GetNumFlexControllers(); i++)
    {
        const char *pszFlex = GetFlexControllerName( i );
        if (stricmp( szTarget, pszFlex ) == 0)
        {
            return i;
        }
    }
    return LocalFlexController_t(-1);
}
Пример #4
0
LocalFlexController_t CFlex::FindFlexController( const char *szName )
{
	for (LocalFlexController_t i = LocalFlexController_t(0); i < GetNumFlexControllers(); i++)
	{
		if (stricmp( GetFlexControllerName( i ), szName ) == 0)
		{
			return i;
		}
	}

	// AssertMsg( 0, UTIL_VarArgs( "flexcontroller %s couldn't be mapped!!!\n", szName ) );
	return LocalFlexController_t(0);
}
Пример #5
0
void CFlex::SetFlexWeight( LocalFlexController_t index, float value )
{
	if (index >= 0 && index < GetNumFlexControllers())
	{
		CStudioHdr *pstudiohdr = GetModelPtr( );
		if (! pstudiohdr)
			return;

		mstudioflexcontroller_t *pflexcontroller = pstudiohdr->pFlexcontroller( index );

		if (pflexcontroller->max != pflexcontroller->min)
		{
			value = (value - pflexcontroller->min) / (pflexcontroller->max - pflexcontroller->min);
			value = clamp( value, 0.0, 1.0 );
		}

		Set_m_flexWeight( index, value );
	}
}
Пример #6
0
float CFlex::GetFlexWeight( LocalFlexController_t index )
{
	if (index >= 0 && index < GetNumFlexControllers())
	{
		CStudioHdr *pstudiohdr = GetModelPtr( );
		if (! pstudiohdr)
			return 0;

		mstudioflexcontroller_t *pflexcontroller = pstudiohdr->pFlexcontroller( index );

		if (pflexcontroller->max != pflexcontroller->min)
		{
			return Get_m_flexWeight(index) * (pflexcontroller->max - pflexcontroller->min) + pflexcontroller->min;
		}
				
		return Get_m_flexWeight(index);
	}
	return 0.0;
}
Пример #7
0
float CBaseFlex::GetFlexWeight( int index )
{
	if (index >= 0 && index < GetNumFlexControllers())
	{
		studiohdr_t *pstudiohdr = GetModelPtr( );
		if (! pstudiohdr)
			return 0;

		mstudioflexcontroller_t *pflexcontroller = pstudiohdr->pFlexcontroller( index );

		if (pflexcontroller->max != pflexcontroller->min)
		{
			return m_flexWeight[index] * (pflexcontroller->max - pflexcontroller->min) + pflexcontroller->min;
		}
				
		return m_flexWeight[index];
	}
	return 0.0;
}
Пример #8
0
void CFlextalkActor::SetFlexTarget( LocalFlexController_t flexnum, float value )
{
    m_flextarget[flexnum] = value;

    const char *pszType = GetFlexControllerType( flexnum );

    for (LocalFlexController_t i = LocalFlexController_t(0); i < GetNumFlexControllers(); i++)
    {
        if (i != flexnum)
        {
            const char *pszOtherType = GetFlexControllerType( i );
            if (stricmp( pszType, pszOtherType ) == 0)
            {
                m_flextarget[i] = 0;
            }
        }
    }

    float value2 = value;
    if (1 || random->RandomFloat( 0.0, 1.0 ) < 0.2)
    {
        value2 = random->RandomFloat( value - 0.2, value + 0.2 );
        value2 = clamp( value2, 0.0f, 1.0f );
    }


    // HACK, for now, consider then linked is named "right_" or "left_"
    if (strncmp( "right_", GetFlexControllerName( flexnum ), 6 ) == 0)
    {
        m_flextarget[flexnum+1] = value2;
    }
    else if (strncmp( "left_", GetFlexControllerName( flexnum ), 5 ) == 0)
    {
        m_flextarget[flexnum-1] = value2;
    }
}
Пример #9
0
void CFlextalkActor::ProcessSceneEvents( void )
{
    if ( HasSceneEvents() )
    {
        BaseClass::ProcessSceneEvents( );
        return;
    }

    // only do this if they have more than eyelid movement
    if (GetNumFlexControllers() > 2)
    {
        const char *pszExpression = flex_expression.GetString();

        if (pszExpression && pszExpression[0] == '+' && pszExpression[1] != '\0')
        {
            int i;
            int j = atoi( &pszExpression[1] );
            for (i = 0; i < GetNumFlexControllers(); i++)
            {
                m_flextarget[m_flexnum] = 0;
            }

            for (i = 0; i < 35 && predef_flexcontroller_names[i]; i++)
            {
                m_flexnum = LookupFlex( predef_flexcontroller_names[i] );
                m_flextarget[m_flexnum] = predef_flexcontroller_values[j][i];
                // Msg( "%s %.3f\n", predef_flexcontroller_names[i], predef_flexcontroller_values[j][i] );
            }
        }
        else if (pszExpression && pszExpression[0] != '\0' && strcmp(pszExpression, "+") != 0)
        {
            char szExpression[128];
            char szTemp[32];

            Q_strncpy( szExpression, pszExpression ,sizeof(szExpression));
            char *pszExpression = szExpression;

            while (*pszExpression != '\0')
            {
                if (*pszExpression == '+')
                    *pszExpression = ' ';

                pszExpression++;
            }

            pszExpression = szExpression;

            while (*pszExpression)
            {
                if (*pszExpression != ' ')
                {
                    if (*pszExpression == '-')
                    {
                        for (LocalFlexController_t i = LocalFlexController_t(0); i < GetNumFlexControllers(); i++)
                        {
                            m_flextarget[i] = 0;
                        }
                    }
                    else if (*pszExpression == '?')
                    {
                        for (LocalFlexController_t i = LocalFlexController_t(0); i < GetNumFlexControllers(); i++)
                        {
                            Msg( "\"%s\" ", GetFlexControllerName( i ) );
                        }
                        Msg( "\n" );
                        flex_expression.SetValue( "" );
                    }
                    else
                    {
                        if (sscanf( pszExpression, "%31s", szTemp ) == 1)
                        {
                            m_flexnum = LookupFlex( szTemp );

                            if (m_flexnum != -1 && m_flextarget[m_flexnum] != 1)
                            {
                                m_flextarget[m_flexnum] = 1.0;
                                // SetFlexTarget( m_flexnum );
                            }
                            pszExpression += strlen( szTemp ) - 1;
                        }
                    }
                }
                pszExpression++;
            }
        }
        else if (m_flextime < gpGlobals->curtime)
        {
            m_flextime = gpGlobals->curtime + random->RandomFloat( 0.3, 0.5 ) * (30.0 / GetNumFlexControllers());
            m_flexnum = (LocalFlexController_t)random->RandomInt( 0, GetNumFlexControllers() - 1 );

            if (m_flextarget[m_flexnum] == 1)
            {
                m_flextarget[m_flexnum] = 0;
            }
            else if (stricmp( GetFlexControllerType( m_flexnum ), "phoneme" ) != 0)
            {
                if (strstr( GetFlexControllerName( m_flexnum ), "upper_raiser" ) == NULL)
                {
                    Msg( "%s:%s\n", GetFlexControllerType( m_flexnum ), GetFlexControllerName( m_flexnum ) );
                    SetFlexTarget( m_flexnum, random->RandomFloat( 0.5, 1.0 ) );
                }
            }
        }

        // slide it up.
        for (LocalFlexController_t i = LocalFlexController_t(0); i < GetNumFlexControllers(); i++)
        {
            float weight = GetFlexWeight( i );

            if (weight != m_flextarget[i])
            {
                weight = weight + (m_flextarget[i] - weight) / random->RandomFloat( 2.0, 4.0 );
            }
            weight = clamp( weight, 0.0f, 1.0f );
            SetFlexWeight( i, weight );
        }

        if (flex_talk.GetInt() == -1)
        {
            m_istalking = 1;

            char pszSentence[256];
            Q_snprintf( pszSentence,sizeof(pszSentence), "%s%d", STRING(m_iszSentence), m_sentence++ );
            int sentenceIndex = engine->SentenceIndexFromName( pszSentence );
            if (sentenceIndex >= 0)
            {
                Msg( "%d : %s\n", sentenceIndex, pszSentence );
                CPASAttenuationFilter filter( this );
                CBaseEntity::EmitSentenceByIndex( filter, entindex(), CHAN_VOICE, sentenceIndex, 1, SNDLVL_TALKING, 0, PITCH_NORM );
            }
            else
            {
                m_sentence = 0;
            }

            flex_talk.SetValue( "0" );
        }
        else if (flex_talk.GetInt() == -2)
        {
            m_flNextEyeLookTime = gpGlobals->curtime + 1000.0;
        }
        else if (flex_talk.GetInt() == -3)
        {
            m_flNextEyeLookTime = gpGlobals->curtime;
            flex_talk.SetValue( "0" );
        }
        else if (flex_talk.GetInt() == -4)
        {
            AddLookTarget( UTIL_PlayerByIndex( 1 ), 0.5, flex_looktime.GetFloat()  );
            flex_talk.SetValue( "0" );
        }
        else if (flex_talk.GetInt() == -5)
        {
            PickLookTarget( true );
            flex_talk.SetValue( "0" );
        }
    }
}