void CNodeBreak::UpdateNode()
{
	int iJacksRequired = 1;
	for ( int i = 0; i < max( GetNumJacks_In(), GetNumJacks_Out() ); i++ )
	{
		const bool bJackInValid = i < GetNumJacks_In();
		const bool bJackOutValid = i < GetNumJacks_Out();
		if ( bJackInValid && GetJack_In( i )->GetNumBridgesConnected() )
			iJacksRequired++;
		else if ( bJackOutValid && GetJack_Out( i )->GetNumBridgesConnected() )
			iJacksRequired++;
	}

	//CUtlVector< int >hSmartTypes_Out;
	//for ( int i = 0; i < GetNumJacks_Out(); i++ )
	//	hSmartTypes_Out.AddToTail( GetJack_Out(i)->GetSmartType() );

	CUtlVector< BridgeRestoreInfo* >m_hRestoreBridges_In;
	CUtlVector< BridgeRestoreInfo* >m_hRestoreBridges_Out;
	CreateBridgeRestoreData_In( CBaseNode::BY_COUNT, m_hRestoreBridges_In );
	CreateBridgeRestoreData_Out( CBaseNode::BY_COUNT, m_hRestoreBridges_Out );

	GenerateJacks_Input( iJacksRequired );
	GenerateJacks_Output( iJacksRequired );

	RestoreBridgesFromList_In( m_hRestoreBridges_In );
	RestoreBridgesFromList_Out( m_hRestoreBridges_Out );

	//for ( int i = 0; i < GetNumJacks_Out(); i++ )
	//	GetJack_Out( i )->SetSmartType( hSmartTypes_Out[i] );
	//hSmartTypes_Out.Purge();

	OnUpdateHierachy( NULL, NULL );
}
bool CNodeStdVLight::CreateSolvers(GenericShaderData *ShaderData)
{
    if ( GetNumJacks_In_Connected() < GetNumJacks_In() )
        return false;

    CJack *pJ_Out = GetJack_Out( 0 );
    const int res = pJ_Out->GetResourceType();

    CHLSL_Var *tg = GetInputToWriteTo( pJ_Out->GetSmartType() );
    SetAllocating( !tg );
    if ( !tg )
        tg = pJ_Out->AllocateVarFromSmartType();
    pJ_Out->SetTemporaryVarTarget( tg );

    CHLSL_Solver_StdVLight *solver = new CHLSL_Solver_StdVLight( GetUniqueIndex() );
    solver->SetResourceType( res );
    solver->SetState( m_bStaticLighting, m_bHalfLambert );

    for ( int i = 0; i < GetNumJacks_In(); i++ )
        solver->AddSourceVar( GetJack_In(i)->GetTemporaryVarTarget_End() );

    solver->AddTargetVar( tg );
    AddSolver( solver );

    return true;
}
void CNodeBreak::UpdateOutputs()
{
	if ( GetNumJacks_Out() != GetNumJacks_In() )
		return SetOutputsUndefined();

	for ( int i = 0; i < GetNumJacks_In(); i++ )
	{
		if ( GetJack_In( i )->GetNumBridgesConnected() < 1 )
			break;
		int iSmartTypeIn = GetJack_In( i )->GetSmartType();
		if ( iSmartTypeIn < 0 )
			return SetOutputsUndefined();
		GetJack_Out( i )->SetSmartType( iSmartTypeIn );
	}
}
bool CNodeCustom::CreateSolvers(GenericShaderData *ShaderData)
{
	if ( GetNumJacks_In_Connected() < GetNumJacks_In() )
		return false;

	Assert( m_pCode_Function && Q_strlen( m_pCode_Function ) );
	Assert( m_bInline || Q_strlen(m_szFilePath) );

	SetAllocating( true );

	char *pszFuncString = CKVPacker::ConvertKVSafeString( m_pCode_Function, false );
	char *pszGlobalString = CKVPacker::ConvertKVSafeString( m_pCode_Global, false );

	int iHierachyType = GetHierachyTypeIterateFullyRecursive();
	int envflags = m_iEnvFlags;
	if ( iHierachyType & HLSLHIERACHY_PS )
		envflags &= ~NODECUSTOM_ADDENV_LIGHTING_VS;

	if ( iHierachyType & HLSLHIERACHY_VS )
		envflags &= ~NODECUSTOM_ADDENV_LIGHTING_PS;

	CHLSL_Solver_Custom *solver = new CHLSL_Solver_Custom( GetUniqueIndex() );
	solver->SetResourceType( RESOURCETYPE_VARIABLE );
	solver->Init( pszGlobalString, pszFuncString, envflags,
		m_szFunctionName, m_szFilePath,
		m_hszVarNames_In, m_hszVarNames_Out,
		this );

	delete [] pszFuncString;
	delete [] pszGlobalString;

	for ( int i = 0; i < GetNumJacks_In(); i++ )
		solver->AddSourceVar( GetJack_In( i )->GetTemporaryVarTarget_End() );

	for ( int i = 0; i < GetNumJacks_Out(); i++ )
	{
		CJack *pJ = GetJack_Out( i );
		CHLSL_Var *pTg = pJ->AllocateVarFromSmartType();
		solver->AddTargetVar( pTg );
	}

	AddSolver( solver );

	return true;
}
bool CNodeBreak::CreateSolvers(GenericShaderData *ShaderData)
{
	if ( GetNumJacks_Out() != GetNumJacks_In() )
		return false;

	CHLSL_Solver_Break *solver = new CHLSL_Solver_Break( GetUniqueIndex() );

	for ( int i = 0; i < GetNumJacks_In(); i++ )
	{
		CJack *pJ_In = GetJack_In( i );
		if ( pJ_In->GetNumBridgesConnected() < 1 )
			break;
		GetJack_Out( i )->SetTemporaryVarTarget( pJ_In->GetTemporaryVarTarget_End() );
	}

	AddSolver( solver );
	return true;
}
void CNodeSubtract::UpdateOutputs()
{
	if ( !GetNumJacks_Out() || !GetNumJacks_In() )
		return;

	if ( GetErrorLevel() != ERRORLEVEL_NONE )
		return SetOutputsUndefined();

	GetJack_Out( 0 )->SetSmartType( max( GetJack_In(0)->GetSmartType(), GetJack_In(1)->GetSmartType() ) );
}
void CNodeUtility_Assign::UpdateOutputs()
{
	if ( !GetNumJacks_Out() || !GetNumJacks_In() )
		return;

	if ( GetErrorLevel() != ERRORLEVEL_NONE )
		return SetOutputsUndefined();

	GetJack_Out( 0 )->SetSmartType( GetJack_In(0)->GetSmartType() );
}
bool CNodeStdSkinning::CreateSolvers(GenericShaderData *ShaderData)
{
	if ( GetNumJacks_In_Connected() < GetNumJacks_In() )
		return false;

	SetAllocating( true );

	CHLSL_Solver_StdSkinning *solver = new CHLSL_Solver_StdSkinning( GetUniqueIndex() );

	solver->SetState( m_iSkinMode );
	for ( int i = 0; i < GetNumJacks_In(); i++ )
		solver->AddSourceVar( GetJack_In(i)->GetTemporaryVarTarget_End() );
	for ( int i = 0; i < GetNumJacks_Out(); i++ )
		solver->AddTargetVar( GetJack_Out(i)->AllocateVarFromSmartType() );

	AddSolver( solver );

	return true;
}
bool CNodeMCompose::CreateSolvers(GenericShaderData *ShaderData)
{
	if ( GetNumJacks_In_Connected() < GetNumJacks_In() )
		return false;

	CJack *pJ_Out = GetJack_Out( 0 );

	const int res = pJ_Out->GetResourceType();

	CHLSL_Var *tg = pJ_Out->AllocateVarFromSmartType();
	SetAllocating( true );

	CHLSL_Solver_MComp *solver = new CHLSL_Solver_MComp( GetUniqueIndex() );
	solver->SetResourceType( res );
	solver->SetState( iTargetMatrix, bColumns );
	for ( int i = 0; i < GetNumJacks_In(); i++ )
		solver->AddSourceVar( GetJack_In(i)->GetTemporaryVarTarget_End() );
	solver->AddTargetVar( tg );
	AddSolver( solver );

	return true;
}
bool CNodeStdMorph::CreateSolvers(GenericShaderData *ShaderData)
{
	const int numJacksIn = GetNumJacks_In();
	if ( GetNumJacks_In_Connected() < numJacksIn )
		return false;

#define __ALLOCVARONOVERWRITEFAIL( _in, _out ) CHLSL_Var *tg##_out = NULL;\
	if ( _in + 1 > GetNumJacks_In() || _out + 1 > GetNumJacks_Out() )\
	{}\
	else if ( GetJack_In( _in )->GetTemporaryVarTarget_End()->CanBeOverwritten() )\
	{\
		tg##_out = GetJack_In( _in )->GetTemporaryVarTarget_End();\
		GetJack_Out( _out )->SetTemporaryVarTarget( tg##_out );\
	}\
	else\
	{\
		tg##_out = GetJack_Out( _out )->AllocateVarFromSmartType();\
	}

	bool bWillAlloc = !GetJack_In( 0 )->GetTemporaryVarTarget_End()->CanBeOverwritten();
	if ( m_iSkinMode >= STD_SKINNING_MODE_POS_NORMAL && !GetJack_In( 2 )->GetTemporaryVarTarget_End()->CanBeOverwritten() )
		bWillAlloc = true;
	if ( m_iSkinMode >= STD_SKINNING_MODE_POS_NORMAL_TANGENT && !GetJack_In( 4 )->GetTemporaryVarTarget_End()->CanBeOverwritten() )
		bWillAlloc = true;

	SetAllocating( bWillAlloc );

	CHLSL_Solver_StdMorph *solver = new CHLSL_Solver_StdMorph( GetUniqueIndex() );

	solver->SetState( m_iSkinMode );
	for ( int i = 0; i < numJacksIn; i++ )
		solver->AddSourceVar( GetJack_In(i)->GetTemporaryVarTarget_End() );

	__ALLOCVARONOVERWRITEFAIL( 0, 0 )
	__ALLOCVARONOVERWRITEFAIL( 2, 1 )
	__ALLOCVARONOVERWRITEFAIL( 4, 2 )

	solver->AddTargetVar( tg0 );
	if ( m_iSkinMode >= STD_SKINNING_MODE_POS_NORMAL )
		solver->AddTargetVar( tg1 );
	if ( m_iSkinMode >= STD_SKINNING_MODE_POS_NORMAL_TANGENT )
		solver->AddTargetVar( tg2 );

	AddSolver( solver );

	return true;
}
Esempio n. 11
0
void CNodeCustom::UpdateNode()
{
	CUtlVector< BridgeRestoreInfo* >m_hRestoreBridges_In;
	CreateBridgeRestoreData_In( CBaseNode::BY_INDEX, m_hRestoreBridges_In );
	GenerateJacks_Input( m_hszVarNames_In.Count() );
	//GenerateJacks_Input( numJacksIn );


	CUtlVector< BridgeRestoreInfo* >m_hRestoreBridges_Out;
	CreateBridgeRestoreData_Out( CBaseNode::BY_INDEX, m_hRestoreBridges_Out );
	GenerateJacks_Output( m_hszVarNames_Out.Count() );


	for ( int i = 0; i < GetNumJacks_In(); i++ )
	{
		char *name = NULL;

		if ( m_hszVarNames_In.Count() > i && m_hszVarNames_In[ i ]->pszName != NULL &&
			Q_strlen( m_hszVarNames_In[ i ]->pszName ) > 0 )
			name = m_hszVarNames_In[ i ]->pszName;
		else
			name = GenerateDefaultName( i );

		LockJackInput_Flags( i, m_hszVarNames_In[ i ]->iFlag, name );
	}

	for ( int i = 0; i < GetNumJacks_Out(); i++ )
	{
		char *name = NULL;

		if ( m_hszVarNames_Out.Count() > i && m_hszVarNames_Out[ i ]->pszName != NULL &&
			Q_strlen( m_hszVarNames_Out[ i ]->pszName ) > 0 )
			name = m_hszVarNames_Out[ i ]->pszName;
		else
			name = GenerateDefaultName( i, true );

		LockJackOutput_Flags( i, m_hszVarNames_Out[ i ]->iFlag, name );
	}

	RestoreBridgesFromList_In( m_hRestoreBridges_In );
	RestoreBridgesFromList_Out( m_hRestoreBridges_Out );


	OnUpdateHierachy( NULL, NULL );
}
Esempio n. 12
0
bool CNodeClip::CreateSolvers(GenericShaderData *ShaderData)
{
	if ( GetNumJacks_In_Connected() < GetNumJacks_In() )
		return false;

	CJack *pJ_In_0 = GetJack_In( 0 );
	CJack *pJ_Out_0 = GetJack_Out( 0 );

	CHLSL_Var *pt = pJ_In_0->GetTemporaryVarTarget_End();

	pJ_Out_0->SetTemporaryVarTarget( pt );

	CHLSL_Solver_Clip *solver = new CHLSL_Solver_Clip( GetUniqueIndex() );
	solver->AddSourceVar( pt );
	solver->AddTargetVar( pt );
	AddSolver( solver );
	return true;
}
Esempio n. 13
0
KeyValues *CNodeCustom::AllocateKeyValues( int NodeIndex )
{
	KeyValues *pKV = BaseClass::AllocateKeyValues( NodeIndex );

	WriteJackDataFromKV( pKV, m_hszVarNames_In, m_hszVarNames_Out,
						GetNumJacks_In(), GetNumJacks_Out() );

	pKV->SetString( "szFunctionName", m_szFunctionName );
	pKV->SetString( "szFilePath", m_szFilePath );
	pKV->SetInt( "iInline", m_bInline ? 1 : 0 );

	CKVPacker::KVPack( m_pCode_Global, "szcode_global", pKV );
	CKVPacker::KVPack( m_pCode_Function, "szcode_body", pKV );
	//pKV->SetString( "szcode_global", m_pCode_Global );
	//pKV->SetString( "szcode_body", m_pCode_Function );
	pKV->SetInt( "iEnvFlags", m_iEnvFlags );

	return pKV;
}
bool CNodePSOutput::CreateSolvers(GenericShaderData *ShaderData)
{
	for ( int i = 0; i < GetNumJacks_In(); i++ )
	{
		CJack *pJ = GetJack_In( i );
		if ( !pJ->GetNumBridgesConnected() )
			continue;

		CJack *sourceJack = pJ->GetBridge( 0 )->GetInputJack();
		CHLSL_Var *src = sourceJack->GetTemporaryVarTarget();
		const int res = pJ->GetResourceType();

		CHLSL_Solver_WriteSemantics *solver = new CHLSL_Solver_WriteSemantics( GetUniqueIndex() );
		solver->SetResourceType( res );
		solver->AddSourceVar( src );

		AddSolver( solver );
	}

	SmartCreateDummySolver();
	return true;
}
void CNodeMultiply::UpdateOutputs()
{
	if ( !GetNumJacks_Out() || !GetNumJacks_In() )
		return;

	if ( GetErrorLevel() != ERRORLEVEL_NONE )
		return SetOutputsUndefined();

	CJack *pJO = GetJack_Out( 0 );
	int vartype_jack_0 = GetJack_In( 0 )->GetSmartType();
	int vartype_jack_1 = GetJack_In( 1 )->GetSmartType();

	int iGoalSmarttype = HLSLVAR_FLOAT4;

	// matrices out
	if ( vartype_jack_0 == HLSLVAR_MATRIX3X3 && vartype_jack_1 == HLSLVAR_MATRIX3X3 )
		iGoalSmarttype = HLSLVAR_MATRIX3X3;
	else if ( vartype_jack_0 == HLSLVAR_MATRIX4X4 && vartype_jack_1 == HLSLVAR_MATRIX4X4 )
		iGoalSmarttype = HLSLVAR_MATRIX4X4;
	else if ( vartype_jack_0 == HLSLVAR_MATRIX4X3 && vartype_jack_1 == HLSLVAR_MATRIX4X4 )
		iGoalSmarttype = HLSLVAR_MATRIX4X4;
	// vector out
	else if ( vartype_jack_0 == HLSLVAR_FLOAT1 || vartype_jack_1 == HLSLVAR_FLOAT1 )
		iGoalSmarttype =  max( vartype_jack_0, vartype_jack_1 );
	else if ( vartype_jack_0 == vartype_jack_1 )
		iGoalSmarttype = vartype_jack_0;
	// vector transform out
	else if ( vartype_jack_1 == HLSLVAR_MATRIX3X3 ||
		vartype_jack_0 == HLSLVAR_MATRIX3X3 ||
		vartype_jack_1 == HLSLVAR_MATRIX4X3 ||
		( vartype_jack_1 == HLSLVAR_MATRIX4X4 && m_bMatrixRotation ) )
		iGoalSmarttype = HLSLVAR_FLOAT3;

	return pJO->SetSmartType( iGoalSmarttype );
	//GetJack_Out( 0 )->SetSmartType( max( GetJack_In(0)->GetSmartType(), GetJack_In(1)->GetSmartType() ) );
}