cleaned all trailing white space from source files.
[sdk] / ecere / src / gfx / 3D / Vector3D.ec
1 namespace gfx3D;
2
3 import "Display"
4
5 public struct Vector3D
6 {
7    double x, y, z;
8
9    void Add(Vector3D vector1, Vector3D vector2)
10    {
11       x = vector1.x + vector2.x;
12       y = vector1.y + vector2.y;
13       z = vector1.z + vector2.z;
14    }
15
16    void Subtract(Vector3D vector1, Vector3D vector2)
17    {
18       x = vector1.x - vector2.x;
19       y = vector1.y - vector2.y;
20       z = vector1.z - vector2.z;
21    }
22
23    void Scale(Vector3D vector1, double s)
24    {
25       x = vector1.x * s;
26       y = vector1.y * s;
27       z = vector1.z * s;
28    }
29
30    double DotProduct(Vector3D vector2)
31    {
32       return x * vector2.x + y * vector2.y + z * vector2.z;
33    }
34
35    double DotProductf(Vector3Df vector2)
36    {
37       return x * vector2.x + y * vector2.y + z * vector2.z;
38    }
39
40    void CrossProduct(Vector3D vector1, Vector3D vector2)
41    {
42       x = vector1.y * vector2.z - vector1.z * vector2.y;
43       y = vector1.z * vector2.x - vector1.x * vector2.z;
44       z = vector1.x * vector2.y - vector1.y * vector2.x;
45    }
46
47    void Normalize(Vector3D source)
48    {
49       double m = source.length;
50       if(m)
51       {
52          x = source.x/m;
53          y = source.y/m;
54          z = source.z/m;
55       }
56       else
57          x = y = z = 0;
58    }
59
60    void MultMatrix(Vector3D source, Matrix matrix)
61    {
62        x = source.x * matrix.m[0][0] + source.y * matrix.m[1][0] + source.z * matrix.m[2][0] + matrix.m[3][0];
63        y = source.x * matrix.m[0][1] + source.y * matrix.m[1][1] + source.z * matrix.m[2][1] + matrix.m[3][1];
64        z = source.x * matrix.m[0][2] + source.y * matrix.m[1][2] + source.z * matrix.m[2][2] + matrix.m[3][2];
65    }
66
67    void MultMatrixf(Vector3Df source, Matrix matrix)
68    {
69        x = source.x * matrix.m[0][0] + source.y * matrix.m[1][0] + source.z * matrix.m[2][0] + matrix.m[3][0];
70        y = source.x * matrix.m[0][1] + source.y * matrix.m[1][1] + source.z * matrix.m[2][1] + matrix.m[3][1];
71        z = source.x * matrix.m[0][2] + source.y * matrix.m[1][2] + source.z * matrix.m[2][2] + matrix.m[3][2];
72    }
73
74    void DivideMatrix(Vector3D source, Matrix matrix)
75    {
76       /*
77       solve(
78       {
79          vectorX=sourceX*m00+sourceY*m10+sourceZ*m20+m30,
80          vectorY=sourceZ*m01+sourceY*m11+sourceZ*m21+m31,
81          vectorZ=sourceX*m02+sourceY*m12+sourceZ*m22+m32
82       }, { sourceX, sourceY, sourceZ });
83       */
84
85       double var1 =
86          matrix.m[2][0] * matrix.m[0][2] * matrix.m[1][1]
87        - matrix.m[0][2] * matrix.m[2][1] * matrix.m[1][0]
88        - matrix.m[2][2] * matrix.m[0][0] * matrix.m[1][1]
89        - matrix.m[0][2] * matrix.m[0][1] * matrix.m[1][0]
90        + matrix.m[2][1] * matrix.m[0][0] * matrix.m[1][2]
91        + matrix.m[0][1] * matrix.m[0][0] * matrix.m[1][2];
92
93       x = (
94          - matrix.m[2][2] * source.x * matrix.m[1][1]
95          + matrix.m[2][2] * matrix.m[1][0] * source.y
96          - matrix.m[2][2] * matrix.m[1][0] * matrix.m[3][1]
97          + matrix.m[2][2] * matrix.m[3][0] * matrix.m[1][1]
98          - matrix.m[2][0] * matrix.m[3][2] * matrix.m[1][1]
99          + source.x * matrix.m[2][1] * matrix.m[1][2]
100          + source.x * matrix.m[0][1] * matrix.m[1][2]
101          - matrix.m[1][0] * matrix.m[0][1] * source.z
102          + matrix.m[1][0] * matrix.m[2][1] * matrix.m[3][2]
103          + matrix.m[1][0] * matrix.m[0][1] * matrix.m[3][2]
104          - matrix.m[1][0] * matrix.m[2][1] * source.z
105          - matrix.m[3][0] * matrix.m[2][1] * matrix.m[1][2]
106          - matrix.m[2][0] * matrix.m[1][2] * source.y
107          + matrix.m[2][0] * matrix.m[1][2] * matrix.m[3][1]
108          + matrix.m[2][0] * source.z * matrix.m[1][1]
109          - matrix.m[3][0] * matrix.m[0][1] * matrix.m[1][2]
110          ) / var1;
111
112       y = - (
113          - matrix.m[2][0] * matrix.m[0][2] * source.y
114          + matrix.m[2][1] * matrix.m[0][0] * matrix.m[3][2]
115          + matrix.m[2][0] * matrix.m[0][2] * matrix.m[3][1]
116          + matrix.m[0][1] * matrix.m[0][0] * matrix.m[3][2]
117          - matrix.m[2][1] * matrix.m[0][0] * source.z
118          - matrix.m[0][2] * matrix.m[2][1] * matrix.m[3][0]
119          + matrix.m[0][2] * matrix.m[0][1] * source.x
120          - matrix.m[0][2] * matrix.m[0][1] * matrix.m[3][0]
121          + matrix.m[0][2] * matrix.m[2][1] * source.x
122          + matrix.m[2][2] * matrix.m[0][0] * source.y
123          - matrix.m[0][1] * matrix.m[0][0] * source.z
124          - matrix.m[2][2] * matrix.m[0][0] * matrix.m[3][1]
125          ) / var1;
126
127       z = (
128          source.x * matrix.m[0][2] * matrix.m[1][1]
129          + matrix.m[0][0] * matrix.m[3][2] * matrix.m[1][1]
130          + matrix.m[0][0] * matrix.m[1][2] * source.y
131          - matrix.m[0][0] * matrix.m[1][2] * matrix.m[3][1]
132          - matrix.m[0][0] * source.z * matrix.m[1][1]
133          - matrix.m[1][0] * matrix.m[0][2] * source.y
134          + matrix.m[1][0] * matrix.m[0][2] * matrix.m[3][1]
135          - matrix.m[3][0] * matrix.m[0][2] * matrix.m[1][1]
136          ) / var1;
137    }
138
139    property double length { get { return (double)sqrt(x * x + y * y + z * z); } };
140    property double lengthApprox
141    {
142       get
143       {
144          double ix = Abs(x), iy = Abs(y), iz = Abs(z);
145          double tmp;
146          if(ix < iy) { tmp = ix; ix = iy; iy = tmp; }
147          if(ix < iz) { tmp = ix; ix = iz; iz = tmp; }
148          if(iz > iy) { iz = iy; }
149          return ix + (iz/2);
150       }
151    }
152 };
153
154 public struct Vector3Df
155 {
156    float x, y, z;
157
158    void Add(Vector3Df vector1, Vector3Df vector2)
159    {
160       x = vector1.x + vector2.x;
161       y = vector1.y + vector2.y;
162       z = vector1.z + vector2.z;
163    }
164
165    void Subtract(Vector3Df vector1, Vector3Df vector2)
166    {
167       x = vector1.x - vector2.x;
168       y = vector1.y - vector2.y;
169       z = vector1.z - vector2.z;
170    }
171
172    void Scale(Vector3Df vector1, float s)
173    {
174       x = vector1.x * s;
175       y = vector1.y * s;
176       z = vector1.z * s;
177    }
178
179    double DotProduct(Vector3Df vector2)
180    {
181       return (double)x * (double)vector2.x + (double)y * (double)vector2.y + (double)z * (double)vector2.z;
182    }
183
184    void CrossProduct(Vector3Df vector1, Vector3Df vector2)
185    {
186       x = vector1.y * vector2.z - vector1.z * vector2.y;
187       y = vector1.z * vector2.x - vector1.x * vector2.z;
188       z = vector1.x * vector2.y - vector1.y * vector2.x;
189    }
190
191    void Normalize(Vector3Df source)
192    {
193       float m = source.length;
194       if(m)
195       {
196          x = source.x/m;
197          y = source.y/m;
198          z = source.z/m;
199       }
200       else
201          x = y = z = 0;
202    }
203
204    void MultMatrix(Vector3Df source, Matrix matrix)
205    {
206        x = (float)(source.x * matrix.m[0][0] + source.y * matrix.m[1][0] + source.z * matrix.m[2][0] + matrix.m[3][0]);
207        y = (float)(source.x * matrix.m[0][1] + source.y * matrix.m[1][1] + source.z * matrix.m[2][1] + matrix.m[3][1]);
208        z = (float)(source.x * matrix.m[0][2] + source.y * matrix.m[1][2] + source.z * matrix.m[2][2] + matrix.m[3][2]);
209    }
210
211    void DivideMatrix(Vector3Df source, Matrix matrix)
212    {
213       /*
214       solve(
215       {
216          vectorX=sourceX*m00+sourceY*m10+sourceZ*m20+m30,
217          vectorY=sourceZ*m01+sourceY*m11+sourceZ*m21+m31,
218          vectorZ=sourceX*m02+sourceY*m12+sourceZ*m22+m32
219       }, { sourceX, sourceY, sourceZ });
220       */
221
222       float var1 = (float)(
223          matrix.m[2][0] * matrix.m[0][2] * matrix.m[1][1]
224        - matrix.m[0][2] * matrix.m[2][1] * matrix.m[1][0]
225        - matrix.m[2][2] * matrix.m[0][0] * matrix.m[1][1]
226        - matrix.m[0][2] * matrix.m[0][1] * matrix.m[1][0]
227        + matrix.m[2][1] * matrix.m[0][0] * matrix.m[1][2]
228        + matrix.m[0][1] * matrix.m[0][0] * matrix.m[1][2]);
229
230       x = (float)(
231          - matrix.m[2][2] * source.x * matrix.m[1][1]
232          + matrix.m[2][2] * matrix.m[1][0] * source.y
233          - matrix.m[2][2] * matrix.m[1][0] * matrix.m[3][1]
234          + matrix.m[2][2] * matrix.m[3][0] * matrix.m[1][1]
235          - matrix.m[2][0] * matrix.m[3][2] * matrix.m[1][1]
236          + source.x * matrix.m[2][1] * matrix.m[1][2]
237          + source.x * matrix.m[0][1] * matrix.m[1][2]
238          - matrix.m[1][0] * matrix.m[0][1] * source.z
239          + matrix.m[1][0] * matrix.m[2][1] * matrix.m[3][2]
240          + matrix.m[1][0] * matrix.m[0][1] * matrix.m[3][2]
241          - matrix.m[1][0] * matrix.m[2][1] * source.z
242          - matrix.m[3][0] * matrix.m[2][1] * matrix.m[1][2]
243          - matrix.m[2][0] * matrix.m[1][2] * source.y
244          + matrix.m[2][0] * matrix.m[1][2] * matrix.m[3][1]
245          + matrix.m[2][0] * source.z * matrix.m[1][1]
246          - matrix.m[3][0] * matrix.m[0][1] * matrix.m[1][2]
247          ) / var1;
248
249       y = - (float)(
250          - matrix.m[2][0] * matrix.m[0][2] * source.y
251          + matrix.m[2][1] * matrix.m[0][0] * matrix.m[3][2]
252          + matrix.m[2][0] * matrix.m[0][2] * matrix.m[3][1]
253          + matrix.m[0][1] * matrix.m[0][0] * matrix.m[3][2]
254          - matrix.m[2][1] * matrix.m[0][0] * source.z
255          - matrix.m[0][2] * matrix.m[2][1] * matrix.m[3][0]
256          + matrix.m[0][2] * matrix.m[0][1] * source.x
257          - matrix.m[0][2] * matrix.m[0][1] * matrix.m[3][0]
258          + matrix.m[0][2] * matrix.m[2][1] * source.x
259          + matrix.m[2][2] * matrix.m[0][0] * source.y
260          - matrix.m[0][1] * matrix.m[0][0] * source.z
261          - matrix.m[2][2] * matrix.m[0][0] * matrix.m[3][1]
262          ) / var1;
263
264       z = (float)(
265          source.x * matrix.m[0][2] * matrix.m[1][1]
266          + matrix.m[0][0] * matrix.m[3][2] * matrix.m[1][1]
267          + matrix.m[0][0] * matrix.m[1][2] * source.y
268          - matrix.m[0][0] * matrix.m[1][2] * matrix.m[3][1]
269          - matrix.m[0][0] * source.z * matrix.m[1][1]
270          - matrix.m[1][0] * matrix.m[0][2] * source.y
271          + matrix.m[1][0] * matrix.m[0][2] * matrix.m[3][1]
272          - matrix.m[3][0] * matrix.m[0][2] * matrix.m[1][1]
273          ) / var1;
274    }
275
276    property float length { get { return (float)sqrt(x * x + y * y + z * z); } };
277    property float lengthApprox
278    {
279       get
280       {
281          float ix = Abs(x), iy = Abs(y), iz = Abs(z);
282          float tmp;
283          if(ix < iy) { tmp = ix; ix = iy; iy = tmp; }
284          if(ix < iz) { tmp = ix; ix = iz; iz = tmp; }
285          if(iz > iy) { iz = iy; }
286          return ix + (iz/2);
287       }
288    }
289    /*
290    property Vector3D
291    {
292       get
293       {
294          value.x = (double) x;
295          value.y = (double) y;
296          value.z = (double) z;
297       }
298       set
299       {
300          x = (float) value.x;
301          y = (float) value.y;
302          z = (float) value.z;
303       }
304    }
305    */
306 };