eefc950400
particles: add an emiteffectnum field (and support emiteffect+traileffect psuedo-fields), for reliable emissions that are not framerate dependant (emitted forwards by default... particles: rewrote 'sky' surface emittance. can now emit from submodels too. particles: be more verbose about unknown mode keywords, instead of silent. server: add basic misc_model emulation, for mods that don't implement one. quake2: better r1q2 compat. renderer: rework mindist+maxdist, should be more consistent as well as more reliable with orthographic matricies. has actual VF_ enumerations now. sound: fix CF_FOLLOW to not crash, and work with openal. client: 'cl_loopbackprotocol nq' now uses appropriate protocol extensions. fs: try using /usr/share/games/foo by default, if it exists. server: uncap drate if unspecified, do not fall back on rate. git-svn-id: https://svn.code.sf.net/p/fteqw/code/trunk@5021 fc73d0e0-1445-4013-8a0c-d673dee63da5
1128 lines
26 KiB
C++
1128 lines
26 KiB
C++
#ifdef CAMQUAKE
|
|
typedef struct
|
|
{
|
|
int numpoints;
|
|
int type;
|
|
vector pos[64];
|
|
float totallength;
|
|
vector color;
|
|
int selected_point;
|
|
float position;
|
|
} spline_t;
|
|
|
|
typedef struct
|
|
{
|
|
float starttime;
|
|
float stoptime;
|
|
spline_t spline;
|
|
} cam_t;
|
|
|
|
typedef struct
|
|
{
|
|
int ver;
|
|
int position_count;
|
|
int position_selected;
|
|
int view_count;
|
|
int view_selected;
|
|
cam_t position[64];
|
|
cam_t view[64];
|
|
} camdata_t;
|
|
#define VER 1i /*bump when the above structs change*/
|
|
|
|
static camdata_t *camdata;
|
|
static var float splinefile = -1;
|
|
static var int edit_type = 0;
|
|
static vector submenu_position;
|
|
var float autocvar_cl_demospeed = 1;
|
|
|
|
void(int *dest, int bytes) memclr =
|
|
{
|
|
bytes = bytes>>2i;
|
|
while(bytes > 0i)
|
|
{
|
|
bytes = bytes - 1i;
|
|
dest[bytes] = 0i;
|
|
}
|
|
};
|
|
|
|
void() spline_init =
|
|
{
|
|
string camfilename;
|
|
if (isdemo())
|
|
camfilename = serverkey("ip"); //this always contains the name of the demo rather than the original ip, which is not known.
|
|
else
|
|
camfilename = mapname; //otherwise just use the current map (though really we should just disable this)
|
|
camfilename = strcat(camfilename, ".cam");
|
|
|
|
/*precache the shader*/
|
|
shaderforname("camsplineshader", "{\n{\nmap construction.tga\nblendfunc blend\nrgbgen vertex\nalphagen vertex\n}\n}\n");
|
|
|
|
splinefile = fopen(camfilename, FILE_MMAP_RW, sizeof(camdata_t));
|
|
if (splinefile < 0)
|
|
{
|
|
/*too lazy to create a file, just use it as a malloc*/
|
|
splinefile = fopen("", FILE_MMAP_RW, sizeof(camdata_t));
|
|
}
|
|
|
|
camdata = (camdata_t*)(fgets(splinefile));
|
|
|
|
if (!camdata)
|
|
error("unable to mmap spline.dat\n");
|
|
|
|
if (camdata->ver != VER)
|
|
{
|
|
print(sprintf("%s version is outdated, wiping.\n", camfilename));
|
|
memclr ((int*)camdata, sizeof(camdata_t));
|
|
camdata->ver = VER;
|
|
}
|
|
};
|
|
void() spline_shutdown =
|
|
{
|
|
fclose(splinefile);
|
|
splinefile = -1;
|
|
};
|
|
|
|
static void spline_calclength(spline_t *s)
|
|
{
|
|
int i;
|
|
s->totallength = 0;
|
|
for (i = 0; i < s->numpoints - 1; i+=1)
|
|
{
|
|
s->totallength = s->totallength + vlen(s->pos[i] - s->pos[i+1]);
|
|
}
|
|
};
|
|
|
|
static vector(spline_t *s, float frac) spline_pos =
|
|
{
|
|
vector v1, v2;
|
|
if (s->numpoints < 2)
|
|
{
|
|
return '0 0 0';
|
|
}
|
|
frac *= s->numpoints;
|
|
if (frac < 0)
|
|
{
|
|
v1 = s->pos[0];
|
|
v2 = s->pos[1];
|
|
}
|
|
else if (frac >= s->numpoints)
|
|
{
|
|
v1 = s->pos[s->numpoints-2];
|
|
v2 = s->pos[s->numpoints-1];
|
|
frac -= s->numpoints;
|
|
}
|
|
else
|
|
{
|
|
v1 = s->pos[s->numpoints];
|
|
v2 = s->pos[s->numpoints+1];
|
|
frac = frac - (float)(int)frac;
|
|
}
|
|
|
|
return v1 * (1-frac) + v2 * frac;
|
|
};
|
|
|
|
static vector(spline_t *s, float frac) spline_dir =
|
|
{
|
|
return normalize(spline_pos(s, frac+0.001) - spline_pos(s, frac-0.001));
|
|
};
|
|
|
|
static vector(vector pos, vector dir, vector view) beamdir =
|
|
{
|
|
vector result;
|
|
view = normalize(view - pos);
|
|
//crossproduct view+dir
|
|
result_x = dir_y*view_z - dir_z*view_y;
|
|
result_y = dir_z*view_x - dir_x*view_z;
|
|
result_z = dir_x*view_y - dir_y*view_x;
|
|
return result;
|
|
};
|
|
|
|
void(vector p1, vector p2, vector color1, vector color2) fakeline = {
|
|
R_BeginPolygon("camsplineshader");
|
|
R_PolygonVertex(p1+'0 0 1', '0 0', color1,1);
|
|
R_PolygonVertex(p1-'0 0 1', '0 1', color1,1);
|
|
R_PolygonVertex(p2-'0 0 1', '1 1', color2,1);
|
|
R_PolygonVertex(p2+'0 0 1', '1 0', color2,1);
|
|
R_PolygonVertex(p2+'0 0 1', '0 0', color2,1);
|
|
R_PolygonVertex(p2-'0 0 1', '0 1', color2,1);
|
|
R_PolygonVertex(p1-'0 0 1', '1 1', color1,1);
|
|
R_PolygonVertex(p1-'0 0 1', '1 0', color1,1);
|
|
R_EndPolygon();
|
|
};
|
|
|
|
void (vector p1, vector p2, vector color1, vector color2) tube
|
|
{
|
|
local vector s;
|
|
R_BeginPolygon("camsplineshader");
|
|
R_EndPolygon();
|
|
};
|
|
|
|
vector (vector p1, vector p2, float frac) interpolate
|
|
{
|
|
return (p2 - p1) * frac + p1;
|
|
};
|
|
|
|
void (vector pos, float point_size, vector color) draw_point
|
|
{
|
|
local int i;
|
|
local vector offsets[5];
|
|
local vector points[8];
|
|
local vector point, point1;
|
|
|
|
if (point_size == 0)
|
|
return;
|
|
|
|
point_x = -(point_size/2);
|
|
point_y = -(point_size/2);
|
|
offsets[0] = point;
|
|
point_x = point_size/2;
|
|
point_y = -(point_size/2);
|
|
offsets[1] = point;
|
|
point_x = -(point_size/2);
|
|
point_y = (point_size/2);
|
|
offsets[2] = point;
|
|
point_x = (point_size/2);
|
|
point_y = (point_size/2);
|
|
offsets[3] = point;
|
|
|
|
point1_z = -(point_size/2);
|
|
for (i=0; i<4; i+=1)
|
|
points[i] = offsets[i] + point1 + pos;
|
|
|
|
point1_z = (point_size/2);
|
|
for (i=4; i<8; i+=1)
|
|
points[i] = offsets[i-4] + point1 + pos;
|
|
|
|
/*
|
|
* bottom
|
|
* 2 3
|
|
* 0 1
|
|
*
|
|
* top
|
|
* 6 7
|
|
* 4 5
|
|
*/
|
|
|
|
// bottom
|
|
R_BeginPolygon("camsplineshader");
|
|
R_PolygonVertex(points[3], '0 0', color ,1);
|
|
R_PolygonVertex(points[2], '0 1', color ,1);
|
|
R_PolygonVertex(points[0], '1 1', color,1);
|
|
R_PolygonVertex(points[1], '1 0', color,1);
|
|
R_EndPolygon();
|
|
|
|
// top
|
|
R_BeginPolygon("camsplineshader");
|
|
R_PolygonVertex(points[5], '0 0', color ,1);
|
|
R_PolygonVertex(points[4], '0 1', color ,1);
|
|
R_PolygonVertex(points[6], '1 1', color,1);
|
|
R_PolygonVertex(points[7], '1 0', color,1);
|
|
R_EndPolygon();
|
|
|
|
// front
|
|
R_BeginPolygon("camsplineshader");
|
|
R_PolygonVertex(points[4], '0 0', color ,1);
|
|
R_PolygonVertex(points[5], '0 1', color ,1);
|
|
R_PolygonVertex(points[1], '1 1', color,1);
|
|
R_PolygonVertex(points[0], '1 0', color,1);
|
|
R_EndPolygon();
|
|
|
|
//back
|
|
R_BeginPolygon("camsplineshader");
|
|
R_PolygonVertex(points[7], '0 0', color ,1);
|
|
R_PolygonVertex(points[6], '0 1', color ,1);
|
|
R_PolygonVertex(points[2], '1 1', color,1);
|
|
R_PolygonVertex(points[3], '1 0', color,1);
|
|
R_EndPolygon();
|
|
|
|
//left
|
|
R_BeginPolygon("camsplineshader");
|
|
R_PolygonVertex(points[6], '0 0', color ,1);
|
|
R_PolygonVertex(points[4], '0 1', color ,1);
|
|
R_PolygonVertex(points[0], '1 1', color,1);
|
|
R_PolygonVertex(points[2], '1 0', color,1);
|
|
R_EndPolygon();
|
|
|
|
//right
|
|
R_BeginPolygon("camsplineshader");
|
|
R_PolygonVertex(points[5], '0 0', color ,1);
|
|
R_PolygonVertex(points[7], '0 1', color ,1);
|
|
R_PolygonVertex(points[3], '1 1', color,1);
|
|
R_PolygonVertex(points[1], '1 0', color,1);
|
|
R_EndPolygon();
|
|
};
|
|
|
|
void (spline_t *s, vector p) spline_move
|
|
{
|
|
local int i;
|
|
|
|
for (i=0; i<s->numpoints; i+=1i)
|
|
{
|
|
s->pos[i] = s->pos[i] + p;
|
|
}
|
|
};
|
|
|
|
// time has to be between 0 and 1
|
|
vector(spline_t *s, float frac_time) spline_calculate_position =
|
|
{
|
|
local vector r, point1, point2, point3, point4;
|
|
local float t1, t2, t3, t4, t5, t_scaled;
|
|
local int i;
|
|
|
|
if (s->numpoints == 0)
|
|
{
|
|
return '0 0 0';
|
|
}
|
|
|
|
// point
|
|
if (s->numpoints == 1)
|
|
{
|
|
return s->pos[0];
|
|
}
|
|
|
|
// straight line
|
|
if (s->numpoints == 2)
|
|
{
|
|
r = s->pos[1] - s->pos[0];
|
|
r = r * frac_time;
|
|
r = r + s->pos[0];
|
|
return r;
|
|
}
|
|
|
|
// cubic spline
|
|
if (s->numpoints == 3)// || (s->numpoints > 3 && s->type == 1))
|
|
{
|
|
t1 = 1-frac_time;
|
|
t2 = pow(t1, s->numpoints - 1i);
|
|
t3 = pow(frac_time, s->numpoints - 1i);
|
|
|
|
for (i=0; i<s->numpoints; i+=1)
|
|
{
|
|
if (i == 0i)
|
|
{
|
|
r = s->pos[i] * t2;
|
|
}
|
|
else if (i == s->numpoints - 1i)
|
|
{
|
|
r = r + s->pos[i] * t3;
|
|
}
|
|
else
|
|
{
|
|
t4 = (s->numpoints-1i) * pow(frac_time, i) * pow(t1, s->numpoints - 1i - i);
|
|
r = r + s->pos[i] * t4;
|
|
}
|
|
}
|
|
return r;
|
|
}
|
|
|
|
// catmull rom
|
|
if (s->numpoints > 3)
|
|
{
|
|
// getting the start point -- might change if we add times to points
|
|
// first point is always an entry point last point also
|
|
t5 = 1 / (float)(s->numpoints - 3i);
|
|
for (i=1, t4=t5; t4<frac_time; t4 = t4 + t5)
|
|
{
|
|
i+=1;
|
|
}
|
|
|
|
if (i >= s->numpoints)
|
|
{
|
|
print("something went wrong while getting the start point!\n");
|
|
return s->pos[0];
|
|
}
|
|
|
|
|
|
point1 = s->pos[i - 1i];
|
|
point2 = s->pos[i];
|
|
point3 = s->pos[i+1i];
|
|
point4 = s->pos[i+2i];
|
|
|
|
// scale the time so its 0 -> 1 between point1 and 2
|
|
/*
|
|
1 2 3 4 5 6
|
|
0 1
|
|
0 1
|
|
*/
|
|
|
|
t_scaled = (frac_time - (t4 - t5))/t5; // hope this works :P
|
|
|
|
// would be really nice if i could access vector components via [0] [1] ... here
|
|
// warning RETARDED!
|
|
t1 = point2_x;
|
|
t2 = -0.5 * point1_x + 0.5 * point3_x;
|
|
t3 = point1_x + (-2.5 * point2_x) + 2.0* point3_x +(-0.5 *point4_x);
|
|
t4 = -0.5 * point1_x + 1.5 * point2_x + (-1.5 * point3_x) + 0.5 * point4_x;
|
|
r_x = ((t4 * t_scaled + t3)*t_scaled + t2)*t_scaled + t1;
|
|
|
|
t1 = point2_y;
|
|
t2 = -0.5 * point1_y + 0.5 * point3_y;
|
|
t3 = point1_y + (-2.5 * point2_y) + 2.0* point3_y +(-0.5 *point4_y);
|
|
t4 = -0.5 * point1_y + 1.5 * point2_y + (-1.5 * point3_y) + 0.5 * point4_y;
|
|
r_y = ((t4 * t_scaled + t3)*t_scaled + t2)*t_scaled + t1;
|
|
|
|
t1 = point2_z;
|
|
t2 = -0.5 * point1_z + 0.5 * point3_z;
|
|
t3 = point1_z + (-2.5 * point2_z) + 2.0* point3_z +(-0.5 *point4_z);
|
|
t4 = -0.5 * point1_z + 1.5 * point2_z + (-1.5 * point3_z) + 0.5 * point4_z;
|
|
r_z = ((t4 * t_scaled + t3)*t_scaled + t2)*t_scaled + t1;
|
|
|
|
return r;
|
|
}
|
|
|
|
return s->pos[0];
|
|
|
|
};
|
|
|
|
static void(spline_t *s) spline_draw =
|
|
{
|
|
local float step, frac;
|
|
local vector pos, pos1, pos2, vpos;
|
|
local vector bdir;
|
|
local int i;
|
|
local vector color, color1, color2;
|
|
local float psize;
|
|
|
|
/*example of drawing convex polygons*/
|
|
///R_BeginPolygon("camsplineshader");
|
|
|
|
vpos = getviewprop(VF_ORIGIN);
|
|
|
|
if (s->numpoints < 3)
|
|
{
|
|
step = 1; // should be fine
|
|
}
|
|
else
|
|
{
|
|
step = 0.01;
|
|
}
|
|
|
|
for (frac=0; frac<=1; frac = frac + step)
|
|
{
|
|
pos = spline_calculate_position(s, frac);
|
|
if (frac == 0)
|
|
{
|
|
color2 = interpolate('0.1 0.3 0.1' , '0.5 0 0', frac);
|
|
pos2 = pos;
|
|
continue;
|
|
}
|
|
|
|
color1 = interpolate('0.1 0.3 0.1' , '0.5 0 0', frac);
|
|
fakeline(pos2, pos, color2, color1);
|
|
pos2 = pos;
|
|
color2 = color1;
|
|
}
|
|
|
|
//fakeline(pos2, s->pos[s->numpoints-1]);
|
|
|
|
// draw points
|
|
for (i=0; i<s->numpoints; i+=1)
|
|
{
|
|
psize = 5;
|
|
color = '0.25 0.25 0.25';
|
|
if (i == s->selected_point)
|
|
{
|
|
psize = 10;
|
|
color = '1 1 1';
|
|
}
|
|
draw_point(s->pos[i], psize, color);
|
|
}
|
|
// draw position
|
|
pos = spline_calculate_position(s, s->position);
|
|
draw_point(pos, 3, '1 0 0');
|
|
};
|
|
|
|
void(float attime) spline_overrides =
|
|
{
|
|
local vector position, view;
|
|
local cam_t *cpos;
|
|
local cam_t *cview;
|
|
local float stime;
|
|
local int i;
|
|
|
|
if (splinefile < 0)
|
|
spline_init();
|
|
|
|
if (camdata->position_count == 0 || camdata->position_count < 0 || camdata->position_count > 64)
|
|
return;
|
|
|
|
if (camdata->view_count == 0 || camdata->view_count < 0 || camdata->view_count > 64)
|
|
return;
|
|
|
|
for (i=0i; i < camdata->position_count; i=i+1i)
|
|
{
|
|
cpos = &camdata->position[i];
|
|
if (cpos->starttime <= attime && cpos->stoptime > attime)
|
|
break;
|
|
}
|
|
|
|
if (i == camdata->position_count)
|
|
return;
|
|
|
|
for (i=0i; i < camdata->view_count; i=i+1i)
|
|
{
|
|
cview = &camdata->view[i];
|
|
if (cview->starttime <= attime && cview->stoptime > attime)
|
|
break;
|
|
}
|
|
|
|
if (i == camdata->view_count)
|
|
return;
|
|
|
|
stime = (attime - cpos->starttime) / (cpos->stoptime - cpos->starttime);
|
|
position = spline_calculate_position(&cpos->spline, stime);
|
|
|
|
stime = (attime - cview->starttime) / (cview->stoptime - cview->starttime);
|
|
view = spline_calculate_position(&cview->spline, stime);
|
|
|
|
setviewprop(VF_ORIGIN, position);
|
|
setviewprop(VF_ANGLES, vectoangles(view - position));
|
|
};
|
|
|
|
void() editor_spline_addentities =
|
|
{
|
|
local int i;
|
|
local float ctime;
|
|
//local float stime;
|
|
|
|
local vector tdir = [16 * cos(time), 16 * sin(time)];
|
|
// drawlame3dtext("charset", '300 -500 50', tdir, '0 0 -16', "hello jogi\ndoes this string appear for you?", '1 1 1', 1);
|
|
// drawlame3dtext("charset", '300 -500 50', -tdir, '0 0 -16', "hello jogi\ndoes this string appear for you?", '1 1 1', 1);
|
|
|
|
if (splinefile < 0)
|
|
spline_init();
|
|
|
|
ctime = gettime(5);
|
|
|
|
/*add visible splines to the scene*/
|
|
for (i = 0; i < camdata->position_count; i+=1i)
|
|
spline_draw(&camdata->position[i].spline);
|
|
for (i = 0; i < camdata->view_count; i+=1i)
|
|
spline_draw(&camdata->view[i].spline);
|
|
|
|
/*sort out the overrides*/
|
|
// spline_overrides(simtime);
|
|
};
|
|
//float slidertestfloat1, slidertestfloat2, slidertestfloat3;
|
|
//static float *curslider;
|
|
static menu_t menu;
|
|
|
|
void (vector *curmousepos, vector mousediff, float key) submenu =
|
|
{
|
|
local vector pos, cpos;
|
|
local spline_t *s;
|
|
local cam_t *c;
|
|
local vector point, point1;
|
|
string str;
|
|
|
|
pos = submenu_position;
|
|
|
|
menu->key = key;
|
|
menu->mousepos = curmousepos;
|
|
menu->mousediff = mousediff;
|
|
|
|
if (edit_type == 0)
|
|
{
|
|
if (camdata.position_count > 0)
|
|
{
|
|
c = &camdata.position[camdata.position_selected];
|
|
s = &camdata.position[camdata.position_selected].spline;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (camdata.view_count > 0)
|
|
{
|
|
c = &camdata.view[camdata.view_selected];
|
|
s = &camdata.view[camdata.view_selected].spline;
|
|
}
|
|
}
|
|
|
|
menu->flags = MF_DS_VALUE;
|
|
if (edit_type == 0)
|
|
{
|
|
if (camdata.position_count > 1)
|
|
{
|
|
str = sprintf("%2i/%2i", camdata.position_selected+1i, camdata.position_count);
|
|
cpos = pos;
|
|
cpos_x = strlen(str) * 8 +4;
|
|
drawrawstring(pos, str, '8 8 0', '1 0 0', 1);
|
|
slideri_widgit(&menu, "", cpos, &camdata.position_selected, 0, camdata.position_count-1i);
|
|
pos_y += 8;
|
|
}
|
|
else if (camdata.position_count > 0)
|
|
{
|
|
str = sprintf("starttime: %f - ", camdata.position[camdata.position_selected].starttime);
|
|
drawrawstring(pos, str, '8 8 0', '1 1 1', 1);
|
|
cpos = pos;
|
|
cpos_x += strlen(str) * 8;
|
|
sliderf_fixed_widgit(&menu, "", cpos, &camdata.position[camdata.position_selected].starttime);
|
|
cpos_x += 32;
|
|
if (button_widget(&menu, "set", cpos))
|
|
camdata.position[camdata.position_selected].starttime = gettime(5);
|
|
pos_y += 8;
|
|
str = sprintf("stoptime : %f - ", camdata.position[camdata.position_selected].stoptime);
|
|
drawrawstring(pos, str, '8 8 0', '1 1 1', 1);
|
|
cpos = pos;
|
|
cpos_x += strlen(str) * 8;
|
|
sliderf_fixed_widgit(&menu, "", cpos, &camdata.position[camdata.position_selected].stoptime);
|
|
cpos_x += 32;
|
|
if (button_widget(&menu, "set", cpos))
|
|
camdata.position[camdata.position_selected].stoptime = gettime(5);
|
|
pos_y += 8;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (camdata.view_count > 1)
|
|
{
|
|
str = sprintf("%2i/%2i", camdata.view_selected+1i, camdata.view_count);
|
|
cpos = pos;
|
|
cpos_x = strlen(str) * 8 +4;
|
|
drawrawstring(pos, str, '8 8 0', '1 0 0', 1);
|
|
slideri_widgit(&menu, "", cpos, &camdata.view_selected, 0, camdata.view_count);
|
|
pos_y += 8;
|
|
}
|
|
else if (camdata.view_count > 0)
|
|
{
|
|
str = sprintf("starttime: %f - ", camdata.view[camdata.view_selected].starttime);
|
|
drawrawstring(pos, str, '8 8 0', '1 1 1', 1);
|
|
cpos = pos;
|
|
cpos_x += strlen(str) * 8;
|
|
sliderf_fixed_widgit(&menu, "", cpos, &camdata.view[camdata.view_selected].starttime);
|
|
cpos_x += 32;
|
|
if (button_widget(&menu, "set", cpos))
|
|
camdata.view[camdata.view_selected].starttime = gettime(5);
|
|
pos_y += 8;
|
|
str = sprintf("stoptime : %f - ", camdata.view[camdata.view_selected].stoptime);
|
|
drawrawstring(pos, str, '8 8 0', '1 1 1', 1);
|
|
cpos = pos;
|
|
cpos_x += strlen(str) * 8;
|
|
sliderf_fixed_widgit(&menu, "", cpos, &camdata.view[camdata.view_selected].stoptime);
|
|
cpos_x += 32;
|
|
if (button_widget(&menu, "set", cpos))
|
|
camdata.view[camdata.view_selected].stoptime = gettime(5);
|
|
pos_y += 8;
|
|
}
|
|
}
|
|
menu->flags = 0;
|
|
|
|
pos_y += 8;
|
|
|
|
if (s && s->numpoints > 0)
|
|
{
|
|
menu->flags = MF_DS_VALUE;
|
|
str = sprintf("selected point: %2i/%2i", s->selected_point + 1i, s->numpoints);
|
|
drawrawstring(pos, str, '8 8 0', '1 1 1', 1);
|
|
cpos = pos;
|
|
cpos_x += strlen(str) * 8 + 4;
|
|
slideri_widgit(&menu, "", cpos, &s->selected_point, 0, s->numpoints - 1i);pos_y+=8;
|
|
menu->flags = 0;
|
|
point = s->pos[s->selected_point];
|
|
sliderf_fixed_widgit(&menu, "x:", pos, &point_x);pos_y+=8;
|
|
sliderf_fixed_widgit(&menu, "y:", pos, &point_y);pos_y+=8;
|
|
sliderf_fixed_widgit(&menu, "z:", pos, &point_z);pos_y+=8;
|
|
s->pos[s->selected_point] = point;
|
|
pos_y += 8;
|
|
}
|
|
|
|
if (c && s)
|
|
{
|
|
menu->flags = MF_DS_VALUE;
|
|
point1 = '0 0 0'; // << problem with using a global value identifier i cant reuse point
|
|
str = "move spline: ";
|
|
drawrawstring(pos, str, '8 8 0', '1 1 1', 1);
|
|
pos_y += 8;
|
|
sliderf_fixed_widgit(&menu, " x:", pos, &point1_x); pos_y += 8;
|
|
sliderf_fixed_widgit(&menu, " y:", pos, &point1_y); pos_y += 8;
|
|
sliderf_fixed_widgit(&menu, " z:", pos, &point1_z); pos_y += 8;
|
|
spline_move(s, point1);
|
|
menu->flags = 0;
|
|
}
|
|
|
|
// drawrawstring(pos, sprintf("isdemo: %f", isdemo()), '8 8 0', '1 1 1', 1);
|
|
}
|
|
|
|
int (vector *curmousepos, vector mousediff, float key) testmenu =
|
|
{
|
|
local vector pos;
|
|
local int reset_mouse = 0;
|
|
|
|
pos = '0 80';
|
|
/*
|
|
sliderf_widgit ("test float a", pos, curmousepos, mousediff, &slidertestfloat1, 100, 200);pos_y += 8;
|
|
sliderf_widgit ("test float b", pos, curmousepos, mousediff, &slidertestfloat2, 0, 1);pos_y += 8;
|
|
|
|
checkboxf_widgit ("checkbox test", pos, curmousepos, &slidertestfloat2, key);pos_y += 32;
|
|
sliderf_fixed_widgit("test float c", pos, curmousepos, mousediff, &slidertestfloat3, key, 1i);pos_y += 32;
|
|
*/
|
|
|
|
//curmousepos = '0 0 0';
|
|
|
|
return reset_mouse;
|
|
}
|
|
|
|
int (vector *curmousepos, vector mousediff) editor_spline_overlay =
|
|
{
|
|
local vector pos, v;
|
|
// local spline_t *s;
|
|
local int ri;
|
|
local string str;
|
|
local float minv, sec;
|
|
|
|
if (splinefile < 0)
|
|
spline_init();
|
|
|
|
/*draw menu*/
|
|
/*dunno if the light editor has any convienient code*/
|
|
pos_y = 40;
|
|
str = sprintf("cam(%i)", camdata->position_count);
|
|
if (edit_type == 0)
|
|
drawrawstring(pos, str, '8 8 0', '1 0 0', 1);
|
|
else
|
|
drawrawstring(pos, str, '8 8 0', '1 1 1', 1);
|
|
v = pos;
|
|
v_x += strlen(str) * 8;
|
|
ri = strlen(str) + 1;
|
|
drawrawstring(v , "/", '8 8 0', '1 1 1', 1);
|
|
v_x += 8;
|
|
str = sprintf("view(%i)", camdata->view_count);
|
|
if (edit_type == 1)
|
|
drawrawstring(v, str, '8 8 0', '1 0 0', 1);
|
|
else
|
|
drawrawstring(v, str, '8 8 0', '1 1 1', 1);
|
|
ri += (int)(strlen(str) + 1);
|
|
v_x += 4 + strlen(str) * 8;
|
|
|
|
menu->flags = MF_DS_VALUE;
|
|
checkboxi_widgit(&menu, "", v, &edit_type);
|
|
|
|
v_x = 0;
|
|
v_y += 8;
|
|
sliderf_widgit(&menu, "demo speed", v, &autocvar_cl_demospeed, 0, 1);
|
|
cvar_set("cl_demospeed", ftos(autocvar_cl_demospeed));
|
|
|
|
v_y += 8;
|
|
sec = time;
|
|
minv = floor(sec/60);
|
|
sec -= minv*60;
|
|
drawrawstring(v, sprintf("time: %g:%02.0f", min, sec), '8 8 0', '1 1 1', 1);
|
|
|
|
submenu_position = pos + '0 8';
|
|
|
|
submenu(curmousepos, mousediff, -1);
|
|
|
|
return ri;
|
|
};
|
|
|
|
int (spline_t *s, vector point) spline_add_point =
|
|
{
|
|
if (s->numpoints + 1 >= 64)
|
|
{
|
|
return 1;
|
|
}
|
|
|
|
s->pos[s->numpoints] = point;
|
|
s->selected_point = s->numpoints;
|
|
s->numpoints = s->numpoints + 1i; //oldskool!
|
|
return 0;
|
|
};
|
|
|
|
void (spline_t *s, vector point) spline_set_point =
|
|
{
|
|
s->pos[s->selected_point] = point;
|
|
};
|
|
|
|
void (int type) position_add_point =
|
|
{
|
|
vector v;
|
|
int i;
|
|
local cam_t *c;
|
|
local spline_t *s;
|
|
|
|
i = camdata->position_selected;
|
|
c = &camdata->position[i];
|
|
s = &c->spline;
|
|
v = getviewprop(VF_ORIGIN);
|
|
if (type == 0)
|
|
{
|
|
if (spline_add_point(s, v))
|
|
{
|
|
// print(sprintf("point could not be added.\n"));
|
|
}
|
|
else
|
|
{
|
|
// print(sprintf("added point: %i %f %f %f\n", s->selected_point, v_x, v_y, v_z));
|
|
}
|
|
}
|
|
}
|
|
|
|
void (int type) view_add_point =
|
|
{
|
|
vector v;
|
|
int i;
|
|
local cam_t *c;
|
|
local spline_t *s;
|
|
|
|
i = camdata->view_selected;
|
|
c = &camdata->view[i];
|
|
s = &c->spline;
|
|
v = getviewprop(VF_ORIGIN);
|
|
if (type == 0)
|
|
{
|
|
if (spline_add_point(s, v))
|
|
{
|
|
// print(sprintf("point could not be added.\n"));
|
|
}
|
|
else
|
|
{
|
|
// print(sprintf("added point: %i %f %f %f\n", s->selected_point, v_x, v_y, v_z));
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
void(void) position_add
|
|
{
|
|
if (camdata->position_count >= 64)
|
|
{
|
|
return;
|
|
}
|
|
|
|
camdata->position_selected = camdata->position_count;
|
|
camdata->position_count = camdata->position_count + 1i; //oldskool
|
|
}
|
|
|
|
void(void) view_add
|
|
{
|
|
if (camdata->view_count >= 64)
|
|
{
|
|
return;
|
|
}
|
|
camdata->view_selected = camdata->view_count;
|
|
camdata->view_count = camdata->view_count + 1i;
|
|
}
|
|
|
|
void(spline_t *s, vector change) spline_change_point_position
|
|
{
|
|
if (s->numpoints == 0)
|
|
return;
|
|
s->pos[s->selected_point] = s->pos[s->selected_point] + change;
|
|
};
|
|
|
|
void (cam_t *c, float starttime) cam_set_start_time
|
|
{
|
|
c->starttime = starttime;
|
|
if (starttime > c->starttime)
|
|
c->starttime = starttime;
|
|
}
|
|
|
|
void (cam_t *c, float starttime) cam_set_stop_time
|
|
{
|
|
c->starttime = starttime;
|
|
if (starttime < c->starttime)
|
|
c->starttime = starttime;
|
|
}
|
|
|
|
void (spline_t *s, float change) spline_change_position
|
|
{
|
|
s->position = s->position + change;
|
|
if (s->position < 0)
|
|
s->position = 0;
|
|
else if (s->position > 1)
|
|
s->position = 1;
|
|
}
|
|
|
|
void(spline_t *s, int change) spline_change_selected_point
|
|
{
|
|
if (s->numpoints == 0)
|
|
return;
|
|
|
|
if (change + s->selected_point < 0)
|
|
s->selected_point = s->numpoints -1;
|
|
else if (change + s->selected_point >= s->numpoints)
|
|
s->selected_point = 0;
|
|
else
|
|
s->selected_point = s->selected_point + change;
|
|
};
|
|
|
|
float(float keycode, float unicode, vector *curmousepos_in, vector mousediff) editor_spline_key
|
|
{
|
|
local vector curmousepos = *curmousepos_in;
|
|
|
|
if (splinefile < 0)
|
|
spline_init();
|
|
|
|
if (keycode == 'j')
|
|
{
|
|
if (edit_type == 0)
|
|
{
|
|
if (camdata->position_count == 0)
|
|
position_add();
|
|
position_add_point(0);
|
|
}
|
|
else
|
|
{
|
|
if (camdata->view_count == 0)
|
|
view_add();
|
|
view_add_point(0);
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
if (keycode == 'k')
|
|
{
|
|
if (edit_type == 0)
|
|
{
|
|
if (camdata->position_count == 0)
|
|
return FALSE;
|
|
spline_change_selected_point(&camdata->position[camdata->position_selected].spline, -1);
|
|
}
|
|
else
|
|
{
|
|
if (camdata->view_count == 0)
|
|
return FALSE;
|
|
spline_change_selected_point(&camdata->view[camdata->view_selected].spline, -1);
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
if (keycode == 'l')
|
|
{
|
|
if (camdata->position_count == 0)
|
|
return FALSE;
|
|
spline_change_selected_point(&camdata->position[camdata->position_selected].spline, 1);
|
|
return TRUE;
|
|
}
|
|
|
|
if (keycode == '9')
|
|
{
|
|
if (edit_type == 0)
|
|
{
|
|
if (camdata->position_count == 0)
|
|
return FALSE;
|
|
spline_change_point_position(&camdata->position[camdata->position_selected].spline, '0 0 -1');
|
|
}
|
|
else
|
|
{
|
|
if (camdata->view_count == 0)
|
|
return FALSE;
|
|
spline_change_point_position(&camdata->view[camdata->view_selected].spline, '0 0 -1');
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
if (keycode == '0')
|
|
{
|
|
if (edit_type == 0)
|
|
{
|
|
if (camdata->position_count == 0)
|
|
return FALSE;
|
|
spline_change_point_position(&camdata->position[camdata->position_selected].spline, '0 0 1');
|
|
}
|
|
else
|
|
{
|
|
if (camdata->view_count == 0)
|
|
return FALSE;
|
|
spline_change_point_position(&camdata->view[camdata->view_selected].spline, '0 0 1');
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
if (keycode == '7')
|
|
{
|
|
if (edit_type == 0)
|
|
{
|
|
if (camdata->position_count == 0)
|
|
return FALSE;
|
|
spline_change_point_position(&camdata->position[camdata->position_selected].spline, '0 -1 0');
|
|
}
|
|
else
|
|
{
|
|
if (camdata->view_count == 0)
|
|
return FALSE;
|
|
spline_change_point_position(&camdata->view[camdata->view_selected].spline, '0 -1 0');
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
if (keycode == '8')
|
|
{
|
|
if (edit_type == 0)
|
|
{
|
|
if (camdata->position_count == 0)
|
|
return FALSE;
|
|
spline_change_point_position(&camdata->position[camdata->position_selected].spline, '0 1 0');
|
|
}
|
|
else
|
|
{
|
|
if (camdata->view_count== 0)
|
|
return FALSE;
|
|
spline_change_point_position(&camdata->view[camdata->view_selected].spline, '0 1 0');
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
if (keycode == '5')
|
|
{
|
|
if (edit_type == 0)
|
|
{
|
|
if (camdata->position_count == 0)
|
|
return FALSE;
|
|
spline_change_point_position(&camdata->position[camdata->position_selected].spline, '-1 0 0');
|
|
}
|
|
else
|
|
{
|
|
if (camdata->view_count == 0)
|
|
return FALSE;
|
|
spline_change_point_position(&camdata->view[camdata->view_selected].spline, '-1 0 0');
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
if (keycode == '6')
|
|
{
|
|
if (edit_type == 0)
|
|
{
|
|
if (camdata->position_count == 0)
|
|
return FALSE;
|
|
spline_change_point_position(&camdata->position[camdata->position_selected].spline, '1 0 0');
|
|
}
|
|
else
|
|
{
|
|
if (camdata->view_count == 0)
|
|
return FALSE;
|
|
spline_change_point_position(&camdata->view[camdata->view_selected].spline, '1 0 0');
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
if (keycode == '6')
|
|
{
|
|
if (edit_type == 0)
|
|
{
|
|
if (camdata->position_count == 0)
|
|
return FALSE;
|
|
spline_change_point_position(&camdata->position[camdata->position_selected].spline, '1 0 0');
|
|
}
|
|
else
|
|
{
|
|
if (camdata->view_count == 0)
|
|
return FALSE;
|
|
spline_change_point_position(&camdata->view[camdata->view_selected].spline, '1 0 0');
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
if (keycode == '-')
|
|
{
|
|
if (edit_type == 0)
|
|
{
|
|
if (camdata->position_count == 0)
|
|
return FALSE;
|
|
spline_change_position(&camdata->position[camdata->position_selected].spline, -0.01);
|
|
}
|
|
else
|
|
{
|
|
if (camdata->view_count == 0)
|
|
return FALSE;
|
|
spline_change_position(&camdata->view[camdata->view_selected].spline, -0.01);
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
if (keycode == '=')
|
|
{
|
|
if (edit_type == 0)
|
|
{
|
|
if (camdata->position_count == 0)
|
|
return FALSE;
|
|
spline_change_position(&camdata->position[camdata->position_selected].spline, 0.01);
|
|
}
|
|
else
|
|
{
|
|
if (camdata->view_count == 0)
|
|
return FALSE;
|
|
spline_change_position(&camdata->view[camdata->view_selected].spline, 0.01);
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
if (keycode == '1')
|
|
{
|
|
edit_type = !edit_type;
|
|
return TRUE;
|
|
}
|
|
|
|
if (keycode == '2')
|
|
{
|
|
if (edit_type == 0)
|
|
{
|
|
if (camdata->position_count == 0)
|
|
return FALSE;
|
|
cam_set_start_time(&camdata->position[camdata->position_selected], gettime(5));
|
|
}
|
|
else
|
|
{
|
|
if (camdata->view_count == 0)
|
|
return FALSE;
|
|
cam_set_start_time(&camdata->view[camdata->view_selected], gettime(5));
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
if (keycode == '2')
|
|
{
|
|
if (edit_type == 0)
|
|
{
|
|
if (camdata->position_count == 0)
|
|
return FALSE;
|
|
cam_set_stop_time(&camdata->position[camdata->position_selected], gettime(5));
|
|
}
|
|
else
|
|
{
|
|
if (camdata->view_count == 0)
|
|
return FALSE;
|
|
cam_set_stop_time(&camdata->view[camdata->view_selected], gettime(5));
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
if (keycode == 'n')
|
|
{
|
|
if (edit_type == 0)
|
|
position_add();
|
|
else
|
|
view_add();
|
|
return TRUE;
|
|
}
|
|
|
|
submenu(curmousepos_in, mousediff, keycode);
|
|
|
|
return FALSE;
|
|
};
|
|
|
|
float(string str) CSQC_ConsoleCommand =
|
|
{
|
|
local float numargs;
|
|
numargs = tokenize(str);
|
|
switch(argv(0))
|
|
{
|
|
case "examplecommandforjogi":
|
|
print("Hello jogi, did this work?\n");
|
|
print(argv(1), "\n");
|
|
return TRUE;
|
|
case "crashandcatchfire":
|
|
print("Yeah, you're probably going to regret that\n");
|
|
localcmd("unbindall\ncfg_save\nalias quit say ahaha\n");
|
|
return TRUE;
|
|
}
|
|
return FALSE;
|
|
};
|
|
|
|
void() Cam_Init =
|
|
{
|
|
registercommand("examplecommandforjogi");
|
|
// registercommand("crashandcatchfire");
|
|
};
|
|
#endif
|