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 #include <assert.h>
00027 #include <stdlib.h>
00028
00029 #include "vec3.h"
00030 #include "vec4.h"
00031 #include "plane.h"
00032
00033 kmScalar kmPlaneDot(const kmPlane* pP, const kmVec4* pV)
00034 {
00035
00036
00037 return (pP->a * pV->x +
00038 pP->b * pV->y +
00039 pP->c * pV->z +
00040 pP->d * pV->w);
00041 }
00042
00043 kmScalar kmPlaneDotCoord(const kmPlane* pP, const kmVec3* pV)
00044 {
00045 return (pP->a * pV->x +
00046 pP->b * pV->y +
00047 pP->c * pV->z + pP->d);
00048 }
00049
00050 kmScalar kmPlaneDotNormal(const kmPlane* pP, const kmVec3* pV)
00051 {
00052 return (pP->a * pV->x +
00053 pP->b * pV->y +
00054 pP->c * pV->z);
00055 }
00056
00057 kmPlane* kmPlaneFromPointNormal(kmPlane* pOut, const kmVec3* pPoint, const kmVec3* pNormal)
00058 {
00059
00060
00061
00062
00063
00064
00065
00066
00067 pOut->a = pNormal->x;
00068 pOut->b = pNormal->y;
00069 pOut->c = pNormal->z;
00070 pOut->d = -kmVec3Dot(pNormal, pPoint);
00071
00072 return pOut;
00073 }
00074
00079 kmPlane* kmPlaneFromPoints(kmPlane* pOut, const kmVec3* p1, const kmVec3* p2, const kmVec3* p3)
00080 {
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090 kmVec3 n, v1, v2;
00091 kmVec3Subtract(&v1, p2, p1);
00092 kmVec3Subtract(&v2, p3, p1);
00093 kmVec3Cross(&n, &v1, &v2);
00094
00095 kmVec3Normalize(&n, &n);
00096
00097 pOut->a = n.x;
00098 pOut->b = n.y;
00099 pOut->c = n.z;
00100 pOut->d = kmVec3Dot(kmVec3Scale(&n, &n, -1.0), p1);
00101
00102 return pOut;
00103 }
00104
00105 kmVec3* kmPlaneIntersectLine(kmVec3* pOut, const kmPlane* pP, const kmVec3* pV1, const kmVec3* pV2)
00106 {
00107
00108
00109
00110
00111
00112 kmVec3 d;
00113 assert(0 && "Not implemented");
00114
00115
00116 kmVec3Subtract(&d, pV2, pV1);
00117
00118
00119
00120
00121
00122
00123
00124
00125
00126
00127
00128 return NULL;
00129 }
00130
00131 kmPlane* kmPlaneNormalize(kmPlane* pOut, const kmPlane* pP)
00132 {
00133 kmVec3 n;
00134 kmScalar l = 0;
00135
00136 n.x = pP->a;
00137 n.y = pP->b;
00138 n.z = pP->c;
00139
00140 l = 1.0f / kmVec3Length(&n);
00141 kmVec3Normalize(&n, &n);
00142
00143 pOut->a = n.x;
00144 pOut->b = n.y;
00145 pOut->c = n.z;
00146
00147 pOut->d = pP->d * l;
00148
00149 return pOut;
00150 }
00151
00152 kmPlane* kmPlaneScale(kmPlane* pOut, const kmPlane* pP, kmScalar s)
00153 {
00154 assert(0 && "Not implemented");
00155 return NULL;
00156 }
00157
00162 POINT_CLASSIFICATION kmPlaneClassifyPoint(const kmPlane* pIn, const kmVec3* pP)
00163 {
00164
00165
00166 float distance = pIn->a * pP->x + pIn->b * pP->y + pIn->c * pP->z + pIn->d;
00167
00168
00169
00170 if(distance > 0.001) return POINT_INFRONT_OF_PLANE;
00171 if(distance < -0.001) return POINT_BEHIND_PLANE;
00172
00173 return POINT_ON_PLANE;
00174 }
00175