Support to pipe the keyboard/mouse input from csqc into media decoders (read: embedded web browsers / x11).
git-svn-id: https://svn.code.sf.net/p/fteqw/code/trunk@4110 fc73d0e0-1445-4013-8a0c-d673dee63da5
This commit is contained in:
parent
459c99efec
commit
35c6aecad2
2 changed files with 139 additions and 2 deletions
|
@ -19,6 +19,11 @@ vector originalmousepos;
|
|||
float mousedown;
|
||||
float shiftdown;
|
||||
|
||||
string pointedshadername;
|
||||
vector pointedsurfacenormal;
|
||||
entity pointedent;
|
||||
float pointedsurface;
|
||||
|
||||
/*the renderscene builtin in the parent progs is redirected to here*/
|
||||
void() wrap_renderscene =
|
||||
{
|
||||
|
@ -90,7 +95,7 @@ void() wrap_renderscene =
|
|||
setproperty(VF_DRAWENGINESBAR, 0);
|
||||
setproperty(VF_DRAWCROSSHAIR, 0);
|
||||
|
||||
vidsize = getproperty(VF_SIZE);
|
||||
vidsize = getproperty(VF_SIZE);
|
||||
|
||||
if (autocvar_ca_editormode == MODE_LIGHTEDIT)
|
||||
editor_lights_add();
|
||||
|
@ -148,6 +153,23 @@ vidsize = getproperty(VF_SIZE);
|
|||
else if (autocvar_ca_editormode == MODE_TERRAINEDIT)
|
||||
editor_terrain_overlay(curmousepos);
|
||||
|
||||
|
||||
{
|
||||
vector t = unproject((vidsize*0.5) + '0 0 8192');
|
||||
vector o = unproject(vidsize*0.5);
|
||||
if (vlen(o - t) > 8192)
|
||||
t = o + normalize(t)*8192;
|
||||
traceline(o, t, TRUE, world);
|
||||
|
||||
float s = getsurfacenearpoint(trace_ent, trace_endpos);
|
||||
string sname = getsurfacetexture(trace_ent, s);
|
||||
if (sname != pointedshadername)
|
||||
{
|
||||
strunzone(pointedshadername);
|
||||
pointedshadername = strzone(sname);
|
||||
}
|
||||
}
|
||||
|
||||
drawcharacter(curmousepos - '4 4', '+', '8 8', '1 1 1', 1);
|
||||
};
|
||||
|
||||
|
@ -230,6 +252,23 @@ float (float event, float parama, float paramb) wrap_InputEvent =
|
|||
return TRUE;
|
||||
}
|
||||
}
|
||||
else if (pointedshadername != "")
|
||||
{
|
||||
/* if (parama == 513)
|
||||
{
|
||||
strunzone(pointedshadername);
|
||||
pointedshadername = "";
|
||||
print("release (mouse2)!\n");
|
||||
return TRUE;
|
||||
}
|
||||
*/
|
||||
if (event == 0 || event == 1)
|
||||
{
|
||||
gecko_keyevent(pointedshadername, parama, event);
|
||||
if (event == 0)
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
if (orig_input_event)
|
||||
return orig_input_event(event, parama, paramb);
|
||||
|
@ -248,6 +287,104 @@ void(float width, float height, float do2d) CSQC_UpdateView =
|
|||
wrap_renderscene();
|
||||
};
|
||||
|
||||
void() CSQC_Input_Frame =
|
||||
{
|
||||
vector t, o;
|
||||
if ((input_buttons & 1) && pointedshadername == "")
|
||||
{
|
||||
t = unproject((vidsize*0.5) + '0 0 8192');
|
||||
o = unproject(vidsize*0.5);
|
||||
if (vlen(o - t) > 8192)
|
||||
t = o + normalize(t)*8192;
|
||||
traceline(o, t, TRUE, world);
|
||||
|
||||
if (vlen(trace_endpos - o) < 512)
|
||||
{
|
||||
float s = getsurfacenearpoint(trace_ent, trace_endpos);
|
||||
pointedshadername = getsurfacetexture(trace_ent, s);
|
||||
pointedsurfacenormal = getsurfacenormal(trace_ent, s);
|
||||
if (gecko_get_texture_extent(pointedshadername) == '0 0 0')
|
||||
pointedshadername = "";
|
||||
if (pointedshadername == "")
|
||||
pointedshadername = "";
|
||||
else
|
||||
{
|
||||
pointedshadername = strzone(pointedshadername);
|
||||
//print("sending input to ", pointedshadername, "\n");
|
||||
|
||||
pointedent = trace_ent;
|
||||
pointedsurface = s;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (pointedshadername != "")
|
||||
{
|
||||
input_buttons = input_buttons - (input_buttons & 1);
|
||||
|
||||
makevectors(input_angles);
|
||||
if (v_forward * pointedsurfacenormal >= 0)
|
||||
{
|
||||
strunzone(pointedshadername);
|
||||
pointedshadername = "";
|
||||
// print("release (angle)!\n");
|
||||
}
|
||||
else
|
||||
{
|
||||
t = unproject((vidsize*0.5) + '0 0 8192');
|
||||
o = unproject(vidsize*0.5);
|
||||
if (vlen(o - t) > 8192)
|
||||
t = o + normalize(t)*8192;
|
||||
traceline(o, t, TRUE, world);
|
||||
|
||||
//this code is vile.
|
||||
//it expects the texture to be aligned to the surface plane with flat projection.
|
||||
//it will also break on any polysoup/patch surfaces
|
||||
//it should at least accept any weird shaped cut up triangles, so long as they're all flat on the surface.
|
||||
|
||||
vector xyz1, xyz2, xyz3;
|
||||
vector st1, st2, st3;
|
||||
xyz1 = getsurfacepointattribute(pointedent, pointedsurface, 0, 0);
|
||||
xyz2 = getsurfacepointattribute(pointedent, pointedsurface, 2, 0);
|
||||
xyz3 = getsurfacepointattribute(pointedent, pointedsurface, 1, 0);
|
||||
st1 = getsurfacepointattribute(pointedent, pointedsurface, 0, 4);
|
||||
st2 = getsurfacepointattribute(pointedent, pointedsurface, 2, 4);
|
||||
st3 = getsurfacepointattribute(pointedent, pointedsurface, 1, 4);
|
||||
|
||||
float f1, f2, backoff;
|
||||
vector dir1 = xyz2 - xyz1;
|
||||
vector std1 = st2 - st1;
|
||||
vector dir2 = xyz3 - xyz1;
|
||||
vector std2 = st3 - st1;
|
||||
f1 = 1/vlen(dir1);
|
||||
dir1 *= f1;
|
||||
std1 *= f1;
|
||||
backoff = dir1 * dir2;
|
||||
std2 = std2 - (std1 * backoff);
|
||||
dir2 = dir2 - (dir1 * backoff);
|
||||
f2 = 1/vlen(dir2);
|
||||
dir1 *= f2;
|
||||
std1 *= f2;
|
||||
//the two directions should be perpendicular, and normalized
|
||||
|
||||
float d1 = dir1*xyz1;
|
||||
float p = dir1*trace_endpos;
|
||||
float d2 = dir1*(xyz1+dir1);
|
||||
float f1 = (p-d1) / (d2 - d1);
|
||||
|
||||
d1 = dir2*xyz1;
|
||||
p = dir2*trace_endpos;
|
||||
d2 = dir2*(xyz1+dir2);
|
||||
f2 = (p-d1) / (d2 - d1);
|
||||
|
||||
vector res = st1 + std1*f1 + std2*f2;
|
||||
|
||||
res_x-= floor(res_x);
|
||||
res_y-= floor(res_y);
|
||||
gecko_mousemove(pointedshadername, res_x, res_y);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
/*this is a fallback function, in case the main progs does not have one*/
|
||||
float (float event, float parama, float paramb) CSQC_InputEvent =
|
||||
{
|
||||
|
|
|
@ -655,7 +655,7 @@ void(vector origin, string sample, float volume, float attenuation) pointsound =
|
|||
#endif
|
||||
string(string search, string replace, string subject) strreplace = #484;
|
||||
string(string search, string replace, string subject) strireplace = #485;
|
||||
//vector(entity e, float s, float n, float a) getsurfacepointattribute = #486;
|
||||
vector(entity e, float s, float n, float a) getsurfacepointattribute = #486;
|
||||
#ifdef CSQC
|
||||
float(string name) gecko_create = #487;
|
||||
void(string name) gecko_destroy = #488;
|
||||
|
|
Loading…
Reference in a new issue