| 1516 | } |
| 1517 | |
| 1518 | BOOL LASquadtree::setup(F64 bb_min_x, F64 bb_max_x, F64 bb_min_y, F64 bb_max_y, F32 cell_size) |
| 1519 | { |
| 1520 | this->cell_size = cell_size; |
| 1521 | this->sub_level = 0; |
| 1522 | this->sub_level_index = 0; |
| 1523 | |
| 1524 | // enlarge bounding box to units of cells |
| 1525 | if (bb_min_x >= 0) min_x = cell_size*((I32)(bb_min_x/cell_size)); |
| 1526 | else min_x = cell_size*((I32)(bb_min_x/cell_size)-1); |
| 1527 | if (bb_max_x >= 0) max_x = cell_size*((I32)(bb_max_x/cell_size)+1); |
| 1528 | else max_x = cell_size*((I32)(bb_max_x/cell_size)); |
| 1529 | if (bb_min_y >= 0) min_y = cell_size*((I32)(bb_min_y/cell_size)); |
| 1530 | else min_y = cell_size*((I32)(bb_min_y/cell_size)-1); |
| 1531 | if (bb_max_y >= 0) max_y = cell_size*((I32)(bb_max_y/cell_size)+1); |
| 1532 | else max_y = cell_size*((I32)(bb_max_y/cell_size)); |
| 1533 | |
| 1534 | // how many cells minimally in each direction |
| 1535 | cells_x = U32_QUANTIZE((max_x - min_x)/cell_size); |
| 1536 | cells_y = U32_QUANTIZE((max_y - min_y)/cell_size); |
| 1537 | |
| 1538 | if (cells_x == 0 || cells_y == 0) |
| 1539 | { |
| 1540 | laserror("cells_x %d cells_y %d", cells_x, cells_y); |
| 1541 | return FALSE; |
| 1542 | } |
| 1543 | |
| 1544 | // how many quad tree levels to get to that many cells |
| 1545 | U32 c = ((cells_x > cells_y) ? cells_x - 1 : cells_y - 1); |
| 1546 | levels = 0; |
| 1547 | while (c) |
| 1548 | { |
| 1549 | c = c >> 1; |
| 1550 | levels++; |
| 1551 | } |
| 1552 | |
| 1553 | // enlarge bounding box to quad tree size |
| 1554 | U32 c1, c2; |
| 1555 | c = (1 << levels) - cells_x; |
| 1556 | c1 = c/2; |
| 1557 | c2 = c - c1; |
| 1558 | min_x -= (c2 * cell_size); |
| 1559 | max_x += (c1 * cell_size); |
| 1560 | c = (1 << levels) - cells_y; |
| 1561 | c1 = c/2; |
| 1562 | c2 = c - c1; |
| 1563 | min_y -= (c2 * cell_size); |
| 1564 | max_y += (c1 * cell_size); |
| 1565 | |
| 1566 | return TRUE; |
| 1567 | } |
| 1568 | |
| 1569 | BOOL LASquadtree::setup(F64 bb_min_x, F64 bb_max_x, F64 bb_min_y, F64 bb_max_y, F32 cell_size, F32 offset_x, F32 offset_y) |
| 1570 | { |
nothing calls this directly
no test coverage detected