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