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 // DShape.cpp: implementation of the DShape class.
22 //////////////////////////////////////////////////////////////////////
37 //#include "dialogs-gtk.h"
42 //////////////////////////////////////////////////////////////////////
43 // Construction/Destruction
44 //////////////////////////////////////////////////////////////////////
46 bool bFacesAll[6] = {true, true, true, true, true, true};
58 void DShape::BuildRegularPrism(vec3_t min, vec3_t max, int nSides, bool bAlignTop)
60 vec3_t vc[MAX_POLYGON_FACES + 2], vd[MAX_POLYGON_FACES + 2];
65 VectorSubtract(max, min, radius);
66 VectorScale(radius, 0.5f, radius);
67 // calc 3d radius and origin
68 VectorAdd(max, min, origin);
69 VectorScale(origin, 0.5f, origin);
74 phase = -(Q_PI / nSides);
75 VectorScale(radius, static_cast<float>( 1.0 / cos(phase)), radius);
78 //----- Build Polygon Vertices -----
81 for (i = 0; i < nSides; i++) {
82 VectorCopy(origin, vc[i]);
83 VectorCopy(origin, vd[i]);
88 vc[i][0] += radius[0] * sinf((2 * Q_PI * i / nSides) + phase);
89 vc[i][1] += radius[1] * cosf((2 * Q_PI * i / nSides) + phase);
95 VectorCopy(vc[0], vc[nSides]);
96 VectorCopy(vd[0], vd[nSides]);
97 VectorCopy(vc[1], vc[nSides + 1]);
98 VectorCopy(vd[1], vd[nSides + 1]);
100 //----------------------------------
102 DBrush *pB = m_Container.GetWorldSpawn()->NewBrush(m_nNextBrush++);
104 for (i = 1; i <= nSides; i++) {
105 pB->AddFace(vc[i - 1], vc[i], vd[i], GetCurrentTexture(), false);
108 pB->AddFace(vc[2], vc[1], vc[0], "textures/common/caulk", false);
109 pB->AddFace(vd[0], vd[1], vd[2], "textures/common/caulk", false);
112 void DShape::Commit()
114 m_Container.GetWorldSpawn()->FixBrushes();
115 m_Container.BuildInRadiant(true);
118 void DShape::BuildInversePrism(vec3_t min, vec3_t max, int nSides, bool bAlignTop)
120 vec3_t va[MAX_POLYGON_FACES + 1], vb[MAX_POLYGON_FACES + 1];
124 VectorSubtract(max, min, radius);
125 VectorScale(radius, 0.5f, radius);
126 // calc 3d radius and origin
127 VectorAdd(max, min, origin);
128 VectorScale(origin, 0.5f, origin);
133 phase = -(Q_PI / nSides);
134 VectorScale(radius, static_cast<float>( 1.0 / cos(phase)), radius);
137 //----- Build Polygon Vertices -----
140 for (i = 0; i < nSides; i++) {
141 VectorCopy(origin, va[i]);
142 VectorCopy(origin, vb[i]);
147 va[i][0] += radius[0] * sinf((2 * Q_PI * i / nSides) + phase);
148 va[i][1] += radius[1] * cosf((2 * Q_PI * i / nSides) + phase);
154 VectorCopy(va[0], va[nSides]);
155 VectorCopy(vb[0], vb[nSides]);
157 //----------------------------------
159 for (i = 1; i <= nSides; i++) {
160 DBrush *pB = GetBoundingCube(min, max, "textures/common/caulk");
163 VectorCopy(va[i - 1], top);
164 VectorCopy(va[i], bottom);
166 if (va[i - 1][1] > va[i][1]) {
169 } else // flip direction of plane on crossover
175 if (top[1] != bottom[1]) { // internal line is flat already if true
176 pB->AddFace(va[i - 1], top, vb[i - 1], "textures/common/caulk", false);
177 pB->AddFace(va[i], vb[i], bottom, "textures/common/caulk", false);
178 } // add cut-off planes
180 pB->AddFace(va[i - 1], vb[i - 1], vb[i], GetCurrentTexture(), false);
181 // add internal polygon plane
185 void DShape::BuildBorderedPrism(vec3_t min, vec3_t max, int nSides, int nBorder, bool bAlignTop)
187 vec3_t va[MAX_POLYGON_FACES + 2], vb[MAX_POLYGON_FACES + 2];
188 vec3_t vc[MAX_POLYGON_FACES + 2], vd[MAX_POLYGON_FACES + 2];
193 VectorSubtract(max, min, radius);
194 VectorScale(radius, 0.5f, radius);
195 // calc 3d radius and origin
196 VectorAdd(max, min, origin);
197 VectorScale(origin, 0.5f, origin);
199 if (nBorder >= Min(radius[0], radius[1])) {
200 // DoMessageBox("Border is too large", "Error", MB_OK);
207 phase = -(Q_PI / nSides);
208 VectorScale(radius, static_cast<float>( 1.0 / cos(phase)), radius);
211 //----- Build Polygon Vertices -----
214 for (i = 0; i < nSides; i++) {
215 VectorCopy(origin, va[i]);
216 VectorCopy(origin, vb[i]);
217 VectorCopy(origin, vc[i]);
218 VectorCopy(origin, vd[i]);
223 va[i][0] += (radius[0] - nBorder) * sinf((2 * Q_PI * i / nSides) + phase);
224 va[i][1] += (radius[1] - nBorder) * cosf((2 * Q_PI * i / nSides) + phase);
233 vc[i][0] += radius[0] * sinf((2 * Q_PI * i / nSides) + phase);
234 vc[i][1] += radius[1] * cosf((2 * Q_PI * i / nSides) + phase);
240 VectorCopy(va[0], va[nSides]);
241 VectorCopy(vb[0], vb[nSides]);
242 VectorCopy(va[1], va[nSides + 1]);
243 VectorCopy(vb[1], vb[nSides + 1]);
245 VectorCopy(vc[0], vc[nSides]);
246 VectorCopy(vd[0], vd[nSides]);
247 VectorCopy(vc[1], vc[nSides + 1]);
248 VectorCopy(vd[1], vd[nSides + 1]);
250 //----------------------------------
252 for (i = 1; i <= nSides; i++) {
253 DBrush *pB = GetBoundingCube(min, max, "textures/common/caulk");
255 pB->AddFace(origin, vc[i - 1], vd[i - 1], "textures/common/caulk", false);
256 pB->AddFace(origin, vd[i], vc[i], "textures/common/caulk", false);
258 pB->AddFace(vc[i - 1], vc[i], vd[i], GetCurrentTexture(), false);
259 pB->AddFace(vb[i], va[i], va[i - 1], GetCurrentTexture(), false);
263 DBrush *DShape::GetBoundingCube_Ext(vec3_t min, vec3_t max, const char *textureName, bool *bUseFaces, bool detail)
265 DBrush *pB = new DBrush;
266 //----- Build Outer Bounds ---------
268 vec3_t v1, v2, v3, v5, v6, v7;
282 //----------------------------------
284 //----- Add Six Cube Faces ---------
287 pB->AddFace(v1, v2, v3, textureName, detail);
290 pB->AddFace(v1, v3, v6, textureName, detail);
293 pB->AddFace(v1, v7, v2, textureName, detail);
297 pB->AddFace(v5, v6, v3, textureName, detail);
300 pB->AddFace(v5, v2, v7, textureName, detail);
303 pB->AddFace(v5, v7, v6, textureName, detail);
306 //----------------------------------
311 DBrush *DShape::GetBoundingCube(vec3_t min, vec3_t max, const char *textureName, DEntity *ent, bool *bUseFaces)
315 pB = m_Container.GetWorldSpawn()->NewBrush(m_nNextBrush++);
317 pB = ent->NewBrush(m_nNextBrush++);
320 //----- Build Outer Bounds ---------
322 vec3_t v1, v2, v3, v5, v6, v7;
336 //----------------------------------
338 //----- Add Six Cube Faces ---------
341 pB->AddFace(v1, v2, v3, textureName, false);
344 pB->AddFace(v1, v3, v6, textureName, false);
347 pB->AddFace(v1, v7, v2, textureName, false);
351 pB->AddFace(v5, v6, v3, textureName, false);
354 pB->AddFace(v5, v2, v7, textureName, false);
357 pB->AddFace(v5, v7, v6, textureName, false);
360 //----------------------------------
365 bool DShape::BuildPit(vec3_t min, vec3_t max)
367 if ((max[2] - min[2]) < 196) {
374 VectorAdd(min, max, centre);
375 VectorScale(centre, 0.5f, centre);
379 int team = (rand() % 10000) + 5000;
381 // ************* SPEAKER ***************
382 sprintf(buffer, "t%i_1", team);
384 // trigger for speaker
385 vec3_t triggerVoiceBtm;
386 VectorCopy(min, triggerVoiceBtm);
387 triggerVoiceBtm[2] = max[2] - 16;
389 DEntity *triggerVoice = m_Container.AddEntity("trigger_multiple");
390 GetBoundingCube(triggerVoiceBtm, max, "textures/common/trigger", triggerVoice);
391 triggerVoice->AddEPair("target", buffer);
392 //--------------------
394 // target for speaker
396 VectorCopy(centre, voiceOrigin);
397 voiceOrigin[2] = max[2] + 16;
400 DEntity *targetVoice = m_Container.AddEntity("target_speaker");
401 targetVoice->AddEPair("targetname", buffer);
403 sprintf(buffer, "%f %f %f", voiceOrigin[0], voiceOrigin[1], voiceOrigin[2]);
404 targetVoice->AddEPair("origin", buffer);
405 targetVoice->AddEPair("spawnflags", "8");
406 targetVoice->AddEPair("noise", "*falling1.wav");
407 //--------------------
409 // *********** END SPEAKER *************
411 // ********* POWERUP REMOVAL ***********
412 sprintf(buffer, "t%i_2", team);
414 // trigger for powerup removal
415 vec3_t triggerPwrRmvTop, triggerPwrRmvBtm;
416 VectorCopy(min, triggerPwrRmvBtm);
417 VectorCopy(max, triggerPwrRmvTop);
419 triggerPwrRmvTop[2] = triggerVoiceBtm[2] - 64;
420 triggerPwrRmvBtm[2] = triggerPwrRmvTop[2] - 16;
422 DEntity *triggerPwrRmv = m_Container.AddEntity("trigger_multiple");
423 GetBoundingCube(triggerPwrRmvBtm, triggerPwrRmvTop, "textures/common/trigger", triggerPwrRmv);
424 triggerPwrRmv->AddEPair("target", buffer);
425 //--------------------
427 // target for powerup removal
429 VectorCopy(centre, pwrRmvOrigin);
430 pwrRmvOrigin[2] = triggerPwrRmvTop[2] + 16;
432 DEntity *targetPwrRmv = m_Container.AddEntity("target_remove_powerups");
433 targetPwrRmv->AddEPair("targetname", buffer);
435 sprintf(buffer, "%f %f %f", pwrRmvOrigin[0], pwrRmvOrigin[1], pwrRmvOrigin[2]);
436 targetPwrRmv->AddEPair("origin", buffer);
437 //--------------------
439 // ****** END POWERUP REMOVAL ********
441 // ********* DAMAGE ***********
443 // trigger for damage
444 vec3_t triggerDmgTop, triggerDmgBtm;
445 VectorCopy(min, triggerDmgBtm);
446 VectorCopy(max, triggerDmgTop);
448 triggerDmgBtm[2] = min[2] + 64;
449 triggerDmgTop[2] = triggerDmgBtm[2] + 16;
451 DEntity *triggerDmg = m_Container.AddEntity("trigger_hurt");
452 GetBoundingCube(triggerDmgBtm, triggerDmgTop, "textures/common/trigger", triggerDmg);
453 triggerDmg->AddEPair("dmg", "9999");
454 triggerDmg->AddEPair("spawnflags", "12");
455 //--------------------
457 // ****** END DAMAGE ********
459 // ********* NODROP ***********
462 VectorCopy(max, nodropTop);
464 nodropTop[2] = min[2] + 64;
466 GetBoundingCube(min, nodropTop, "textures/common/nodrop");
468 // ****** END NODROP ********