1 /* bzflag
2 * Copyright (c) 1993-2021 Tim Riker
3 *
4 * This package is free software; you can redistribute it and/or
5 * modify it under the terms of the license found in the file
6 * named COPYING that should have accompanied this file.
7 *
8 * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
9 * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
10 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
11 */
12
13 #ifndef __VECTOR_MATH_H__
14 #define __VECTOR_MATH_H__
15
16 #include <string.h>
17
18 // vectors implemented as arrays
19 typedef float afvec2[2];
20 typedef float afvec3[3];
21 typedef float afvec4[4];
22
23 // vectors implemented as simple classes
24 class cfvec2
25 {
26 public:
cfvec2()27 cfvec2()
28 {
29 memset(data,0,sizeof(float)*2);
30 }
cfvec2(const float values[2])31 cfvec2(const float values[2])
32 {
33 memcpy (data, values, sizeof(float[2]));
34 }
35 cfvec2& operator=(const float values[2])
36 {
37 memcpy (data, values, sizeof(float[2]));
38 return *this;
39 }
40 inline float& operator[](int pos)
41 {
42 return data[pos];
43 }
44 float data[2];
45 };
46
47 class cfvec3
48 {
49 public:
cfvec3()50 cfvec3()
51 {
52 memset(data,0,sizeof(float)*3);
53 }
cfvec3(const float values[3])54 cfvec3(const float values[3])
55 {
56 memcpy (data, values, sizeof(float[3]));
57 }
58 cfvec3& operator=(const float values[3])
59 {
60 memcpy (data, values, sizeof(float[3]));
61 return *this;
62 }
63 inline float& operator[](int pos)
64 {
65 return data[pos];
66 }
67 float data[3];
68 };
69
70 class cfvec4
71 {
72 public:
cfvec4()73 cfvec4()
74 {
75 memset(data,0,sizeof(float)*4);
76 }
cfvec4(const float values[4])77 cfvec4(const float values[4])
78 {
79 memcpy (data, values, sizeof(float[4]));
80 }
81 cfvec4& operator=(const float values[4])
82 {
83 memcpy (data, values, sizeof(float[4]));
84 return *this;
85 }
86 inline float& operator[](int pos)
87 {
88 return data[pos];
89 }
90 float data[4];
91 };
92
93
94 // FIXME - some these should go into a common file
95 // Some handy geometry functions
96
vec3add(float * result,const float * v1,const float * v2)97 static inline void vec3add (float *result, const float* v1, const float* v2)
98 {
99 result[0] = v1[0] + v2[0];
100 result[1] = v1[1] + v2[1];
101 result[2] = v1[2] + v2[2];
102 return;
103 }
vec3sub(float * result,const float * v1,const float * v2)104 static inline void vec3sub (float *result, const float* v1, const float* v2)
105 {
106 result[0] = v1[0] - v2[0];
107 result[1] = v1[1] - v2[1];
108 result[2] = v1[2] - v2[2];
109 return;
110 }
vec3dot(const float * v1,const float * v2)111 static inline float vec3dot (const float* v1, const float* v2)
112 {
113 return (v1[0] * v2[0]) + (v1[1] * v2[1]) + (v1[2] * v2[2]);
114 }
vec3cross(float * result,const float * v1,const float * v2)115 static inline void vec3cross (float* result, const float* v1, const float* v2)
116 {
117 result[0] = (v1[1] * v2[2]) - (v1[2] * v2[1]);
118 result[1] = (v1[2] * v2[0]) - (v1[0] * v2[2]);
119 result[2] = (v1[0] * v2[1]) - (v1[1] * v2[0]);
120 return;
121 }
122
123 #endif // __VECTOR_MATH_H__
124
125 // Local variables: ***
126 // mode: C++ ***
127 // tab-width: 8 ***
128 // c-basic-offset: 2 ***
129 // indent-tabs-mode: t ***
130 // End: ***
131 // ex: shiftwidth=2 tabstop=8
132