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 // DShape.cpp: implementation of the DShape class.
\r
22 //////////////////////////////////////////////////////////////////////
\r
27 //#include "dialogs-gtk.h"
\r
32 //////////////////////////////////////////////////////////////////////
\r
33 // Construction/Destruction
\r
34 //////////////////////////////////////////////////////////////////////
\r
36 bool bFacesAll[6] = {TRUE, TRUE, TRUE, TRUE, TRUE, TRUE};
\r
48 void DShape::BuildRegularPrism(vec3_t min, vec3_t max, int nSides, bool bAlignTop)
\r
50 vec3_t vc[MAX_POLYGON_FACES+2], vd[MAX_POLYGON_FACES+2];
\r
55 VectorSubtract(max, min, radius);
\r
56 VectorScale(radius, 0.5f, radius);
\r
57 // calc 3d radius and origin
\r
58 VectorAdd(max, min, origin);
\r
59 VectorScale(origin, 0.5f, origin);
\r
65 phase = -(Q_PI/nSides);
\r
66 VectorScale(radius, static_cast< float >( 1/cos(phase) ), radius);
\r
69 //----- Build Polygon Vertices -----
\r
72 for(i = 0; i < nSides; i++)
\r
74 VectorCopy(origin, vc[i]);
\r
75 VectorCopy(origin, vd[i]);
\r
80 vc[i][0] += radius[0] * sinf( ( 2 * Q_PI * i / nSides ) + phase );
\r
81 vc[i][1] += radius[1] * cosf( ( 2 * Q_PI * i / nSides ) + phase );
\r
83 vd[i][0] = vc[i][0];
\r
84 vd[i][1] = vc[i][1];
\r
87 VectorCopy(vc[0], vc[nSides]);
\r
88 VectorCopy(vd[0], vd[nSides]);
\r
89 VectorCopy(vc[1], vc[nSides+1]);
\r
90 VectorCopy(vd[1], vd[nSides+1]);
\r
92 //----------------------------------
\r
94 DBrush* pB = m_Container.GetWorldSpawn()->NewBrush(m_nNextBrush++);
\r
96 for(i = 1; i <= nSides; i++)
\r
97 pB->AddFace(vc[i-1], vc[i], vd[i], GetCurrentTexture(), FALSE);
\r
99 pB->AddFace(vc[2], vc[1], vc[0], "textures/common/caulk", FALSE);
\r
100 pB->AddFace(vd[0], vd[1], vd[2], "textures/common/caulk", FALSE);
\r
103 void DShape::Commit()
\r
105 m_Container.GetWorldSpawn()->FixBrushes(FALSE);
\r
106 m_Container.BuildInRadiant(TRUE);
\r
109 void DShape::BuildInversePrism(vec3_t min, vec3_t max, int nSides, bool bAlignTop)
\r
111 vec3_t va[MAX_POLYGON_FACES+1], vb[MAX_POLYGON_FACES+1];
\r
115 VectorSubtract(max, min, radius);
\r
116 VectorScale(radius, 0.5f, radius);
\r
117 // calc 3d radius and origin
\r
118 VectorAdd(max, min, origin);
\r
119 VectorScale(origin, 0.5f, origin);
\r
121 float phase = 0.0f;
\r
125 phase = -(Q_PI/nSides);
\r
126 VectorScale(radius, static_cast< float >( 1/cos(phase) ), radius);
\r
129 //----- Build Polygon Vertices -----
\r
132 for(i = 0; i < nSides; i++)
\r
134 VectorCopy(origin, va[i]);
\r
135 VectorCopy(origin, vb[i]);
\r
140 va[i][0] += radius[0] * sinf( ( 2 * Q_PI * i / nSides ) + phase );
\r
141 va[i][1] += radius[1] * cosf( ( 2 * Q_PI * i / nSides ) + phase );
\r
143 vb[i][0] = va[i][0];
\r
144 vb[i][1] = va[i][1];
\r
147 VectorCopy(va[0], va[nSides]);
\r
148 VectorCopy(vb[0], vb[nSides]);
\r
150 //----------------------------------
\r
152 for(i = 1; i <= nSides; i++)
\r
154 DBrush* pB = GetBoundingCube(min, max, "textures/common/caulk");
\r
156 vec3_t top, bottom;
\r
157 VectorCopy(va[i-1], top);
\r
158 VectorCopy(va[i], bottom);
\r
160 if(va[i-1][1] > va[i][1])
\r
165 else // flip direction of plane on crossover
\r
171 if(top[1] != bottom[1]) // internal line is flat already if true
\r
173 pB->AddFace(va[i-1], top, vb[i-1], "textures/common/caulk", FALSE);
\r
174 pB->AddFace(va[i], vb[i], bottom, "textures/common/caulk", FALSE);
\r
175 } // add cut-off planes
\r
177 pB->AddFace(va[i-1], vb[i-1], vb[i], GetCurrentTexture(), FALSE);
\r
178 // add internal polygon plane
\r
182 void DShape::BuildBorderedPrism(vec3_t min, vec3_t max, int nSides, int nBorder, bool bAlignTop)
\r
184 vec3_t va[MAX_POLYGON_FACES+2], vb[MAX_POLYGON_FACES+2];
\r
185 vec3_t vc[MAX_POLYGON_FACES+2], vd[MAX_POLYGON_FACES+2];
\r
190 VectorSubtract(max, min, radius);
\r
191 VectorScale(radius, 0.5f, radius);
\r
192 // calc 3d radius and origin
\r
193 VectorAdd(max, min, origin);
\r
194 VectorScale(origin, 0.5f, origin);
\r
196 if(nBorder >= Min(radius[0], radius[1]))
\r
198 // DoMessageBox("Border is too large", "Error", MB_OK);
\r
202 float phase = 0.0f;
\r
206 phase = -(Q_PI/nSides);
\r
207 VectorScale(radius, static_cast< float >( 1/cos(phase) ), radius);
\r
210 //----- Build Polygon Vertices -----
\r
213 for(i = 0; i < nSides; i++)
\r
215 VectorCopy(origin, va[i]);
\r
216 VectorCopy(origin, vb[i]);
\r
217 VectorCopy(origin, vc[i]);
\r
218 VectorCopy(origin, vd[i]);
\r
223 va[i][0] += (radius[0] - nBorder) * sinf( ( 2 * Q_PI * i / nSides ) + phase );
\r
224 va[i][1] += (radius[1] - nBorder) * cosf( ( 2 * Q_PI * i / nSides ) + phase );
\r
226 vb[i][0] = va[i][0];
\r
227 vb[i][1] = va[i][1];
\r
234 vc[i][0] += radius[0] * sinf( ( 2 * Q_PI * i / nSides ) + phase );
\r
235 vc[i][1] += radius[1] * cosf( ( 2 * Q_PI * i / nSides ) + phase );
\r
237 vd[i][0] = vc[i][0];
\r
238 vd[i][1] = vc[i][1];
\r
241 VectorCopy(va[0], va[nSides]);
\r
242 VectorCopy(vb[0], vb[nSides]);
\r
243 VectorCopy(va[1], va[nSides+1]);
\r
244 VectorCopy(vb[1], vb[nSides+1]);
\r
246 VectorCopy(vc[0], vc[nSides]);
\r
247 VectorCopy(vd[0], vd[nSides]);
\r
248 VectorCopy(vc[1], vc[nSides+1]);
\r
249 VectorCopy(vd[1], vd[nSides+1]);
\r
251 //----------------------------------
\r
253 for(i = 1; i <= nSides; i++)
\r
255 DBrush* pB = GetBoundingCube(min, max, "textures/common/caulk");
\r
257 pB->AddFace(origin, vc[i-1], vd[i-1], "textures/common/caulk", FALSE);
\r
258 pB->AddFace(origin, vd[i], vc[i], "textures/common/caulk", FALSE);
\r
260 pB->AddFace(vc[i-1], vc[i], vd[i], GetCurrentTexture(), FALSE);
\r
261 pB->AddFace(vb[i], va[i], va[i-1], GetCurrentTexture(), FALSE);
\r
265 DBrush* DShape::GetBoundingCube_Ext(vec3_t min, vec3_t max, const char *textureName, bool* bUseFaces, bool detail)
\r
267 DBrush* pB = new DBrush;
\r
268 //----- Build Outer Bounds ---------
\r
270 vec3_t v1, v2, v3, v5, v6, v7;
\r
271 VectorCopy(min, v1);
\r
272 VectorCopy(min, v2);
\r
273 VectorCopy(min, v3);
\r
274 VectorCopy(max, v5);
\r
275 VectorCopy(max, v6);
\r
276 VectorCopy(max, v7);
\r
284 //----------------------------------
\r
286 //----- Add Six Cube Faces ---------
\r
289 pB->AddFace(v1, v2, v3, textureName, detail);
\r
291 pB->AddFace(v1, v3, v6, textureName, detail);
\r
293 pB->AddFace(v1, v7, v2, textureName, detail);
\r
296 pB->AddFace(v5, v6, v3, textureName, detail);
\r
298 pB->AddFace(v5, v2, v7, textureName, detail);
\r
300 pB->AddFace(v5, v7, v6, textureName, detail);
\r
302 //----------------------------------
\r
307 DBrush* DShape::GetBoundingCube(vec3_t min, vec3_t max, const char *textureName, DEntity* ent, bool* bUseFaces)
\r
311 pB = m_Container.GetWorldSpawn()->NewBrush(m_nNextBrush++);
\r
313 pB = ent->NewBrush(m_nNextBrush++);
\r
315 //----- Build Outer Bounds ---------
\r
317 vec3_t v1, v2, v3, v5, v6, v7;
\r
318 VectorCopy(min, v1);
\r
319 VectorCopy(min, v2);
\r
320 VectorCopy(min, v3);
\r
321 VectorCopy(max, v5);
\r
322 VectorCopy(max, v6);
\r
323 VectorCopy(max, v7);
\r
331 //----------------------------------
\r
333 //----- Add Six Cube Faces ---------
\r
336 pB->AddFace(v1, v2, v3, textureName, FALSE);
\r
338 pB->AddFace(v1, v3, v6, textureName, FALSE);
\r
340 pB->AddFace(v1, v7, v2, textureName, FALSE);
\r
343 pB->AddFace(v5, v6, v3, textureName, FALSE);
\r
345 pB->AddFace(v5, v2, v7, textureName, FALSE);
\r
347 pB->AddFace(v5, v7, v6, textureName, FALSE);
\r
349 //----------------------------------
\r
354 bool DShape::BuildPit(vec3_t min, vec3_t max)
\r
356 if((max[2] - min[2]) < 196)
\r
362 VectorAdd(min, max, centre);
\r
363 VectorScale(centre, 0.5f, centre);
\r
367 int team = (rand()%10000)+5000;
\r
369 // ************* SPEAKER ***************
\r
370 sprintf(buffer, "t%i_1", team);
\r
372 // trigger for speaker
\r
373 vec3_t triggerVoiceBtm;
\r
374 VectorCopy(min, triggerVoiceBtm);
\r
375 triggerVoiceBtm[2] = max[2] - 16;
\r
377 DEntity* triggerVoice = m_Container.AddEntity("trigger_multiple");
\r
378 GetBoundingCube(triggerVoiceBtm, max, "textures/common/trigger", triggerVoice);
\r
379 triggerVoice->AddEPair("target", buffer);
\r
380 //--------------------
\r
382 // target for speaker
\r
383 vec3_t voiceOrigin;
\r
384 VectorCopy(centre, voiceOrigin);
\r
385 voiceOrigin[2] = max[2]+16;
\r
388 DEntity* targetVoice = m_Container.AddEntity("target_speaker");
\r
389 targetVoice->AddEPair("targetname", buffer);
\r
391 sprintf(buffer, "%f %f %f", voiceOrigin[0], voiceOrigin[1], voiceOrigin[2]);
\r
392 targetVoice->AddEPair("origin", buffer);
\r
393 targetVoice->AddEPair("spawnflags", "8");
\r
394 targetVoice->AddEPair("noise", "*falling1.wav");
\r
395 //--------------------
\r
397 // *********** END SPEAKER *************
\r
399 // ********* POWERUP REMOVAL ***********
\r
400 sprintf(buffer, "t%i_2", team);
\r
402 // trigger for powerup removal
\r
403 vec3_t triggerPwrRmvTop, triggerPwrRmvBtm;
\r
404 VectorCopy(min, triggerPwrRmvBtm);
\r
405 VectorCopy(max, triggerPwrRmvTop);
\r
407 triggerPwrRmvTop[2] = triggerVoiceBtm[2] - 64;
\r
408 triggerPwrRmvBtm[2] = triggerPwrRmvTop[2] - 16;
\r
410 DEntity* triggerPwrRmv = m_Container.AddEntity("trigger_multiple");
\r
411 GetBoundingCube(triggerPwrRmvBtm, triggerPwrRmvTop, "textures/common/trigger", triggerPwrRmv);
\r
412 triggerPwrRmv->AddEPair("target", buffer);
\r
413 //--------------------
\r
415 // target for powerup removal
\r
416 vec3_t pwrRmvOrigin;
\r
417 VectorCopy(centre, pwrRmvOrigin);
\r
418 pwrRmvOrigin[2] = triggerPwrRmvTop[2]+16;
\r
420 DEntity* targetPwrRmv = m_Container.AddEntity("target_remove_powerups");
\r
421 targetPwrRmv->AddEPair("targetname", buffer);
\r
423 sprintf(buffer, "%f %f %f", pwrRmvOrigin[0], pwrRmvOrigin[1], pwrRmvOrigin[2]);
\r
424 targetPwrRmv->AddEPair("origin", buffer);
\r
425 //--------------------
\r
427 // ****** END POWERUP REMOVAL ********
\r
429 // ********* DAMAGE ***********
\r
431 // trigger for damage
\r
432 vec3_t triggerDmgTop, triggerDmgBtm;
\r
433 VectorCopy(min, triggerDmgBtm);
\r
434 VectorCopy(max, triggerDmgTop);
\r
436 triggerDmgBtm[2] = min[2] + 64;
\r
437 triggerDmgTop[2] = triggerDmgBtm[2] + 16;
\r
439 DEntity* triggerDmg = m_Container.AddEntity("trigger_hurt");
\r
440 GetBoundingCube(triggerDmgBtm, triggerDmgTop, "textures/common/trigger", triggerDmg);
\r
441 triggerDmg->AddEPair("dmg", "9999");
\r
442 triggerDmg->AddEPair("spawnflags", "12");
\r
443 //--------------------
\r
445 // ****** END DAMAGE ********
\r
447 // ********* NODROP ***********
\r
450 VectorCopy(max, nodropTop);
\r
452 nodropTop[2] = min[2] + 64;
\r
454 GetBoundingCube(min, nodropTop, "textures/common/nodrop");
\r
456 // ****** END NODROP ********
\r