static int is_box_in_frustum(float *bmin, float *bmax) { int i; for (i=0; i < 5; ++i) if (!test_plane(&frustum[i], bmin[0], bmin[1], bmin[2], bmax[0], bmax[1], bmax[2])) return 0; return 1; }
//perhaps in engine is better? void find_best_split_plane( const std::vector <face_t >& faces // ,std::vector <face_t >& front // ,std::vector <face_t >& back ) { //all time low score_t low={},s={}; low.score = 999999; //along planes, along edges... for ( size_t i = faces.size() ; i--; ) { face_t f = faces[i]; //xplane_t p = { f.a, f.normal() }; //test_plane(p, faces, s); //enum{ABC,AB,BC,CA}; vec3 N = f.normal(); plane_t planes[4] = { pmake( f.a, N), //this should always end up on front/front_on side pmake( f.a, vnormal(vcross( N, f.b - f.a ) ) ), pmake( f.b, vnormal(vcross( N, f.c - f.b ) ) ), pmake( f.c, vnormal(vcross( N, f.a - f.c ) ) ) }; //test planes for ( int j = 0; j < 4 ; ++j ) { test_plane( planes[j], faces, s); if( s.score < low.score ) low=s,low.face=i; } } //check score //use low.p to split front and backm or stop here if bad score //print printf( "\n\nBest plane for all %d\n", faces.size()); printf( "index %d\n", low.face); printf( "score = %d\n", low.score ); printf( "balance = %d\n", low.balance ); printf( "splits = %d\n", low.split ); printf( "coins = %d\n", low.coin ); printf( "front = %d\n", low.front ); printf( "back = %d\n", low.back ); printf( "plane = %f, %f, %f, %f\n", low.p.x,low.p.y,low.p.z,low.p.w ); }