5 // Copyright (c) 2011 Apple Inc.
11 #include "LinearMath/btScalar.h"
12 #if defined (BT_USE_SSE_IN_API) || defined (BT_USE_NEON)
14 #include "Test_v3interp.h"
21 #include <LinearMath/btVector3.h>
23 // reference code for testing purposes
25 btVector3& v3interp_ref(
31 #define LOOPCOUNT 1024
32 #define NUM_CYCLES 1000
34 int Test_v3interp(void)
42 w = BT_NAN; // w channel NaN
44 btVector3 correct_res, test_res;
46 for (rt = 0.0f; rt <= 1.0f; rt += 0.1f)
48 correct_res.setValue(vNaN, vNaN, vNaN);
49 test_res.setValue(vNaN, vNaN, vNaN);
64 correct_res = v3interp_ref(correct_res, v1, v2, rt);
65 test_res.setInterpolate3(v1, v2, rt);
67 if( fabs(correct_res.m_floats[0] - test_res.m_floats[0]) +
68 fabs(correct_res.m_floats[1] - test_res.m_floats[1]) +
69 fabs(correct_res.m_floats[2] - test_res.m_floats[2]) > FLT_EPSILON * 4)
71 vlog( "Error - v3interp result error! "
72 "\ncorrect = (%10.4f, %10.4f, %10.4f) "
73 "\ntested = (%10.4f, %10.4f, %10.4f) \n"
75 correct_res.m_floats[0], correct_res.m_floats[1], correct_res.m_floats[2],
76 test_res.m_floats[0], test_res.m_floats[1], test_res.m_floats[2], rt);
82 #define DATA_SIZE LOOPCOUNT
84 btVector3 vec3_arr1[DATA_SIZE];
85 btVector3 vec3_arr2[DATA_SIZE];
86 btScalar rt_arr[DATA_SIZE];
93 uint64_t startTime, bestTime, currentTime;
97 for (j = 0; j < NUM_CYCLES; j++)
99 for( k = 0; k < DATA_SIZE; k++ )
104 vec3_arr1[k].setValue(x,y,z);
105 vec3_arr1[k].setW(w);
110 vec3_arr2[k].setValue(x,y,z);
111 vec3_arr2[k].setW(w);
113 rt_arr[k] = RANDF_01;
116 startTime = ReadTicks();
117 for( k = 0; k < LOOPCOUNT; k++ )
119 v3interp_ref(vec3_arr1[k], vec3_arr1[k], vec3_arr2[k], rt_arr[k]);
121 currentTime = ReadTicks() - startTime;
122 scalarTime += currentTime;
123 if( currentTime < bestTime )
124 bestTime = currentTime;
126 if( 0 == gReportAverageTimes )
127 scalarTime = bestTime;
129 scalarTime /= NUM_CYCLES;
133 uint64_t startTime, bestTime, currentTime;
137 for (j = 0; j < NUM_CYCLES; j++)
139 for( k = 0; k < DATA_SIZE; k++ )
144 vec3_arr1[k].setValue(x,y,z);
145 vec3_arr1[k].setW(w);
150 vec3_arr2[k].setValue(x,y,z);
151 vec3_arr2[k].setW(w);
153 rt_arr[k] = RANDF_01;
156 startTime = ReadTicks();
157 for( k = 0; k < LOOPCOUNT; k++ )
159 vec3_arr1[k].setInterpolate3(vec3_arr1[k], vec3_arr2[k], rt_arr[k]);
161 currentTime = ReadTicks() - startTime;
162 vectorTime += currentTime;
163 if( currentTime < bestTime )
164 bestTime = currentTime;
166 if( 0 == gReportAverageTimes )
167 vectorTime = bestTime;
169 vectorTime /= NUM_CYCLES;
173 vlog( " \t scalar\t vector\n" );
174 vlog( " \t%10.4f\t%10.4f\n", TicksToCycles( scalarTime ) / LOOPCOUNT,
175 TicksToCycles( vectorTime ) / LOOPCOUNT );
187 btScalar s = btScalar(1.0) - rt;
188 vr.m_floats[0] = s * v0.m_floats[0] + rt * v1.m_floats[0];
189 vr.m_floats[1] = s * v0.m_floats[1] + rt * v1.m_floats[1];
190 vr.m_floats[2] = s * v0.m_floats[2] + rt * v1.m_floats[2];