Table of Contents

include/AK/Plugin/PluginServices/AkVectorValueRamp.h

Go to the documentation of this file.
00001 /*******************************************************************************
00002 The content of this file includes portions of the AUDIOKINETIC Wwise Technology
00003 released in source code form as part of the SDK installer package.
00004 
00005 Commercial License Usage
00006 
00007 Licensees holding valid commercial licenses to the AUDIOKINETIC Wwise Technology
00008 may use this file in accordance with the end user license agreement provided 
00009 with the software or, alternatively, in accordance with the terms contained in a
00010 written agreement between you and Audiokinetic Inc.
00011 
00012 Apache License Usage
00013 
00014 Alternatively, this file may be used under the Apache License, Version 2.0 (the 
00015 "Apache License"); you may not use this file except in compliance with the 
00016 Apache License. You may obtain a copy of the Apache License at 
00017 http://www.apache.org/licenses/LICENSE-2.0.
00018 
00019 Unless required by applicable law or agreed to in writing, software distributed
00020 under the Apache License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES
00021 OR CONDITIONS OF ANY KIND, either express or implied. See the Apache License for
00022 the specific language governing permissions and limitations under the License.
00023 
00024   Version: <VERSION>  Build: <BUILDNUMBER>
00025   Copyright (c) <COPYRIGHTYEAR> Audiokinetic Inc.
00026 *******************************************************************************/
00027 
00028 #ifndef _AK_VECTORVALUERAMP_H_
00029 #define _AK_VECTORVALUERAMP_H_
00030 
00031 #include <AK/SoundEngine/Common/AkSimd.h>
00032 
00033 /// Tool for computing a ramp using SIMD types.
00034 /// Implementation using AKSIMD_V4F32
00035 class CAkVectorValueRampV4
00036 {
00037 public:
00038 
00039     AkForceInline AKSIMD_V4F32 Setup( AkReal32 in_fStartValue, AkReal32 in_fStopValue, AkUInt32 in_uNumFrames )
00040     {
00041         const AkReal32 fIncrement = (in_fStopValue-in_fStartValue)/in_uNumFrames;
00042         const AkReal32 f4xInc = 4.f*fIncrement;
00043         vIncrement = AKSIMD_LOAD1_V4F32( f4xInc);
00044         AK_ALIGN_SIMD( AkReal32 fVal[4] );
00045         fVal[0] = in_fStartValue;
00046         fVal[1] = fVal[0] + fIncrement;
00047         fVal[2] = fVal[1] + fIncrement;
00048         fVal[3] = fVal[2] + fIncrement;
00049         vValueRamp = AKSIMD_LOAD_V4F32( fVal );
00050         return vValueRamp;
00051     }
00052 
00053     AkForceInline AKSIMD_V4F32 Tick( )
00054     {
00055         vValueRamp = AKSIMD_ADD_V4F32( vValueRamp, vIncrement );
00056         return vValueRamp;
00057     }
00058 
00059 private:
00060     AKSIMD_V4F32 vIncrement;
00061     AKSIMD_V4F32 vValueRamp;
00062 };
00063 
00064 
00065 #ifdef AKSIMD_V2F32_SUPPORTED
00066 /// Tool for computing a ramp using SIMD types.
00067 /// Implementation using AKSIMD_V2F32
00068 class CAkVectorValueRampV2
00069 {
00070 public:
00071 
00072     AkForceInline AKSIMD_V2F32 Setup( AkReal32 in_fStartValue, AkReal32 in_fStopValue, AkUInt32 in_uNumFrames )
00073     {
00074         const AkReal32 fIncrement = (in_fStopValue-in_fStartValue)/in_uNumFrames;
00075         const AkReal32 f2xInc = 2.f*fIncrement;
00076         vIncrement = AKSIMD_SET_V2F32( f2xInc );
00077         AKSIMD_BUILD_V2F32( const AKSIMD_V2F32 vStartOffset, 0.f, fIncrement );
00078         AKSIMD_V2F32 l_vValueRamp = AKSIMD_SET_V2F32( in_fStartValue );
00079         l_vValueRamp = AKSIMD_ADD_V2F32( l_vValueRamp, vStartOffset );
00080         vValueRamp = l_vValueRamp;
00081         return l_vValueRamp;
00082     }
00083 
00084     AkForceInline AKSIMD_V2F32 Tick( )
00085     {
00086         vValueRamp = AKSIMD_ADD_V2F32( vValueRamp, vIncrement );
00087         return vValueRamp;
00088     }
00089 
00090 private:
00091     AKSIMD_V2F32 vIncrement;
00092     AKSIMD_V2F32 vValueRamp;
00093 };
00094 #endif
00095 
00096 // By default, CAkVectorValueRamp uses the V4 implementation.
00097 typedef CAkVectorValueRampV4 CAkVectorValueRamp;
00098 
00099 #endif //_AK_VECTORVALUERAMP_H_