Add vecmat forward declaration header

This commit is contained in:
Kp 2015-12-05 22:57:23 +00:00
parent 93a441b81e
commit 32c7214f5a
2 changed files with 93 additions and 141 deletions

View file

@ -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);

View file

@ -25,13 +25,11 @@ COPYRIGHT 1993-1998 PARALLAX SOFTWARE CORPORATION. ALL RIGHTS RESERVED.
#pragma once
#include "maths.h"
#ifdef __cplusplus
#include <cassert>
#include <cstdint>
#include "dxxsconf.h"
#include <utility>
#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