19 #define vm_is_vec_nan(v) (_isnan((v)->xyz.x) || _isnan((v)->xyz.y) || _isnan((v)->xyz.z))
24 #define IS_VEC_NULL_SQ_SAFE(v) ( ( (v)->xyz.x > -1e-16 ) && ( (v)->xyz.x < 1e-16 ) && \
25 ( (v)->xyz.y > -1e-16 ) && ( (v)->xyz.y < 1e-16 ) && \
26 ( (v)->xyz.z > -1e-16 ) && ( (v)->xyz.z < 1e-16 ) )
28 #define IS_VEC_NULL(v) ( ( (v)->xyz.x > -1e-36 ) && ( (v)->xyz.x < 1e-36 ) && \
29 ( (v)->xyz.y > -1e-36 ) && ( (v)->xyz.y < 1e-36 ) && \
30 ( (v)->xyz.z > -1e-36 ) && ( (v)->xyz.z < 1e-36 ) )
32 #define IS_MAT_NULL(v) (IS_VEC_NULL(&(v)->vec.fvec) && IS_VEC_NULL(&(v)->vec.uvec) && IS_VEC_NULL(&(v)->vec.rvec))
37 #define vm_vec_zero(v) (v)->xyz.x=(v)->xyz.y=(v)->xyz.z=0.0f
48 #define vm_vec_make(v,_x,_y,_z) ((v)->xyz.x=(_x), (v)->xyz.y=(_y), (v)->xyz.z=(_z))
60 #define ZERO_VECTOR { { { 0.0f, 0.0f, 0.0f } } }
64 #define IDENTITY_MATRIX { { { { { { 1.0f, 0.0f, 0.0f } } }, { { { 0.0f, 1.0f, 0.0f } } }, { { { 0.0f, 0.0f, 1.0f } } } } } }
67 #define vm_angvec_make(v,_p,_b,_h) (((v)->p=(_p), (v)->b=(_b), (v)->h=(_h)), (v))
70 #define vm_vec_negate(v) do {(v)->xyz.x = - (v)->xyz.x; (v)->xyz.y = - (v)->xyz.y; (v)->xyz.z = - (v)->xyz.z;} while (0);
350 float vm_interp_angle(
float *
h,
float desired_angle,
float step_size,
bool force_front =
false );
370 matrix *next_orient,
vec3d *rotvel_out,
const vec3d *rotvel_limit,
const vec3d *acc_limit,
int no_overshoot=0);
377 matrix *next_orient,
vec3d *rotvel_out,
const vec3d *vel_limit,
const vec3d *acc_limit,
int no_overshoot=0);
void vm_vec_scale2(vec3d *dest, float n, float d)
float vm_vec_dot3(float x, float y, float z, vec3d *v)
float vm_vec_delta_ang(const vec3d *v0, const vec3d *v1, const vec3d *fvec)
void vm_orthogonalize_matrix(matrix *m_src)
void vm_vec_scale_sub(vec3d *dest, const vec3d *src1, const vec3d *src2, float k)
void vm_find_bounding_sphere(const vec3d *pnts, int num_pnts, vec3d *center, float *radius)
float vm_vec_normalize_quick(vec3d *v)
vec3d * vm_vec_unrotate(vec3d *dest, const vec3d *src, const matrix *m)
void vm_estimate_next_orientation(const matrix *last_orient, const matrix *current_orient, matrix *next_orient)
float vm_vec_mag_squared(const vec3d *v)
vec3d * vm_vec_avg3(vec3d *dest, const vec3d *src0, const vec3d *src1, const vec3d *src2)
GLfloat GLfloat GLfloat GLfloat h
float vm_vec_normalize(vec3d *v)
int vm_matrix_cmp(const matrix *a, const matrix *b)
void vm_vec_boxscale(vec2d *vec, float scale)
vec3d * vm_vec_avg(vec3d *dest, const vec3d *src0, const vec3d *src1)
matrix * vm_angle_2_matrix(matrix *m, float a, int angle_index)
void vm_rot_point_around_line(vec3d *out, const vec3d *in, float angle, const vec3d *line_point, const vec3d *line_dir)
void vm_vec_add2(vec3d *dest, const vec3d *src)
float find_nearest_point_on_line(vec3d *nearest_point, const vec3d *p0, const vec3d *p1, const vec3d *int_pnt)
float vm_vec_dist_quick(const vec3d *v0, const vec3d *v1)
float atan2_safe(float x, float y)
void vm_vec_scale_add(vec3d *dest, const vec3d *src1, const vec3d *src2, float k)
int vm_vec_dist_to_line(const vec3d *p, const vec3d *l0, const vec3d *l1, vec3d *nearest, float *dist)
int is_valid_vec(const vec3d *vec)
float vm_vec_normalize_quick_mag(vec3d *v)
void vm_vec_add(vec3d *dest, const vec3d *src0, const vec3d *src1)
vec3d * vm_vec_normal(vec3d *dest, const vec3d *p0, const vec3d *p1, const vec3d *p2)
GLenum GLenum GLenum GLenum GLenum scale
GLfloat GLfloat GLfloat v2
void vm_vec_scale_sub2(vec3d *dest, const vec3d *src, float k)
int vm_check_matrix_for_zeros(const matrix *m)
vec3d * vm_vec_avg_n(vec3d *dest, int n, const vec3d src[])
float vm_vec_projection_parallel(vec3d *component, const vec3d *src, const vec3d *unit_vector)
void vm_vec_scale(vec3d *dest, float s)
float vm_vec_mag(const vec3d *v)
float vm_vec_copy_normalize_quick(vec3d *dest, const vec3d *src)
void vm_matrix_to_rot_axis_and_angle(const matrix *m, float *theta, vec3d *rot_axis)
int vm_matrix_same(matrix *m1, matrix *m2)
void vm_trackball(int idx, int idy, matrix *RotMat)
void vm_matrix_interpolate(const matrix *goal_orient, const matrix *start_orient, const vec3d *rotvel_in, float delta_t, matrix *next_orient, vec3d *rotvel_out, const vec3d *rotvel_limit, const vec3d *acc_limit, int no_overshoot=0)
void vm_vec_random_cone(vec3d *out, const vec3d *in, float max_angle, const matrix *orient=NULL)
GLboolean GLboolean GLboolean GLboolean a
vec3d * vm_rotate_vec_to_world(vec3d *world_vec, const vec3d *body_vec, const matrix *orient)
matrix * vm_vec_ang_2_matrix(matrix *m, const vec3d *v, float a)
void vm_vec_sub2(vec3d *dest, const vec3d *src)
matrix vmd_identity_matrix
matrix * vm_vector_2_matrix(matrix *m, const vec3d *fvec, const vec3d *uvec, const vec3d *rvec)
void vm_vec_rand_vec_quick(vec3d *rvec)
void vm_vec_dist_squared_to_line(const vec3d *p, const vec3d *l0, const vec3d *l1, vec3d *nearest, float *dist_squared)
matrix * vm_copy_transpose(matrix *dest, const matrix *src)
float vm_vec_normalize_safe(vec3d *v)
void vm_vec_copy_scale(vec3d *dest, const vec3d *src, float s)
float vm_vec_delta_ang_norm(const vec3d *v0, const vec3d *v1, const vec3d *fvec)
void vm_vec_random_in_sphere(vec3d *out, const vec3d *in, const matrix *orient, float radius, int on_edge)
void vm_set_identity(matrix *m)
int vm_vec_same(const vec3d *v1, const vec3d *v2)
float vm_interp_angle(float *h, float desired_angle, float step_size, bool force_front=false)
float vm_vec_mag_quick(const vec3d *v)
float vm_delta_from_interp_angle(float current_angle, float desired_angle)
float vm_vec_copy_normalize(vec3d *dest, const vec3d *src)
GLint GLint GLint GLint GLint x
float vm_vec_normalized_dir(vec3d *dest, const vec3d *end, const vec3d *start)
angles * vm_extract_angles_matrix(angles *a, const matrix *m)
void vm_vec_scale_add2(vec3d *dest, const vec3d *src, float k)
void compute_point_on_plane(vec3d *q, const plane *planep, const vec3d *p)
vec3d * vm_vec_cross(vec3d *dest, const vec3d *src0, const vec3d *src1)
int vm_test_parallel(const vec3d *src0, const vec3d *src1)
matrix * vm_transpose(matrix *m)
bool vm_vec_equal(const vec2d &self, const vec2d &other)
vec3d * vm_vec_rotate(vec3d *dest, const vec3d *src, const matrix *m)
void vm_vec_sub(vec3d *dest, const vec3d *src0, const vec3d *src1)
GLboolean GLboolean GLboolean b
void vm_fix_matrix(matrix *m)
GLdouble GLdouble GLdouble GLdouble q
float vm_dist_to_plane(const vec3d *checkp, const vec3d *norm, const vec3d *planep)
void vm_vec_interp_constant(vec3d *out, const vec3d *v1, const vec3d *v2, float t)
vec3d * vm_rotate_vec_to_body(vec3d *body_vec, const vec3d *world_vec, const matrix *orient)
vec3d * vm_vec_perp(vec3d *dest, const vec3d *p0, const vec3d *p1, const vec3d *p2)
float vm_vec_normalized_dir_quick(vec3d *dest, const vec3d *end, const vec3d *start)
float vm_vec_dot(const vec3d *v0, const vec3d *v1)
void vm_project_point_onto_plane(vec3d *new_point, const vec3d *point, const vec3d *plane_normal, const vec3d *plane_point)
angles * vm_extract_angles_vector(angles *a, const vec3d *v)
matrix * vm_vector_2_matrix_norm(matrix *m, const vec3d *fvec, const vec3d *uvec=NULL, const vec3d *rvec=NULL)
void vm_quaternion_rotate(matrix *m, float theta, const vec3d *u)
float vm_vec_dist(const vec3d *v0, const vec3d *v1)
int vm_vec_cmp(const vec3d *a, const vec3d *b)
angles * vm_extract_angles_matrix_alternate(angles *a, const matrix *m)
void vm_rotate_matrix_by_angles(matrix *orient, const angles *tangles)
bool vm_matrix_equal(const matrix &self, const matrix &other)
float vm_vec_normalized_dir_quick_mag(vec3d *dest, const vec3d *end, const vec3d *start)
float vm_vec_copy_normalize_quick_mag(vec3d *dest, const vec3d *src)
int is_valid_matrix(const matrix *m)
bool vm_inverse_matrix4(const matrix4 *m, matrix4 *invOut)
Attempts to invert a 4x4 matrix.
void vm_vec_random_in_circle(vec3d *out, const vec3d *in, const matrix *orient, float radius, int on_edge)
vec3d * vm_vec_avg4(vec3d *dest, const vec3d *src0, const vec3d *src1, const vec3d *src2, const vec3d *src3)
float vm_vec_dot_to_point(const vec3d *dir, const vec3d *p1, const vec3d *p2)
matrix * vm_angles_2_matrix(matrix *m, const angles *a)
void vm_forward_interpolate(const vec3d *goal_fvec, const matrix *orient, const vec3d *rotvel_in, float delta_t, float delta_bank, matrix *next_orient, vec3d *rotvel_out, const vec3d *vel_limit, const vec3d *acc_limit, int no_overshoot=0)
void vm_vec_projection_onto_plane(vec3d *projection, const vec3d *src, const vec3d *normal)
float vm_vec_dist_squared(const vec3d *v0, const vec3d *v1)
matrix * vm_matrix_x_matrix(matrix *dest, const matrix *src0, const matrix *src1)