//----------------------------------------------------------------------------- // Called every frame to sense the angular velocity of the target entity. // Output is filtered by m_flFireInterval to ignore excessive oscillations. //----------------------------------------------------------------------------- void CPointAngularVelocitySensor::Think(void) { if (m_hTargetEntity != NULL) { // // Check to see if the measure entity's angular velocity has been within // tolerance of the threshold for the given period of time. // int nCompare = CompareToThreshold(m_hTargetEntity, m_flThreshold, true); if (nCompare != m_nLastCompareResult) { // If we've oscillated back to where we last fired the output, don't // fire the same output again. if (nCompare == m_nLastFireResult) { m_flFireTime = 0; } else if (m_nLastCompareResult != AVELOCITY_SENSOR_NO_LAST_RESULT) { // // The value has changed -- reset the timer. We'll fire the output if // it stays at this value until the interval expires. // m_flFireTime = gpGlobals->curtime + m_flFireInterval; } m_nLastCompareResult = nCompare; } else if ((m_flFireTime != 0) && (gpGlobals->curtime >= m_flFireTime)) { // // The compare result has held steady long enough -- time to // fire the output. // FireCompareOutput(nCompare, this); m_nLastFireResult = nCompare; m_flFireTime = 0; } SetNextThink( gpGlobals->curtime ); } }
//----------------------------------------------------------------------------- // Purpose: Called every frame. //----------------------------------------------------------------------------- void CPointAngularVelocitySensor::Think(void) { if (m_hTargetEntity != NULL) { // // Check to see if the measure entity's forward vector has been within // given tolerance of the target entity for the given period of time. // int nCompare = CompareToThreshold(m_hTargetEntity, m_flThreshold, true); if ((nCompare != m_nLastCompareResult) && (m_nLastCompareResult != AVELOCITY_SENSOR_NO_LAST_RESULT)) { if (!m_flFireTime) { m_flFireTime = gpGlobals->curtime; } if (gpGlobals->curtime >= (m_flFireTime + m_flFireInterval)) { // // The compare result has changed. We need to fire the output. // FireCompareOutput(nCompare, this); // Save the result for next time. m_flFireTime = 0; m_nLastCompareResult = nCompare; } } else if (m_nLastCompareResult == AVELOCITY_SENSOR_NO_LAST_RESULT) { m_nLastCompareResult = nCompare; } SetNextThink( gpGlobals->curtime ); } }
//----------------------------------------------------------------------------- // Purpose: Input handler for forcing an instantaneous test of the condition. //----------------------------------------------------------------------------- void CPointAngularVelocitySensor::InputTest( inputdata_t &inputdata ) { int nCompareResult = CompareToThreshold(m_hTargetEntity, m_flThreshold, false); FireCompareOutput(nCompareResult, inputdata.pActivator); }