mirror of
https://github.com/UberGames/GtkRadiant.git
synced 2024-12-02 08:32:37 +00:00
433 lines
10 KiB
C
433 lines
10 KiB
C
|
/*
|
||
|
GenSurf plugin for GtkRadiant
|
||
|
Copyright (C) 2001 David Hyde, Loki software and qeradiant.com
|
||
|
|
||
|
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
|
||
|
*/
|
||
|
|
||
|
#ifndef _GENSURF_H_
|
||
|
#define _GENSURF_H_
|
||
|
|
||
|
#include <string.h>
|
||
|
#include "qertypes.h"
|
||
|
#include <stdio.h>
|
||
|
|
||
|
#include "mathlib.h"
|
||
|
#include "iscenegraph.h"
|
||
|
#define USE_QERTABLE_DEFINE
|
||
|
#include "qerplugin.h"
|
||
|
extern _QERFuncTable_1 g_FuncTable;
|
||
|
|
||
|
#include "irender.h"
|
||
|
#include "iselection.h"
|
||
|
|
||
|
#define USE_ENTITYTABLE_DEFINE
|
||
|
#include "ientity.h"
|
||
|
extern _QEREntityTable __ENTITYTABLENAME;
|
||
|
|
||
|
#define USE_PATCHTABLE_DEFINE
|
||
|
#include "ipatch.h"
|
||
|
extern _QERPatchTable __PATCHTABLENAME;
|
||
|
|
||
|
#define USE_BRUSHTABLE_DEFINE
|
||
|
#include "ibrush.h"
|
||
|
extern _QERBrushTable __BRUSHTABLENAME;
|
||
|
|
||
|
#include "igl.h"
|
||
|
#include "ientity.h"
|
||
|
|
||
|
#include <gtk/gtk.h>
|
||
|
|
||
|
#include "iui_gtk.h"
|
||
|
|
||
|
#include "gendlgs.h"
|
||
|
|
||
|
|
||
|
#define PLUGIN
|
||
|
#define Q3RADIANT
|
||
|
|
||
|
//#if defined(__linux__) || defined(__APPLE__)
|
||
|
#if 1
|
||
|
#include <algorithm>
|
||
|
#else
|
||
|
template <class T>
|
||
|
inline T min (T x, T y) { return (x < y) ? x : y; }
|
||
|
template <class T>
|
||
|
inline T max (T x, T y) { return (x > y) ? x : y; }
|
||
|
#endif
|
||
|
|
||
|
typedef struct { long x, y; } Point;
|
||
|
typedef struct { long left, top, right, bottom; } Rect;
|
||
|
|
||
|
#define NAME_MAX 255
|
||
|
|
||
|
typedef void* LPVOID;
|
||
|
typedef char* LPSTR;
|
||
|
|
||
|
//#endif
|
||
|
inline bool PtInRect (Rect *rc, Point pt)
|
||
|
{
|
||
|
if (pt.x < rc->left) return false;
|
||
|
if (pt.x > rc->right) return false;
|
||
|
if (pt.y < rc->bottom) return false;
|
||
|
if (pt.y > rc->top) return false;
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
#define NUMGAMES 7
|
||
|
|
||
|
#define CONTENTS_SOLID 0x00000001
|
||
|
#define CONTENTS_DETAIL 0x08000000 // brushes to be added after vis leafs
|
||
|
#define CONTENTS_LADDER 0x20000000
|
||
|
#define SURF_HINT 0x100 // make a primary bsp splitter
|
||
|
#define SURF_SKIP 0x200 // completely ignore, allowing non-closed brushes
|
||
|
#define HINT_OFFSET 96
|
||
|
|
||
|
#define PI 3.14159265358979224
|
||
|
#define RadiansToDegrees(a) (floor(a*57.2957795 - 0.5)+1.)
|
||
|
#define DegreesToRadians(a) (a/57.2957795)
|
||
|
|
||
|
#define BOGUS_RANGE 65536
|
||
|
/*
|
||
|
#define DotProduct(x,y) (x[0]*y[0]+x[1]*y[1]+x[2]*y[2])
|
||
|
#define VectorAdd(a,b,c) {c[0]=a[0]+b[0];c[1]=a[1]+b[1];c[2]=a[2]+b[2];}
|
||
|
#define VectorClear(x) {x[0] = x[1] = x[2] = 0;}
|
||
|
#define VectorCopy(a,b) {b[0]=a[0];b[1]=a[1];b[2]=a[2];}
|
||
|
#define VectorScale(a,b,c) {c[0]=b*a[0];c[1]=b*a[1];c[2]=b*a[2];}
|
||
|
#define VectorSubtract(a,b,c) {c[0]=a[0]-b[0];c[1]=a[1]-b[1];c[2]=a[2]-b[2];}
|
||
|
*/
|
||
|
#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];}
|
||
|
#define side(u1,v1,u2,v2,u3,v3) (v3-v1)*(u2-u1) - (u3-u1)*(v2-v1)
|
||
|
|
||
|
#define QUAKE2 0
|
||
|
#define HALFLIFE 1
|
||
|
#define SIN 2
|
||
|
#define HERETIC2 3
|
||
|
#define KINGPIN 4
|
||
|
#define GENESIS3D 5
|
||
|
#define QUAKE3 6
|
||
|
|
||
|
#define MAX_FACES_PER_BRUSH 6
|
||
|
#define SLIVER_ANGLE DegreesToRadians(20)
|
||
|
#define MAX_NODES (MAX_ROWS+1)*(MAX_ROWS+1)
|
||
|
#define MAX_TRIS (MAX_ROWS)*(MAX_ROWS)
|
||
|
|
||
|
typedef float vec;
|
||
|
typedef vec vec3[3];
|
||
|
typedef vec vec2[2];
|
||
|
|
||
|
typedef struct
|
||
|
{
|
||
|
vec3 v[3];
|
||
|
char texture[64];
|
||
|
float Shift[2];
|
||
|
float Rotate;
|
||
|
float Scale[2];
|
||
|
int Contents;
|
||
|
int Surface;
|
||
|
int Value;
|
||
|
} FACE;
|
||
|
|
||
|
typedef struct
|
||
|
{
|
||
|
vec3 normal;
|
||
|
vec dist;
|
||
|
} PLANE;
|
||
|
|
||
|
typedef struct
|
||
|
{
|
||
|
int numpoints;
|
||
|
vec3 p[4]; // variable sized
|
||
|
} MY_WINDING;
|
||
|
|
||
|
typedef struct
|
||
|
{
|
||
|
int Number;
|
||
|
int NumFaces;
|
||
|
FACE face[MAX_FACES_PER_BRUSH];
|
||
|
} BRUSH;
|
||
|
|
||
|
typedef struct tagXYZ
|
||
|
{
|
||
|
int fixed;
|
||
|
int done;
|
||
|
double p[3];
|
||
|
double pp[3]; // these used only for general 3D projection (not isometric)
|
||
|
double fixed_value;
|
||
|
double range;
|
||
|
double rate;
|
||
|
} XYZ;
|
||
|
|
||
|
// Q2 PAK file structures
|
||
|
typedef struct
|
||
|
{
|
||
|
char id[4]; // Should be 'PACK'
|
||
|
int dstart; // Offest in the file to the directory
|
||
|
int dsize; // Size in bytes of the directory, same as num_items*64
|
||
|
} pak_header_t;
|
||
|
|
||
|
typedef struct
|
||
|
{
|
||
|
char name[56]; // The name of the item, normal C string
|
||
|
int start; // Offset in .pak file to start of item
|
||
|
int size; // Size of item in bytes
|
||
|
} pak_item_t;
|
||
|
|
||
|
// SiN .SIN structures
|
||
|
#define SINPAKHEADER (('K'<<24)+('A'<<16)+('P'<<8)+'S')
|
||
|
#define MAX_PAK_FILENAME_LENGTH 120
|
||
|
|
||
|
typedef struct
|
||
|
{
|
||
|
char name[MAX_PAK_FILENAME_LENGTH];
|
||
|
int filepos, filelen;
|
||
|
} dpackfile_t;
|
||
|
|
||
|
typedef struct
|
||
|
{
|
||
|
int ident; // == IDPAKHEADER
|
||
|
int dirofs;
|
||
|
int dirlen;
|
||
|
} dpackheader_t;
|
||
|
|
||
|
// Half-Life WAD file structures
|
||
|
typedef struct
|
||
|
{
|
||
|
char identification[4]; // should be WAD2 or 2DAW
|
||
|
int numlumps;
|
||
|
int infotableofs;
|
||
|
} wadinfo_t;
|
||
|
|
||
|
typedef struct
|
||
|
{
|
||
|
int filepos;
|
||
|
int disksize;
|
||
|
int size; // uncompressed
|
||
|
char type;
|
||
|
char compression;
|
||
|
char pad1, pad2;
|
||
|
char name[16]; // must be null terminated
|
||
|
} lumpinfo_t;
|
||
|
|
||
|
typedef struct
|
||
|
{
|
||
|
int signature;
|
||
|
short version;
|
||
|
short bitflag;
|
||
|
short compression_method;
|
||
|
short modfiletime;
|
||
|
short modfiledate;
|
||
|
int crc;
|
||
|
int compressed_size;
|
||
|
int uncompressed_size;
|
||
|
short filename_size;
|
||
|
short extra_size;
|
||
|
} zipheader_t;
|
||
|
|
||
|
typedef struct
|
||
|
{
|
||
|
double x[2];
|
||
|
double y[2];
|
||
|
double z[2];
|
||
|
} bounding_box;
|
||
|
|
||
|
typedef struct
|
||
|
{
|
||
|
float p[3];
|
||
|
int used;
|
||
|
int tri;
|
||
|
float error;
|
||
|
int fixed;
|
||
|
} NODE;
|
||
|
|
||
|
typedef struct
|
||
|
{
|
||
|
int v[3];
|
||
|
int n[3]; // indices of neighboring triangles
|
||
|
PLANE plane;
|
||
|
int flag;
|
||
|
float min[3];
|
||
|
float max[3];
|
||
|
} TRI;
|
||
|
|
||
|
//--------------- bitmap.c -----------------------------
|
||
|
bool OpenBitmap ();
|
||
|
double CalculateSnapValue(double value);
|
||
|
void GenerateBitmapMapping ();
|
||
|
//--------------- face.c -------------------------------
|
||
|
void PlaneFromPoints (float *, float *, float *, PLANE *);
|
||
|
//void CrossProduct (vec3 v1, vec3 v2, vec3 cross);
|
||
|
//vec VectorNormalize (vec3 in, vec3 out);
|
||
|
//--------------- gendlg.c -----------------------------
|
||
|
GtkWidget* create_main_dialog ();
|
||
|
void About (GtkWidget *parent);
|
||
|
//--------------- genmap.c -----------------------------
|
||
|
double AtLeast(double,double);
|
||
|
bool CanEdit(int, int);
|
||
|
void CloseFuncGroup();
|
||
|
bool FixedPoint(int,int);
|
||
|
void GenerateMap();
|
||
|
void GenerateXYZ();
|
||
|
double LessThan(double,double);
|
||
|
void MakeBrush(BRUSH *);
|
||
|
double MoreThan(double,double);
|
||
|
double Nearest(double,double);
|
||
|
double NoMoreThan(double,double);
|
||
|
void OpenFuncGroup();
|
||
|
void PlasmaCloud();
|
||
|
int PlayerStartZ(double,double);
|
||
|
void SubdividePlasma(int,int,int,int);
|
||
|
bool ValidSurface();
|
||
|
void XYZtoV(XYZ *, vec3 *);
|
||
|
scene::Node* MakePatch(void);
|
||
|
|
||
|
//---------------- gensurf.c ---------------------------
|
||
|
bool GenSurfInit ();
|
||
|
void ReadIniFile (const char *);
|
||
|
void WriteIniFile (const char *);
|
||
|
void OpenSetup (GtkWidget*,int);
|
||
|
void SaveSetup (GtkWidget*);
|
||
|
//---------------- heretic.c ---------------------------
|
||
|
int GetDefSurfaceProps(char *);
|
||
|
//---------------- view.c ------------------------------
|
||
|
void CreateViewWindow ();
|
||
|
void DrawGrid(Rect);
|
||
|
void DrawPreview(Rect);
|
||
|
void evaluate();
|
||
|
void GetScaleFactor(Rect);
|
||
|
void project(XYZ *);
|
||
|
void Scale(Rect,XYZ,Point *);
|
||
|
void ShowPreview ();
|
||
|
void UpdatePreview (bool);
|
||
|
|
||
|
//---------------- plugin.c -----------------------------
|
||
|
void UseFaceBounds();
|
||
|
|
||
|
extern _QERFuncTable_1 g_FuncTable;
|
||
|
extern _QERQglTable g_GLTable;
|
||
|
extern _QERUIGtkTable g_UIGtkTable;
|
||
|
extern _QEREntityTable g_EntityTable;
|
||
|
//#define MAX_ROWS 64
|
||
|
#define MAX_ROWS 128
|
||
|
|
||
|
#define PLANE_XY0 0
|
||
|
#define PLANE_XY1 1
|
||
|
#define PLANE_YZ0 2
|
||
|
#define PLANE_XZ0 3
|
||
|
#define PLANE_YZ1 4
|
||
|
#define PLANE_XZ1 5
|
||
|
|
||
|
#define WAVE_COS_SIN 0
|
||
|
#define WAVE_HCYLINDER 1
|
||
|
#define WAVE_VCYLINDER 2
|
||
|
#define WAVE_BITMAP 3
|
||
|
#define WAVE_ROUGH_ONLY 4
|
||
|
#define WAVE_FORMULA 5
|
||
|
#define WAVE_FIRST WAVE_COS_SIN
|
||
|
#define WAVE_LAST WAVE_FORMULA
|
||
|
#define DLG_WAVE_LAST DLG_WAVE_01+WAVE_LAST-WAVE_FIRST
|
||
|
|
||
|
#define MSG_VERTEX_SELECTED WM_USER+1
|
||
|
|
||
|
typedef struct tagMYBITMAP
|
||
|
{
|
||
|
char name[NAME_MAX];
|
||
|
char defpath[NAME_MAX];
|
||
|
double black_value;
|
||
|
double white_value;
|
||
|
int width, height;
|
||
|
unsigned char* colors;
|
||
|
} MYBITMAP;
|
||
|
|
||
|
typedef struct tagELEMENT {
|
||
|
int i;
|
||
|
int j;
|
||
|
} ELEMENT;
|
||
|
|
||
|
extern char gszAppDir[NAME_MAX];
|
||
|
extern char gszCaption[64];
|
||
|
extern char gszHelpFile[NAME_MAX];
|
||
|
extern char gszIni[NAME_MAX];
|
||
|
extern char gszMapFile[NAME_MAX];
|
||
|
extern char gszVersion[64];
|
||
|
extern double Amplitude;
|
||
|
extern double Roughness;
|
||
|
extern double TexOffset[2];
|
||
|
extern double TexScale[2];
|
||
|
extern double WaveLength;
|
||
|
extern double Hll, Hur, Vll, Vur;
|
||
|
extern double Z00, Z01, Z10, Z11;
|
||
|
extern double yaw, pitch, roll;
|
||
|
extern ELEMENT Vertex[(MAX_ROWS+1)*(MAX_ROWS+1)];
|
||
|
extern int AddHints;
|
||
|
extern int ArghRad2;
|
||
|
extern int AutoOverwrite;
|
||
|
extern int Decimate;
|
||
|
extern int FileAppend;
|
||
|
extern int FixBorders;
|
||
|
extern int HideBackFaces;
|
||
|
extern int NH, NV;
|
||
|
extern int NumVerticesSelected;
|
||
|
extern int Plane;
|
||
|
extern int Preview;
|
||
|
extern int RandomSeed;
|
||
|
extern int Skybox;
|
||
|
extern int UseDetail;
|
||
|
extern int UseLadder;
|
||
|
extern int VertexMode;
|
||
|
extern int vid_x, vid_y;
|
||
|
extern int WaveType;
|
||
|
extern int gNumNodes;
|
||
|
extern int gNumTris;
|
||
|
extern int view_x, view_y;
|
||
|
extern int view_cx, view_cy;
|
||
|
extern int UsePatches;
|
||
|
extern int SlantAngle;
|
||
|
extern int GimpHints;
|
||
|
extern int Antialiasing; // ^Fishman - Antializing for the preview window.
|
||
|
extern int AddTerrainKey; // ^Fishman - Add terrain key to func_group.
|
||
|
extern int SnapToGrid; // Hydra : snap to grid
|
||
|
extern int SP; // ^Fishman - Snap to grid.
|
||
|
|
||
|
|
||
|
/*extern HCURSOR ghCursorCurrent;
|
||
|
extern HCURSOR ghCursorDefault;
|
||
|
extern HCURSOR ghCursorVertex;
|
||
|
extern HINSTANCE ghInst;*/
|
||
|
extern GtkWidget *g_pRadiantWnd;
|
||
|
extern GtkWidget *g_pWnd;
|
||
|
/*extern HWND ghwndAngles;
|
||
|
extern HWND ghwndFix;
|
||
|
*/extern GtkWidget *g_pWndPreview;
|
||
|
extern GtkWidget *g_pPreviewWidget;
|
||
|
extern MYBITMAP gbmp;
|
||
|
extern NODE *gNode;
|
||
|
extern TRI *gTri;
|
||
|
extern XYZ xyz[MAX_ROWS+1][MAX_ROWS+1];
|
||
|
|
||
|
extern int Game;
|
||
|
extern bounding_box PlayerBox[NUMGAMES];
|
||
|
//extern char gszOutputDir[NUMGAMES][NAME_MAX];
|
||
|
extern char Texture[NUMGAMES][3][64];
|
||
|
//extern char gszTextureDir[NUMGAMES][NAME_MAX];
|
||
|
extern char GameName[NUMGAMES][16];
|
||
|
//extern char pakfile[NUMGAMES][NAME_MAX];
|
||
|
//extern char lastpakfile[NUMGAMES][NAME_MAX];
|
||
|
//extern int UsePak[NUMGAMES];
|
||
|
//extern char GameDir[NUMGAMES][NAME_MAX];
|
||
|
//extern char ExcelFunc[1024];
|
||
|
|
||
|
#endif // _GENSURF_H_
|