2 GenSurf plugin for GtkRadiant
\r
3 Copyright (C) 2001 David Hyde, Loki software and qeradiant.com
\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
23 #include <gtk/gtk.h>
\r
25 #include "qerplugin.h"
\r
26 //#include "qertypes.h"
\r
29 #include "iui_gtk.h"
\r
30 #include "ientity.h"
\r
32 #include "gendlgs.h"
\r
37 #if defined(__linux__) || defined(__APPLE__)
\r
39 inline T min (T x, T y) { return (x < y) ? x : y; }
\r
41 inline T max (T x, T y) { return (x > y) ? x : y; }
\r
43 typedef struct { long x, y; } POINT;
\r
44 typedef struct { long left, top, right, bottom; } RECT;
\r
46 inline bool PtInRect (RECT *rc, POINT pt)
\r
48 if (pt.x < rc->left) return false;
\r
49 if (pt.x > rc->right) return false;
\r
50 if (pt.y < rc->bottom) return false;
\r
51 if (pt.y > rc->top) return false;
\r
57 #define CONTENTS_SOLID 0x00000001
\r
58 #define CONTENTS_DETAIL 0x08000000 // brushes to be added after vis leafs
\r
59 #define CONTENTS_LADDER 0x20000000
\r
60 #define SURF_HINT 0x100 // make a primary bsp splitter
\r
61 #define SURF_SKIP 0x200 // completely ignore, allowing non-closed brushes
\r
62 #define HINT_OFFSET 96
\r
64 #define PI 3.14159265358979224
\r
65 #define RadiansToDegrees(a) (floor(a*57.2957795 - 0.5)+1.)
\r
66 #define DegreesToRadians(a) (a/57.2957795)
\r
68 #define BOGUS_RANGE 65536
\r
69 #define DotProduct(x,y) (x[0]*y[0]+x[1]*y[1]+x[2]*y[2])
\r
70 #define VectorAdd(a,b,c) {c[0]=a[0]+b[0];c[1]=a[1]+b[1];c[2]=a[2]+b[2];}
\r
71 #define VectorClear(x) {x[0] = x[1] = x[2] = 0;}
\r
72 #define VectorCopy(a,b) {b[0]=a[0];b[1]=a[1];b[2]=a[2];}
\r
73 #define VectorScale(a,b,c) {c[0]=b*a[0];c[1]=b*a[1];c[2]=b*a[2];}
\r
74 #define VectorSubtract(a,b,c) {c[0]=a[0]-b[0];c[1]=a[1]-b[1];c[2]=a[2]-b[2];}
\r
75 #define XYZVectorSubtract(a,b,c) {c[0]=(float)a[0]-(float)b[0];c[1]=(float)a[1]-(float)b[1];c[2]=(float)a[2]-(float)b[2];}
\r
76 #define side(u1,v1,u2,v2,u3,v3) (v3-v1)*(u2-u1) - (u3-u1)*(v2-v1)
\r
86 #define MAX_FACES_PER_BRUSH 6
\r
87 #define SLIVER_ANGLE DegreesToRadians(20)
\r
88 #define MAX_NODES (MAX_ROWS+1)*(MAX_ROWS+1)
\r
89 #define MAX_TRIS (MAX_ROWS)*(MAX_ROWS)
\r
92 typedef vec vec3[3];
\r
93 typedef vec vec2[2];
\r
116 vec3 p[4]; // variable sized
\r
123 FACE face[MAX_FACES_PER_BRUSH];
\r
126 typedef struct tagXYZ
\r
131 double pp[3]; // these used only for general 3D projection (not isometric)
\r
132 double fixed_value;
\r
137 // Q2 PAK file structures
\r
140 char id[4]; // Should be 'PACK'
\r
141 int dstart; // Offest in the file to the directory
\r
142 int dsize; // Size in bytes of the directory, same as num_items*64
\r
147 char name[56]; // The name of the item, normal C string
\r
148 int start; // Offset in .pak file to start of item
\r
149 int size; // Size of item in bytes
\r
152 // SiN .SIN structures
\r
153 #define SINPAKHEADER (('K'<<24)+('A'<<16)+('P'<<8)+'S')
\r
154 #define MAX_PAK_FILENAME_LENGTH 120
\r
158 char name[MAX_PAK_FILENAME_LENGTH];
\r
159 int filepos, filelen;
\r
164 int ident; // == IDPAKHEADER
\r
169 // Half-Life WAD file structures
\r
172 char identification[4]; // should be WAD2 or 2DAW
\r
181 int size; // uncompressed
\r
185 char name[16]; // must be null terminated
\r
193 short compression_method;
\r
197 int compressed_size;
\r
198 int uncompressed_size;
\r
199 short filename_size;
\r
222 int n[3]; // indices of neighboring triangles
\r
229 //--------------- bitmap.c -----------------------------
\r
230 bool OpenBitmap ();
\r
231 void GenerateBitmapMapping ();
\r
232 //--------------- face.c -------------------------------
\r
233 void PlaneFromPoints (float *, float *, float *, PLANE *);
\r
234 void CrossProduct (vec3 v1, vec3 v2, vec3 cross);
\r
235 vec VectorNormalize (vec3 in, vec3 out);
\r
236 //--------------- gendlg.c -----------------------------
\r
237 GtkWidget* create_main_dialog ();
\r
238 void About (GtkWidget *parent);
\r
239 //--------------- genmap.c -----------------------------
\r
240 double AtLeast(double,double);
\r
241 bool CanEdit(int, int);
\r
242 void CloseFuncGroup();
\r
243 bool FixedPoint(int,int);
\r
244 void GenerateMap();
\r
245 void GenerateXYZ();
\r
246 double LessThan(double,double);
\r
247 void MakeBrush(BRUSH *);
\r
248 double MoreThan(double,double);
\r
249 double Nearest(double,double);
\r
250 double NoMoreThan(double,double);
\r
251 void OpenFuncGroup();
\r
252 void PlasmaCloud();
\r
253 int PlayerStartZ(double,double);
\r
254 void SubdividePlasma(int,int,int,int);
\r
255 bool ValidSurface();
\r
256 void XYZtoV(XYZ *, vec3 *);
\r
257 void MakePatch(patchMesh_t *);
\r
258 double CalculateSnapValue(double value);
\r
260 //---------------- gensurf.c ---------------------------
\r
261 bool GenSurfInit ();
\r
262 void ReadIniFile (const char *);
\r
263 void WriteIniFile (const char *);
\r
264 void OpenSetup (GtkWidget*,int);
\r
265 void SaveSetup (GtkWidget*);
\r
266 //---------------- heretic.c ---------------------------
\r
267 int GetDefSurfaceProps(char *);
\r
268 //---------------- view.c ------------------------------
\r
269 void CreateViewWindow ();
\r
270 void DrawGrid(RECT);
\r
271 void DrawPreview(RECT);
\r
273 void GetScaleFactor(RECT);
\r
274 void project(XYZ *);
\r
275 void Scale(RECT,XYZ,POINT *);
\r
276 void ShowPreview ();
\r
277 void UpdatePreview (bool);
\r
279 //---------------- plugin.c -----------------------------
\r
280 void UseFaceBounds();
\r
282 extern _QERFuncTable_1 g_FuncTable;
\r
283 extern _QERQglTable g_GLTable;
\r
284 extern _QERUIGtkTable g_UIGtkTable;
\r
285 extern _QEREntityTable g_EntityTable;
\r
286 //#define MAX_ROWS 64
\r
287 #define MAX_ROWS 128
\r
289 #define PLANE_XY0 0
\r
290 #define PLANE_XY1 1
\r
291 #define PLANE_YZ0 2
\r
292 #define PLANE_XZ0 3
\r
293 #define PLANE_YZ1 4
\r
294 #define PLANE_XZ1 5
\r
296 #define WAVE_COS_SIN 0
\r
297 #define WAVE_HCYLINDER 1
\r
298 #define WAVE_VCYLINDER 2
\r
299 #define WAVE_BITMAP 3
\r
300 #define WAVE_ROUGH_ONLY 4
\r
301 #define WAVE_FORMULA 5
\r
302 #define WAVE_FIRST WAVE_COS_SIN
\r
303 #define WAVE_LAST WAVE_FORMULA
\r
304 #define DLG_WAVE_LAST DLG_WAVE_01+WAVE_LAST-WAVE_FIRST
\r
306 #define MSG_VERTEX_SELECTED WM_USER+1
\r
308 typedef struct tagMYBITMAP
\r
310 char name[NAME_MAX];
\r
311 char defpath[NAME_MAX];
\r
312 double black_value;
\r
313 double white_value;
\r
315 unsigned char* colors;
\r
318 typedef struct tagELEMENT {
\r
323 extern char gszAppDir[NAME_MAX];
\r
324 extern char gszCaption[64];
\r
325 extern char gszHelpFile[NAME_MAX];
\r
326 extern char gszIni[NAME_MAX];
\r
327 extern char gszMapFile[NAME_MAX];
\r
328 extern char gszVersion[64];
\r
329 extern double Amplitude;
\r
330 extern double Roughness;
\r
331 extern double TexOffset[2];
\r
332 extern double TexScale[2];
\r
333 extern double WaveLength;
\r
334 extern double Hll, Hur, Vll, Vur;
\r
335 extern double Z00, Z01, Z10, Z11;
\r
336 extern double yaw, pitch, roll;
\r
337 extern ELEMENT Vertex[(MAX_ROWS+1)*(MAX_ROWS+1)];
\r
338 extern int AddHints;
\r
339 extern int ArghRad2;
\r
340 extern int AutoOverwrite;
\r
341 extern int Decimate;
\r
342 extern int FileAppend;
\r
343 extern int FixBorders;
\r
344 extern int HideBackFaces;
\r
346 extern int NumVerticesSelected;
\r
348 extern int Preview;
\r
349 extern int RandomSeed;
\r
351 extern int UseDetail;
\r
352 extern int UseLadder;
\r
353 extern int VertexMode;
\r
354 extern int vid_x, vid_y;
\r
355 extern int WaveType;
\r
356 extern int gNumNodes;
\r
357 extern int gNumTris;
\r
358 extern int view_x, view_y;
\r
359 extern int view_cx, view_cy;
\r
360 extern int UsePatches;
\r
361 extern int SlantAngle;
\r
362 extern int GimpHints;
\r
363 extern int Antialiasing; // ^Fishman - Antializing for the preview window.
\r
364 extern int AddTerrainKey; // ^Fishman - Add terrain key to func_group.
\r
365 extern int SnapToGrid; // Hydra : snap to grid
\r
366 extern int SP; // ^Fishman - Snap to grid.
\r
368 /*extern HCURSOR ghCursorCurrent;
\r
369 extern HCURSOR ghCursorDefault;
\r
370 extern HCURSOR ghCursorVertex;
\r
371 extern HINSTANCE ghInst;*/
\r
372 extern GtkWidget *g_pRadiantWnd;
\r
373 extern GtkWidget *g_pWnd;
\r
374 /*extern HWND ghwndAngles;
\r
375 extern HWND ghwndFix;
\r
376 */extern GtkWidget *g_pWndPreview;
\r
377 extern GtkWidget *g_pPreviewWidget;
\r
378 extern MYBITMAP gbmp;
\r
379 extern NODE *gNode;
\r
381 extern XYZ xyz[MAX_ROWS+1][MAX_ROWS+1];
\r
384 extern bounding_box PlayerBox[NUMGAMES];
\r
385 //extern char gszOutputDir[NUMGAMES][NAME_MAX];
\r
386 extern char Texture[NUMGAMES][3][64];
\r
387 //extern char gszTextureDir[NUMGAMES][NAME_MAX];
\r
388 extern char GameName[NUMGAMES][16];
\r
389 //extern char pakfile[NUMGAMES][NAME_MAX];
\r
390 //extern char lastpakfile[NUMGAMES][NAME_MAX];
\r
391 //extern int UsePak[NUMGAMES];
\r
392 //extern char GameDir[NUMGAMES][NAME_MAX];
\r
393 //extern char ExcelFunc[1024];
\r
395 #endif // _GENSURF_H_
\r