| 485 | } |
| 486 | |
| 487 | std::vector<int> Renderer::CullTrackBlocks(glm::vec3 oldWorldPosition, glm::vec3 worldPosition, int blockDrawDistance, |
| 488 | bool useNeighbourData) { |
| 489 | std::vector<int> activeTrackBlockIds; |
| 490 | |
| 491 | // Basic Geometry Cull |
| 492 | if ((oldWorldPosition.x != worldPosition.x) || (oldWorldPosition.z != worldPosition.z)) { |
| 493 | float lowestDistanceSqr = FLT_MAX; |
| 494 | //Primitive Draw distance |
| 495 | for (auto &track_block : track->track_blocks) { |
| 496 | float distanceSqr = glm::length2(glm::distance(worldPosition, track_block.center)); |
| 497 | if (distanceSqr < lowestDistanceSqr) { |
| 498 | closestBlockID = track_block.block_id; |
| 499 | lowestDistanceSqr = distanceSqr; |
| 500 | } |
| 501 | } |
| 502 | // If we have an NFS3 track loaded, use the provided neighbour data to work out which blocks to render |
| 503 | if ((track->tag == NFS_3 || track->tag == NFS_4) && useNeighbourData) { |
| 504 | for (int i = 0; i < 300; ++i) { |
| 505 | if (boost::get<shared_ptr<NFS3_4_DATA::TRACK>>(track->trackData)->trk[closestBlockID].nbdData[i].blk == |
| 506 | -1) { |
| 507 | break; |
| 508 | } else { |
| 509 | activeTrackBlockIds.emplace_back(boost::get<shared_ptr<NFS3_4_DATA::TRACK>>( |
| 510 | track->trackData)->trk[closestBlockID].nbdData[i].blk); |
| 511 | } |
| 512 | } |
| 513 | } else { |
| 514 | // Use a draw distance value to return closestBlock +- drawDistance inclusive blocks |
| 515 | int wrapBlocks = 0; |
| 516 | for (int block_Idx = closestBlockID - blockDrawDistance; |
| 517 | block_Idx < closestBlockID + blockDrawDistance; ++block_Idx) { |
| 518 | if (block_Idx < 0) { |
| 519 | int activeBlock = |
| 520 | ((int) track->track_blocks.size() + (closestBlockID - blockDrawDistance)) + wrapBlocks++; |
| 521 | activeTrackBlockIds.emplace_back(activeBlock); |
| 522 | } else { |
| 523 | activeTrackBlockIds.emplace_back(block_Idx % track->track_blocks.size()); |
| 524 | } |
| 525 | } |
| 526 | } |
| 527 | oldWorldPosition = worldPosition; |
| 528 | } |
| 529 | // Render far to near |
| 530 | return std::vector<int>(activeTrackBlockIds.rbegin(), activeTrackBlockIds.rend()); |
| 531 | } |
| 532 | |
| 533 | bool Renderer::DrawMenuBar() { |
| 534 | bool assetChange = false; |
nothing calls this directly
no outgoing calls
no test coverage detected