engine/quakec/csaddon/src/brush_selection.qc

159 lines
4.1 KiB
Plaintext

var float autocvar_ca_brush_view = 0; //0=normal, 1=x, 2=y, 3=z
var float autocvar_ca_brush_viewsize = 1024; //for different views.
var string autocvar_ca_newbrushtexture = "metal4_2";
var float autocvar_ca_newbrushheight = 64;
var float autocvar_ca_grid = 16;
var float autocvar_ca_explicitpatch = 0;
var float autocvar_ca_cpwidth = 2;
var float autocvar_ca_cpheight = 2;
#define EPSILON (1.0 / 32) //inprecision sucks.
#define MAX_FACEPOINTS 64
vector facepoints[MAX_FACEPOINTS]; //for temp usage
#define MAX_BRUSHFACES 64
struct
{
//brush state
brushface_t faces[MAX_BRUSHFACES];
int numfaces;
int contents;
//patch state
patchvert_t *cp;
int numcp, maxcp;
patchinfo_t patchinfo;
} tmp;
//int selected;
int brushlist[2048];
enum : int
{
BT_NONE, //selection
BT_MOVE = BT_NONE,
BT_ROTATE,
BT_MERGE,
BT_PUSHFACE,
BT_CREATEBRUSH,
BT_CREATEPATCH,
BT_CREATEDRAG,
BT_CLONEDISPLACE,
BT_SLICE,
BT_MOVETEXTURE,
BT_VERTEXEDIT
};
int mousetool;
int brushtool;
int bt_points;
vector bt_displace;
vector bt_point[64];
int nogrid; //+nogrid, temporarily disables grid locks
typedef struct
{
int model;
int id;
__uint64 facemask; //MAX_BRUSHFACES is 64... handy.
} selbrush_t;
selbrush_t *selectedbrushes;
int selectedbrushcount;
var int selectedbrushmodel = 1; //by default, the worldmodel. this is tracked to know which submodel to insert new brushes into.
int(int modelidx, int brushid) brush_isselected = //0 for faceid means 'all'
{
for (int i = 0; i < selectedbrushcount; i++)
if (selectedbrushes[i].id == brushid)
if (selectedbrushes[i].model == modelidx)
return i+1;
return 0;
};
int(int modelidx, int brushid, int faceid) brushface_isselected = //0 for faceid means 'all'
{
for (int i = 0; i < selectedbrushcount; i++)
if (selectedbrushes[i].id == brushid)
if (selectedbrushes[i].model == modelidx)
return !!(selectedbrushes[i].facemask&(1ull<<(faceid-1i)));
return 0;
};
int(int modelidx, int brushid) brush_deselect =
{
int i = brush_isselected(modelidx, brushid);
if (!i)
return FALSE;
brush_selected(modelidx, brushid, -1, FALSE);
memcpy(&selectedbrushes[i-1], &selectedbrushes[i], sizeof(selbrush_t)*(selectedbrushcount-i));
selectedbrushcount--;
return TRUE;
};
int(int modelidx, int brushid, int face) brushface_deselect =
{
//deselecting a single face
int i = brush_isselected(modelidx, brushid); //get the brush selection index
if (!i)
return FALSE;
i--;
face--;
if (!selectedbrushes[i].facemask) //no faces means all..
selectedbrushes[i].facemask = ~0ul;
selectedbrushes[i].facemask &= ~(1ul<<face);
if (!selectedbrushes[i].facemask)
{ //no faces left selected.
brush_selected(modelidx, brushid, -1, FALSE);
memcpy(&selectedbrushes[i], &selectedbrushes[i+1], sizeof(selbrush_t)*(selectedbrushcount-i));
selectedbrushcount--;
}
return TRUE;
};
void() brush_deselectall =
{
for (int i = 0; i < selectedbrushcount; i++)
brush_selected(selectedbrushes[i].model, selectedbrushes[i].id, -1, FALSE);
selectedbrushcount = 0;
};
void(int modelidx, int brushid) brush_select =
{
if (!brush_isselected(modelidx, brushid))
{
selbrush_t *n = memalloc(sizeof(selbrush_t) * (selectedbrushcount+1));
memcpy(n, selectedbrushes, sizeof(selbrush_t)*selectedbrushcount);
memfree(selectedbrushes);
selectedbrushes = n;
n[selectedbrushcount].model = modelidx;
n[selectedbrushcount].id = brushid;
n[selectedbrushcount].facemask = ~0ul;
selectedbrushcount++;
brush_selected(modelidx, brushid, -1, TRUE);
}
selectedbrushmodel = modelidx;
};
void(int modelidx, int brushid, int faceid) brushface_select =
{
faceid--;
int i = brush_isselected(modelidx, brushid); //get the brush selection index
if (!i)
{ //brush not selected yet
selbrush_t *n = memalloc(sizeof(selbrush_t) * (selectedbrushcount+1));
memcpy(n, selectedbrushes, sizeof(selbrush_t)*selectedbrushcount);
memfree(selectedbrushes);
selectedbrushes = n;
n[selectedbrushcount].model = modelidx;
n[selectedbrushcount].id = brushid;
n[selectedbrushcount].facemask = 0;
selectedbrushcount++;
brush_selected(modelidx, brushid, -1, TRUE);
i = selectedbrushcount;
}
selectedbrushes[i-1].facemask |= 1ul<<faceid;
selectedbrushmodel = modelidx;
};