2 BobToolz plugin for GtkRadiant
\r
3 Copyright (C) 2001 Gordon Biggans
\r
5 This library is free software; you can redistribute it and/or
\r
6 modify it under the terms of the GNU Lesser General Public
\r
7 License as published by the Free Software Foundation; either
\r
8 version 2.1 of the License, or (at your option) any later version.
\r
10 This library is distributed in the hope that it will be useful,
\r
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
\r
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
\r
13 Lesser General Public License for more details.
\r
15 You should have received a copy of the GNU Lesser General Public
\r
16 License along with this library; if not, write to the Free Software
\r
17 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
\r
20 // DPlane.cpp: implementation of the DPlane class.
\r
22 //////////////////////////////////////////////////////////////////////
\r
26 #include "DWinding.h"
\r
29 //////////////////////////////////////////////////////////////////////
\r
30 // Construction/Destruction
\r
31 //////////////////////////////////////////////////////////////////////
\r
33 DPlane::DPlane(vec3_t va, vec3_t vb, vec3_t vc, _QERFaceData* texData)
\r
35 MakeNormal( va, vb, vc, normal );
\r
36 if(VectorNormalize(normal, normal) == 0) // normalizes and returns length
\r
37 Sys_ERROR("DPlane::DPlane: Bad Normal.\n");
\r
39 _d = (normal[0]*va[0]) + (normal[1]*va[1]) + (normal[2]*va[2]);
\r
41 VectorCopy(va, points[0]);
\r
42 VectorCopy(vb, points[1]);
\r
43 VectorCopy(vc, points[2]);
\r
48 memcpy(&texInfo, texData, sizeof(_QERFaceData));
\r
50 FillDefaultTexture(&texInfo, points[0], points[1], points[2], "textures/common/caulk");
\r
58 //////////////////////////////////////////////////////////////////////
\r
60 //////////////////////////////////////////////////////////////////////
\r
62 vec_t DPlane::DistanceToPoint(vec3_t pnt)
\r
65 VectorSubtract(pnt, points[0], tmp);
\r
66 return DotProduct(tmp, normal);
\r
69 bool DPlane::PlaneIntersection(DPlane *pl1, DPlane *pl2, vec3_t out)
\r
75 a1 = normal[0]; a2 = normal[1]; a3 = normal[2];
\r
76 b1 = pl1->normal[0]; b2 = pl1->normal[1]; b3 = pl1->normal[2];
\r
77 c1 = pl2->normal[0]; c2 = pl2->normal[1]; c3 = pl2->normal[2];
\r
79 float d = Determinant3x3(a1, a2, a3, b1, b2, b3, c1, c2, c3);
\r
88 float d1 = Determinant3x3(v1, a2, a3, v2, b2, b3, v3, c2, c3);
\r
89 float d2 = Determinant3x3(a1, v1, a3, b1, v2, b3, c1, v3, c3);
\r
90 float d3 = Determinant3x3(a1, a2, v1, b1, b2, v2, c1, c2, v3);
\r
99 bool DPlane::IsRedundant(list<DPoint*>& pointList)
\r
103 //list<DPoint *>::const_iterator point=pointList.begin();
\r
104 for(list<DPoint *>::const_iterator point=pointList.begin(); point!=pointList.end(); point++)
\r
106 if(fabs(DistanceToPoint((*point)->_pnt)) < MAX_ROUND_ERROR)
\r
115 bool DPlane::operator == (DPlane& other)
\r
118 VectorSubtract(other.normal, normal, chk);
\r
119 if(fabs(VectorLength(chk)) > MAX_ROUND_ERROR)
\r
122 if(fabs(other._d - _d) > MAX_ROUND_ERROR)
\r
128 bool DPlane::operator != (DPlane& other)
\r
131 VectorAdd(other.normal, normal, chk);
\r
132 if(fabs(VectorLength(chk)) > MAX_ROUND_ERROR)
\r
138 DWinding* DPlane::BaseWindingForPlane()
\r
142 vec3_t org, vright, vup;
\r
144 // find the major axis
\r
148 for (i=0 ; i<3; i++)
\r
150 v = (float)fabs(normal[i]);
\r
158 Sys_Printf ("BaseWindingForPlane: no axis found");
\r
160 VectorCopy (vec3_origin, vup);
\r
172 v = DotProduct (vup, normal);
\r
173 VectorMA (vup, -v, normal, vup);
\r
174 VectorNormalize (vup, vup);
\r
176 VectorScale (normal, _d, org);
\r
178 CrossProduct (vup, normal, vright);
\r
180 VectorScale (vup, 131072, vup);
\r
181 VectorScale (vright, 131072, vright);
\r
183 // project a really big axis aligned box onto the plane
\r
184 DWinding* w = new DWinding;
\r
185 w->AllocWinding(4);
\r
187 VectorSubtract (org, vright, w->p[0]);
\r
188 VectorAdd (w->p[0], vup, w->p[0]);
\r
190 VectorAdd (org, vright, w->p[1]);
\r
191 VectorAdd (w->p[1], vup, w->p[1]);
\r
193 VectorAdd (org, vright, w->p[2]);
\r
194 VectorSubtract (w->p[2], vup, w->p[2]);
\r
196 VectorSubtract (org, vright, w->p[3]);
\r
197 VectorSubtract (w->p[3], vup, w->p[3]);
\r
202 void DPlane::Rebuild()
\r
205 VectorSubtract(points[0], points[1], v1);
\r
206 VectorSubtract(points[2], points[1], v2);
\r
207 CrossProduct(v1, v2, normal);
\r
209 if(VectorNormalize(normal, normal) == 0) // normalizes and returns length
\r
210 Sys_ERROR("DPlane::Rebuild: Bad Normal.\n");
\r
212 _d = (normal[0]*points[0][0]) + (normal[1]*points[0][1]) + (normal[2]*points[0][2]);
\r
214 VectorCopy(points[0], texInfo.m_v1);
\r
215 VectorCopy(points[1], texInfo.m_v2);
\r
216 VectorCopy(points[2], texInfo.m_v3);
\r
219 bool DPlane::AddToBrush_t(brush_t *brush)
\r
221 if(m_bChkOk || !strcmp(texInfo.m_TextureName, "textures/common/caulk"))
\r
223 g_FuncTable.m_pfnAddFaceData(brush, &texInfo);
\r
227 strcpy(texInfo.m_TextureName, "textures/common/caulk");
\r
228 g_FuncTable.m_pfnAddFaceData(brush, &texInfo);
\r
232 void DPlane::ScaleTexture()
\r
235 DPlane::DPlane(vec3_t va, vec3_t vb, vec3_t vc, const char* textureName, bool bDetail)
\r
238 VectorSubtract(va, vb, v1);
\r
239 VectorSubtract(vc, vb, v2);
\r
240 CrossProduct(v1, v2, normal);
\r
242 if(VectorNormalize(normal, normal) == 0) // normalizes and returns length
\r
243 Sys_ERROR("DPlane::DPlane: Bad Normal.\n");
\r
245 _d = (normal[0]*va[0]) + (normal[1]*va[1]) + (normal[2]*va[2]);
\r
247 VectorCopy(va, points[0]);
\r
248 VectorCopy(vb, points[1]);
\r
249 VectorCopy(vc, points[2]);
\r
253 FillDefaultTexture(&texInfo, points[0], points[1], points[2], textureName);
\r
255 texInfo.m_nContents |= FACE_DETAIL;
\r