//====== Copyright © 1996-2009, Valve Corporation, All rights reserved. ======= // // Purpose: Declaration of the CDmeConnectionOperator class, a CDmeOperator // which copies one attribute value to another, providing similar functionality // to CDmeChannel, but does not store a log and is not effected by the // recording mode. // //============================================================================= #include "movieobjects/dmeconnectionoperator.h" #include "datamodel/dmelementfactoryhelper.h" #include "tier1/fmtstr.h" // memdbgon must be the last include file in a .cpp file!!! #include "tier0/memdbgon.h" //------------------------------------------------------------------------------------------------- // Expose this class to the scene database //------------------------------------------------------------------------------------------------- IMPLEMENT_ELEMENT_FACTORY( DmeConnectionOperator, CDmeConnectionOperator ); //------------------------------------------------------------------------------------------------- // Purpose: Constructor, initializes attributes, create the embedded target //------------------------------------------------------------------------------------------------- void CDmeConnectionOperator::OnConstruction() { m_Input.InitAndCreate( this, "input" ); m_Outputs.Init( this, "outputs" ); } //------------------------------------------------------------------------------------------------- // Purpose: Perform destruction tasks, destroy the internal elements of the constraint. //------------------------------------------------------------------------------------------------- void CDmeConnectionOperator::OnDestruction() { g_pDataModel->DestroyElement( m_Input.GetHandle() ); int nOutputs = m_Outputs.Count(); for ( int i = 0 ;i < nOutputs; ++i ) { if ( m_Outputs[ i ] ) { g_pDataModel->DestroyElement( m_Outputs[ i ]->GetHandle() ); } } m_Outputs.RemoveAll(); } //------------------------------------------------------------------------------------------------- // Purpose: Run the operator, which copies the value from the source attribute to the destination // attributes. //------------------------------------------------------------------------------------------------- void CDmeConnectionOperator::Operate() { if ( !m_Input->IsValid() ) return; int nOutputs = m_Outputs.Count(); if ( nOutputs == 0 ) return; DmAttributeType_t inputType = AT_UNKNOWN; const void *pValue = m_Input->GetAttributeValue( inputType ); for ( int iOutput = 0; iOutput < nOutputs; ++iOutput ) { m_Outputs[ iOutput ]->SetAttributeValue( pValue, inputType ); } } //------------------------------------------------------------------------------------------------- // Purpose: Determine if data has changed and the operator needs to be updated //------------------------------------------------------------------------------------------------- bool CDmeConnectionOperator::IsDirty() { CDmAttribute* pAttr = m_Input->GetReferencedAttribute(); if ( pAttr ) { return pAttr->IsFlagSet( FATTRIB_DIRTY ); } return false; } //------------------------------------------------------------------------------------------------- // Purpose: Add the input attribute used by the operator to the provided list of attributes, This // is generally used by the evaluation process to find the attributes an operator is dependent on. //------------------------------------------------------------------------------------------------- void CDmeConnectionOperator::GetInputAttributes( CUtlVector< CDmAttribute * > &attrs ) { CDmAttribute *pInputAttr = m_Input->GetReferencedAttribute(); if ( pInputAttr ) { attrs.AddToTail( pInputAttr ); } } //------------------------------------------------------------------------------------------------- // Purpose: Add each of attributes the connection operator outputs to the provided list of // attributes. This is generally used by the evaluation process to find out what attributes are // written by the operator in order to determine what other operators are dependent on this // operator. //------------------------------------------------------------------------------------------------- void CDmeConnectionOperator::GetOutputAttributes( CUtlVector< CDmAttribute * > &attrs ) { int nOutputs = m_Outputs.Count(); for ( int iOutput = 0; iOutput < nOutputs; ++iOutput ) { CDmAttribute *pOutputAttr = m_Outputs[ iOutput ]->GetReferencedAttribute(); if ( pOutputAttr ) { attrs.AddToTail( pOutputAttr ); } } } //------------------------------------------------------------------------------------------------- // Purpose: Set the input attribute of the connection. //------------------------------------------------------------------------------------------------- void CDmeConnectionOperator::SetInput( CDmElement* pElement, const char* pchAttributeName, int index ) { m_Input->SetAttribute( pElement, pchAttributeName, index ); } //------------------------------------------------------------------------------------------------- // Purpose: Add an attribute to be written to by the connection. //------------------------------------------------------------------------------------------------- void CDmeConnectionOperator::AddOutput( CDmElement* pElement, const char* pchAttributeName, int index ) { if ( ( pElement == NULL ) || ( pchAttributeName == NULL ) ) return; CDmeAttributeReference *pAttrRef = CreateElement< CDmeAttributeReference >( CFmtStr( "%s_%s", pElement->GetName() , pchAttributeName ), GetFileId() ); if ( pAttrRef ) { if ( pAttrRef->SetAttribute( pElement, pchAttributeName, index ) ) { // Add the new reference to the list of outputs of the connection. m_Outputs.AddToTail( pAttrRef ); } else { // If the specified attribute was not valid destroy the reference. g_pDataModel->DestroyElement( pAttrRef->GetHandle() ); } } } //------------------------------------------------------------------------------------------------- // Purpose: Get the number of output attributes //------------------------------------------------------------------------------------------------- int CDmeConnectionOperator::NumOutputAttributes() const { return m_Outputs.Count(); } //------------------------------------------------------------------------------------------------- // Purpose: Get the specified output attribute //------------------------------------------------------------------------------------------------- CDmAttribute *CDmeConnectionOperator::GetOutputAttribute( int index ) const { if ( index >= m_Outputs.Count() ) return NULL; return m_Outputs[ index ]->GetReferencedAttribute(); } //------------------------------------------------------------------------------------------------- // Purpose: Get the input attribute //------------------------------------------------------------------------------------------------- CDmAttribute *CDmeConnectionOperator::GetInputAttribute() { return m_Input.GetAttribute(); }