raytrace.h
上传用户:king477883
上传日期:2021-03-01
资源大小:9553k
文件大小:10k
源码类别:

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file raytrace.h
  3.  * @brief Ray intersection tests for primitives.
  4.  *
  5.  * $LicenseInfo:firstyear=2001&license=viewergpl$
  6.  * 
  7.  * Copyright (c) 2001-2010, Linden Research, Inc.
  8.  * 
  9.  * Second Life Viewer Source Code
  10.  * The source code in this file ("Source Code") is provided by Linden Lab
  11.  * to you under the terms of the GNU General Public License, version 2.0
  12.  * ("GPL"), unless you have obtained a separate licensing agreement
  13.  * ("Other License"), formally executed by you and Linden Lab.  Terms of
  14.  * the GPL can be found in doc/GPL-license.txt in this distribution, or
  15.  * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
  16.  * 
  17.  * There are special exceptions to the terms and conditions of the GPL as
  18.  * it is applied to this Source Code. View the full text of the exception
  19.  * in the file doc/FLOSS-exception.txt in this software distribution, or
  20.  * online at
  21.  * http://secondlifegrid.net/programs/open_source/licensing/flossexception
  22.  * 
  23.  * By copying, modifying or distributing this software, you acknowledge
  24.  * that you have read and understood your obligations described above,
  25.  * and agree to abide by those obligations.
  26.  * 
  27.  * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
  28.  * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
  29.  * COMPLETENESS OR PERFORMANCE.
  30.  * $/LicenseInfo$
  31.  */
  32. #ifndef LL_RAYTRACE_H
  33. #define LL_RAYTRACE_H
  34. class LLVector3;
  35. class LLQuaternion;
  36. // All functions produce results in the same reference frame as the arguments.
  37. //
  38. // Any arguments of the form "foo_direction" or "foo_normal" are assumed to
  39. // be normalized, or normalized vectors are stored in them.
  40. //
  41. // Vector arguments of the form "shape_scale" represent the scale of the
  42. // object along the three axes.
  43. //
  44. // All functions return the expected TRUE or FALSE, unless otherwise noted.
  45. // When FALSE is returned, any resulting values that might have been stored 
  46. // are undefined.
  47. //
  48. // Rays are defined by a "ray_point" and a "ray_direction" (unit).
  49. //
  50. // Lines are defined by a "line_point" and a "line_direction" (unit).
  51. //
  52. // Line segements are defined by "point_a" and "point_b", and for intersection
  53. // purposes are assumed to point from "point_a" to "point_b".
  54. //
  55. // A ray is different from a line in that it starts at a point and extends
  56. // in only one direction.
  57. //
  58. // Intersection normals always point outside the object, normal to the object's
  59. // surface at the point of intersection.
  60. //
  61. // Object rotations passed as quaternions are expected to rotate from the 
  62. // object's local frame to the absolute frame.  So, if "foo" is a vector in
  63. // the object's local frame, then "foo * object_rotation" is in the absolute
  64. // frame.
  65. // returns TRUE iff line is not parallel to plane.
  66. BOOL line_plane(const LLVector3 &line_point, const LLVector3 &line_direction, 
  67. const LLVector3 &plane_point, const LLVector3 plane_normal, 
  68. LLVector3 &intersection);
  69. // returns TRUE iff line is not parallel to plane.
  70. BOOL ray_plane(const LLVector3 &ray_point, const LLVector3 &ray_direction, 
  71.    const LLVector3 &plane_point, const LLVector3 plane_normal, 
  72.    LLVector3 &intersection);
  73. BOOL ray_circle(const LLVector3 &ray_point, const LLVector3 &ray_direction, 
  74. const LLVector3 &circle_center, const LLVector3 plane_normal, F32 circle_radius,
  75. LLVector3 &intersection);
  76. // point_0 through point_2 define the plane_normal via the right-hand rule:
  77. // circle from point_0 to point_2 with fingers ==> thumb points in direction of normal
  78. BOOL ray_triangle(const LLVector3 &ray_point, const LLVector3 &ray_direction, 
  79.   const LLVector3 &point_0, const LLVector3 &point_1, const LLVector3 &point_2, 
  80.   LLVector3 &intersection, LLVector3 &intersection_normal);
  81. // point_0 is the lower-left corner, point_1 is the lower-right, point_2 is the upper-right
  82. // right-hand-rule... curl fingers from lower-left toward lower-right then toward upper-right
  83. // ==> thumb points in direction of normal
  84. // assumes a parallelogram, so point_3 is determined by the other points
  85. BOOL ray_quadrangle(const LLVector3 &ray_point, const LLVector3 &ray_direction, 
  86. const LLVector3 &point_0, const LLVector3 &point_1, const LLVector3 &point_2, 
  87. LLVector3 &intersection, LLVector3 &intersection_normal);
  88. BOOL ray_sphere(const LLVector3 &ray_point, const LLVector3 &ray_direction,
  89. const LLVector3 &sphere_center, F32 sphere_radius,
  90. LLVector3 &intersection, LLVector3 &intersection_normal);
  91. // finite right cylinder is defined by end centers: "cyl_top", "cyl_bottom", 
  92. // and by the cylinder radius "cyl_radius"
  93. BOOL ray_cylinder(const LLVector3 &ray_point, const LLVector3 &ray_direction,
  94.           const LLVector3 &cyl_center, const LLVector3 &cyl_scale, const LLQuaternion &cyl_rotation,
  95.   LLVector3 &intersection, LLVector3 &intersection_normal);
  96. // this function doesn't just return a BOOL because the return is currently
  97. // used to decide how to break up boxes that have been hit by shots... 
  98. // a hack that will probably be changed later
  99. //
  100. // returns a number representing the side of the box that was hit by the ray,
  101. // or NO_SIDE if intersection test failed.
  102. U32 ray_box(const LLVector3 &ray_point, const LLVector3 &ray_direction,
  103.     const LLVector3 &box_center, const LLVector3 &box_scale, const LLQuaternion &box_rotation,
  104. LLVector3 &intersection, LLVector3 &intersection_normal);
  105. /* TODO
  106. BOOL ray_ellipsoid(const LLVector3 &ray_point, const LLVector3 &ray_direction,
  107.    const LLVector3 &e_center, const LLVector3 &e_scale, const LLQuaternion &e_rotation,
  108.    LLVector3 &intersection, LLVector3 &intersection_normal);
  109. BOOL ray_cone(const LLVector3 &ray_point, const LLVector3 &ray_direction,
  110.   const LLVector3 &cone_tip, const LLVector3 &cone_bottom, 
  111.   const LLVector3 &cone_scale, const LLQuaternion &cone_rotation,
  112.   LLVector3 &intersection, LLVector3 &intersection_normal);
  113. */
  114. BOOL ray_prism(const LLVector3 &ray_point, const LLVector3 &ray_direction,
  115.    const LLVector3 &prism_center, const LLVector3 &prism_scale, const LLQuaternion &prism_rotation,
  116.    LLVector3 &intersection, LLVector3 &intersection_normal);
  117. BOOL ray_tetrahedron(const LLVector3 &ray_point, const LLVector3 &ray_direction,
  118.  const LLVector3 &t_center, const LLVector3 &t_scale, const LLQuaternion &t_rotation,
  119.  LLVector3 &intersection, LLVector3 &intersection_normal);
  120. BOOL ray_pyramid(const LLVector3 &ray_point, const LLVector3 &ray_direction,
  121.  const LLVector3 &p_center, const LLVector3 &p_scale, const LLQuaternion &p_rotation,
  122.  LLVector3 &intersection, LLVector3 &intersection_normal);
  123. /* TODO
  124. BOOL ray_hemiellipsoid(const LLVector3 &ray_point, const LLVector3 &ray_direction,
  125.    const LLVector3 &e_center, const LLVector3 &e_scale, const LLQuaternion &e_rotation,
  126.    const LLVector3 &e_cut_normal,
  127.    LLVector3 &intersection, LLVector3 &intersection_normal);
  128. BOOL ray_hemisphere(const LLVector3 &ray_point, const LLVector3 &ray_direction,
  129. const LLVector3 &sphere_center, F32 sphere_radius, const LLVector3 &sphere_cut_normal, 
  130. LLVector3 &intersection, LLVector3 &intersection_normal);
  131. BOOL ray_hemicylinder(const LLVector3 &ray_point, const LLVector3 &ray_direction,
  132.   const LLVector3 &cyl_top, const LLVector3 &cyl_bottom, F32 cyl_radius, 
  133.   const LLVector3 &cyl_cut_normal,
  134.   LLVector3 &intersection, LLVector3 &intersection_normal);
  135. BOOL ray_hemicone(const LLVector3 &ray_point, const LLVector3 &ray_direction,
  136.   const LLVector3 &cone_tip, const LLVector3 &cone_bottom, 
  137.   const LLVector3 &cone_scale, const LLVector3 &cyl_cut_normal,
  138.   LLVector3 &intersection, LLVector3 &intersection_normal);
  139. */
  140. BOOL linesegment_circle(const LLVector3 &point_a, const LLVector3 &point_b, 
  141. const LLVector3 &circle_center, const LLVector3 plane_normal, F32 circle_radius,
  142. LLVector3 &intersection);
  143. // point_0 through point_2 define the plane_normal via the right-hand rule:
  144. // circle from point_0 to point_2 with fingers ==> thumb points in direction of normal
  145. BOOL linesegment_triangle(const LLVector3 &point_a, const LLVector3 &point_b, 
  146.   const LLVector3 &point_0, const LLVector3 &point_1, const LLVector3 &point_2, 
  147.   LLVector3 &intersection, LLVector3 &intersection_normal);
  148. // point_0 is the lower-left corner, point_1 is the lower-right, point_2 is the upper-right
  149. // right-hand-rule... curl fingers from lower-left toward lower-right then toward upper-right
  150. // ==> thumb points in direction of normal
  151. // assumes a parallelogram, so point_3 is determined by the other points
  152. BOOL linesegment_quadrangle(const LLVector3 &point_a, const LLVector3 &point_b, 
  153. const LLVector3 &point_0, const LLVector3 &point_1, const LLVector3 &point_2, 
  154. LLVector3 &intersection, LLVector3 &intersection_normal);
  155. BOOL linesegment_sphere(const LLVector3 &point_a, const LLVector3 &point_b,
  156. const LLVector3 &sphere_center, F32 sphere_radius,
  157. LLVector3 &intersection, LLVector3 &intersection_normal);
  158. // finite right cylinder is defined by end centers: "cyl_top", "cyl_bottom", 
  159. // and by the cylinder radius "cyl_radius"
  160. BOOL linesegment_cylinder(const LLVector3 &point_a, const LLVector3 &point_b,
  161.   const LLVector3 &cyl_center, const LLVector3 &cyl_scale, const LLQuaternion &cyl_rotation,
  162.   LLVector3 &intersection, LLVector3 &intersection_normal);
  163. // this function doesn't just return a BOOL because the return is currently
  164. // used to decide how to break up boxes that have been hit by shots... 
  165. // a hack that will probably be changed later
  166. //
  167. // returns a number representing the side of the box that was hit by the ray,
  168. // or NO_SIDE if intersection test failed.
  169. U32 linesegment_box(const LLVector3 &point_a, const LLVector3 &point_b, 
  170. const LLVector3 &box_center, const LLVector3 &box_scale, const LLQuaternion &box_rotation,
  171. LLVector3 &intersection, LLVector3 &intersection_normal);
  172. BOOL linesegment_prism(const LLVector3 &point_a, const LLVector3 &point_b,
  173.    const LLVector3 &prism_center, const LLVector3 &prism_scale, const LLQuaternion &prism_rotation,
  174.    LLVector3 &intersection, LLVector3 &intersection_normal);
  175. BOOL linesegment_tetrahedron(const LLVector3 &point_a, const LLVector3 &point_b,
  176.  const LLVector3 &t_center, const LLVector3 &t_scale, const LLQuaternion &t_rotation,
  177.  LLVector3 &intersection, LLVector3 &intersection_normal);
  178. BOOL linesegment_pyramid(const LLVector3 &point_a, const LLVector3 &point_b,
  179.  const LLVector3 &p_center, const LLVector3 &p_scale, const LLQuaternion &p_rotation,
  180.  LLVector3 &intersection, LLVector3 &intersection_normal);
  181. #endif