cleaned all trailing white space from source files.
[sdk] / ecere / src / gfx / 3D / Plane.ec
1 namespace gfx3D;
2
3 import "Display"
4
5 public struct Line
6 {
7    Vector3D p0;
8    Vector3D delta;
9 };
10
11 public struct Plane
12 {
13    union
14    {
15       struct { double a, b, c; };
16       Vector3D normal;
17    };
18    double d;
19
20    void FromPoints(Vector3D v1, Vector3D v2, Vector3D v3)
21    {
22       Vector3D a, b;
23
24       a.Subtract(v3, v1);
25       b.Subtract(v2, v1);
26       normal.CrossProduct(a, b);
27       normal.Normalize(normal);
28
29       d = -normal.DotProduct(v1);
30    }
31
32    void FromPointsf(Vector3Df v1, Vector3Df v2, Vector3Df v3)
33    {
34       Vector3D v1d { (double)v1.x, (double)v1.y, (double)v1.z };
35       Vector3D v2d { (double)v2.x, (double)v2.y, (double)v2.z };
36       Vector3D v3d { (double)v3.x, (double)v3.y, (double)v3.z };
37       Vector3D a, b;
38
39       a.Subtract(v3d, v1d);
40       b.Subtract(v2d, v1d);
41       normal.CrossProduct(a, b);
42       normal.Normalize(normal);
43
44       d = -normal.DotProduct(v1d);
45    }
46
47    void MultMatrix(Plane source, Matrix inverseTranspose)
48    {
49       a = source.a * inverseTranspose.m[0][0] +
50           source.b * inverseTranspose.m[1][0] +
51           source.c * inverseTranspose.m[2][0] +
52           source.d * inverseTranspose.m[3][0];
53       b = source.a * inverseTranspose.m[0][1] +
54           source.b * inverseTranspose.m[1][1] +
55           source.c * inverseTranspose.m[2][1] +
56           source.d * inverseTranspose.m[3][1];
57       c = source.a * inverseTranspose.m[0][2] +
58           source.b * inverseTranspose.m[1][2] +
59           source.c * inverseTranspose.m[2][2] +
60           source.d * inverseTranspose.m[3][2];
61       d = source.a * inverseTranspose.m[0][3] +
62           source.b * inverseTranspose.m[1][3] +
63           source.c * inverseTranspose.m[2][3] +
64           source.d * inverseTranspose.m[3][3];
65    }
66
67    void IntersectLine(Line line, Vector3D result)
68    {
69       double divisor = a * line.delta.x + b * line.delta.y + c * line.delta.z;
70
71       result.x = (b * line.delta.y * line.p0.x - b * line.delta.x * line.p0.y +
72                   c * line.delta.z * line.p0.x - c * line.delta.x * line.p0.z -
73                   d * line.delta.x ) / divisor;
74
75       result.y = (a * line.delta.x * line.p0.y - a * line.delta.y * line.p0.x +
76                   c * line.delta.z * line.p0.y - c * line.delta.y * line.p0.z -
77                   d * line.delta.y ) / divisor;
78
79       result.z = (a * line.delta.x * line.p0.z - a * line.delta.z * line.p0.x +
80                   b * line.delta.y * line.p0.z - b * line.delta.z * line.p0.y -
81                   d * line.delta.z ) / divisor;
82    }
83
84    void IntersectLinef(Line line, Vector3Df result)
85    {
86       double divisor = a * line.delta.x + b * line.delta.y + c * line.delta.z;
87
88       result.x = (float)((b * line.delta.y * line.p0.x - b * line.delta.x * line.p0.y +
89                   c * line.delta.z * line.p0.x - c * line.delta.x * line.p0.z -
90                   d * line.delta.x ) / divisor);
91
92       result.y = (float)((a * line.delta.x * line.p0.y - a * line.delta.y * line.p0.x +
93                   c * line.delta.z * line.p0.y - c * line.delta.y * line.p0.z -
94                   d * line.delta.y ) / divisor);
95
96       result.z = (float)((a * line.delta.x * line.p0.z - a * line.delta.z * line.p0.x +
97                   b * line.delta.y * line.p0.z - b * line.delta.z * line.p0.y -
98                   d * line.delta.z ) / divisor);
99    }
100
101    void FromPointNormal(Vector3D normal, Vector3D point)
102    {
103       this.normal = normal;
104       d = -(normal.x * point.x + normal.y * point.y + normal.z * point.z);
105    }
106 };