Will be explained in upcoming video...
| 606 | |
| 607 | // Will be explained in upcoming video... |
| 608 | bool olc::rcw::Engine::CastRayDDA(const olc::vf2d& vOrigin, const olc::vf2d& vDirection, sTileHit& hit) |
| 609 | { |
| 610 | olc::vf2d vRayDelta = { sqrt(1 + (vDirection.y / vDirection.x) * (vDirection.y / vDirection.x)), sqrt(1 + (vDirection.x / vDirection.y) * (vDirection.x / vDirection.y)) }; |
| 611 | |
| 612 | olc::vi2d vMapCheck = vOrigin; |
| 613 | olc::vf2d vSideDistance; |
| 614 | olc::vi2d vStepDistance; |
| 615 | |
| 616 | if (vDirection.x < 0) |
| 617 | { |
| 618 | vStepDistance.x = -1; |
| 619 | vSideDistance.x = (vOrigin.x - (float)vMapCheck.x) * vRayDelta.x; |
| 620 | } |
| 621 | else |
| 622 | { |
| 623 | vStepDistance.x = 1; |
| 624 | vSideDistance.x = ((float)vMapCheck.x + 1.0f - vOrigin.x) * vRayDelta.x; |
| 625 | } |
| 626 | |
| 627 | if (vDirection.y < 0) |
| 628 | { |
| 629 | vStepDistance.y = -1; |
| 630 | vSideDistance.y = (vOrigin.y - (float)vMapCheck.y) * vRayDelta.y; |
| 631 | } |
| 632 | else |
| 633 | { |
| 634 | vStepDistance.y = 1; |
| 635 | vSideDistance.y = ((float)vMapCheck.y + 1.0f - vOrigin.y) * vRayDelta.y; |
| 636 | } |
| 637 | |
| 638 | olc::vf2d vIntersection; |
| 639 | olc::vi2d vHitTile; |
| 640 | float fMaxDistance = 100.0f; |
| 641 | float fDistance = 0.0f; |
| 642 | bool bTileFound = false; |
| 643 | while (!bTileFound && fDistance < fMaxDistance) |
| 644 | { |
| 645 | if (vSideDistance.x < vSideDistance.y) |
| 646 | { |
| 647 | vSideDistance.x += vRayDelta.x; |
| 648 | vMapCheck.x += vStepDistance.x; |
| 649 | } |
| 650 | else |
| 651 | { |
| 652 | vSideDistance.y += vRayDelta.y; |
| 653 | vMapCheck.y += vStepDistance.y; |
| 654 | } |
| 655 | |
| 656 | olc::vf2d rayDist = { (float)vMapCheck.x - vOrigin.x, (float)vMapCheck.y - vOrigin.y }; |
| 657 | fDistance = rayDist.mag(); |
| 658 | |
| 659 | |
| 660 | if (IsLocationSolid(float(vMapCheck.x), float(vMapCheck.y))) |
| 661 | { |
| 662 | vHitTile = vMapCheck; |
| 663 | bTileFound = true; |
| 664 | |
| 665 | hit.vTilePos = vMapCheck; |