Details | Last modification | View Log | RSS feed
| Rev | Author | Line No. | Line |
|---|---|---|---|
| 1 | pmbaty | 1 | /* |
| 2 | * Portions of this file are copyright Rebirth contributors and licensed as |
||
| 3 | * described in COPYING.txt. |
||
| 4 | * Portions of this file are copyright Parallax Software and licensed |
||
| 5 | * according to the Parallax license below. |
||
| 6 | * See COPYING.txt for license details. |
||
| 7 | |||
| 8 | THE COMPUTER CODE CONTAINED HEREIN IS THE SOLE PROPERTY OF PARALLAX |
||
| 9 | SOFTWARE CORPORATION ("PARALLAX"). PARALLAX, IN DISTRIBUTING THE CODE TO |
||
| 10 | END-USERS, AND SUBJECT TO ALL OF THE TERMS AND CONDITIONS HEREIN, GRANTS A |
||
| 11 | ROYALTY-FREE, PERPETUAL LICENSE TO SUCH END-USERS FOR USE BY SUCH END-USERS |
||
| 12 | IN USING, DISPLAYING, AND CREATING DERIVATIVE WORKS THEREOF, SO LONG AS |
||
| 13 | SUCH USE, DISPLAY OR CREATION IS FOR NON-COMMERCIAL, ROYALTY OR REVENUE |
||
| 14 | FREE PURPOSES. IN NO EVENT SHALL THE END-USER USE THE COMPUTER CODE |
||
| 15 | CONTAINED HEREIN FOR REVENUE-BEARING PURPOSES. THE END-USER UNDERSTANDS |
||
| 16 | AND AGREES TO THE TERMS HEREIN AND ACCEPTS THE SAME BY USE OF THIS FILE. |
||
| 17 | COPYRIGHT 1993-1999 PARALLAX SOFTWARE CORPORATION. ALL RIGHTS RESERVED. |
||
| 18 | */ |
||
| 19 | |||
| 20 | /* |
||
| 21 | * |
||
| 22 | * Header for fvi.c |
||
| 23 | * |
||
| 24 | */ |
||
| 25 | |||
| 26 | #pragma once |
||
| 27 | |||
| 28 | #include "vecmat.h" |
||
| 29 | |||
| 30 | #ifdef __cplusplus |
||
| 31 | #include "dxxsconf.h" |
||
| 32 | #include "fwd-object.h" |
||
| 33 | #include "pack.h" |
||
| 34 | #include "countarray.h" |
||
| 35 | |||
| 36 | //return values for find_vector_intersection() - what did we hit? |
||
| 37 | #define HIT_NONE 0 //we hit nothing |
||
| 38 | #define HIT_WALL 1 //we hit - guess - a wall |
||
| 39 | #define HIT_OBJECT 2 //we hit an object - which one? no way to tell... |
||
| 40 | #define HIT_BAD_P0 3 //start point not is specified segment |
||
| 41 | |||
| 42 | #define MAX_FVI_SEGS 100 |
||
| 43 | |||
| 44 | //this data structure gets filled in by find_vector_intersection() |
||
| 45 | struct fvi_info : prohibit_void_ptr<fvi_info> |
||
| 46 | { |
||
| 47 | struct segment_array_t : public count_array_t<segnum_t, MAX_FVI_SEGS> {}; |
||
| 48 | int hit_type; //what sort of intersection |
||
| 49 | vms_vector hit_pnt; //where we hit |
||
| 50 | segnum_t hit_seg; //what segment hit_pnt is in |
||
| 51 | int hit_side; //if hit wall, which side |
||
| 52 | segnum_t hit_side_seg; //what segment the hit side is in |
||
| 53 | objnum_t hit_object; //if object hit, which object |
||
| 54 | vms_vector hit_wallnorm; //if hit wall, ptr to its surface normal |
||
| 55 | segment_array_t seglist; |
||
| 56 | }; |
||
| 57 | |||
| 58 | //flags for fvi query |
||
| 59 | #define FQ_CHECK_OBJS 1 //check against objects? |
||
| 60 | #define FQ_TRANSWALL 2 //go through transparent walls |
||
| 61 | #define FQ_TRANSPOINT 4 //go through trans wall if hit point is transparent |
||
| 62 | #define FQ_GET_SEGLIST 8 //build a list of segments |
||
| 63 | #define FQ_IGNORE_POWERUPS 16 //ignore powerups |
||
| 64 | |||
| 65 | #ifdef dsx |
||
| 66 | //this data contains the parms to fvi() |
||
| 67 | struct fvi_query : prohibit_void_ptr<fvi_query> |
||
| 68 | { |
||
| 69 | const vms_vector *p0,*p1; |
||
| 70 | segnum_t startseg; |
||
| 71 | objnum_t thisobjnum; |
||
| 72 | fix rad; |
||
| 73 | std::pair<const vcobjidx_t *, const vcobjidx_t *> ignore_obj_list; |
||
| 74 | int flags; |
||
| 75 | }; |
||
| 76 | |||
| 77 | struct fvi_hitpoint |
||
| 78 | { |
||
| 79 | fix u, v; |
||
| 80 | }; |
||
| 81 | |||
| 82 | //Find out if a vector intersects with anything. |
||
| 83 | //Fills in hit_data, an fvi_info structure (see above). |
||
| 84 | //Parms: |
||
| 85 | // p0 & startseg describe the start of the vector |
||
| 86 | // p1 the end of the vector |
||
| 87 | // rad the radius of the cylinder |
||
| 88 | // thisobjnum used to prevent an object with colliding with itself |
||
| 89 | // ingore_obj_list NULL, or ptr to a list of objnums to ignore, terminated with -1 |
||
| 90 | // check_obj_flag determines whether collisions with objects are checked |
||
| 91 | //Returns the hit_data->hit_type |
||
| 92 | int find_vector_intersection(const fvi_query &fq, fvi_info &hit_data); |
||
| 93 | |||
| 94 | //finds the uv coords of the given point on the given seg & side |
||
| 95 | //fills in u & v. if l is non-NULL fills it in also |
||
| 96 | namespace dsx { |
||
| 97 | __attribute_warn_unused_result |
||
| 98 | fvi_hitpoint find_hitpoint_uv(const vms_vector &pnt, const cscusegment seg, uint_fast32_t sidenum, uint_fast32_t facenum); |
||
| 99 | } |
||
| 100 | |||
| 101 | struct sphere_intersects_wall_result |
||
| 102 | { |
||
| 103 | const shared_segment *seg; |
||
| 104 | uint_fast32_t side; |
||
| 105 | }; |
||
| 106 | |||
| 107 | //Returns true if the object is through any walls |
||
| 108 | sphere_intersects_wall_result sphere_intersects_wall(fvcvertptr &vcvertptr, const vms_vector &pnt, vcsegptridx_t seg, fix rad); |
||
| 109 | #endif |
||
| 110 | |||
| 111 | #endif |