Subversion Repositories Games.Descent

Rev

Blame | Last modification | View Log | Download | RSS feed

  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
  112.