| 2462 | } |
| 2463 | |
| 2464 | void check_ceiling() { |
| 2465 | vector hit_point; |
| 2466 | float cur_dist; |
| 2467 | |
| 2468 | vector face_normal = {0.0, -1.0, 0.0}; |
| 2469 | vector *vertex_ptr_list[4]; |
| 2470 | vector vlist[4]; |
| 2471 | int face_hit_type; |
| 2472 | vector wall_norm; |
| 2473 | vector colp; |
| 2474 | |
| 2475 | // Bail early if hitpnt is not high enough |
| 2476 | if (fvi_query_ptr->rad + fvi_hit_data_ptr->hit_pnt.y < CEILING_HEIGHT) |
| 2477 | return; |
| 2478 | |
| 2479 | vlist[0].x = 0.0; |
| 2480 | vlist[0].y = CEILING_HEIGHT; |
| 2481 | vlist[0].z = 0.0; |
| 2482 | vlist[1].x = TERRAIN_WIDTH * TERRAIN_SIZE; |
| 2483 | vlist[1].y = CEILING_HEIGHT; |
| 2484 | vlist[1].z = 0.0; |
| 2485 | vlist[2].x = TERRAIN_WIDTH * TERRAIN_SIZE; |
| 2486 | vlist[2].y = CEILING_HEIGHT; |
| 2487 | vlist[2].z = TERRAIN_DEPTH * TERRAIN_SIZE; |
| 2488 | vlist[3].x = 0.0; |
| 2489 | vlist[3].y = CEILING_HEIGHT; |
| 2490 | vlist[3].z = TERRAIN_DEPTH * TERRAIN_SIZE; |
| 2491 | |
| 2492 | vertex_ptr_list[0] = &vlist[0]; |
| 2493 | vertex_ptr_list[1] = &vlist[1]; |
| 2494 | vertex_ptr_list[2] = &vlist[2]; |
| 2495 | vertex_ptr_list[3] = &vlist[3]; |
| 2496 | |
| 2497 | // Did we hit this face? |
| 2498 | face_hit_type = check_line_to_face(&hit_point, &colp, &cur_dist, &wall_norm, fvi_query_ptr->p0, |
| 2499 | &fvi_hit_data_ptr->hit_pnt, &face_normal, vertex_ptr_list, 4, fvi_query_ptr->rad); |
| 2500 | |
| 2501 | if (face_hit_type) { |
| 2502 | if (cur_dist <= fvi_collision_dist) { |
| 2503 | if ((cur_dist < fvi_collision_dist) || !(fvi_query_ptr->flags & FQ_MULTI_POINT)) { |
| 2504 | fvi_hit_data_ptr->num_hits = 0; |
| 2505 | |
| 2506 | fvi_hit_data_ptr->hit_pnt = hit_point; |
| 2507 | fvi_collision_dist = cur_dist; |
| 2508 | compute_movement_AABB(); |
| 2509 | } else if (fvi_hit_data_ptr->num_hits == MAX_HITS) { |
| 2510 | goto ignore_hit; |
| 2511 | } |
| 2512 | |
| 2513 | fvi_hit_data_ptr->hit_type[fvi_hit_data_ptr->num_hits] = HIT_CEILING; |
| 2514 | fvi_hit_data_ptr->hit_wallnorm[fvi_hit_data_ptr->num_hits] = wall_norm; |
| 2515 | // fvi_hit_data_ptr->hit_seg = -1; -- set in the fvi_FindIntersection function |
| 2516 | fvi_hit_data_ptr->hit_object[fvi_hit_data_ptr->num_hits] = -1; |
| 2517 | fvi_hit_data_ptr->hit_face[fvi_hit_data_ptr->num_hits] = 0; |
| 2518 | fvi_hit_data_ptr->hit_face_room[fvi_hit_data_ptr->num_hits] = 0; |
| 2519 | fvi_hit_data_ptr->hit_face_pnt[fvi_hit_data_ptr->num_hits] = colp; |
| 2520 | |
| 2521 | fvi_hit_data_ptr->num_hits++; |
no test coverage detected