5 // Copyright (c) 2011 Apple Inc., Inc.
10 #include "LinearMath/btScalar.h"
11 #if defined (BT_USE_SSE_IN_API) || defined (BT_USE_NEON)
13 #include "Test_btDbvt.h"
20 #include <BulletCollision/BroadphaseCollision/btDbvt.h>
22 // reference code for testing purposes
23 SIMD_FORCE_INLINE bool Intersect_ref( btDbvtAabbMm& a, btDbvtAabbMm& b)
25 return( (a.tMins().x()<=b.tMaxs().x())&&
26 (a.tMaxs().x()>=b.tMins().x())&&
27 (a.tMins().y()<=b.tMaxs().y())&&
28 (a.tMaxs().y()>=b.tMins().y())&&
29 (a.tMins().z()<=b.tMaxs().z())&&
30 (a.tMaxs().z()>=b.tMins().z()));
35 SIMD_FORCE_INLINE btScalar Proximity_ref( btDbvtAabbMm& a,
38 const btVector3 d=(a.tMins()+a.tMaxs())-(b.tMins()+b.tMaxs());
39 return(btFabs(d.x())+btFabs(d.y())+btFabs(d.z()));
44 SIMD_FORCE_INLINE int Select_ref( btDbvtAabbMm& o,
48 return(Proximity_ref(o,a)<Proximity_ref(o,b)?0:1);
52 SIMD_FORCE_INLINE void Merge_ref( btDbvtAabbMm& a,
57 //Changing '3' into '4' to compare with the vector code which changes all 4 floats.
58 //Erwin: don't do this because the 4th component is ignore and not computed on non-vector code (there is no NEON version and scalar is just 3 components)
62 if(a.tMins().m_floats[i]<b.tMins().m_floats[i])
63 r.tMins().m_floats[i] = a.tMins().m_floats[i];
65 r.tMins().m_floats[i] = b.tMins().m_floats[i];
68 if(a.tMaxs().m_floats[i]>b.tMaxs().m_floats[i])
69 r.tMaxs().m_floats[i]=a.tMaxs().m_floats[i];
71 r.tMaxs().m_floats[i]=b.tMaxs().m_floats[i];
75 [0] float32_t 0.0318338
76 [1] float32_t 0.0309355
81 [1] float32_t 0.478779
82 [2] float32_t 0.833354
83 [3] float32_t 0.186335
85 [0] float32_t 0.242578
86 [1] float32_t 0.0134696
87 [2] float32_t 0.383139
88 [3] float32_t 0.414653
90 [0] float32_t 0.067769
91 [1] float32_t 0.993127
92 [2] float32_t 0.484308
93 [3] float32_t 0.765338
96 #define LOOPCOUNT 1000
97 #define NUM_CYCLES 10000
98 #define DATA_SIZE 1024
100 int Test_btDbvt(void)
102 btDbvtAabbMm a[DATA_SIZE], b[DATA_SIZE], c[DATA_SIZE];
103 btDbvtAabbMm a_ref[DATA_SIZE], b_ref[DATA_SIZE], c_ref[DATA_SIZE];
107 bool Intersect_Test_Res[DATA_SIZE], Intersect_Ref_Res[DATA_SIZE];
108 int Select_Test_Res[DATA_SIZE], Select_Ref_Res[DATA_SIZE];
111 for (i = 0; i < DATA_SIZE; i++)
113 a[i].tMins().m_floats[0] = (float)rand() / (float)RAND_MAX;
114 a[i].tMins().m_floats[1] = (float)rand() / (float)RAND_MAX;
115 a[i].tMins().m_floats[2] = (float)rand() / (float)RAND_MAX;
116 a[i].tMins().m_floats[3] = (float)rand() / (float)RAND_MAX;
118 a[i].tMaxs().m_floats[0] = (float)rand() / (float)RAND_MAX;
119 a[i].tMaxs().m_floats[1] = (float)rand() / (float)RAND_MAX;
120 a[i].tMaxs().m_floats[2] = (float)rand() / (float)RAND_MAX;
121 a[i].tMaxs().m_floats[3] = (float)rand() / (float)RAND_MAX;
123 b[i].tMins().m_floats[0] = (float)rand() / (float)RAND_MAX;
124 b[i].tMins().m_floats[1] = (float)rand() / (float)RAND_MAX;
125 b[i].tMins().m_floats[2] = (float)rand() / (float)RAND_MAX;
126 b[i].tMins().m_floats[3] = (float)rand() / (float)RAND_MAX;
128 b[i].tMaxs().m_floats[0] = (float)rand() / (float)RAND_MAX;
129 b[i].tMaxs().m_floats[1] = (float)rand() / (float)RAND_MAX;
130 b[i].tMaxs().m_floats[2] = (float)rand() / (float)RAND_MAX;
131 b[i].tMaxs().m_floats[3] = (float)rand() / (float)RAND_MAX;
133 c[i].tMins().m_floats[0] = (float)rand() / (float)RAND_MAX;
134 c[i].tMins().m_floats[1] = (float)rand() / (float)RAND_MAX;
135 c[i].tMins().m_floats[2] = (float)rand() / (float)RAND_MAX;
136 c[i].tMins().m_floats[3] = (float)rand() / (float)RAND_MAX;
138 c[i].tMaxs().m_floats[0] = (float)rand() / (float)RAND_MAX;
139 c[i].tMaxs().m_floats[1] = (float)rand() / (float)RAND_MAX;
140 c[i].tMaxs().m_floats[2] = (float)rand() / (float)RAND_MAX;
141 c[i].tMaxs().m_floats[3] = (float)rand() / (float)RAND_MAX;
144 a_ref[i].tMins().m_floats[0] = a[i].tMins().m_floats[0];
145 a_ref[i].tMins().m_floats[1] = a[i].tMins().m_floats[1];
146 a_ref[i].tMins().m_floats[2] = a[i].tMins().m_floats[2];
147 a_ref[i].tMins().m_floats[3] = a[i].tMins().m_floats[3];
149 a_ref[i].tMaxs().m_floats[0] = a[i].tMaxs().m_floats[0];
150 a_ref[i].tMaxs().m_floats[1] = a[i].tMaxs().m_floats[1];
151 a_ref[i].tMaxs().m_floats[2] = a[i].tMaxs().m_floats[2];
152 a_ref[i].tMaxs().m_floats[3] = a[i].tMaxs().m_floats[3];
154 b_ref[i].tMins().m_floats[0] = b[i].tMins().m_floats[0];
155 b_ref[i].tMins().m_floats[1] = b[i].tMins().m_floats[1];
156 b_ref[i].tMins().m_floats[2] = b[i].tMins().m_floats[2];
157 b_ref[i].tMins().m_floats[3] = b[i].tMins().m_floats[3];
159 b_ref[i].tMaxs().m_floats[0] = b[i].tMaxs().m_floats[0];
160 b_ref[i].tMaxs().m_floats[1] = b[i].tMaxs().m_floats[1];
161 b_ref[i].tMaxs().m_floats[2] = b[i].tMaxs().m_floats[2];
162 b_ref[i].tMaxs().m_floats[3] = b[i].tMaxs().m_floats[3];
164 c_ref[i].tMins().m_floats[0] = c[i].tMins().m_floats[0];
165 c_ref[i].tMins().m_floats[1] = c[i].tMins().m_floats[1];
166 c_ref[i].tMins().m_floats[2] = c[i].tMins().m_floats[2];
167 c_ref[i].tMins().m_floats[3] = c[i].tMins().m_floats[3];
169 c_ref[i].tMaxs().m_floats[0] = c[i].tMaxs().m_floats[0];
170 c_ref[i].tMaxs().m_floats[1] = c[i].tMaxs().m_floats[1];
171 c_ref[i].tMaxs().m_floats[2] = c[i].tMaxs().m_floats[2];
172 c_ref[i].tMaxs().m_floats[3] = c[i].tMaxs().m_floats[3];
178 for (i = 0; i < DATA_SIZE; i++)
181 Intersect_Test_Res[i] = Intersect(a[i], b[i]);
182 Intersect_Ref_Res[i] = Intersect_ref(a_ref[i], b_ref[i]);
184 if(Intersect_Test_Res[i] != Intersect_Ref_Res[i])
186 printf("Diff on %d\n", i);
188 printf("a_mx_f[0] = %.3f, a_mx_f[1] = %.3f, a_mx_f[2] = %.3f, a_mx_f[3] = %.3f\n", a[i].tMaxs().m_floats[0], a[i].tMaxs().m_floats[1], a[i].tMaxs().m_floats[2], a[i].tMaxs().m_floats[3]);
189 printf("a_mi_f[0] = %.3f, a_mi_f[1] = %.3f, a_mi_f[2] = %.3f, a_mi_f[3] = %.3f\n", a[i].tMins().m_floats[0], a[i].tMins().m_floats[1], a[i].tMins().m_floats[2], a[i].tMins().m_floats[3]);
190 printf("b_mx_f[0] = %.3f, b_mx_f[1] = %.3f, b_mx_f[2] = %.3f, b_mx_f[3] = %.3f\n", b[i].tMaxs().m_floats[0], b[i].tMaxs().m_floats[1], b[i].tMaxs().m_floats[2], b[i].tMaxs().m_floats[3]);
191 printf("b_mi_f[0] = %.3f, b_mi_f[1] = %.3f, b_mi_f[2] = %.3f, b_mi_f[3] = %.3f\n", b[i].tMins().m_floats[0], b[i].tMins().m_floats[1], b[i].tMins().m_floats[2], b[i].tMins().m_floats[3]);
193 printf("a_mx_f_ref[0] = %.3f, a_mx_f_ref[1] = %.3f, a_mx_f_ref[2] = %.3f, a_mx_f_ref[3] = %.3f\n", a_ref[i].tMaxs().m_floats[0], a_ref[i].tMaxs().m_floats[1], a_ref[i].tMaxs().m_floats[2], a_ref[i].tMaxs().m_floats[3]);
194 printf("a_mi_f_ref[0] = %.3f, a_mi_f_ref[1] = %.3f, a_mi_f_ref[2] = %.3f, a_mi_f_ref[3] = %.3f\n", a_ref[i].tMins().m_floats[0], a_ref[i].tMins().m_floats[1], a_ref[i].tMins().m_floats[2], a_ref[i].tMins().m_floats[3]);
195 printf("b_mx_f_ref[0] = %.3f, b_mx_f_ref[1] = %.3f, b_mx_f_ref[2] = %.3f, b_mx_f_ref[3] = %.3f\n", b_ref[i].tMaxs().m_floats[0], b_ref[i].tMaxs().m_floats[1], b_ref[i].tMaxs().m_floats[2], b_ref[i].tMaxs().m_floats[3]);
196 printf("b_mi_f_ref[0] = %.3f, b_mi_f_ref[1] = %.3f, b_mi_f_ref[2] = %.3f, b_mi_f_ref[3] = %.3f\n", b_ref[i].tMins().m_floats[0], b_ref[i].tMins().m_floats[1], b_ref[i].tMins().m_floats[2], b_ref[i].tMins().m_floats[3]);
206 ////////////////////////////////////
208 // Time and Test Intersect
210 ////////////////////////////////////
212 uint64_t startTime, bestTime, currentTime;
216 for (j = 0; j < NUM_CYCLES; j++)
218 startTime = ReadTicks();
221 for (i = 0; i < DATA_SIZE; i++)
223 Intersect_Ref_Res[i] = Intersect_ref(a_ref[i], b_ref[i]);
226 currentTime = ReadTicks() - startTime;
227 scalarTime += currentTime;
228 if( currentTime < bestTime )
229 bestTime = currentTime;
231 if( 0 == gReportAverageTimes )
232 scalarTime = bestTime;
234 scalarTime /= NUM_CYCLES;
238 uint64_t startTime, bestTime, currentTime;
242 for (j = 0; j < NUM_CYCLES; j++)
244 startTime = ReadTicks();
246 for (i = 0; i < DATA_SIZE; i++)
248 Intersect_Test_Res[i] = Intersect(a[i], b[i]);
251 currentTime = ReadTicks() - startTime;
252 vectorTime += currentTime;
253 if( currentTime < bestTime )
254 bestTime = currentTime;
256 if( 0 == gReportAverageTimes )
257 vectorTime = bestTime;
259 vectorTime /= NUM_CYCLES;
262 vlog( "Intersect Timing:\n" );
263 vlog( " \t scalar\t vector\n" );
264 vlog( " \t%10.4f\t%10.4f\n", TicksToCycles( scalarTime ) / LOOPCOUNT, TicksToCycles( vectorTime ) / LOOPCOUNT );
266 //printf("scalar = %llu, vector = %llu\n", scalarTime, vectorTime);
268 for (i = 0; i < DATA_SIZE; i++)
270 if(Intersect_Test_Res[i] != Intersect_Ref_Res[i])
272 printf("Intersect fail at %d\n", i);
277 ////////////////////////////////////
279 // Time and Test Merge
281 ////////////////////////////////////
283 uint64_t startTime, bestTime, currentTime;
287 for (j = 0; j < NUM_CYCLES; j++)
289 startTime = ReadTicks();
292 for (i = 0; i < DATA_SIZE; i++)
294 Merge_ref(a_ref[i], b_ref[i], c_ref[i]);
297 currentTime = ReadTicks() - startTime;
298 scalarTime += currentTime;
299 if( currentTime < bestTime )
300 bestTime = currentTime;
302 if( 0 == gReportAverageTimes )
303 scalarTime = bestTime;
305 scalarTime /= NUM_CYCLES;
310 uint64_t startTime, bestTime, currentTime;
314 for (j = 0; j < NUM_CYCLES; j++)
316 startTime = ReadTicks();
318 for (i = 0; i < DATA_SIZE; i++)
320 Merge(a[i], b[i], c[i]);
323 currentTime = ReadTicks() - startTime;
324 vectorTime += currentTime;
325 if( currentTime < bestTime )
326 bestTime = currentTime;
328 if( 0 == gReportAverageTimes )
329 vectorTime = bestTime;
331 vectorTime /= NUM_CYCLES;
334 vlog( "Merge Timing:\n" );
335 vlog( " \t scalar\t vector\n" );
336 vlog( " \t%10.4f\t%10.4f\n", TicksToCycles( scalarTime ) / LOOPCOUNT, TicksToCycles( vectorTime ) / LOOPCOUNT );
338 //printf("scalar = %llu, vector = %llu\n", scalarTime, vectorTime);
340 c [0] float32_t 0.00455523
341 [1] float32_t 0.559712
342 [2] float32_t 0.0795838
343 [3] float32_t 0.10182
346 [0] float32_t 0.00455523
347 [1] float32_t 0.559712
348 [2] float32_t 0.0795838
349 [3] float32_t 0.552081
352 c [0] float32_t 0.829904
353 [1] float32_t 0.692891
354 [2] float32_t 0.961654
355 [3] float32_t 0.666956
358 [0] float32_t 0.829904
359 [1] float32_t 0.692891
360 [2] float32_t 0.961654
361 [3] float32_t 0.522878
363 for (i = 0; i < DATA_SIZE; i++)
365 //ignore 4th component because it is not computed in all code-paths
366 if( (fabs(c[i].tMaxs().m_floats[0] - c_ref[i].tMaxs().m_floats[0]) > 0.001) ||
367 (fabs(c[i].tMaxs().m_floats[1] - c_ref[i].tMaxs().m_floats[1]) > 0.001) ||
368 (fabs(c[i].tMaxs().m_floats[2] - c_ref[i].tMaxs().m_floats[2]) > 0.001) ||
369 // (fabs(c[i].tMaxs().m_floats[3] - c_ref[i].tMaxs().m_floats[3]) > 0.001) ||
370 (fabs(c[i].tMins().m_floats[0] - c_ref[i].tMins().m_floats[0]) > 0.001) ||
371 (fabs(c[i].tMins().m_floats[1] - c_ref[i].tMins().m_floats[1]) > 0.001) ||
372 (fabs(c[i].tMins().m_floats[2] - c_ref[i].tMins().m_floats[2]) > 0.001)
373 //|| (fabs(c[i].tMins().m_floats[3] - c_ref[i].tMins().m_floats[3]) > 0.001)
377 //if((c[i].tMaxs().m_floats[0] != c_ref[i].tMaxs().m_floats[0]) || (c[i].tMaxs().m_floats[1] != c_ref[i].tMaxs().m_floats[1]) || (c[i].tMaxs().m_floats[2] != c_ref[i].tMaxs().m_floats[2]) || (c[i].tMaxs().m_floats[3] != c_ref[i].tMaxs().m_floats[3]) || (c[i].tMins().m_floats[0] != c_ref[i].tMins().m_floats[0]) || (c[i].tMins().m_floats[1] != c_ref[i].tMins().m_floats[1]) || (c[i].tMins().m_floats[2] != c_ref[i].tMins().m_floats[2]) || (c[i].tMins().m_floats[3] != c_ref[i].tMins().m_floats[3]))
379 printf("Merge fail at %d with test = %d, ref = %d\n", i, Select_Test_Res[i], Select_Ref_Res[i]);
381 printf("a_mx_f[0] = %.3f, a_mx_f[1] = %.3f, a_mx_f[2] = %.3f, a_mx_f[3] = %.3f\n", a[i].tMaxs().m_floats[0], a[i].tMaxs().m_floats[1], a[i].tMaxs().m_floats[2], a[i].tMaxs().m_floats[3]);
382 printf("a_mi_f[0] = %.3f, a_mi_f[1] = %.3f, a_mi_f[2] = %.3f, a_mi_f[3] = %.3f\n", a[i].tMins().m_floats[0], a[i].tMins().m_floats[1], a[i].tMins().m_floats[2], a[i].tMins().m_floats[3]);
383 printf("b_mx_f[0] = %.3f, b_mx_f[1] = %.3f, b_mx_f[2] = %.3f, b_mx_f[3] = %.3f\n", b[i].tMaxs().m_floats[0], b[i].tMaxs().m_floats[1], b[i].tMaxs().m_floats[2], b[i].tMaxs().m_floats[3]);
384 printf("b_mi_f[0] = %.3f, b_mi_f[1] = %.3f, b_mi_f[2] = %.3f, b_mi_f[3] = %.3f\n", b[i].tMins().m_floats[0], b[i].tMins().m_floats[1], b[i].tMins().m_floats[2], b[i].tMins().m_floats[3]);
385 printf("c_mx_f[0] = %.3f, c_mx_f[1] = %.3f, c_mx_f[2] = %.3f, c_mx_f[3] = %.3f\n", c[i].tMaxs().m_floats[0], c[i].tMaxs().m_floats[1], c[i].tMaxs().m_floats[2], c[i].tMaxs().m_floats[3]);
386 printf("c_mi_f[0] = %.3f, c_mi_f[1] = %.3f, c_mi_f[2] = %.3f, c_mi_f[3] = %.3f\n", c[i].tMins().m_floats[0], c[i].tMins().m_floats[1], c[i].tMins().m_floats[2], c[i].tMins().m_floats[3]);
388 printf("a_mx_f_ref[0] = %.3f, a_mx_f_ref[1] = %.3f, a_mx_f_ref[2] = %.3f, a_mx_f_ref[3] = %.3f\n", a_ref[i].tMaxs().m_floats[0], a_ref[i].tMaxs().m_floats[1], a_ref[i].tMaxs().m_floats[2], a_ref[i].tMaxs().m_floats[3]);
389 printf("a_mi_f_ref[0] = %.3f, a_mi_f_ref[1] = %.3f, a_mi_f_ref[2] = %.3f, a_mi_f_ref[3] = %.3f\n", a_ref[i].tMins().m_floats[0], a_ref[i].tMins().m_floats[1], a_ref[i].tMins().m_floats[2], a_ref[i].tMins().m_floats[3]);
390 printf("b_mx_f_ref[0] = %.3f, b_mx_f_ref[1] = %.3f, b_mx_f_ref[2] = %.3f, b_mx_f_ref[3] = %.3f\n", b_ref[i].tMaxs().m_floats[0], b_ref[i].tMaxs().m_floats[1], b_ref[i].tMaxs().m_floats[2], b_ref[i].tMaxs().m_floats[3]);
391 printf("b_mi_f_ref[0] = %.3f, b_mi_f_ref[1] = %.3f, b_mi_f_ref[2] = %.3f, b_mi_f_ref[3] = %.3f\n", b_ref[i].tMins().m_floats[0], b_ref[i].tMins().m_floats[1], b_ref[i].tMins().m_floats[2], b_ref[i].tMins().m_floats[3]);
392 printf("c_mx_f_ref[0] = %.3f, c_mx_f_ref[1] = %.3f, c_mx_f_ref[2] = %.3f, c_mx_f_ref[3] = %.3f\n", c_ref[i].tMaxs().m_floats[0], c_ref[i].tMaxs().m_floats[1], c_ref[i].tMaxs().m_floats[2], c_ref[i].tMaxs().m_floats[3]);
393 printf("c_mi_f_ref[0] = %.3f, c_mi_f_ref[1] = %.3f, c_mi_f_ref[2] = %.3f, c_mi_f_ref[3] = %.3f\n", c_ref[i].tMins().m_floats[0], c_ref[i].tMins().m_floats[1], c_ref[i].tMins().m_floats[2], c_ref[i].tMins().m_floats[3]);
400 ////////////////////////////////////
402 // Time and Test Select
404 ////////////////////////////////////
406 uint64_t startTime, bestTime, currentTime;
410 for (j = 0; j < NUM_CYCLES; j++)
412 startTime = ReadTicks();
415 for (i = 0; i < DATA_SIZE; i++)
417 Select_Ref_Res[i] = Select_ref(a_ref[i], b_ref[i], c_ref[i]);
420 currentTime = ReadTicks() - startTime;
421 scalarTime += currentTime;
422 if( currentTime < bestTime )
423 bestTime = currentTime;
425 if( 0 == gReportAverageTimes )
426 scalarTime = bestTime;
428 scalarTime /= NUM_CYCLES;
432 uint64_t startTime, bestTime, currentTime;
436 for (j = 0; j < NUM_CYCLES; j++)
438 startTime = ReadTicks();
440 for (i = 0; i < DATA_SIZE; i++)
442 Select_Test_Res[i] = Select(a[i], b[i], c[i]);
445 currentTime = ReadTicks() - startTime;
446 vectorTime += currentTime;
447 if( currentTime < bestTime )
448 bestTime = currentTime;
450 if( 0 == gReportAverageTimes )
451 vectorTime = bestTime;
453 vectorTime /= NUM_CYCLES;
456 vlog( "Select Timing:\n" );
457 vlog( " \t scalar\t vector\n" );
458 vlog( " \t%10.4f\t%10.4f\n", TicksToCycles( scalarTime ) / LOOPCOUNT, TicksToCycles( vectorTime ) / LOOPCOUNT );
460 //printf("scalar = %llu, vector = %llu\n", scalarTime, vectorTime);
462 for (i = 0; i < DATA_SIZE; i++)
464 Select_Ref_Res[i] = Select_ref(a_ref[i], b_ref[i], c_ref[i]);
465 Select_Test_Res[i] = Select(a[i], b[i], c[i]);
467 if(Select_Test_Res[i] != Select_Ref_Res[i])
469 printf("Select fail at %d with test = %d, ref = %d\n", i, Select_Test_Res[i], Select_Ref_Res[i]);
471 printf("a_mx_f[0] = %.3f, a_mx_f[1] = %.3f, a_mx_f[2] = %.3f, a_mx_f[3] = %.3f\n", a[i].tMaxs().m_floats[0], a[i].tMaxs().m_floats[1], a[i].tMaxs().m_floats[2], a[i].tMaxs().m_floats[3]);
472 printf("a_mi_f[0] = %.3f, a_mi_f[1] = %.3f, a_mi_f[2] = %.3f, a_mi_f[3] = %.3f\n", a[i].tMins().m_floats[0], a[i].tMins().m_floats[1], a[i].tMins().m_floats[2], a[i].tMins().m_floats[3]);
473 printf("b_mx_f[0] = %.3f, b_mx_f[1] = %.3f, b_mx_f[2] = %.3f, b_mx_f[3] = %.3f\n", b[i].tMaxs().m_floats[0], b[i].tMaxs().m_floats[1], b[i].tMaxs().m_floats[2], b[i].tMaxs().m_floats[3]);
474 printf("b_mi_f[0] = %.3f, b_mi_f[1] = %.3f, b_mi_f[2] = %.3f, b_mi_f[3] = %.3f\n", b[i].tMins().m_floats[0], b[i].tMins().m_floats[1], b[i].tMins().m_floats[2], b[i].tMins().m_floats[3]);
475 printf("c_mx_f[0] = %.3f, c_mx_f[1] = %.3f, c_mx_f[2] = %.3f, c_mx_f[3] = %.3f\n", c[i].tMaxs().m_floats[0], c[i].tMaxs().m_floats[1], c[i].tMaxs().m_floats[2], c[i].tMaxs().m_floats[3]);
476 printf("c_mi_f[0] = %.3f, c_mi_f[1] = %.3f, c_mi_f[2] = %.3f, c_mi_f[3] = %.3f\n", c[i].tMins().m_floats[0], c[i].tMins().m_floats[1], c[i].tMins().m_floats[2], c[i].tMins().m_floats[3]);
478 printf("a_mx_f_ref[0] = %.3f, a_mx_f_ref[1] = %.3f, a_mx_f_ref[2] = %.3f, a_mx_f_ref[3] = %.3f\n", a_ref[i].tMaxs().m_floats[0], a_ref[i].tMaxs().m_floats[1], a_ref[i].tMaxs().m_floats[2], a_ref[i].tMaxs().m_floats[3]);
479 printf("a_mi_f_ref[0] = %.3f, a_mi_f_ref[1] = %.3f, a_mi_f_ref[2] = %.3f, a_mi_f_ref[3] = %.3f\n", a_ref[i].tMins().m_floats[0], a_ref[i].tMins().m_floats[1], a_ref[i].tMins().m_floats[2], a_ref[i].tMins().m_floats[3]);
480 printf("b_mx_f_ref[0] = %.3f, b_mx_f_ref[1] = %.3f, b_mx_f_ref[2] = %.3f, b_mx_f_ref[3] = %.3f\n", b_ref[i].tMaxs().m_floats[0], b_ref[i].tMaxs().m_floats[1], b_ref[i].tMaxs().m_floats[2], b_ref[i].tMaxs().m_floats[3]);
481 printf("b_mi_f_ref[0] = %.3f, b_mi_f_ref[1] = %.3f, b_mi_f_ref[2] = %.3f, b_mi_f_ref[3] = %.3f\n", b_ref[i].tMins().m_floats[0], b_ref[i].tMins().m_floats[1], b_ref[i].tMins().m_floats[2], b_ref[i].tMins().m_floats[3]);
482 printf("c_mx_f_ref[0] = %.3f, c_mx_f_ref[1] = %.3f, c_mx_f_ref[2] = %.3f, c_mx_f_ref[3] = %.3f\n", c_ref[i].tMaxs().m_floats[0], c_ref[i].tMaxs().m_floats[1], c_ref[i].tMaxs().m_floats[2], c_ref[i].tMaxs().m_floats[3]);
483 printf("c_mi_f_ref[0] = %.3f, c_mi_f_ref[1] = %.3f, c_mi_f_ref[2] = %.3f, c_mi_f_ref[3] = %.3f\n", c_ref[i].tMins().m_floats[0], c_ref[i].tMins().m_floats[1], c_ref[i].tMins().m_floats[2], c_ref[i].tMins().m_floats[3]);