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