]> de.git.xonotic.org Git - xonotic/netradiant.git/blob - contrib/gtkgensurf/gensurf.h
transfer from internal tree r5311 branches/1.4-gpl
[xonotic/netradiant.git] / contrib / gtkgensurf / gensurf.h
1 /*\r
2 GenSurf plugin for GtkRadiant\r
3 Copyright (C) 2001 David Hyde, Loki software and qeradiant.com\r
4 \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
9 \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
14 \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
18 */\r
19 \r
20 #ifndef _GENSURF_H_\r
21 #define _GENSURF_H_\r
22 \r
23 #include <gtk/gtk.h>\r
24 \r
25 #include "qerplugin.h"\r
26 //#include "qertypes.h"\r
27 \r
28 #include "igl.h"\r
29 #include "iui_gtk.h"\r
30 #include "ientity.h"\r
31 \r
32 #include "gendlgs.h"\r
33 \r
34 #define PLUGIN\r
35 #define Q3RADIANT\r
36 \r
37 #if defined(__linux__) || defined(__APPLE__)\r
38 template <class T>\r
39 inline T min (T x, T y) { return (x < y) ? x : y; }\r
40 template <class T>\r
41 inline T max (T x, T y) { return (x > y) ? x : y; }\r
42 \r
43 typedef struct { long x, y; } POINT;\r
44 typedef struct { long left, top, right, bottom; } RECT;\r
45 #endif\r
46 inline bool PtInRect (RECT *rc, POINT pt)\r
47 {\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
52   return true;\r
53 }\r
54 \r
55 #define NUMGAMES 7\r
56 \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
63 \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
67 \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
77 \r
78 #define QUAKE2    0\r
79 #define HALFLIFE  1\r
80 #define SIN       2\r
81 #define HERETIC2  3\r
82 #define KINGPIN   4\r
83 #define GENESIS3D 5\r
84 #define QUAKE3    6\r
85 \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
90 \r
91 typedef float vec;\r
92 typedef vec vec3[3];\r
93 typedef vec vec2[2];\r
94 \r
95 typedef struct\r
96 {\r
97         vec3   v[3];\r
98         char   texture[64];\r
99         float  Shift[2];\r
100         float  Rotate;\r
101         float  Scale[2];\r
102         int    Contents;\r
103         int    Surface;\r
104         int    Value;\r
105 } FACE;\r
106 \r
107 typedef struct\r
108 {\r
109         vec3 normal;\r
110         vec  dist;\r
111 } PLANE;\r
112 \r
113 typedef struct\r
114 {\r
115         int             numpoints;\r
116         vec3    p[4];           // variable sized\r
117 } MY_WINDING;\r
118 \r
119 typedef struct\r
120 {\r
121         int  Number;\r
122         int  NumFaces;\r
123         FACE face[MAX_FACES_PER_BRUSH];\r
124 } BRUSH;\r
125 \r
126 typedef struct tagXYZ\r
127 {\r
128         int fixed;\r
129         int done;\r
130         double p[3];\r
131         double pp[3];    // these used only for general 3D projection (not isometric)\r
132         double fixed_value;\r
133         double range;\r
134         double rate;\r
135 } XYZ;\r
136 \r
137 // Q2 PAK file structures\r
138 typedef struct\r
139 {\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
143 } pak_header_t;\r
144 \r
145 typedef struct\r
146 {\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
150 } pak_item_t;\r
151 \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
155 \r
156 typedef struct\r
157 {\r
158         char    name[MAX_PAK_FILENAME_LENGTH];\r
159         int             filepos, filelen;\r
160 } dpackfile_t;\r
161 \r
162 typedef struct\r
163 {\r
164         int             ident;          // == IDPAKHEADER\r
165         int             dirofs;\r
166         int             dirlen;\r
167 } dpackheader_t;\r
168 \r
169 // Half-Life WAD file structures\r
170 typedef struct\r
171 {\r
172         char            identification[4];              // should be WAD2 or 2DAW\r
173         int                     numlumps;\r
174         int                     infotableofs;\r
175 } wadinfo_t;\r
176 \r
177 typedef struct\r
178 {\r
179         int                     filepos;\r
180         int                     disksize;\r
181         int                     size;                                   // uncompressed\r
182         char            type;\r
183         char            compression;\r
184         char            pad1, pad2;\r
185         char            name[16];                               // must be null terminated\r
186 } lumpinfo_t;\r
187 \r
188 typedef struct\r
189 {\r
190         int             signature;\r
191         short   version;\r
192         short   bitflag;\r
193         short   compression_method;\r
194         short   modfiletime;\r
195         short   modfiledate;\r
196         int             crc;\r
197         int             compressed_size;\r
198         int             uncompressed_size;\r
199         short   filename_size;\r
200         short   extra_size;\r
201 } zipheader_t;\r
202 \r
203 typedef struct\r
204 {\r
205         double  x[2];\r
206         double  y[2];\r
207         double  z[2];\r
208 } bounding_box;\r
209 \r
210 typedef struct\r
211 {\r
212         float p[3];\r
213         int   used;\r
214         int   tri;\r
215         float error;\r
216         int   fixed;\r
217 } NODE;\r
218 \r
219 typedef struct\r
220 {\r
221         int   v[3];\r
222         int   n[3];    // indices of neighboring triangles\r
223         PLANE plane;\r
224         int   flag;\r
225         float min[3];\r
226         float max[3];\r
227 } TRI;\r
228 \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
259 \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
272 void evaluate();\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
278 \r
279 //---------------- plugin.c -----------------------------\r
280 void UseFaceBounds();\r
281 \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
288 \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
295 \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
305 \r
306 #define MSG_VERTEX_SELECTED WM_USER+1\r
307 \r
308 typedef struct tagMYBITMAP\r
309 {\r
310   char             name[NAME_MAX];\r
311   char             defpath[NAME_MAX];\r
312   double           black_value;\r
313   double           white_value;\r
314   int width, height;\r
315   unsigned char* colors;\r
316 } MYBITMAP;\r
317 \r
318 typedef struct tagELEMENT {\r
319         int i;\r
320         int j;\r
321 } ELEMENT;\r
322 \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
345 extern int       NH, NV;\r
346 extern int       NumVerticesSelected;\r
347 extern int       Plane;\r
348 extern int       Preview;\r
349 extern int       RandomSeed;\r
350 extern int       Skybox;\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
367 \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
380 extern TRI       *gTri;\r
381 extern XYZ       xyz[MAX_ROWS+1][MAX_ROWS+1];\r
382 \r
383 extern int       Game;\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
394 \r
395 #endif // _GENSURF_H_\r