2 BobToolz plugin for GtkRadiant
3 Copyright (C) 2001 Gordon Biggans
5 This library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Lesser General Public
7 License as published by the Free Software Foundation; either
8 version 2.1 of the License, or (at your option) any later version.
10 This library is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Lesser General Public License for more details.
15 You should have received a copy of the GNU Lesser General Public
16 License along with this library; if not, write to the Free Software
17 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20 // DPlane.cpp: implementation of the DPlane class.
22 //////////////////////////////////////////////////////////////////////
26 #include "gtkr_list.h"
35 //////////////////////////////////////////////////////////////////////
36 // Construction/Destruction
37 //////////////////////////////////////////////////////////////////////
39 DPlane::DPlane(vec3_t va, vec3_t vb, vec3_t vc, _QERFaceData* texData)
41 MakeNormal( va, vb, vc, normal );
42 if(VectorNormalize(normal, normal) == 0) // normalizes and returns length
43 Sys_ERROR("DPlane::DPlane: Bad Normal.\n");
45 _d = (normal[0]*va[0]) + (normal[1]*va[1]) + (normal[2]*va[2]);
47 VectorCopy(va, points[0]);
48 VectorCopy(vb, points[1]);
49 VectorCopy(vc, points[2]);
54 memcpy(&texInfo, texData, sizeof(_QERFaceData));
56 FillDefaultTexture(&texInfo, points[0], points[1], points[2], "textures/common/caulk");
64 //////////////////////////////////////////////////////////////////////
66 //////////////////////////////////////////////////////////////////////
68 vec_t DPlane::DistanceToPoint(vec3_t pnt)
71 VectorSubtract(pnt, points[0], tmp);
72 return DotProduct(tmp, normal);
75 bool DPlane::PlaneIntersection(DPlane *pl1, DPlane *pl2, vec3_t out)
81 a1 = normal[0]; a2 = normal[1]; a3 = normal[2];
82 b1 = pl1->normal[0]; b2 = pl1->normal[1]; b3 = pl1->normal[2];
83 c1 = pl2->normal[0]; c2 = pl2->normal[1]; c3 = pl2->normal[2];
85 float d = Determinant3x3(a1, a2, a3, b1, b2, b3, c1, c2, c3);
94 float d1 = Determinant3x3(v1, a2, a3, v2, b2, b3, v3, c2, c3);
95 float d2 = Determinant3x3(a1, v1, a3, b1, v2, b3, c1, v3, c3);
96 float d3 = Determinant3x3(a1, a2, v1, b1, b2, v2, c1, c2, v3);
105 bool DPlane::IsRedundant(list<DPoint*>& pointList)
109 //list<DPoint *>::const_iterator point=pointList.begin();
110 for(list<DPoint *>::const_iterator point=pointList.begin(); point!=pointList.end(); point++)
112 if(fabs(DistanceToPoint((*point)->_pnt)) < MAX_ROUND_ERROR)
121 bool DPlane::operator == (DPlane& other)
124 VectorSubtract(other.normal, normal, chk);
125 if(fabs(VectorLength(chk)) > MAX_ROUND_ERROR)
128 if(fabs(other._d - _d) > MAX_ROUND_ERROR)
134 bool DPlane::operator != (DPlane& other)
137 VectorAdd(other.normal, normal, chk);
138 if(fabs(VectorLength(chk)) > MAX_ROUND_ERROR)
144 DWinding* DPlane::BaseWindingForPlane()
148 vec3_t org, vright, vup;
150 // find the major axis
156 v = (float)fabs(normal[i]);
164 Sys_Printf ("BaseWindingForPlane: no axis found");
166 VectorCopy (vec3_origin, vup);
178 v = DotProduct (vup, normal);
179 VectorMA (vup, -v, normal, vup);
180 VectorNormalize (vup, vup);
182 VectorScale (normal, _d, org);
184 CrossProduct (vup, normal, vright);
186 VectorScale (vup, 131072, vup);
187 VectorScale (vright, 131072, vright);
189 // project a really big axis aligned box onto the plane
190 DWinding* w = new DWinding;
193 VectorSubtract (org, vright, w->p[0]);
194 VectorAdd (w->p[0], vup, w->p[0]);
196 VectorAdd (org, vright, w->p[1]);
197 VectorAdd (w->p[1], vup, w->p[1]);
199 VectorAdd (org, vright, w->p[2]);
200 VectorSubtract (w->p[2], vup, w->p[2]);
202 VectorSubtract (org, vright, w->p[3]);
203 VectorSubtract (w->p[3], vup, w->p[3]);
208 void DPlane::Rebuild()
211 VectorSubtract(points[0], points[1], v1);
212 VectorSubtract(points[2], points[1], v2);
213 CrossProduct(v1, v2, normal);
215 if(VectorNormalize(normal, normal) == 0) // normalizes and returns length
216 Sys_ERROR("DPlane::Rebuild: Bad Normal.\n");
218 _d = (normal[0]*points[0][0]) + (normal[1]*points[0][1]) + (normal[2]*points[0][2]);
220 VectorCopy(points[0], texInfo.m_p0);
221 VectorCopy(points[1], texInfo.m_p1);
222 VectorCopy(points[2], texInfo.m_p2);
225 bool DPlane::AddToBrush(Brush *brush)
228 if(m_bChkOk || !strcmp(texInfo.m_TextureName, "textures/common/caulk"))
230 brush->addPlane(m_p0, m_p1, m_p2, m_texdef, false);
234 strcpy(texInfo.m_TextureName, "textures/common/caulk");
235 brush->addPlane(m_p0, m_p1, m_p2, m_texdef, false);
240 void DPlane::ScaleTexture()
243 DPlane::DPlane(vec3_t va, vec3_t vb, vec3_t vc, const char* textureName, bool bDetail)
246 VectorSubtract(va, vb, v1);
247 VectorSubtract(vc, vb, v2);
248 CrossProduct(v1, v2, normal);
250 if(VectorNormalize(normal, normal) == 0) // normalizes and returns length
251 Sys_ERROR("DPlane::DPlane: Bad Normal.\n");
253 _d = (normal[0]*va[0]) + (normal[1]*va[1]) + (normal[2]*va[2]);
255 VectorCopy(va, points[0]);
256 VectorCopy(vb, points[1]);
257 VectorCopy(vc, points[2]);
261 FillDefaultTexture(&texInfo, points[0], points[1], points[2], textureName);
263 texInfo.m_texdef.contents |= FACE_DETAIL;