Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- hyp = (viewx==curline->v1->x && viewy==curline->v1->y)?
- 0 : R_PointToDist (curline->v1->x, curline->v1->y);
- // if wall is horizontal or vertical, finding the distance to it is trivial
- if (curline->v1->y == curline->v2->y)
- rw_distance = D_abs(viewy - curline->v1->y);
- else if (curline->v1->x == curline->v2->x)
- rw_distance = D_abs(viewx - curline->v1->x);
- else
- {
- fixed_t sineval = finecosine[offsetangle >> ANGLETOFINESHIFT];
- // use old code for short walls and for walls that arent too oblique
- if (hyp < 1024 << FRACBITS && sineval > 2000)
- {
- rw_distance = FixedMul(hyp, sineval);
- }
- else
- {
- int_64_t a, c;
- fixed_t dx, dy;
- fixed_t rwd_x_offset, rwd_y_offset;
- fixed_t recentered_v1x, recentered_v1y, recentered_v2x, recentered_v2y;
- const int bb = 11;
- recentered_v1x = (curline->v1->x - viewx) >> bb;
- recentered_v1y = (curline->v1->y - viewy) >> bb;
- recentered_v2x = (curline->v2->x - viewx) >> bb;
- recentered_v2y = (curline->v2->y - viewy) >> bb;
- dx = recentered_v2x - recentered_v1x;
- dy = recentered_v2y - recentered_v1y;
- a = (int_64_t)recentered_v1x * recentered_v2y - (int_64_t)recentered_v1y * recentered_v2x;
- c = (int_64_t)dx * dx + (int_64_t)dy * dy;
- if (!c)
- c = 1; // just in case
- rwd_x_offset = ((fixed_t)(a * (-dy) / c)) << bb;
- rwd_y_offset = ((fixed_t)(a * ( dx) / c)) << bb;
- if (!rwd_x_offset && !rwd_y_offset)
- rw_distance = 0;
- else
- rw_distance = R_PointToDist(viewx + rwd_x_offset, viewy + rwd_y_offset);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment