Imported Upstream version 2.81
[platform/upstream/libbullet.git] / Test / Source / Tests / Test_v3cross.cpp
1 //
2 //  Test_v3cross.cpp
3 //  BulletTest
4 //
5 //  Copyright (c) 2011 Apple Inc.
6 //
7
8
9 #include "LinearMath/btScalar.h"
10 #if defined (BT_USE_SSE_IN_API) || defined (BT_USE_NEON)
11
12
13 #include "Test_v3cross.h"
14 #include "vector.h"
15 #include "Utils.h"
16 #include "main.h"
17 #include <math.h>
18 #include <string.h>
19
20 #include <LinearMath/btVector3.h>
21
22 // reference code for testing purposes
23 static btVector3& v3cross_ref(btVector3& v1, btVector3& v2);
24
25 #define LOOPCOUNT 1024
26 #define NUM_CYCLES 1000
27
28 int Test_v3cross(void)
29 {
30     btVector3 v1, v2, v3;
31         
32     float x,y,z,w;
33     
34     // Init the data
35     x = RANDF_01;
36     y = RANDF_01;
37     z = RANDF_01;
38     w = BT_NAN;     // w channel NaN
39     v1.setValue(x,y,z);
40         v1.setW(w);
41
42     x = RANDF_01;
43     y = RANDF_01;
44     z = RANDF_01;
45     v2.setValue(x,y,z);
46         v2.setW(w);
47
48         v3 = v1;
49                 
50     btVector3 correct_res, test_res;
51          
52     {
53                 float vNaN = BT_NAN;
54                 correct_res.setValue(vNaN, vNaN, vNaN); 
55                 test_res.setValue(vNaN, vNaN, vNaN);
56                 correct_res = v3cross_ref(v1, v2);
57                 test_res = v3.cross(v2);
58            
59                 if( fabs(correct_res.m_floats[0] - test_res.m_floats[0]) +  
60                         fabs(correct_res.m_floats[1] - test_res.m_floats[1]) + 
61                         fabs(correct_res.m_floats[2] - test_res.m_floats[2]) > FLT_EPSILON * 4)
62                 {       
63                         vlog( "Error - v3cross result error! "
64                                         "\ncorrect = (%10.4f, %10.4f, %10.4f) "
65                                         "\ntested  = (%10.4f, %10.4f, %10.4f) \n", 
66                                         correct_res.m_floats[0], correct_res.m_floats[1], correct_res.m_floats[2], 
67                                         test_res.m_floats[0], test_res.m_floats[1], test_res.m_floats[2]);
68                 
69                         return 1;
70                 }
71         }
72     
73 #define DATA_SIZE LOOPCOUNT
74
75         btVector3 vec3_arr1[DATA_SIZE];
76         btVector3 vec3_arr2[DATA_SIZE];
77
78     uint64_t scalarTime;
79     uint64_t vectorTime;
80     size_t j, k;
81
82         {
83         uint64_t startTime, bestTime, currentTime;
84             
85         bestTime = -1LL;
86         scalarTime = 0;
87         for (j = 0; j < NUM_CYCLES; j++) 
88                 {
89                         for( k = 0; k < DATA_SIZE; k++ )
90                         {
91                             x = RANDF_01;
92                 y = RANDF_01;
93                 z = RANDF_01;
94                 vec3_arr1[k].setValue(x,y,z);
95                                 vec3_arr1[k].setW(w);
96
97                             x = RANDF_01;
98                 y = RANDF_01;
99                 z = RANDF_01;
100                                 vec3_arr2[k].setValue(x,y,z);
101                                 vec3_arr2[k].setW(w);
102                         }
103
104             startTime = ReadTicks();
105             for( k = 0; k < LOOPCOUNT; k++ )
106                         {
107                     vec3_arr1[k] = v3cross_ref(vec3_arr1[k], vec3_arr2[k]);
108                         }
109                         currentTime = ReadTicks() - startTime;
110             scalarTime += currentTime;
111             if( currentTime < bestTime )
112                 bestTime = currentTime;
113         }
114         if( 0 == gReportAverageTimes )
115             scalarTime = bestTime;        
116         else
117             scalarTime /= NUM_CYCLES;
118     }
119     
120     {
121         uint64_t startTime, bestTime, currentTime;
122         
123         bestTime = -1LL;
124         vectorTime = 0;
125         for (j = 0; j < NUM_CYCLES; j++) 
126                 {
127                         for( k = 0; k < DATA_SIZE; k++ )
128                         {
129                             x = RANDF_01;
130                 y = RANDF_01;
131                 z = RANDF_01;
132                                 vec3_arr1[k].setValue(x,y,z);
133                                 vec3_arr1[k].setW(w);
134
135                             x = RANDF_01;
136                 y = RANDF_01;
137                 z = RANDF_01;
138                                 vec3_arr2[k].setValue(x,y,z);
139                                 vec3_arr2[k].setW(w);
140                         }
141
142             startTime = ReadTicks();
143             for( k = 0; k < LOOPCOUNT; k++ )
144                         {
145                                 vec3_arr1[k] = vec3_arr1[k].cross(vec3_arr2[k]);
146                         }
147                         currentTime = ReadTicks() - startTime;
148             vectorTime += currentTime;
149             if( currentTime < bestTime )
150                 bestTime = currentTime;
151         }
152         if( 0 == gReportAverageTimes )
153             vectorTime = bestTime;        
154         else
155             vectorTime /= NUM_CYCLES;
156     }
157
158     vlog( "Timing:\n" );
159     vlog( "     \t    scalar\t    vector\n" );
160     vlog( "    \t%10.4f\t%10.4f\n", TicksToCycles( scalarTime ) / LOOPCOUNT, 
161                                                                         TicksToCycles( vectorTime ) / LOOPCOUNT );
162
163     return 0;
164 }
165
166 static btVector3& v3cross_ref(btVector3& v1, btVector3& v2)
167 {
168         btScalar x,y,z;
169         x = v1.m_floats[1] * v2.m_floats[2] - v1.m_floats[2] * v2.m_floats[1];
170         y = v1.m_floats[2] * v2.m_floats[0] - v1.m_floats[0] * v2.m_floats[2];
171         z = v1.m_floats[0] * v2.m_floats[1] - v1.m_floats[1] * v2.m_floats[0];
172         
173         v1.m_floats[0] = x;
174         v1.m_floats[1] = y;
175         v1.m_floats[2] = z;
176         
177         return v1;
178 }
179
180
181 #endif //BT_USE_SSE