]> git.xonotic.org Git - xonotic/netradiant.git/blobdiff - contrib/bobtoolz/DShape.cpp
more eol-style
[xonotic/netradiant.git] / contrib / bobtoolz / DShape.cpp
index 83e68659f710ce27af9e739e96ef67a084fcd0e2..9418b73bbede92e9911facf82ec47f4d8097c69b 100644 (file)
-/*\r
-BobToolz plugin for GtkRadiant\r
-Copyright (C) 2001 Gordon Biggans\r
-\r
-This library is free software; you can redistribute it and/or\r
-modify it under the terms of the GNU Lesser General Public\r
-License as published by the Free Software Foundation; either\r
-version 2.1 of the License, or (at your option) any later version.\r
-\r
-This library is distributed in the hope that it will be useful,\r
-but WITHOUT ANY WARRANTY; without even the implied warranty of\r
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\r
-Lesser General Public License for more details.\r
-\r
-You should have received a copy of the GNU Lesser General Public\r
-License along with this library; if not, write to the Free Software\r
-Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\r
-*/\r
-\r
-// DShape.cpp: implementation of the DShape class.\r
-//\r
-//////////////////////////////////////////////////////////////////////\r
-\r
-#include "StdAfx.h"\r
-#include "DShape.h"\r
-\r
-//#include "dialogs-gtk.h"\r
-\r
-#include "misc.h"\r
-#include "shapes.h"\r
-\r
-//////////////////////////////////////////////////////////////////////\r
-// Construction/Destruction\r
-//////////////////////////////////////////////////////////////////////\r
-\r
-bool bFacesAll[6] = {TRUE, TRUE, TRUE, TRUE, TRUE, TRUE};\r
-\r
-DShape::DShape()\r
-{\r
-       m_nNextBrush = 0;\r
-}\r
-\r
-DShape::~DShape()\r
-{\r
-\r
-}\r
-\r
-void DShape::BuildRegularPrism(vec3_t min, vec3_t max, int nSides, bool bAlignTop)\r
-{\r
-       vec3_t vc[MAX_POLYGON_FACES+2], vd[MAX_POLYGON_FACES+2];\r
-\r
-       vec3_t radius;\r
-       vec3_t origin;\r
-\r
-       VectorSubtract(max, min, radius);\r
-       VectorScale(radius, 0.5f, radius);\r
-       // calc 3d radius and origin\r
-       VectorAdd(max, min, origin);\r
-       VectorScale(origin, 0.5f, origin);\r
-\r
-       float phase = 0.0f;\r
-\r
-       if(bAlignTop)\r
-       {\r
-               phase = -(Q_PI/nSides);\r
-               VectorScale(radius, static_cast< float >( 1/cos(phase) ), radius);\r
-       }\r
-\r
-       //----- Build Polygon Vertices -----\r
-\r
-       int i;\r
-       for(i = 0; i < nSides; i++)\r
-       {\r
-               VectorCopy(origin, vc[i]);\r
-               VectorCopy(origin, vd[i]);\r
-               \r
-               vc[i][2] = min[2];\r
-               vd[i][2] = max[2];\r
-\r
-               vc[i][0] += radius[0] * sinf( ( 2 * Q_PI * i / nSides ) + phase );\r
-               vc[i][1] += radius[1] * cosf( ( 2 * Q_PI * i / nSides ) + phase );\r
-\r
-               vd[i][0] = vc[i][0];\r
-               vd[i][1] = vc[i][1];\r
-       }\r
-\r
-       VectorCopy(vc[0], vc[nSides]);\r
-       VectorCopy(vd[0], vd[nSides]);\r
-       VectorCopy(vc[1], vc[nSides+1]);\r
-       VectorCopy(vd[1], vd[nSides+1]);\r
-       \r
-       //----------------------------------\r
-\r
-       DBrush* pB = m_Container.GetWorldSpawn()->NewBrush(m_nNextBrush++);\r
-\r
-       for(i = 1; i <= nSides; i++)\r
-               pB->AddFace(vc[i-1], vc[i], vd[i], GetCurrentTexture(), FALSE);\r
-\r
-       pB->AddFace(vc[2], vc[1], vc[0], "textures/common/caulk", FALSE);\r
-       pB->AddFace(vd[0], vd[1], vd[2], "textures/common/caulk", FALSE);\r
-}\r
-\r
-void DShape::Commit()\r
-{\r
-       m_Container.GetWorldSpawn()->FixBrushes(FALSE);\r
-       m_Container.BuildInRadiant(TRUE);\r
-}\r
-\r
-void DShape::BuildInversePrism(vec3_t min, vec3_t max, int nSides, bool bAlignTop)\r
-{\r
-       vec3_t va[MAX_POLYGON_FACES+1], vb[MAX_POLYGON_FACES+1];\r
-       vec3_t radius;\r
-       vec3_t origin;\r
-\r
-       VectorSubtract(max, min, radius);\r
-       VectorScale(radius, 0.5f, radius);\r
-       // calc 3d radius and origin\r
-       VectorAdd(max, min, origin);\r
-       VectorScale(origin, 0.5f, origin);\r
-\r
-       float phase = 0.0f;\r
-\r
-       if(bAlignTop)\r
-       {\r
-               phase = -(Q_PI/nSides);\r
-               VectorScale(radius, static_cast< float >( 1/cos(phase) ), radius);\r
-       }\r
-\r
-       //----- Build Polygon Vertices -----\r
-\r
-       int i;\r
-       for(i = 0; i < nSides; i++)\r
-       {\r
-               VectorCopy(origin, va[i]);\r
-               VectorCopy(origin, vb[i]);\r
-\r
-               va[i][2] = min[2];\r
-               vb[i][2] = max[2];\r
-\r
-               va[i][0] += radius[0] * sinf( ( 2 * Q_PI * i / nSides ) + phase );\r
-               va[i][1] += radius[1] * cosf( ( 2 * Q_PI * i / nSides ) + phase );\r
-\r
-               vb[i][0] = va[i][0];\r
-               vb[i][1] = va[i][1];\r
-       }\r
-\r
-       VectorCopy(va[0], va[nSides]);\r
-       VectorCopy(vb[0], vb[nSides]);\r
-       \r
-       //----------------------------------\r
-\r
-       for(i = 1; i <= nSides; i++)\r
-       {\r
-               DBrush* pB = GetBoundingCube(min, max, "textures/common/caulk");\r
-\r
-               vec3_t top, bottom;\r
-               VectorCopy(va[i-1], top);\r
-               VectorCopy(va[i], bottom);\r
-\r
-               if(va[i-1][1] > va[i][1])\r
-               {\r
-                       top[0] += 5;\r
-                       bottom[0] += 5;\r
-               }\r
-               else    // flip direction of plane on crossover\r
-               {\r
-                       top[0] -= 5;\r
-                       bottom[0] -= 5;\r
-               }\r
-               \r
-               if(top[1] != bottom[1]) // internal line is flat already if true\r
-               {                       \r
-                       pB->AddFace(va[i-1], top, vb[i-1], "textures/common/caulk", FALSE);\r
-                       pB->AddFace(va[i], vb[i], bottom, "textures/common/caulk", FALSE);\r
-               }       // add cut-off planes\r
-\r
-               pB->AddFace(va[i-1], vb[i-1], vb[i], GetCurrentTexture(), FALSE);\r
-               // add internal polygon plane\r
-       }\r
-}\r
-\r
-void DShape::BuildBorderedPrism(vec3_t min, vec3_t max, int nSides, int nBorder, bool bAlignTop)\r
-{\r
-       vec3_t va[MAX_POLYGON_FACES+2], vb[MAX_POLYGON_FACES+2];\r
-       vec3_t vc[MAX_POLYGON_FACES+2], vd[MAX_POLYGON_FACES+2];\r
-\r
-       vec3_t radius;\r
-       vec3_t origin;\r
-\r
-       VectorSubtract(max, min, radius);\r
-       VectorScale(radius, 0.5f, radius);\r
-       // calc 3d radius and origin\r
-       VectorAdd(max, min, origin);\r
-       VectorScale(origin, 0.5f, origin);\r
-\r
-       if(nBorder >= Min(radius[0], radius[1]))\r
-       {\r
-//             DoMessageBox("Border is too large", "Error", MB_OK);\r
-               return;\r
-       }\r
-\r
-       float phase = 0.0f;\r
-\r
-       if(bAlignTop)\r
-       {\r
-               phase = -(Q_PI/nSides);\r
-               VectorScale(radius, static_cast< float >( 1/cos(phase) ), radius);\r
-       }\r
-\r
-       //----- Build Polygon Vertices -----\r
-\r
-       int i;\r
-       for(i = 0; i < nSides; i++)\r
-       {\r
-               VectorCopy(origin, va[i]);\r
-               VectorCopy(origin, vb[i]);\r
-               VectorCopy(origin, vc[i]);\r
-               VectorCopy(origin, vd[i]);\r
-\r
-               va[i][2] = min[2];\r
-               vb[i][2] = max[2];\r
-\r
-               va[i][0] += (radius[0] - nBorder) * sinf( ( 2 * Q_PI * i / nSides ) + phase );\r
-               va[i][1] += (radius[1] - nBorder) * cosf( ( 2 * Q_PI * i / nSides ) + phase );\r
-\r
-               vb[i][0] = va[i][0];\r
-               vb[i][1] = va[i][1];\r
-\r
-\r
-               \r
-               vc[i][2] = min[2];\r
-               vd[i][2] = max[2];\r
-\r
-               vc[i][0] += radius[0] * sinf( ( 2 * Q_PI * i / nSides ) + phase );\r
-               vc[i][1] += radius[1] * cosf( ( 2 * Q_PI * i / nSides ) + phase );\r
-\r
-               vd[i][0] = vc[i][0];\r
-               vd[i][1] = vc[i][1];\r
-       }\r
-\r
-       VectorCopy(va[0], va[nSides]);\r
-       VectorCopy(vb[0], vb[nSides]);\r
-       VectorCopy(va[1], va[nSides+1]);\r
-       VectorCopy(vb[1], vb[nSides+1]);\r
-\r
-       VectorCopy(vc[0], vc[nSides]);\r
-       VectorCopy(vd[0], vd[nSides]);\r
-       VectorCopy(vc[1], vc[nSides+1]);\r
-       VectorCopy(vd[1], vd[nSides+1]);\r
-       \r
-       //----------------------------------\r
-\r
-       for(i = 1; i <= nSides; i++)\r
-       {\r
-               DBrush* pB = GetBoundingCube(min, max, "textures/common/caulk");\r
-\r
-               pB->AddFace(origin, vc[i-1], vd[i-1], "textures/common/caulk", FALSE);\r
-               pB->AddFace(origin, vd[i], vc[i], "textures/common/caulk", FALSE); \r
-\r
-               pB->AddFace(vc[i-1], vc[i], vd[i], GetCurrentTexture(), FALSE);\r
-               pB->AddFace(vb[i], va[i], va[i-1], GetCurrentTexture(), FALSE);\r
-       }\r
-}\r
-\r
-DBrush* DShape::GetBoundingCube_Ext(vec3_t min, vec3_t max, const char *textureName, bool* bUseFaces, bool detail)\r
-{\r
-       DBrush* pB = new DBrush;\r
-       //----- Build Outer Bounds ---------\r
-\r
-       vec3_t v1, v2, v3, v5, v6, v7;\r
-       VectorCopy(min, v1);\r
-       VectorCopy(min, v2);\r
-       VectorCopy(min, v3);\r
-       VectorCopy(max, v5);\r
-       VectorCopy(max, v6);\r
-       VectorCopy(max, v7);\r
-\r
-       v2[0] = max[0];\r
-       v3[1] = max[1];\r
-\r
-       v6[0] = min[0];\r
-       v7[1] = min[1];\r
-\r
-       //----------------------------------\r
-\r
-       //----- Add Six Cube Faces ---------\r
-\r
-       if(bUseFaces[0])\r
-               pB->AddFace(v1, v2, v3, textureName, detail);\r
-       if(bUseFaces[1])\r
-               pB->AddFace(v1, v3, v6, textureName, detail);\r
-       if(bUseFaces[2])\r
-               pB->AddFace(v1, v7, v2, textureName, detail);\r
-\r
-       if(bUseFaces[3])\r
-               pB->AddFace(v5, v6, v3, textureName, detail);\r
-       if(bUseFaces[4])\r
-               pB->AddFace(v5, v2, v7, textureName, detail);\r
-       if(bUseFaces[5])\r
-               pB->AddFace(v5, v7, v6, textureName, detail);\r
-\r
-       //----------------------------------\r
-\r
-       return pB;\r
-}\r
-\r
-DBrush* DShape::GetBoundingCube(vec3_t min, vec3_t max, const char *textureName, DEntity* ent, bool* bUseFaces)\r
-{\r
-       DBrush* pB;\r
-       if(ent == NULL)\r
-               pB = m_Container.GetWorldSpawn()->NewBrush(m_nNextBrush++);\r
-       else\r
-               pB = ent->NewBrush(m_nNextBrush++);\r
-\r
-       //----- Build Outer Bounds ---------\r
-\r
-       vec3_t v1, v2, v3, v5, v6, v7;\r
-       VectorCopy(min, v1);\r
-       VectorCopy(min, v2);\r
-       VectorCopy(min, v3);\r
-       VectorCopy(max, v5);\r
-       VectorCopy(max, v6);\r
-       VectorCopy(max, v7);\r
-\r
-       v2[0] = max[0];\r
-       v3[1] = max[1];\r
-\r
-       v6[0] = min[0];\r
-       v7[1] = min[1];\r
-\r
-       //----------------------------------\r
-\r
-       //----- Add Six Cube Faces ---------\r
-\r
-       if(bUseFaces[0])\r
-               pB->AddFace(v1, v2, v3, textureName, FALSE);\r
-       if(bUseFaces[1])\r
-               pB->AddFace(v1, v3, v6, textureName, FALSE);\r
-       if(bUseFaces[2])\r
-               pB->AddFace(v1, v7, v2, textureName, FALSE);\r
-\r
-       if(bUseFaces[3])\r
-               pB->AddFace(v5, v6, v3, textureName, FALSE);\r
-       if(bUseFaces[4])\r
-               pB->AddFace(v5, v2, v7, textureName, FALSE);\r
-       if(bUseFaces[5])\r
-               pB->AddFace(v5, v7, v6, textureName, FALSE);\r
-\r
-       //----------------------------------\r
-\r
-       return pB;\r
-}\r
-\r
-bool DShape::BuildPit(vec3_t min, vec3_t max)\r
-{\r
-       if((max[2] - min[2]) < 196)\r
-               return FALSE;\r
-\r
-       srand(time(NULL));\r
-\r
-       vec3_t centre;\r
-       VectorAdd(min, max, centre);\r
-       VectorScale(centre, 0.5f, centre);\r
-\r
-       char buffer[256];\r
-\r
-       int team = (rand()%10000)+5000;\r
-\r
-// ************* SPEAKER ***************\r
-       sprintf(buffer, "t%i_1", team);\r
-\r
-// trigger for speaker\r
-       vec3_t triggerVoiceBtm;\r
-       VectorCopy(min, triggerVoiceBtm);\r
-       triggerVoiceBtm[2] = max[2] - 16;\r
-\r
-       DEntity* triggerVoice = m_Container.AddEntity("trigger_multiple");\r
-       GetBoundingCube(triggerVoiceBtm, max, "textures/common/trigger", triggerVoice);\r
-       triggerVoice->AddEPair("target", buffer);\r
-//--------------------\r
-\r
-// target for speaker\r
-       vec3_t voiceOrigin;\r
-       VectorCopy(centre, voiceOrigin);\r
-       voiceOrigin[2] = max[2]+16;\r
-\r
-\r
-       DEntity* targetVoice = m_Container.AddEntity("target_speaker");\r
-       targetVoice->AddEPair("targetname", buffer);\r
-\r
-       sprintf(buffer, "%f %f %f", voiceOrigin[0], voiceOrigin[1], voiceOrigin[2]);\r
-       targetVoice->AddEPair("origin", buffer);\r
-       targetVoice->AddEPair("spawnflags", "8");\r
-       targetVoice->AddEPair("noise", "*falling1.wav");\r
-//--------------------\r
-\r
-// *********** END SPEAKER *************\r
-\r
-// ********* POWERUP REMOVAL ***********\r
-       sprintf(buffer, "t%i_2", team);\r
-\r
-// trigger for powerup removal\r
-       vec3_t triggerPwrRmvTop, triggerPwrRmvBtm;\r
-       VectorCopy(min, triggerPwrRmvBtm);\r
-       VectorCopy(max, triggerPwrRmvTop);\r
-\r
-       triggerPwrRmvTop[2] = triggerVoiceBtm[2] - 64;\r
-       triggerPwrRmvBtm[2] = triggerPwrRmvTop[2] - 16;\r
-\r
-       DEntity* triggerPwrRmv = m_Container.AddEntity("trigger_multiple");\r
-       GetBoundingCube(triggerPwrRmvBtm, triggerPwrRmvTop, "textures/common/trigger", triggerPwrRmv);\r
-       triggerPwrRmv->AddEPair("target", buffer);\r
-//--------------------\r
-\r
-// target for powerup removal\r
-       vec3_t pwrRmvOrigin;\r
-       VectorCopy(centre, pwrRmvOrigin);\r
-       pwrRmvOrigin[2] = triggerPwrRmvTop[2]+16;\r
-\r
-       DEntity* targetPwrRmv = m_Container.AddEntity("target_remove_powerups");\r
-       targetPwrRmv->AddEPair("targetname", buffer);\r
-\r
-       sprintf(buffer, "%f %f %f", pwrRmvOrigin[0], pwrRmvOrigin[1], pwrRmvOrigin[2]);\r
-       targetPwrRmv->AddEPair("origin", buffer);\r
-//--------------------\r
-\r
-// ****** END POWERUP REMOVAL ********\r
-\r
-// ********* DAMAGE ***********\r
-\r
-// trigger for damage\r
-       vec3_t triggerDmgTop, triggerDmgBtm;\r
-       VectorCopy(min, triggerDmgBtm);\r
-       VectorCopy(max, triggerDmgTop);\r
-\r
-       triggerDmgBtm[2] = min[2] + 64;\r
-       triggerDmgTop[2] = triggerDmgBtm[2] + 16;\r
-\r
-       DEntity* triggerDmg = m_Container.AddEntity("trigger_hurt");\r
-       GetBoundingCube(triggerDmgBtm, triggerDmgTop, "textures/common/trigger", triggerDmg);\r
-       triggerDmg->AddEPair("dmg", "9999");\r
-       triggerDmg->AddEPair("spawnflags", "12");\r
-//--------------------\r
-\r
-// ****** END DAMAGE ********\r
-\r
-// ********* NODROP ***********\r
-\r
-       vec3_t nodropTop;\r
-       VectorCopy(max, nodropTop);\r
-\r
-       nodropTop[2] = min[2] + 64;\r
-\r
-       GetBoundingCube(min, nodropTop, "textures/common/nodrop");\r
-\r
-// ****** END NODROP ********\r
-\r
-       return TRUE;\r
-}\r
+/*
+BobToolz plugin for GtkRadiant
+Copyright (C) 2001 Gordon Biggans
+
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+This library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+*/
+
+// DShape.cpp: implementation of the DShape class.
+//
+//////////////////////////////////////////////////////////////////////
+
+#include "StdAfx.h"
+#include "DShape.h"
+
+//#include "dialogs-gtk.h"
+
+#include "misc.h"
+#include "shapes.h"
+
+//////////////////////////////////////////////////////////////////////
+// Construction/Destruction
+//////////////////////////////////////////////////////////////////////
+
+bool bFacesAll[6] = {TRUE, TRUE, TRUE, TRUE, TRUE, TRUE};
+
+DShape::DShape()
+{
+       m_nNextBrush = 0;
+}
+
+DShape::~DShape()
+{
+
+}
+
+void DShape::BuildRegularPrism(vec3_t min, vec3_t max, int nSides, bool bAlignTop)
+{
+       vec3_t vc[MAX_POLYGON_FACES+2], vd[MAX_POLYGON_FACES+2];
+
+       vec3_t radius;
+       vec3_t origin;
+
+       VectorSubtract(max, min, radius);
+       VectorScale(radius, 0.5f, radius);
+       // calc 3d radius and origin
+       VectorAdd(max, min, origin);
+       VectorScale(origin, 0.5f, origin);
+
+       float phase = 0.0f;
+
+       if(bAlignTop)
+       {
+               phase = -(Q_PI/nSides);
+               VectorScale(radius, static_cast< float >( 1/cos(phase) ), radius);
+       }
+
+       //----- Build Polygon Vertices -----
+
+       int i;
+       for(i = 0; i < nSides; i++)
+       {
+               VectorCopy(origin, vc[i]);
+               VectorCopy(origin, vd[i]);
+               
+               vc[i][2] = min[2];
+               vd[i][2] = max[2];
+
+               vc[i][0] += radius[0] * sinf( ( 2 * Q_PI * i / nSides ) + phase );
+               vc[i][1] += radius[1] * cosf( ( 2 * Q_PI * i / nSides ) + phase );
+
+               vd[i][0] = vc[i][0];
+               vd[i][1] = vc[i][1];
+       }
+
+       VectorCopy(vc[0], vc[nSides]);
+       VectorCopy(vd[0], vd[nSides]);
+       VectorCopy(vc[1], vc[nSides+1]);
+       VectorCopy(vd[1], vd[nSides+1]);
+       
+       //----------------------------------
+
+       DBrush* pB = m_Container.GetWorldSpawn()->NewBrush(m_nNextBrush++);
+
+       for(i = 1; i <= nSides; i++)
+               pB->AddFace(vc[i-1], vc[i], vd[i], GetCurrentTexture(), FALSE);
+
+       pB->AddFace(vc[2], vc[1], vc[0], "textures/common/caulk", FALSE);
+       pB->AddFace(vd[0], vd[1], vd[2], "textures/common/caulk", FALSE);
+}
+
+void DShape::Commit()
+{
+       m_Container.GetWorldSpawn()->FixBrushes(FALSE);
+       m_Container.BuildInRadiant(TRUE);
+}
+
+void DShape::BuildInversePrism(vec3_t min, vec3_t max, int nSides, bool bAlignTop)
+{
+       vec3_t va[MAX_POLYGON_FACES+1], vb[MAX_POLYGON_FACES+1];
+       vec3_t radius;
+       vec3_t origin;
+
+       VectorSubtract(max, min, radius);
+       VectorScale(radius, 0.5f, radius);
+       // calc 3d radius and origin
+       VectorAdd(max, min, origin);
+       VectorScale(origin, 0.5f, origin);
+
+       float phase = 0.0f;
+
+       if(bAlignTop)
+       {
+               phase = -(Q_PI/nSides);
+               VectorScale(radius, static_cast< float >( 1/cos(phase) ), radius);
+       }
+
+       //----- Build Polygon Vertices -----
+
+       int i;
+       for(i = 0; i < nSides; i++)
+       {
+               VectorCopy(origin, va[i]);
+               VectorCopy(origin, vb[i]);
+
+               va[i][2] = min[2];
+               vb[i][2] = max[2];
+
+               va[i][0] += radius[0] * sinf( ( 2 * Q_PI * i / nSides ) + phase );
+               va[i][1] += radius[1] * cosf( ( 2 * Q_PI * i / nSides ) + phase );
+
+               vb[i][0] = va[i][0];
+               vb[i][1] = va[i][1];
+       }
+
+       VectorCopy(va[0], va[nSides]);
+       VectorCopy(vb[0], vb[nSides]);
+       
+       //----------------------------------
+
+       for(i = 1; i <= nSides; i++)
+       {
+               DBrush* pB = GetBoundingCube(min, max, "textures/common/caulk");
+
+               vec3_t top, bottom;
+               VectorCopy(va[i-1], top);
+               VectorCopy(va[i], bottom);
+
+               if(va[i-1][1] > va[i][1])
+               {
+                       top[0] += 5;
+                       bottom[0] += 5;
+               }
+               else    // flip direction of plane on crossover
+               {
+                       top[0] -= 5;
+                       bottom[0] -= 5;
+               }
+               
+               if(top[1] != bottom[1]) // internal line is flat already if true
+               {                       
+                       pB->AddFace(va[i-1], top, vb[i-1], "textures/common/caulk", FALSE);
+                       pB->AddFace(va[i], vb[i], bottom, "textures/common/caulk", FALSE);
+               }       // add cut-off planes
+
+               pB->AddFace(va[i-1], vb[i-1], vb[i], GetCurrentTexture(), FALSE);
+               // add internal polygon plane
+       }
+}
+
+void DShape::BuildBorderedPrism(vec3_t min, vec3_t max, int nSides, int nBorder, bool bAlignTop)
+{
+       vec3_t va[MAX_POLYGON_FACES+2], vb[MAX_POLYGON_FACES+2];
+       vec3_t vc[MAX_POLYGON_FACES+2], vd[MAX_POLYGON_FACES+2];
+
+       vec3_t radius;
+       vec3_t origin;
+
+       VectorSubtract(max, min, radius);
+       VectorScale(radius, 0.5f, radius);
+       // calc 3d radius and origin
+       VectorAdd(max, min, origin);
+       VectorScale(origin, 0.5f, origin);
+
+       if(nBorder >= Min(radius[0], radius[1]))
+       {
+//             DoMessageBox("Border is too large", "Error", MB_OK);
+               return;
+       }
+
+       float phase = 0.0f;
+
+       if(bAlignTop)
+       {
+               phase = -(Q_PI/nSides);
+               VectorScale(radius, static_cast< float >( 1/cos(phase) ), radius);
+       }
+
+       //----- Build Polygon Vertices -----
+
+       int i;
+       for(i = 0; i < nSides; i++)
+       {
+               VectorCopy(origin, va[i]);
+               VectorCopy(origin, vb[i]);
+               VectorCopy(origin, vc[i]);
+               VectorCopy(origin, vd[i]);
+
+               va[i][2] = min[2];
+               vb[i][2] = max[2];
+
+               va[i][0] += (radius[0] - nBorder) * sinf( ( 2 * Q_PI * i / nSides ) + phase );
+               va[i][1] += (radius[1] - nBorder) * cosf( ( 2 * Q_PI * i / nSides ) + phase );
+
+               vb[i][0] = va[i][0];
+               vb[i][1] = va[i][1];
+
+
+               
+               vc[i][2] = min[2];
+               vd[i][2] = max[2];
+
+               vc[i][0] += radius[0] * sinf( ( 2 * Q_PI * i / nSides ) + phase );
+               vc[i][1] += radius[1] * cosf( ( 2 * Q_PI * i / nSides ) + phase );
+
+               vd[i][0] = vc[i][0];
+               vd[i][1] = vc[i][1];
+       }
+
+       VectorCopy(va[0], va[nSides]);
+       VectorCopy(vb[0], vb[nSides]);
+       VectorCopy(va[1], va[nSides+1]);
+       VectorCopy(vb[1], vb[nSides+1]);
+
+       VectorCopy(vc[0], vc[nSides]);
+       VectorCopy(vd[0], vd[nSides]);
+       VectorCopy(vc[1], vc[nSides+1]);
+       VectorCopy(vd[1], vd[nSides+1]);
+       
+       //----------------------------------
+
+       for(i = 1; i <= nSides; i++)
+       {
+               DBrush* pB = GetBoundingCube(min, max, "textures/common/caulk");
+
+               pB->AddFace(origin, vc[i-1], vd[i-1], "textures/common/caulk", FALSE);
+               pB->AddFace(origin, vd[i], vc[i], "textures/common/caulk", FALSE); 
+
+               pB->AddFace(vc[i-1], vc[i], vd[i], GetCurrentTexture(), FALSE);
+               pB->AddFace(vb[i], va[i], va[i-1], GetCurrentTexture(), FALSE);
+       }
+}
+
+DBrush* DShape::GetBoundingCube_Ext(vec3_t min, vec3_t max, const char *textureName, bool* bUseFaces, bool detail)
+{
+       DBrush* pB = new DBrush;
+       //----- Build Outer Bounds ---------
+
+       vec3_t v1, v2, v3, v5, v6, v7;
+       VectorCopy(min, v1);
+       VectorCopy(min, v2);
+       VectorCopy(min, v3);
+       VectorCopy(max, v5);
+       VectorCopy(max, v6);
+       VectorCopy(max, v7);
+
+       v2[0] = max[0];
+       v3[1] = max[1];
+
+       v6[0] = min[0];
+       v7[1] = min[1];
+
+       //----------------------------------
+
+       //----- Add Six Cube Faces ---------
+
+       if(bUseFaces[0])
+               pB->AddFace(v1, v2, v3, textureName, detail);
+       if(bUseFaces[1])
+               pB->AddFace(v1, v3, v6, textureName, detail);
+       if(bUseFaces[2])
+               pB->AddFace(v1, v7, v2, textureName, detail);
+
+       if(bUseFaces[3])
+               pB->AddFace(v5, v6, v3, textureName, detail);
+       if(bUseFaces[4])
+               pB->AddFace(v5, v2, v7, textureName, detail);
+       if(bUseFaces[5])
+               pB->AddFace(v5, v7, v6, textureName, detail);
+
+       //----------------------------------
+
+       return pB;
+}
+
+DBrush* DShape::GetBoundingCube(vec3_t min, vec3_t max, const char *textureName, DEntity* ent, bool* bUseFaces)
+{
+       DBrush* pB;
+       if(ent == NULL)
+               pB = m_Container.GetWorldSpawn()->NewBrush(m_nNextBrush++);
+       else
+               pB = ent->NewBrush(m_nNextBrush++);
+
+       //----- Build Outer Bounds ---------
+
+       vec3_t v1, v2, v3, v5, v6, v7;
+       VectorCopy(min, v1);
+       VectorCopy(min, v2);
+       VectorCopy(min, v3);
+       VectorCopy(max, v5);
+       VectorCopy(max, v6);
+       VectorCopy(max, v7);
+
+       v2[0] = max[0];
+       v3[1] = max[1];
+
+       v6[0] = min[0];
+       v7[1] = min[1];
+
+       //----------------------------------
+
+       //----- Add Six Cube Faces ---------
+
+       if(bUseFaces[0])
+               pB->AddFace(v1, v2, v3, textureName, FALSE);
+       if(bUseFaces[1])
+               pB->AddFace(v1, v3, v6, textureName, FALSE);
+       if(bUseFaces[2])
+               pB->AddFace(v1, v7, v2, textureName, FALSE);
+
+       if(bUseFaces[3])
+               pB->AddFace(v5, v6, v3, textureName, FALSE);
+       if(bUseFaces[4])
+               pB->AddFace(v5, v2, v7, textureName, FALSE);
+       if(bUseFaces[5])
+               pB->AddFace(v5, v7, v6, textureName, FALSE);
+
+       //----------------------------------
+
+       return pB;
+}
+
+bool DShape::BuildPit(vec3_t min, vec3_t max)
+{
+       if((max[2] - min[2]) < 196)
+               return FALSE;
+
+       srand(time(NULL));
+
+       vec3_t centre;
+       VectorAdd(min, max, centre);
+       VectorScale(centre, 0.5f, centre);
+
+       char buffer[256];
+
+       int team = (rand()%10000)+5000;
+
+// ************* SPEAKER ***************
+       sprintf(buffer, "t%i_1", team);
+
+// trigger for speaker
+       vec3_t triggerVoiceBtm;
+       VectorCopy(min, triggerVoiceBtm);
+       triggerVoiceBtm[2] = max[2] - 16;
+
+       DEntity* triggerVoice = m_Container.AddEntity("trigger_multiple");
+       GetBoundingCube(triggerVoiceBtm, max, "textures/common/trigger", triggerVoice);
+       triggerVoice->AddEPair("target", buffer);
+//--------------------
+
+// target for speaker
+       vec3_t voiceOrigin;
+       VectorCopy(centre, voiceOrigin);
+       voiceOrigin[2] = max[2]+16;
+
+
+       DEntity* targetVoice = m_Container.AddEntity("target_speaker");
+       targetVoice->AddEPair("targetname", buffer);
+
+       sprintf(buffer, "%f %f %f", voiceOrigin[0], voiceOrigin[1], voiceOrigin[2]);
+       targetVoice->AddEPair("origin", buffer);
+       targetVoice->AddEPair("spawnflags", "8");
+       targetVoice->AddEPair("noise", "*falling1.wav");
+//--------------------
+
+// *********** END SPEAKER *************
+
+// ********* POWERUP REMOVAL ***********
+       sprintf(buffer, "t%i_2", team);
+
+// trigger for powerup removal
+       vec3_t triggerPwrRmvTop, triggerPwrRmvBtm;
+       VectorCopy(min, triggerPwrRmvBtm);
+       VectorCopy(max, triggerPwrRmvTop);
+
+       triggerPwrRmvTop[2] = triggerVoiceBtm[2] - 64;
+       triggerPwrRmvBtm[2] = triggerPwrRmvTop[2] - 16;
+
+       DEntity* triggerPwrRmv = m_Container.AddEntity("trigger_multiple");
+       GetBoundingCube(triggerPwrRmvBtm, triggerPwrRmvTop, "textures/common/trigger", triggerPwrRmv);
+       triggerPwrRmv->AddEPair("target", buffer);
+//--------------------
+
+// target for powerup removal
+       vec3_t pwrRmvOrigin;
+       VectorCopy(centre, pwrRmvOrigin);
+       pwrRmvOrigin[2] = triggerPwrRmvTop[2]+16;
+
+       DEntity* targetPwrRmv = m_Container.AddEntity("target_remove_powerups");
+       targetPwrRmv->AddEPair("targetname", buffer);
+
+       sprintf(buffer, "%f %f %f", pwrRmvOrigin[0], pwrRmvOrigin[1], pwrRmvOrigin[2]);
+       targetPwrRmv->AddEPair("origin", buffer);
+//--------------------
+
+// ****** END POWERUP REMOVAL ********
+
+// ********* DAMAGE ***********
+
+// trigger for damage
+       vec3_t triggerDmgTop, triggerDmgBtm;
+       VectorCopy(min, triggerDmgBtm);
+       VectorCopy(max, triggerDmgTop);
+
+       triggerDmgBtm[2] = min[2] + 64;
+       triggerDmgTop[2] = triggerDmgBtm[2] + 16;
+
+       DEntity* triggerDmg = m_Container.AddEntity("trigger_hurt");
+       GetBoundingCube(triggerDmgBtm, triggerDmgTop, "textures/common/trigger", triggerDmg);
+       triggerDmg->AddEPair("dmg", "9999");
+       triggerDmg->AddEPair("spawnflags", "12");
+//--------------------
+
+// ****** END DAMAGE ********
+
+// ********* NODROP ***********
+
+       vec3_t nodropTop;
+       VectorCopy(max, nodropTop);
+
+       nodropTop[2] = min[2] + 64;
+
+       GetBoundingCube(min, nodropTop, "textures/common/nodrop");
+
+// ****** END NODROP ********
+
+       return TRUE;
+}