1 vector fixedvectoangles(vector v)
9 vector Portal_Transform_Apply(vector transform, vector v)
11 makevectors(transform);
12 return v_forward * v_x
17 vector Portal_Transform_Invert(vector transform)
19 makevectors(transform);
20 // we want angles that turn v_forward into '1 0 0', v_right into '0 1 0' and v_up into '0 0 1'
21 // but these are orthogonal unit vectors!
22 // so to invert, we can simply vectoangles the TRANSPOSED matrix
23 // TODO is this always -transform?
24 return fixedvectoangles(
25 '1 0 0' * v_forward_x + '0 1 0' * v_right_x + '0 0 1' * v_up_x,
26 '1 0 0' * v_forward_y + '0 1 0' * v_right_y + '0 0 1' * v_up_y
30 vector Portal_Transform_Multiply(vector t1, vector t2)
33 makevectors(t2); vx = v_forward; vy = v_right;
34 vx = Portal_Transform_Apply(t1, vx);
35 vy = Portal_Transform_Apply(t1, vy);
36 return fixedvectoangles(vx, vy);
39 vector Portal_Transform_Divide(vector to_transform, vector from_transform)
41 return Portal_Transform_Multiply(to_transform, Portal_Transform_Invert(from_transform));
44 void Portal_TeleportPlayer(entity teleporter, entity player)
47 to = teleporter.velocity;
48 transform = teleporter.mangle;
49 TeleportPlayer(teleporter, player, to, Portal_Transform_Multiply(transform, player.angles), Portal_Transform_Apply(transform, player.velocity));
52 float Portal_Fix(entity teleporter)
54 teleporter.mins = PL_MIN - '2 2 2';
55 teleporter.maxs = PL_MAX + '2 2 2';
56 return move_out_of_solid(teleporter);
59 void Portal_Connect(entity teleporter, entity destination)
61 teleporter.mangle = Portal_Transform_Divide(-(destination.angles), teleporter.angles);
62 teleporter.touch = Portal_Touch;
64 destination.touch = SUB_Null;
68 entity Portal_Spawn(entity own, vector org, vector ang)
72 portal.classname = "portal";
76 setmodel(portal, ...);