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;
}
Esempio n. 2
0
bool CNodeDot::CreateSolvers(GenericShaderData *ShaderData)
{
	if ( GetNumJacks_In_Connected() < 2 )
		return false;

	CJack *pJ1 = GetJack_In( 0 );
	CJack *pJ2 = GetJack_In( 1 );
	CJack *pJ_Out = GetJack_Out( 0 );

	int type0 = pJ_Out->GetSmartType();
	const int res = pJ_Out->GetResourceType();

	if ( pJ2->GetSmartType() == HLSLVAR_FLOAT1 )
		swap( pJ1, pJ2 );

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

	CHLSL_Solver_Dot *solver = new CHLSL_Solver_Dot( GetUniqueIndex() );
	solver->SetResourceType( res );
	solver->AddSourceVar( pJ1->GetTemporaryVarTarget_End() );
	solver->AddSourceVar( pJ2->GetTemporaryVarTarget_End() );
	solver->AddTargetVar( tg );
	AddSolver( solver );

	//Msg("add solver has %i src vars\n", solver->GetNumSourceVars());

	return true;
}
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 CNodeSubtract::CreateSolvers(GenericShaderData *ShaderData)
{
	if ( GetNumJacks_In_Connected() < 2 )
		return false;

	CJack *pJ1 = GetJack_In( 0 );
	CJack *pJ2 = GetJack_In( 1 );
	CJack *pJ_Out = GetJack_Out( 0 );

	int type1 = pJ1->GetSmartType();
	int type2 = pJ2->GetSmartType();
	const int res = pJ_Out->GetResourceType();

	CHLSL_Var *tg = GetInputToWriteTo( max( type1, type2 ) );
	SetAllocating( !tg );
	if ( !tg )
		tg = pJ_Out->AllocateVarFromSmartType();
	pJ_Out->SetTemporaryVarTarget( tg );

	CHLSL_Solver_Subtract *solver = new CHLSL_Solver_Subtract( GetUniqueIndex() );
	solver->SetResourceType( res );
	solver->AddSourceVar( pJ1->GetTemporaryVarTarget_End() );
	solver->AddSourceVar( pJ2->GetTemporaryVarTarget_End() );
	solver->AddTargetVar( tg );
	AddSolver( solver );

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

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

	GetJack_Out( 0 )->SetSmartType( GetJack_In(0)->GetSmartType() );
}
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() ) );
}
bool CNodeVCompression::CreateSolvers(GenericShaderData *ShaderData)
{
	const bool bUseTangent = m_iCompressionMode == COMPRESSION_MODE_NORMAL_TANGENT;

	SetAllocating( true );
	CHLSL_Solver_VCompression *solver =  new CHLSL_Solver_VCompression( GetUniqueIndex() );
	solver->SetCompressionType( m_iCompressionMode );

	solver->AddSourceVar( GetJack_In(0)->GetTemporaryVarTarget_End() );
	solver->AddTargetVar( GetJack_Out(0)->AllocateVarFromSmartType() );

	if ( bUseTangent )
	{
		solver->AddSourceVar( GetJack_In(1)->GetTemporaryVarTarget_End() );
		solver->AddTargetVar( GetJack_Out(1)->AllocateVarFromSmartType() );
	}

	AddSolver( solver );
	return true;
}
void CNodeClip::UpdateOutputs()
{
	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 CNodeLightscale::CreateSolvers(GenericShaderData *ShaderData)
{
    CJack *pJ_Out = GetJack_Out( 0 );
    const int res = pJ_Out->GetResourceType();

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

    CHLSL_Solver_Lightscale *solver = new CHLSL_Solver_Lightscale( GetUniqueIndex() );
    solver->SetResourceType( res );
    solver->AddTargetVar( tg );
    solver->SetState( m_iLightScale );
    AddSolver( solver );
    return true;
}
bool CNodeRandom::CreateSolvers(GenericShaderData *ShaderData)
{
	CJack *pJ_Out = GetJack_Out( 0 );
	const int res = pJ_Out->GetResourceType();

	CHLSL_Var *tg = pJ_Out->AllocateVarFromSmartType();
	tg->MakeConstantOnly();

	CHLSL_Solver_Random *solver = new CHLSL_Solver_Random( GetUniqueIndex() );
	solver->SetResourceType( res );
	solver->AddTargetVar( tg );
	solver->SetState( m_iNumComponents, m_flValue_Min, m_flValue_Max );
	AddSolver( solver );

	return true;
}
bool CNodeConstant::CreateSolvers(GenericShaderData *ShaderData)
{
	CJack *pJ_Out = GetJack_Out( 0 );

	const int res = pJ_Out->GetResourceType();

	CHLSL_Var *tg = pJ_Out->AllocateVarFromSmartType();
	tg->MakeConstantOnly();

	CHLSL_Solver_Constant *solver = new CHLSL_Solver_Constant( GetUniqueIndex() );
	solver->SetResourceType( res );
	solver->AddTargetVar( tg );
	solver->SetComponentInfo( m_iChannelInfo );
	AddSolver( solver );

	return true;
}
Esempio n. 12
0
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;
}
Esempio n. 13
0
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;
}
Esempio n. 14
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;
}
bool CNodeMultiply::CreateSolvers(GenericShaderData *ShaderData)
{
	if ( GetNumJacks_In_Connected() < 2 )
		return false;

	CJack *pJ1 = GetJack_In( 0 );
	CJack *pJ2 = GetJack_In( 1 );
	CJack *pJ_Out = GetJack_Out( 0 );

	int type1 = pJ1->GetSmartType();
	int type2 = pJ2->GetSmartType();
	const int res = pJ_Out->GetResourceType();

	CHLSL_Var *tg = NULL;
	
	if ( type1 == type2 || type1 == HLSLVAR_FLOAT1 || type2 == HLSLVAR_FLOAT1 )
		tg = GetInputToWriteTo( max( type1, type2 ) );
	else if ( type1 == HLSLVAR_FLOAT3 && type2 == HLSLVAR_MATRIX3X3 )
		tg = GetInputToWriteTo( HLSLVAR_FLOAT3 );
	else if ( type1 == HLSLVAR_FLOAT3 && type2 == HLSLVAR_MATRIX4X3 )
		tg = GetInputToWriteTo( HLSLVAR_FLOAT3 );
	else if ( type1 == HLSLVAR_FLOAT4 && type2 == HLSLVAR_MATRIX4X4 )
		tg = GetInputToWriteTo( HLSLVAR_FLOAT4 );
	else if ( type1 == HLSLVAR_MATRIX3X3 && type2 == HLSLVAR_FLOAT3 )
		tg = GetInputToWriteTo( HLSLVAR_FLOAT3 );

	SetAllocating( !tg );
	if ( !tg )
		tg = pJ_Out->AllocateVarFromSmartType();
	pJ_Out->SetTemporaryVarTarget( tg );

	CHLSL_Solver_Multiply *solver = new CHLSL_Solver_Multiply( GetUniqueIndex() );
	solver->SetMatrixRotationOnly( m_bMatrixRotation );
	solver->SetResourceType( res );
	solver->AddSourceVar( pJ1->GetTemporaryVarTarget_End() );
	solver->AddSourceVar( pJ2->GetTemporaryVarTarget_End() );
	solver->AddTargetVar( tg );
	AddSolver( solver );

	//Msg("add solver has %i src vars\n", solver->GetNumSourceVars());

	return true;
}
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 CNodeUtility_Declare::CreateSolvers(GenericShaderData *ShaderData)
{
	if ( GetNumJacks_In_Connected() < 1 )
		return false;

	CJack *pJ1 = GetJack_In( 0 );
	CJack *pJ_Out = GetJack_Out( 0 );

	const int res = pJ_Out->GetResourceType();

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

	CHLSL_Solver_Utility_Declare *solver = new CHLSL_Solver_Utility_Declare( GetUniqueIndex() );
	solver->SetResourceType( res );
	solver->AddSourceVar( pJ1->GetTemporaryVarTarget_End() );
	solver->AddTargetVar( tg );
	AddSolver( solver );

	return true;
}
bool CNodeVSInput::CreateSolvers(GenericShaderData *ShaderData)
{
	for ( int i = 0; i < GetNumJacks_Out(); i++ )
	{
		CJack *pJ = GetJack_Out( i );
		if ( !pJ->GetNumBridgesConnected() )
			continue;

		const int res = pJ->GetResourceType();
		CHLSL_Var *var = pJ->AllocateVarFromSmartType();
		var->MakeConstantOnly();

		CHLSL_Solver_ReadSemantics *solver = new CHLSL_Solver_ReadSemantics( GetUniqueIndex() );
		solver->SendVSSetup( curSetup );
		solver->SetResourceType( res );
		solver->AddTargetVar( var );
		AddSolver( solver );
	}

	SmartCreateDummySolver();
	return true;
}
bool CNodeUtility_Assign::CreateSolvers(GenericShaderData *ShaderData)
{
	if ( GetNumJacks_In_Connected() < 2 )
		return false;

	CJack *pJ1 = GetJack_In( 0 );
	CJack *pJ2 = GetJack_In( 1 );
	CJack *pJ_Out = GetJack_Out( 0 );
	if ( !pJ1->GetTemporaryVarTarget_End()->CanBeOverwritten() )
	{
		SetOutputsUndefined();
		OnShowSolverErrored();
		return false;
	}


	const int res = pJ_Out->GetResourceType();

	CHLSL_Var *tg = pJ1->GetTemporaryVarTarget_End_Smart( pJ1->GetSmartType(), true );
	Assert( tg );
	if ( !tg->CanBeOverwritten() )
		tg = NULL;
	if ( !( tg->GetType() & pJ1->GetSmartType() ) )
		tg = NULL;

	SetAllocating( !tg );
	if ( !tg )
		tg = pJ_Out->AllocateVarFromSmartType();
	pJ_Out->SetTemporaryVarTarget( tg );

	CHLSL_Solver_Utility_Assign *solver = new CHLSL_Solver_Utility_Assign( GetUniqueIndex() );
	solver->SetResourceType( res );
	solver->AddSourceVar( pJ1->GetTemporaryVarTarget_End() );
	solver->AddSourceVar( pJ2->GetTemporaryVarTarget_End() );
	solver->AddTargetVar( tg );
	AddSolver( solver );

	return true;
}
bool CNodeBumpBasis::CreateSolvers(GenericShaderData *ShaderData)
{
	for ( int i = 0; i < GetNumJacks_Out(); i++ )
	{
		CJack *pJCur = GetJack_Out(i);
		if ( !pJCur->GetNumBridgesConnected() && i != 0 )
			continue;

		const int res = pJCur->GetResourceType();

		CHLSL_Var *tg = pJCur->AllocateVarFromSmartType();
		tg->MakeConstantOnly();

		CHLSL_Solver_BumpBasis *solver = new CHLSL_Solver_BumpBasis( GetUniqueIndex() );
		solver->SetResourceType( res );
		solver->AddTargetVar( tg );
		solver->SetState( i );
		AddSolver( solver );
	}

	return !!GetNumSolvers();
}
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 CNodeCallback::CreateSolvers(GenericShaderData *ShaderData)
{
	if ( !szCallbackName || !Q_strlen( szCallbackName ) || !iNumComponents )
		return false;
	int target = shaderEdit->FindCallback( szCallbackName );
	if ( target < 0 )
		return false;

	CJack *pJ_Out = GetJack_Out( 0 );

	const int res = pJ_Out->GetResourceType();

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

	CHLSL_Solver_Callback *solver = new CHLSL_Solver_Callback( GetUniqueIndex() );
	solver->SetState( target, szCallbackName, iNumComponents );
	solver->SetResourceType( res );
	solver->AddTargetVar( tg );
	AddSolver( solver );

	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() ) );
}
void CNodeLightscale::UpdateNode()
{
    GetJack_Out( 0 )->SetName( GetLightscaleGameString( m_iLightScale ) );
}
void CNodeVSInput::Setup( SETUP_HLSL_VS_Input info )
{
	int numOutputs = 1;
	if ( info.bFlexDelta_enabled )
		numOutputs += 2;
	if ( info.bBlendweights_enabled )
		numOutputs += 2;
	if ( info.bNormal_enabled )
		numOutputs += 1;
	if ( info.bTangentspace_enabled )
		numOutputs += 2;
	numOutputs += info.iTexcoords_num;
	numOutputs += info.iVertexcolor_num;

	CUtlVector< BridgeRestoreInfo* >m_hRestoreBridges;
	CreateBridgeRestoreData_Out( CBaseNode::BY_NAME, m_hRestoreBridges );

	GenerateJacks_Output( numOutputs );

	int curOutput = 0;

	GetJack_Out( curOutput )->SetResourceType( RESOURCETYPE_POS_3 );
	LockJackOutput_Flags( curOutput, HLSLVAR_FLOAT3, "Position" );curOutput++;

	if ( info.bFlexDelta_enabled )
	{
		GetJack_Out( curOutput )->SetResourceType( RESOURCETYPE_FLEXDELTA );
		LockJackOutput_Flags( curOutput, HLSLVAR_FLOAT3, "Flex offset" );curOutput++;
		GetJack_Out( curOutput )->SetResourceType( RESOURCETYPE_FLEXDELTA_NORMAL );
		LockJackOutput_Flags( curOutput, HLSLVAR_FLOAT3, "Flex normal" );curOutput++;
	}
	if ( info.bBlendweights_enabled )
	{
		GetJack_Out( curOutput )->SetResourceType( RESOURCETYPE_BONE_WEIGHTS );
		LockJackOutput_Flags( curOutput, HLSLVAR_FLOAT4, "Bone weights" );curOutput++;
		GetJack_Out( curOutput )->SetResourceType( RESOURCETYPE_BONE_INDICES );
		LockJackOutput_Flags( curOutput, HLSLVAR_FLOAT4, "Bone indices" );curOutput++;
	}
	if ( info.bNormal_enabled )
	{
		int normalFlag = info.bNormal_enabled_compression ? HLSLVAR_FLOAT4 : HLSLVAR_FLOAT3;
		GetJack_Out( curOutput )->SetResourceType( info.bNormal_enabled_compression ? RESOURCETYPE_NORMAL_4 : RESOURCETYPE_NORMAL );
		LockJackOutput_Flags( curOutput, normalFlag, "Normal" );curOutput++;
	}
	if ( info.bTangentspace_enabled )
	{
		int tangentStype = info.bTangentspace_enabled_skinning ? HLSLVAR_FLOAT4 : HLSLVAR_FLOAT3;
		int tangentSRestype = info.bTangentspace_enabled_skinning ? RESOURCETYPE_TANGENTS_4 : RESOURCETYPE_TANGENTS_3;

		GetJack_Out( curOutput )->SetResourceType( tangentSRestype );
		LockJackOutput_Flags( curOutput, tangentStype, "Tangent S" );curOutput++;
		GetJack_Out( curOutput )->SetResourceType( RESOURCETYPE_TANGENTT );
		LockJackOutput_Flags( curOutput, HLSLVAR_FLOAT3, "Tangent T" );curOutput++;
	}

	for ( int i = 0; i < info.iTexcoords_num; i++ )
	{
		Assert( i < 3 );
		GetJack_Out( curOutput )->SetResourceType( RESOURCETYPE_TEXCOORD_0 + i );
		LockJackOutput_Flags( curOutput, info.iDataTypeFlag_TexCoords[i], VarArgs("TexCoords %i",i) );curOutput++;
	}
	for ( int i = 0; i < info.iVertexcolor_num; i++ )
	{
		Assert( i < 2 );
		GetJack_Out( curOutput )->SetResourceType( RESOURCETYPE_COLOR_0 + i );
		LockJackOutput_Flags( curOutput, info.iDataTypeFlag_Color[i], VarArgs("Color %i",i) );curOutput++;
	}
	curSetup = info;

	RestoreBridgesFromList_Out( m_hRestoreBridges );
}