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
22 #include "DEntity.h"
\r
23 #include "funchandlers.h"
\r
26 #include <sys/types.h>
\r
30 /*==========================
\r
32 ==========================*/
\r
34 //HANDLE bsp_process;
\r
35 char g_CurrentTexture[256] = "";
\r
37 //=============================================================
\r
38 //=============================================================
\r
40 void ReadCurrentTexture()
\r
42 const char* textureName = g_FuncTable.m_pfnGetCurrentTexture();
\r
43 strcpy(g_CurrentTexture, textureName);
\r
46 const char* GetCurrentTexture()
\r
48 ReadCurrentTexture();
\r
49 return g_CurrentTexture;
\r
52 epair_t* GetNextChainItem(epair_t* lastItem, char* key, char* value)
\r
54 epair_t* nextEPair = g_FuncTable.m_pfnAllocateEpair(key, value);
\r
56 if(lastItem != NULL)
\r
57 lastItem->next = nextEPair;
\r
62 void MoveBlock(int dir, vec3_t min, vec3_t max, float dist)
\r
93 void SetInitialStairPos(int dir, vec3_t min, vec3_t max, float width)
\r
99 max[0] = min[0] + width;
\r
104 min[0] = max[0] - width;
\r
109 max[1] = min[1] + width;
\r
114 min[1] = max[1] - width;
\r
120 char* TranslateString (char *buf)
\r
122 static char buf2[32768];
\r
128 for (i=0 ; i<l ; i++)
\r
130 if (buf[i] == '\n')
\r
143 void Sys_ERROR (char* text, ...)
\r
148 va_start (argptr,text);
\r
149 vsprintf (buf, text,argptr);
\r
152 Sys_Printf("BobToolz::ERROR->%s", buf);
\r
155 /*void Sys_Printf (char *text, ...)
\r
160 va_start (argptr,text);
\r
161 vsprintf (buf, text,argptr);
\r
164 g_FuncTable.m_pfnSysMsg ( buf );
\r
167 char* UnixToDosPath(char* path)
\r
172 for(char* p = path; *p; p++)
\r
181 const char* ExtractFilename(const char* path)
\r
183 char* p = strrchr(path, '/');
\r
186 p = strrchr(path, '\\');
\r
194 extern char* PLUGIN_NAME;
\r
195 /*char* GetGameFilename(char* buffer, const char* filename)
\r
197 strcpy(buffer, g_FuncTable.m_pfnGetGamePath());
\r
198 char* p = strrchr(buffer, '/');
\r
200 strcat(buffer, filename);
\r
201 buffer = UnixToDosPath(buffer);
\r
205 #if defined (__linux__) || defined (__APPLE__)
\r
206 // the bCreateConsole parameter is ignored on linux ..
\r
207 bool Q_Exec( const char *pCmd, bool bCreateConsole )
\r
213 // Error ("CreateProcess failed");
\r
217 printf("Running system...\n");
\r
218 printf("Command: %s\n", pCmd);
\r
220 // NOTE: we could use that to detect when a step finishes. But then it
\r
221 // would not work for remote compiling stuff.
\r
222 // execlp (pCmd, pCmd, NULL);
\r
224 printf ("system() returned");
\r
233 bool Q_Exec( const char *pCmd, bool bCreateConsole )
\r
235 // G_DeWan: Don't know if this is needed for linux version
\r
237 PROCESS_INFORMATION pi;
\r
238 STARTUPINFO si = {0}; // Initialize all members to zero
\r
239 si.cb = sizeof(STARTUPINFO); // Set byte count
\r
240 DWORD dwCreationFlags;
\r
242 if (bCreateConsole)
\r
243 dwCreationFlags = CREATE_NEW_CONSOLE | NORMAL_PRIORITY_CLASS;
\r
245 dwCreationFlags = DETACHED_PROCESS | NORMAL_PRIORITY_CLASS;
\r
247 for(; *pCmd == ' '; pCmd++);
\r
249 if(!CreateProcess(NULL, (char *)pCmd, NULL, NULL, FALSE, dwCreationFlags, NULL, NULL, &si, &pi))
\r
259 GetFilename(exename, "q3map");
\r
260 UnixToDosPath(exename); // do we want this done in linux version?
\r
262 char mapname[256];
\r
263 const char *pn = g_FuncTable.m_pfnReadProjectKey("mapspath");
\r
265 strcpy( mapname, pn );
\r
266 strcat( mapname, "/ac_prt.map" );
\r
267 UnixToDosPath(mapname);
\r
269 char command[1024];
\r
270 sprintf(command, "%s -nowater -fulldetail %s", exename, mapname);
\r
272 Q_Exec( command, TRUE );
\r
275 void BuildMiniPrt(list<Str>* exclusionList)
\r
277 // yes, we could just use -fulldetail option, but, as SPOG said
\r
278 // it'd be faster without all the hint, donotenter etc textures and
\r
284 const char *pn = g_FuncTable.m_pfnReadProjectKey("mapspath");
\r
286 strcpy( buffer, pn );
\r
287 strcat( buffer, "/ac_prt.map" );
\r
288 FILE* pFile = fopen(buffer, "w");
\r
294 int count = g_FuncTable.m_pfnGetEntityCount();
\r
295 for(int i = 0; i < count; i++)
\r
297 entity_t* ent = (entity_t*)g_FuncTable.m_pfnGetEntityHandle(i);
\r
299 epair_t* epl = *g_EntityTable.m_pfnGetEntityKeyValList(ent);
\r
304 if(!strcmp(ep->key, "classname"))
\r
306 if(!strcmp(ep->value, "worldspawn"))
\r
308 world.LoadFromEntity(i, FALSE);
\r
309 world.RemoveNonCheckBrushes(exclusionList, TRUE);
\r
310 world.SaveToFile(pFile);
\r
312 else if(strstr(ep->value, "info_"))
\r
314 world.ClearBrushes();
\r
315 world.ClearEPairs();
\r
316 world.LoadEPairList(epl);
\r
317 world.SaveToFile(pFile);
\r
331 entity_s* FindEntityFromTargetname(const char* targetname, int* entNum)
\r
335 int count = g_FuncTable.m_pfnGetEntityCount();
\r
336 for(int i = 0; i < count; i++)
\r
338 world.ClearEPairs();
\r
340 entity_s* ent = (entity_s*)g_FuncTable.m_pfnGetEntityHandle(i);
\r
342 world.LoadEPairList(*g_EntityTable.m_pfnGetEntityKeyValList(ent));
\r
344 DEPair* tn = world.FindEPairByKey("targetname");
\r
347 if(!stricmp(tn->value, targetname)) {
\r
358 void FillDefaultTexture(_QERFaceData* faceData, vec3_t va, vec3_t vb, vec3_t vc, const char* texture)
\r
360 faceData->m_bBPrimit = FALSE;
\r
361 faceData->m_fRotate = 0;
\r
362 faceData->m_fScale[0] = 0.5;
\r
363 faceData->m_fScale[1] = 0.5;
\r
364 faceData->m_fShift[0] = 0;
\r
365 faceData->m_fShift[1] = 0;
\r
366 faceData->m_nContents = 0;
\r
367 faceData->m_nFlags = 0;
\r
368 faceData->m_nValue = 0;
\r
370 strcpy(faceData->m_TextureName, texture);
\r
372 strcpy(faceData->m_TextureName, "textures/common/caulk");
\r
373 VectorCopy(va, faceData->m_v1);
\r
374 VectorCopy(vb, faceData->m_v2);
\r
375 VectorCopy(vc, faceData->m_v3);
\r
378 float Determinant3x3(float a1, float a2, float a3,
\r
379 float b1, float b2, float b3,
\r
380 float c1, float c2, float c3)
\r
382 return a1*(b2*c3-b3*c2) - a2*(b1*c3-b3*c1) + a3*(b1*c2-b2*c1);
\r
385 bool GetEntityCentre(const char* entity, vec3_t centre)
\r
387 entity_s* ent = FindEntityFromTargetname(entity, NULL);
\r
391 int cnt = g_FuncTable.m_pfnAllocateEntityBrushHandles(ent);
\r
394 g_FuncTable.m_pfnReleaseEntityBrushHandles();
\r
398 brush_t* brush = (brush_t*)g_FuncTable.m_pfnGetEntityBrushHandle(0);
\r
400 cBrush.LoadFromBrush_t(brush, FALSE);
\r
403 cBrush.GetBounds(min, max);
\r
405 VectorAdd(min, max, centre);
\r
406 VectorScale(centre, 0.5f, centre);
\r
408 g_FuncTable.m_pfnReleaseEntityBrushHandles();
\r
412 vec_t Min(vec_t a, vec_t b)
\r
419 void MakeNormal( vec_t* va, vec_t* vb, vec_t* vc, vec_t* out ) {
\r
421 VectorSubtract(va, vb, v1);
\r
422 VectorSubtract(vc, vb, v2);
\r
423 CrossProduct(v1, v2, out);
\r