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;
}
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;
}
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;
}
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;
}