- build system has to use 32bit (the code is not 64bit safe)
[genesis3d.git] / GBSPLib / MATHLIB.CPP
1 /****************************************************************************************/\r
2 /*  MathLib.cpp                                                                         */\r
3 /*                                                                                      */\r
4 /*  Author: John Pollard                                                                */\r
5 /*  Description: Various math functions not included in Vec3d.h, etc...                 */\r
6 /*                                                                                      */\r
7 /*  The contents of this file are subject to the Genesis3D Public License               */\r
8 /*  Version 1.01 (the "License"); you may not use this file except in                   */\r
9 /*  compliance with the License. You may obtain a copy of the License at                */\r
10 /*  http://www.genesis3d.com                                                            */\r
11 /*                                                                                      */\r
12 /*  Software distributed under the License is distributed on an "AS IS"                 */\r
13 /*  basis, WITHOUT WARRANTY OF ANY KIND, either express or implied.  See                */\r
14 /*  the License for the specific language governing rights and limitations              */\r
15 /*  under the License.                                                                  */\r
16 /*                                                                                      */\r
17 /*  The Original Code is Genesis3D, released March 25, 1999.                            */\r
18 /*Genesis3D Version 1.1 released November 15, 1999                            */\r
19 /*  Copyright (C) 1999 WildTangent, Inc. All Rights Reserved           */\r
20 /*                                                                                      */\r
21 /****************************************************************************************/\r
22 #include <Windows.h>\r
23 \r
24 #include "Math.h"\r
25 #include "MathLib.h"\r
26 \r
27 geVec3d VecOrigin = {0.0f, 0.0f, 0.0f};\r
28 \r
29 //====================================================================================\r
30 // ClearBounds\r
31 //====================================================================================\r
32 void ClearBounds(geVec3d *Mins, geVec3d *Maxs)\r
33 {\r
34         Mins->X =  MIN_MAX_BOUNDS;\r
35         Mins->Y =  MIN_MAX_BOUNDS;\r
36         Mins->Z =  MIN_MAX_BOUNDS;\r
37 \r
38         Maxs->X = -MIN_MAX_BOUNDS;\r
39         Maxs->Y = -MIN_MAX_BOUNDS;\r
40         Maxs->Z = -MIN_MAX_BOUNDS;\r
41 }\r
42 \r
43 //=======================================================================================\r
44 //      AddPointToBounds\r
45 //=======================================================================================\r
46 void AddPointToBounds(geVec3d *v, geVec3d *Mins, geVec3d *Maxs)\r
47 {\r
48         int32   i;\r
49         geFloat         Val;\r
50 \r
51         for (i=0 ; i<3 ; i++)\r
52         {\r
53                 Val = VectorToSUB(*v, i);\r
54 \r
55                 if (Val < VectorToSUB(*Mins, i))\r
56                         VectorToSUB(*Mins, i) = Val;\r
57                 if (Val > VectorToSUB(*Maxs, i))\r
58                         VectorToSUB(*Maxs, i) = Val;\r
59         }\r
60 }\r
61 \r
62 //=======================================================================================\r
63 //      ColorNormalize\r
64 //=======================================================================================\r
65 geFloat ColorNormalize(geVec3d *C1, geVec3d *C2)\r
66 {\r
67         geFloat Max;\r
68 \r
69         Max = C1->X;\r
70         if (C1->Y > Max)\r
71                 Max = C1->Y;\r
72         if (C1->Z > Max)\r
73                 Max = C1->Z;\r
74 \r
75         if (Max == 0.0f)\r
76                 return 0.0f;\r
77         \r
78         geVec3d_Scale(C1, 1.0f/Max, C2);\r
79 \r
80         return Max;\r
81 }\r
82 \r
83 //=======================================================================================\r
84 //      ColorClamp\r
85 //=======================================================================================\r
86 geFloat ColorClamp(geVec3d *C1, geFloat Clamp, geVec3d *C2)\r
87 {\r
88         int32   i;\r
89         geFloat Max, Max2;\r
90         geVec3d C3;\r
91 \r
92         Max = -1.0f;\r
93 \r
94         C3 = *C1;\r
95 \r
96         for (i=0; i<3; i++)\r
97         {\r
98                 if (VectorToSUB(C3, i) < 1.0f)\r
99                         VectorToSUB(C3, i) = 1.0f;\r
100 \r
101                 if (VectorToSUB(C3, i) > Max)\r
102                         Max = VectorToSUB(C3, i);\r
103         }\r
104         \r
105         Max2 = Max;\r
106 \r
107         if (Max2 > Clamp)\r
108                 Max2 = Clamp;\r
109 \r
110         geVec3d_Scale(C1, Max2/Max, C2);\r
111 \r
112         return Max;\r
113 }\r
114 \r
115 //=======================================================================================\r
116 //      geVec3d_PlaneType\r
117 //=======================================================================================\r
118 int32 geVec3d_PlaneType(geVec3d *V1)\r
119 {\r
120         geFloat X, Y, Z;\r
121 \r
122         X = (geFloat)fabs(V1->X);\r
123         Y = (geFloat)fabs(V1->Y);\r
124         Z = (geFloat)fabs(V1->Z);\r
125 \r
126         if (X == 1.0f)\r
127                 return PLANE_X;\r
128 \r
129         else if (Y == 1.0f)\r
130                 return PLANE_Y;\r
131 \r
132         else if (Z == 1.0f)\r
133                 return PLANE_Z;\r
134 \r
135         if (X >= Y && X >= Z)\r
136                 return PLANE_ANYX;\r
137 \r
138         else if (Y >= X && Y >= Z)\r
139                 return PLANE_ANYY;\r
140 \r
141         else\r
142                 return PLANE_ANYZ;\r
143 }\r
144 \r
145 \r