00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032 #include <vlCore/math_utils.hpp>
00033 #include <vlCore/AABB.hpp>
00034 #include <vlCore/Vector2.hpp>
00035 #include <vlCore/Vector4.hpp>
00036 #include <vlCore/Plane.hpp>
00037 #include <vlCore/checks.hpp>
00038 #include <vlCore/MersenneTwister.hpp>
00039 #include <cstdlib>
00040
00041 using namespace vl;
00042
00043
00044 real vl::random(real min, real max)
00045 {
00046 real t = (real)defMersenneTwister()->rand53();
00047 return min + (max-min)*t;
00048 }
00049
00050 u32 vl::randomU32(u32 min, u32 max)
00051 {
00052 return defMersenneTwister()->randInt(max-min) + min;
00053 }
00054
00055 i32 vl::randomI32(i32 min, i32 max)
00056 {
00057 return defMersenneTwister()->randInt(max-min) + min;
00058 }
00059
00060 int vl::greaterEqualPow2(int n)
00061 {
00062 int pow2=2;
00063 for(int i=0; i<20; ++i) {
00064 if (pow2 >= n)
00065 return pow2;
00066 pow2 = pow2 * 2;
00067 }
00068 return pow2;
00069 }
00070
00071 int vl::smallerEqualPow2(int n)
00072 {
00073 int pow2=2;
00074 for(int i=0; i<20; ++i) {
00075 if (pow2 > n)
00076 return pow2/2;
00077 pow2 = pow2 * 2;
00078 }
00079 return pow2;
00080 }
00081
00082 void vl::extractPlanes( Plane* planes, const mat4& modelviewproj )
00083 {
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093 vec3 n;
00094 real d;
00095
00096
00097 n.x() = modelviewproj.e(3,0) + modelviewproj.e(0,0);
00098 n.y() = modelviewproj.e(3,1) + modelviewproj.e(0,1);
00099 n.z() = modelviewproj.e(3,2) + modelviewproj.e(0,2);
00100 d = modelviewproj.e(3,3) + modelviewproj.e(0,3);
00101 d /= n.length();
00102 n.normalize();
00103 planes[0] = Plane(d,-n);
00104
00105
00106 n.x() = modelviewproj.e(3,0) - modelviewproj.e(0,0);
00107 n.y() = modelviewproj.e(3,1) - modelviewproj.e(0,1);
00108 n.z() = modelviewproj.e(3,2) - modelviewproj.e(0,2);
00109 d = modelviewproj.e(3,3) - modelviewproj.e(0,3);
00110 d /= n.length();
00111 n.normalize();
00112 planes[1] = Plane(d,-n);
00113
00114
00115 n.x() = modelviewproj.e(3,0) - modelviewproj.e(1,0);
00116 n.y() = modelviewproj.e(3,1) - modelviewproj.e(1,1);
00117 n.z() = modelviewproj.e(3,2) - modelviewproj.e(1,2);
00118 d = modelviewproj.e(3,3) - modelviewproj.e(1,3);
00119 d /= n.length();
00120 n.normalize();
00121 planes[2] = Plane(d,-n);
00122
00123
00124 n.x() = modelviewproj.e(3,0) + modelviewproj.e(1,0);
00125 n.y() = modelviewproj.e(3,1) + modelviewproj.e(1,1);
00126 n.z() = modelviewproj.e(3,2) + modelviewproj.e(1,2);
00127 d = modelviewproj.e(3,3) + modelviewproj.e(1,3);
00128 d /= n.length();
00129 n.normalize();
00130 planes[3] = Plane(d,-n);
00131
00132
00133 n.x() = modelviewproj.e(3,0) + modelviewproj.e(2,0);
00134 n.y() = modelviewproj.e(3,1) + modelviewproj.e(2,1);
00135 n.z() = modelviewproj.e(3,2) + modelviewproj.e(2,2);
00136 d = modelviewproj.e(3,3) + modelviewproj.e(2,3);
00137 d /= n.length();
00138 n.normalize();
00139 planes[4] = Plane(d,-n);
00140
00141
00142 n.x() = modelviewproj.e(3,0) - modelviewproj.e(2,0);
00143 n.y() = modelviewproj.e(3,1) - modelviewproj.e(2,1);
00144 n.z() = modelviewproj.e(3,2) - modelviewproj.e(2,2);
00145 d = modelviewproj.e(3,3) - modelviewproj.e(2,3);
00146 d /= n.length();
00147 n.normalize();
00148 planes[5] = Plane(d,-n);
00149 }