From 32c7214f5ab7eb37ce36ce0897186a3d465becdf Mon Sep 17 00:00:00 2001 From: Kp Date: Sat, 5 Dec 2015 22:57:23 +0000 Subject: [PATCH] Add vecmat forward declaration header --- common/include/fwd-vecmat.h | 92 +++++++++++++++++++++++ common/include/vecmat.h | 142 +----------------------------------- 2 files changed, 93 insertions(+), 141 deletions(-) create mode 100644 common/include/fwd-vecmat.h diff --git a/common/include/fwd-vecmat.h b/common/include/fwd-vecmat.h new file mode 100644 index 000000000..0cc044dfd --- /dev/null +++ b/common/include/fwd-vecmat.h @@ -0,0 +1,92 @@ +/* + * Portions of this file are copyright Rebirth contributors and licensed as + * described in COPYING.txt. + */ + +#pragma once + +#include "maths.h" +#include "dxxsconf.h" + +struct vms_vector; +class vm_distance_squared; + +class vm_distance; +class vm_magnitude; +class vm_distance_squared; +class vm_magnitude_squared; +struct vms_angvec; +struct vms_matrix; +struct vms_quaternion; + +extern const vms_matrix vmd_identity_matrix; + +#define IDENTITY_MATRIX { {f1_0,0,0}, {0,f1_0,0}, {0,0,f1_0} } + +vms_vector &vm_vec_add (vms_vector &dest, const vms_vector &src0, const vms_vector &src1); + +vms_vector &_vm_vec_sub(vms_vector &dest, const vms_vector &src0, const vms_vector &src1); +void vm_vec_add2 (vms_vector &dest, const vms_vector &src); +void vm_vec_sub2 (vms_vector &dest, const vms_vector &src); +void vm_vec_avg (vms_vector &dest, const vms_vector &src0, const vms_vector &src1); +vms_vector &vm_vec_scale (vms_vector &dest, fix s); +void vm_vec_divide(vms_vector &dest, const vms_vector &src, fix d); + +#define vm_vec_copy_scale(A,B,...) vm_vec_copy_scale(A, ## __VA_ARGS__, B) +vms_vector &vm_vec_copy_scale (vms_vector &dest, const vms_vector &src, fix s); +void vm_vec_scale_add (vms_vector &dest, const vms_vector &src1, const vms_vector &src2, fix k); +void vm_vec_scale_add2 (vms_vector &dest, const vms_vector &src, fix k); +void vm_vec_scale2 (vms_vector &dest, fix n, fix d); + +__attribute_warn_unused_result +vm_magnitude_squared vm_vec_mag2(const vms_vector &v); +__attribute_warn_unused_result +vm_magnitude vm_vec_mag(const vms_vector &v); + +__attribute_warn_unused_result +vm_distance vm_vec_dist(const vms_vector &v0, const vms_vector &v1); +__attribute_warn_unused_result +vm_distance_squared vm_vec_dist2(const vms_vector &v0, const vms_vector &v1); + +__attribute_warn_unused_result +vm_magnitude vm_vec_mag_quick(const vms_vector &v); + +__attribute_warn_unused_result +vm_distance vm_vec_dist_quick(const vms_vector &v0, const vms_vector &v1); + +__attribute_warn_unused_result +vm_magnitude vm_vec_copy_normalize(vms_vector &dest, const vms_vector &src); + +vm_magnitude vm_vec_normalize(vms_vector &v); + +vm_magnitude vm_vec_copy_normalize_quick(vms_vector &dest, const vms_vector &src); + +vm_magnitude vm_vec_normalize_quick(vms_vector &v); +vm_magnitude vm_vec_normalized_dir (vms_vector &dest, const vms_vector &end, const vms_vector &start); +vm_magnitude vm_vec_normalized_dir_quick (vms_vector &dest, const vms_vector &end, const vms_vector &start); + +__attribute_warn_unused_result +fix vm_vec_dot (const vms_vector &v0, const vms_vector &v1); + +void vm_vec_cross (vms_vector &dest, const vms_vector &src0, const vms_vector &src1); + +void vm_vec_normal (vms_vector &dest, const vms_vector &p0, const vms_vector &p1, const vms_vector &p2); + +void vm_vec_perp (vms_vector &dest, const vms_vector &p0, const vms_vector &p1, const vms_vector &p2); +fixang vm_vec_delta_ang (const vms_vector &v0, const vms_vector &v1, const vms_vector &fvec) __attribute_warn_unused_result; +fixang vm_vec_delta_ang_norm (const vms_vector &v0, const vms_vector &v1, const vms_vector &fvec) __attribute_warn_unused_result; + +void vm_angles_2_matrix (vms_matrix &m, const vms_angvec &a); + +#ifdef EDITOR +void vm_vec_ang_2_matrix (vms_matrix &m, const vms_vector &v, fixang a); +#endif + +void vm_vector_2_matrix (vms_matrix &m, const vms_vector &fvec, const vms_vector *uvec, const vms_vector *rvec); +void vm_vec_rotate (vms_vector &dest, const vms_vector &src, const vms_matrix &m); +void _vm_matrix_x_matrix (vms_matrix &dest, const vms_matrix &src0, const vms_matrix &src1); +void vm_extract_angles_matrix (vms_angvec &a, const vms_matrix &m); +void vm_extract_angles_vector (vms_angvec &a, const vms_vector &v); +fix vm_dist_to_plane (const vms_vector &checkp, const vms_vector &norm, const vms_vector &planep) __attribute_warn_unused_result; +void vms_quaternion_from_matrix(vms_quaternion * q, const vms_matrix * m); +void vms_matrix_from_quaternion(vms_matrix * m, const vms_quaternion * q); diff --git a/common/include/vecmat.h b/common/include/vecmat.h index 471f39921..e23e6e1c9 100644 --- a/common/include/vecmat.h +++ b/common/include/vecmat.h @@ -25,13 +25,11 @@ COPYRIGHT 1993-1998 PARALLAX SOFTWARE CORPORATION. ALL RIGHTS RESERVED. #pragma once -#include "maths.h" - #ifdef __cplusplus #include #include -#include "dxxsconf.h" #include +#include "fwd-vecmat.h" //The basic fixed-point vector. Access elements by name or position struct vms_vector @@ -39,8 +37,6 @@ struct vms_vector fix x, y, z; }; -class vm_distance_squared; - class vm_distance { public: @@ -227,13 +223,8 @@ static inline void vm_vec_zero(vms_vector &v) //Global constants -extern const vms_matrix vmd_identity_matrix; - - //Here's a handy constant -#define IDENTITY_MATRIX { {f1_0,0,0}, {0,f1_0,0}, {0,0,f1_0} } - //negate a vector static inline void vm_vec_negate(vms_vector &v) { @@ -252,7 +243,6 @@ static inline vms_vector vm_vec_negated(vms_vector v) //adds two vectors, fills in dest, returns ptr to dest //ok for dest to equal either source, but should use vm_vec_add2() if so -vms_vector &vm_vec_add (vms_vector &dest, const vms_vector &src0, const vms_vector &src1); static inline vms_vector vm_vec_add (const vms_vector &src0, const vms_vector &src1) __attribute_warn_unused_result; static inline vms_vector vm_vec_add (const vms_vector &src0, const vms_vector &src1) { @@ -263,7 +253,6 @@ static inline vms_vector vm_vec_add (const vms_vector &src0, const vms_vector &s //subs two vectors, fills in dest, returns ptr to dest //ok for dest to equal either source, but should use vm_vec_sub2() if so -vms_vector &_vm_vec_sub(vms_vector &dest, const vms_vector &src0, const vms_vector &src1); static inline vms_vector &vm_vec_sub(vms_vector &dest, const vms_vector &src0, const vms_vector &src1) { #ifdef DXX_CONSTANT_TRUE @@ -282,18 +271,8 @@ static inline vms_vector vm_vec_sub (const vms_vector &src0, const vms_vector &s return vm_vec_sub(dest, src0, src1), dest; } - -//adds one vector to another. returns ptr to dest -//dest can equal source -void vm_vec_add2 (vms_vector &dest, const vms_vector &src); - -//subs one vector from another, returns ptr to dest -//dest can equal source -void vm_vec_sub2 (vms_vector &dest, const vms_vector &src); - //averages two vectors. returns ptr to dest //dest can equal either source -void vm_vec_avg (vms_vector &dest, const vms_vector &src0, const vms_vector &src1); static inline vms_vector vm_vec_avg (const vms_vector &src0, const vms_vector &src1) __attribute_warn_unused_result; static inline vms_vector vm_vec_avg (const vms_vector &src0, const vms_vector &src1) { @@ -301,13 +280,8 @@ static inline vms_vector vm_vec_avg (const vms_vector &src0, const vms_vector &s return vm_vec_avg(dest, src0, src1), dest; } -//scales a vector in place. returns ptr to vector -vms_vector &vm_vec_scale (vms_vector &dest, fix s); -void vm_vec_divide(vms_vector &dest, const vms_vector &src, fix d); - //scales and copies a vector. returns ptr to dest #define vm_vec_copy_scale(A,B,...) vm_vec_copy_scale(A, ## __VA_ARGS__, B) -vms_vector &vm_vec_copy_scale (vms_vector &dest, const vms_vector &src, fix s); static inline vms_vector vm_vec_copy_scale(vms_vector src, fix s) __attribute_warn_unused_result; static inline vms_vector vm_vec_copy_scale(vms_vector src, fix s) { @@ -316,7 +290,6 @@ static inline vms_vector vm_vec_copy_scale(vms_vector src, fix s) //scales a vector, adds it to another, and stores in a 3rd vector //dest = src1 + k * src2 -void vm_vec_scale_add (vms_vector &dest, const vms_vector &src1, const vms_vector &src2, fix k); static inline vms_vector vm_vec_scale_add(const vms_vector &src1, const vms_vector &src2, fix k) __attribute_warn_unused_result; static inline vms_vector vm_vec_scale_add(const vms_vector &src1, const vms_vector &src2, fix k) { @@ -324,76 +297,18 @@ static inline vms_vector vm_vec_scale_add(const vms_vector &src1, const vms_vect return vm_vec_scale_add(dest, src1, src2, k), dest; } - -//scales a vector and adds it to another -//dest += k * src -void vm_vec_scale_add2 (vms_vector &dest, const vms_vector &src, fix k); - -//scales a vector in place, taking n/d for scale. returns ptr to vector -//dest *= n/d -void vm_vec_scale2 (vms_vector &dest, fix n, fix d); - -__attribute_warn_unused_result -vm_magnitude_squared vm_vec_mag2(const vms_vector &v); -//returns magnitude of a vector -__attribute_warn_unused_result -vm_magnitude vm_vec_mag(const vms_vector &v); - - -//computes the distance between two points. (does sub and mag) -__attribute_warn_unused_result -vm_distance vm_vec_dist(const vms_vector &v0, const vms_vector &v1); -__attribute_warn_unused_result -vm_distance_squared vm_vec_dist2(const vms_vector &v0, const vms_vector &v1); - - -//computes an approximation of the magnitude of the vector -//uses dist = largest + next_largest*3/8 + smallest*3/16 -__attribute_warn_unused_result -vm_magnitude vm_vec_mag_quick(const vms_vector &v); - - -//computes an approximation of the distance between two points. -//uses dist = largest + next_largest*3/8 + smallest*3/16 -__attribute_warn_unused_result -vm_distance vm_vec_dist_quick(const vms_vector &v0, const vms_vector &v1); - -//normalize a vector. returns mag of source vec -__attribute_warn_unused_result -vm_magnitude vm_vec_copy_normalize(vms_vector &dest, const vms_vector &src); - -vm_magnitude vm_vec_normalize(vms_vector &v); static inline vms_vector vm_vec_normalized(vms_vector v) __attribute_warn_unused_result; static inline vms_vector vm_vec_normalized(vms_vector v) { return vm_vec_normalize(v), v; } -//normalize a vector. returns mag of source vec. uses approx mag -vm_magnitude vm_vec_copy_normalize_quick(vms_vector &dest, const vms_vector &src); - -vm_magnitude vm_vec_normalize_quick(vms_vector &v); static inline vms_vector vm_vec_normalized_quick(vms_vector v) __attribute_warn_unused_result; static inline vms_vector vm_vec_normalized_quick(vms_vector v) { return vm_vec_normalize_quick(v), v; } - -//return the normalized direction vector between two points -//dest = normalized(end - start). Returns mag of direction vector -//NOTE: the order of the parameters matches the vector subtraction -vm_magnitude vm_vec_normalized_dir (vms_vector &dest, const vms_vector &end, const vms_vector &start); - -vm_magnitude vm_vec_normalized_dir_quick (vms_vector &dest, const vms_vector &end, const vms_vector &start); - - -////returns dot product of two vectors -fix vm_vec_dot (const vms_vector &v0, const vms_vector &v1) __attribute_warn_unused_result; - -//computes cross product of two vectors. returns ptr to dest -//dest CANNOT equal either source -void vm_vec_cross (vms_vector &dest, const vms_vector &src0, const vms_vector &src1); static inline vms_vector vm_vec_cross(const vms_vector &src0, const vms_vector &src1) __attribute_warn_unused_result; static inline vms_vector vm_vec_cross(const vms_vector &src0, const vms_vector &src1) { @@ -401,10 +316,6 @@ static inline vms_vector vm_vec_cross(const vms_vector &src0, const vms_vector & return vm_vec_cross(dest, src0, src1), dest; } -//computes surface normal from three points. result is normalized -//returns ptr to dest -//dest CANNOT equal either source -void vm_vec_normal (vms_vector &dest, const vms_vector &p0, const vms_vector &p1, const vms_vector &p2); static inline vms_vector vm_vec_normal(const vms_vector &p0, const vms_vector &p1, const vms_vector &p2) __attribute_warn_unused_result; static inline vms_vector vm_vec_normal(const vms_vector &p0, const vms_vector &p1, const vms_vector &p2) { @@ -412,10 +323,6 @@ static inline vms_vector vm_vec_normal(const vms_vector &p0, const vms_vector &p return vm_vec_normal(dest, p0, p1, p2), dest; } -//computes non-normalized surface normal from three points. -//returns ptr to dest -//dest CANNOT equal either source -void vm_vec_perp (vms_vector &dest, const vms_vector &p0, const vms_vector &p1, const vms_vector &p2); static inline vms_vector vm_vec_perp (const vms_vector &p0, const vms_vector &p1, const vms_vector &p2) __attribute_warn_unused_result; static inline vms_vector vm_vec_perp (const vms_vector &p0, const vms_vector &p1, const vms_vector &p2) { @@ -423,20 +330,6 @@ static inline vms_vector vm_vec_perp (const vms_vector &p0, const vms_vector &p1 return vm_vec_perp(dest, p0, p1, p2), dest; } - -//computes the delta angle between two vectors. -//vectors need not be normalized. if they are, call vm_vec_delta_ang_norm() -//the forward vector (third parameter) can be NULL, in which case the absolute -//value of the angle in returned. Otherwise the angle around that vector is -//returned. -fixang vm_vec_delta_ang (const vms_vector &v0, const vms_vector &v1, const vms_vector &fvec) __attribute_warn_unused_result; - -//computes the delta angle between two normalized vectors. -fixang vm_vec_delta_ang_norm (const vms_vector &v0, const vms_vector &v1, const vms_vector &fvec) __attribute_warn_unused_result; - - -//computes a matrix from a set of three angles. returns ptr to matrix -void vm_angles_2_matrix (vms_matrix &m, const vms_angvec &a); static inline vms_matrix vm_angles_2_matrix (const vms_angvec &a) __attribute_warn_unused_result; static inline vms_matrix vm_angles_2_matrix (const vms_angvec &a) { @@ -444,17 +337,6 @@ static inline vms_matrix vm_angles_2_matrix (const vms_angvec &a) return vm_angles_2_matrix(m, a), m; } -#ifdef EDITOR -//computes a matrix from a forward vector and an angle -void vm_vec_ang_2_matrix (vms_matrix &m, const vms_vector &v, fixang a); -#endif - -//computes a matrix from one or more vectors. The forward vector is required, -//with the other two being optional. If both up & right vectors are passed, -//the up vector is used. If only the forward vector is passed, a bank of -//zero is assumed -//returns ptr to matrix -void vm_vector_2_matrix (vms_matrix &m, const vms_vector &fvec, const vms_vector *uvec, const vms_vector *rvec); static inline vms_matrix vm_vector_2_matrix (const vms_vector &fvec, const vms_vector *uvec, const vms_vector *rvec) __attribute_warn_unused_result; static inline vms_matrix vm_vector_2_matrix (const vms_vector &fvec, const vms_vector *uvec, const vms_vector *rvec) { @@ -462,9 +344,6 @@ static inline vms_matrix vm_vector_2_matrix (const vms_vector &fvec, const vms_v return vm_vector_2_matrix(m, fvec, uvec, rvec), m; } -//rotates a vector through a matrix. returns ptr to dest vector -//dest CANNOT equal either source -void vm_vec_rotate (vms_vector &dest, const vms_vector &src, const vms_matrix &m); static inline vms_vector vm_vec_rotate (const vms_vector &src, const vms_matrix &m) __attribute_warn_unused_result; static inline vms_vector vm_vec_rotate (const vms_vector &src, const vms_matrix &m) { @@ -489,7 +368,6 @@ static inline vms_matrix vm_transposed_matrix(vms_matrix m) } //mulitply 2 matrices, fill in dest. returns ptr to dest -void _vm_matrix_x_matrix (vms_matrix &dest, const vms_matrix &src0, const vms_matrix &src1); static inline void vm_matrix_x_matrix(vms_matrix &dest, const vms_matrix &src0, const vms_matrix &src1) { #ifdef DXX_CONSTANT_TRUE @@ -511,8 +389,6 @@ static inline vms_matrix vm_matrix_x_matrix(const vms_matrix &src0, const vms_ma return dest; } -//extract angles from a matrix -void vm_extract_angles_matrix (vms_angvec &a, const vms_matrix &m); static inline vms_angvec vm_extract_angles_matrix (const vms_matrix &m) __attribute_warn_unused_result; static inline vms_angvec vm_extract_angles_matrix (const vms_matrix &m) { @@ -520,18 +396,6 @@ static inline vms_angvec vm_extract_angles_matrix (const vms_matrix &m) return vm_extract_angles_matrix(a, m), a; } - -//extract heading and pitch from a vector, assuming bank==0 -void vm_extract_angles_vector (vms_angvec &a, const vms_vector &v); - - -//compute the distance from a point to a plane. takes the normalized normal -//of the plane (ebx), a point on the plane (edi), and the point to check (esi). -//returns distance in eax -//distance is signed, so negative dist is on the back of the plane -fix vm_dist_to_plane (const vms_vector &checkp, const vms_vector &norm, const vms_vector &planep) __attribute_warn_unused_result; - - //fills in fields of an angle vector static inline void vm_angvec_make(vms_angvec *v, fixang p, fixang b, fixang h) { @@ -540,8 +404,4 @@ static inline void vm_angvec_make(vms_angvec *v, fixang p, fixang b, fixang h) v->h = h; } -// convert from quaternion to vector matrix and back -void vms_quaternion_from_matrix(vms_quaternion * q, const vms_matrix * m); -void vms_matrix_from_quaternion(vms_matrix * m, const vms_quaternion * q); - #endif