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 //////////////////////////////////////////////////////////////////////
34 //////////////////////////////////////////////////////////////////////
35 // Construction/Destruction
36 //////////////////////////////////////////////////////////////////////
38 DPlane::DPlane(const vec3_t va, const vec3_t vb, const vec3_t vc, const _QERFaceData *texData)
40 MakeNormal(va, vb, vc, normal);
41 if (VectorNormalize(normal, normal) == 0) { // normalizes and returns length
42 globalErrorStream() << "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");
65 //////////////////////////////////////////////////////////////////////
67 //////////////////////////////////////////////////////////////////////
69 vec_t DPlane::DistanceToPoint(vec3_t pnt)
72 VectorSubtract(pnt, points[0], tmp);
73 return DotProduct(tmp, normal);
76 bool DPlane::PlaneIntersection(DPlane *pl1, DPlane *pl2, vec3_t out)
92 float d = Determinant3x3(a1, a2, a3, b1, b2, b3, c1, c2, c3);
102 float d1 = Determinant3x3(v1, a2, a3, v2, b2, b3, v3, c2, c3);
103 float d2 = Determinant3x3(a1, v1, a3, b1, v2, b3, c1, v3, c3);
104 float d3 = Determinant3x3(a1, a2, v1, b1, b2, v2, c1, c2, v3);
113 bool DPlane::IsRedundant(std::list<DPoint *> &pointList)
117 //std::list<DPoint *>::const_iterator point=pointList.begin();
118 for (std::list<DPoint *>::const_iterator point = pointList.begin(); point != pointList.end(); point++) {
119 if (fabs(DistanceToPoint((*point)->_pnt)) < MAX_ROUND_ERROR) {
130 bool DPlane::operator==(DPlane &other)
133 VectorSubtract(other.normal, normal, chk);
134 if (fabs(VectorLength(chk)) > MAX_ROUND_ERROR) {
138 if (fabs(other._d - _d) > MAX_ROUND_ERROR) {
145 bool DPlane::operator!=(DPlane &other)
148 VectorAdd(other.normal, normal, chk);
149 if (fabs(VectorLength(chk)) > MAX_ROUND_ERROR) {
156 DWinding *DPlane::BaseWindingForPlane()
160 vec3_t org, vright, vup;
162 // find the major axis
166 for (i = 0; i < 3; i++) {
167 v = (float) fabs(normal[i]);
174 globalOutputStream() << "BaseWindingForPlane: no axis found";
177 VectorCopy(vec3_origin, vup);
188 v = DotProduct(vup, normal);
189 VectorMA(vup, -v, normal, vup);
190 VectorNormalize(vup, vup);
192 VectorScale(normal, _d, org);
194 CrossProduct(vup, normal, vright);
196 VectorScale(vup, 131072, vup);
197 VectorScale(vright, 131072, vright);
199 // project a really big axis aligned box onto the plane
200 DWinding *w = new DWinding;
203 VectorSubtract(org, vright, w->p[0]);
204 VectorAdd(w->p[0], vup, w->p[0]);
206 VectorAdd(org, vright, w->p[1]);
207 VectorAdd(w->p[1], vup, w->p[1]);
209 VectorAdd(org, vright, w->p[2]);
210 VectorSubtract(w->p[2], vup, w->p[2]);
212 VectorSubtract(org, vright, w->p[3]);
213 VectorSubtract(w->p[3], vup, w->p[3]);
218 void DPlane::Rebuild()
221 VectorSubtract(points[0], points[1], v1);
222 VectorSubtract(points[2], points[1], v2);
223 CrossProduct(v1, v2, normal);
225 if (VectorNormalize(normal, normal) == 0) { // normalizes and returns length
226 globalErrorStream() << "DPlane::Rebuild: Bad Normal.\n";
229 _d = (normal[0] * points[0][0]) + (normal[1] * points[0][1]) + (normal[2] * points[0][2]);
231 VectorCopy(points[0], texInfo.m_p0);
232 VectorCopy(points[1], texInfo.m_p1);
233 VectorCopy(points[2], texInfo.m_p2);
236 bool DPlane::AddToBrush(scene::Node &brush)
238 bool changed = false;
239 if (!(m_bChkOk || !strcmp(m_shader.c_str(), "textures/common/caulk"))) {
240 m_shader = "textures/common/caulk";
244 _QERFaceData faceData;
245 faceData.m_p0 = vector3_from_array(points[0]);
246 faceData.m_p1 = vector3_from_array(points[1]);
247 faceData.m_p2 = vector3_from_array(points[2]);
248 faceData.m_texdef = texInfo.m_texdef;
249 faceData.m_shader = m_shader.c_str();
250 GlobalBrushCreator().Brush_addFace(brush, faceData);
255 void DPlane::ScaleTexture()
258 DPlane::DPlane(const vec3_t va, const vec3_t vb, const vec3_t vc, const char *textureName, bool bDetail)
261 VectorSubtract(va, vb, v1);
262 VectorSubtract(vc, vb, v2);
263 CrossProduct(v1, v2, normal);
265 if (VectorNormalize(normal, normal) == 0) { // normalizes and returns length
266 globalErrorStream() << "DPlane::DPlane: Bad Normal.\n";
269 _d = (normal[0] * va[0]) + (normal[1] * va[1]) + (normal[2] * va[2]);
271 VectorCopy(va, points[0]);
272 VectorCopy(vb, points[1]);
273 VectorCopy(vc, points[2]);
277 FillDefaultTexture(&texInfo, points[0], points[1], points[2], textureName);
279 texInfo.contents |= FACE_DETAIL;