fteqw/quakec/csqctest/src/cs/editor_lights.qc

237 lines
5.6 KiB
Plaintext

/*NOTE: csaddon is more up to date, with more stuff! use that instead!*/
/*FTE has some special light editing builtins, I don't ever expect them to be standard or anything, but they're handy for this*/
/*If you want to edit lights for hexen2, edit this cvar, use models/s_light.spr or something.*/
DEFCVAR_STRING(cg_editor_lightmodel, "progs/s_light.spr")
static float selectedlight;
static float editfield;
static string editvalue;
static entity tempent;
void() editor_lights_add =
{
__using dynamiclight_get;
float l;
if (!tempent)
tempent = spawn();
l = dynamiclight_get(-1, -1);
setmodel(tempent, CVARS(cg_editor_lightmodel));
while(l > 0)
{
l = l-1;
if (l == selectedlight)
{
if (time*5 & 1)
continue;
tempent.effects |= 8192;
}
else
tempent.effects (-) 8192;
if (!(float)dynamiclight_get(l, LFIELD_RADIUS))
continue;
setorigin(tempent, (vector)dynamiclight_get(l, LFIELD_ORIGIN));
addentity(tempent);
}
};
static string fldname[8] = {
"bad",
"num",
"org",
"rgb",
"rad",
"flg",
"sty",
"???"
};
static string(float fld, float foredit) readfield =
{
__using dynamiclight_get;
switch(fld)
{
case 1:
if (foredit)
return ftos(selectedlight);
return strcat(ftos(selectedlight), " / ", ftos(dynamiclight_get(-1, -1)));
case 2:
return vtos((vector)dynamiclight_get(selectedlight, LFIELD_ORIGIN));
case 3:
return vtos((vector)dynamiclight_get(selectedlight, LFIELD_COLOUR));
case 4:
return ftos(dynamiclight_get(selectedlight, LFIELD_RADIUS));
case 5:
float fl = dynamiclight_get(selectedlight, LFIELD_FLAGS);
if (foredit)
return ftos(fl);
return strcat( ((fl & 1)?" alwaysvisible":""),
((fl & 2)?" realtime":""),
((fl & 65536)?" no-shadows":"")
);
case 6:
return ftos(dynamiclight_get(selectedlight, LFIELD_STYLE));
default:
return "";
}
};
static void(float fld, string newval) writefield =
{
switch(fld)
{
case 1:
selectedlight = stof(newval);
return;
case 2:
dynamiclight_set(selectedlight, LFIELD_ORIGIN, stov(newval));
return;
case 3:
dynamiclight_set(selectedlight, LFIELD_COLOUR, stov(newval));
return;
case 4:
dynamiclight_set(selectedlight, LFIELD_RADIUS, stof(newval));
return;
case 5:
dynamiclight_set(selectedlight, LFIELD_FLAGS, stof(newval));
return;
case 6:
dynamiclight_set(selectedlight, LFIELD_STYLE, stof(newval));
return;
default:
return;
}
};
void() editor_lights_overlay =
{
float i;
string s;
//void(vector position, string text, vector scale, vector rgb, float alpha, ...) drawrawstring
drawrawstring('0 0 0', "LIGHTS EDITOR", '8 8 0', '1 1 1', 1);
for (i = 1; i < 8; i++)
{
if (editfield == i)
s = editvalue;
else
s = readfield(i, 0);
s = strcat(ftos(i), " ", fldname[i], ": ", s);
drawrawstring('0 32 0' + '0 8 0' * i, s, '8 8 0', ((editfield == i)?'1 0 0':'1 1 1'), 1);
}
};
static void(vector fwd, vector vorg) selectbestlight =
{
float l, b=selectedlight, d, bd = 0;
vector ldir;
l = (float)dynamiclight_get(-1, -1);
while(l > 0)
{
l--;
ldir = (vector)dynamiclight_get(l, LFIELD_ORIGIN);
ldir = normalize(ldir - vorg);
d = fwd*ldir;
if (d > bd)
{
bd = d;
b = l;
}
}
selectedlight = b;
};
float(float keyc, float unic) editor_lights_key =
{
vector v, o;
string ns;
if (editfield)
{
ns = strcat(editvalue);
if (keyc == 10 || keyc == 13)
{
writefield(editfield, ns);
editfield = 0;
}
else if (keyc == 127)
{
if (ns != "")
ns = substring(ns, 0, -2);
}
else if (keyc == 8)
{
ns = "";
}
else
ns = strcat(ns, chr2str(unic));
ns = strzone(ns);
strunzone(editvalue);
editvalue = ns;
writefield(editfield, ns);
}
else if (keyc >= '0' && keyc <= '9')
{
editfield = keyc - '0';
editvalue = strzone(readfield(editfield, 1));
}
else if (keyc == '=')
selectedlight++;
else if (keyc == '-')
selectedlight--;
else if (keyc == 'n')
localcmd("noclip\n");
else if (keyc == 's')
{
v = (vector)getviewprop(15);
o = (vector)getviewprop(11);
makevectors(v);
selectbestlight(v_forward, o);
}
else if (keyc == 'm')
{
v = (vector)getviewprop(15);
o = (vector)getviewprop(11);
makevectors(v);
traceline(o, o + v_forward*8192, true, world);
dynamiclight_set(selectedlight, LFIELD_ORIGIN, trace_endpos + trace_plane_normal*4);
}
else if (keyc == 'i')
{
for (selectedlight = 32; ; selectedlight++)
{
if (!(float)dynamiclight_get(selectedlight, LFIELD_RADIUS))
{
dynamiclight_set(selectedlight, LFIELD_RADIUS, 300);
v = (vector)getviewprop(15);
o = (vector)getviewprop(11);
makevectors(v);
traceline(o, o + v_forward*8192, true, world);
dynamiclight_set(selectedlight, LFIELD_ORIGIN, trace_endpos + trace_plane_normal*4);
break;
}
}
}
else if (keyc == '[')
{
v = (vector)getviewprop(15);
o = (vector)getviewprop(11);
makevectors(v);
traceline(o, o + v_forward*8192, true, world);
dynamiclight_set(selectedlight, LFIELD_ORIGIN, (vector)dynamiclight_get(selectedlight, LFIELD_ORIGIN) - trace_plane_normal);
}
else if (keyc == ']')
{
v = (vector)getviewprop(15);
o = (vector)getviewprop(11);
makevectors(v);
traceline(o, o + v_forward*8192, true, world);
dynamiclight_set(selectedlight, LFIELD_ORIGIN, (vector)dynamiclight_get(selectedlight, LFIELD_ORIGIN) + trace_plane_normal);
}
else if (keyc == 127)
dynamiclight_set(selectedlight, LFIELD_RADIUS, 0);
else
return false;
return true;
};