//----------------------------------------------------------------------------- // Purpose: Called every frame. //----------------------------------------------------------------------------- void CPointAngleSensor::Think(void) { if (m_hTargetEntity != NULL) { Vector forward; m_hTargetEntity->GetVectors(&forward, NULL, NULL); m_TargetDir.Set(forward, this, this); if (m_hLookAtEntity != 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. // float flDot; if (IsFacingWithinTolerance(m_hTargetEntity, m_hLookAtEntity, m_flDotTolerance, &flDot )) { if (!m_bFired) { if (!m_flFacingTime) { m_flFacingTime = gpGlobals->curtime; } if (gpGlobals->curtime >= m_flFacingTime + m_flDuration) { m_OnFacingLookat.FireOutput(this, this); m_bFired = true; } } } else { // Reset the fired state if ( m_bFired ) { m_bFired = false; } // Always reset the time when we've lost our facing m_flFacingTime = 0; } // Output the angle range we're in float flPerc = RemapValClamped( flDot, 1.0f, m_flDotTolerance, 1.0f, 0.0f ); m_FacingPercentage.Set( flPerc, this, this ); } SetNextThink( gpGlobals->curtime ); } }
void CLogicMirrorMovement::Think() { // Attempt to get the player's handle because it didn't exist at Activate time if ( !m_hMirrorTarget.Get() ) { // If we will never find a target, we don't have a use... shutdown if ( m_strMirrorTarget == NULL_STRING ) SetNextThink ( NULL ); //BUGBUG: If m_strSetMirrorTarget doesn't exist in ent list, we get per-think searches with no results ever... SetMirrorTarget ( STRING(m_strMirrorTarget) ); } // Make sure all entities are valid if ( m_hMirrorTarget.Get() && m_hMovementTarget.Get() && m_hRemoteTarget.Get() && m_hMirrorRelative.Get() ) { // Get our two portal's world transforms transforms VMatrix matPortal1ToWorldInv, matPortal2ToWorld; MatrixInverseGeneral( m_hMirrorRelative->EntityToWorldTransform(), matPortal1ToWorldInv ); matPortal2ToWorld = m_hRemoteTarget->EntityToWorldTransform(); VMatrix matTransformToRemotePortal = matPortal1ToWorldInv * matPortal2ToWorld; // Get our scene camera's current orientation Vector ptCameraPosition, vCameraLook, vCameraRight, vCameraUp; ptCameraPosition = m_hMirrorTarget->EyePosition(); m_hMirrorTarget->GetVectors ( &vCameraLook, &vCameraRight, &vCameraUp ); // map this position and orientation to the remote portal, mirrored (invert the result) Vector ptNewPosition, vNewLook; ptNewPosition = matPortal1ToWorldInv * ptCameraPosition; ptNewPosition = matPortal2ToWorld*( Vector( -ptNewPosition.x, -ptNewPosition.y, ptNewPosition.z ) ); vNewLook = matPortal1ToWorldInv.ApplyRotation( vCameraLook ); vNewLook = matPortal2ToWorld.ApplyRotation( Vector( -vNewLook.x, -vNewLook.y, vNewLook.z) ); // Set the point camera to the new location/orientation QAngle qNewAngles; VectorAngles( vNewLook, qNewAngles ); m_hMovementTarget->Teleport( &ptNewPosition, &qNewAngles, NULL ); } SetNextThink( gpGlobals->curtime + TICK_INTERVAL ); }