]> icculus.org git repositories - divverent/nexuiz.git/blob - data/qcsrc/warpzonelib/client.qc
server culling camera support
[divverent/nexuiz.git] / data / qcsrc / warpzonelib / client.qc
1 .vector warpzone_transform;
2 void WarpZone_Read(float isnew)
3 {
4         if not(self.enemy)
5         {
6                 self.enemy = spawn();
7                 self.enemy.classname = "warpzone_from";
8         }
9         self.classname = "warpzone_to";
10         self.origin_x = ReadCoord();
11         self.origin_y = ReadCoord();
12         self.origin_z = ReadCoord();
13         self.modelindex = ReadShort();
14         self.mins_x = ReadCoord();
15         self.mins_y = ReadCoord();
16         self.mins_z = ReadCoord();
17         self.maxs_x = ReadCoord();
18         self.maxs_y = ReadCoord();
19         self.maxs_z = ReadCoord();
20         self.enemy.oldorigin_x = ReadCoord();
21         self.enemy.oldorigin_y = ReadCoord();
22         self.enemy.oldorigin_z = ReadCoord();
23         self.enemy.avelocity_x = ReadCoord();
24         self.enemy.avelocity_y = ReadCoord();
25         self.enemy.avelocity_z = ReadCoord();
26         self.oldorigin_x = ReadCoord();
27         self.oldorigin_y = ReadCoord();
28         self.oldorigin_z = ReadCoord();
29         self.avelocity_x = ReadCoord();
30         self.avelocity_y = ReadCoord();
31         self.avelocity_z = ReadCoord();
32
33         self.avelocity = AnglesTransform_TurnDirectionFR(self.avelocity);
34         self.warpzone_transform = AnglesTransform_Divide(self.avelocity, self.enemy.avelocity);
35
36         self.flags = FL_CAMERA;
37         self.drawmask = MASK_NORMAL;
38
39         // link me
40         //setmodel(self, self.model);
41         setorigin(self, self.origin);
42         setsize(self, self.mins, self.maxs);
43 }
44
45 float warpzone_saved;
46 vector warpzone_saved_origin;
47 vector warpzone_saved_angles;
48 void WarpZone_FixView()
49 {
50         float pd;
51         entity e;
52         warpzone_saved = 0;
53         warpzone_saved_origin = warpzone_fixview_origin;
54         warpzone_saved_angles = warpzone_fixview_angles;
55
56         for(e = world; (e = find(e, classname, "warpzone_to")); )
57         {
58                 if(WarpZoneLib_BoxTouchesBrush(warpzone_fixview_origin, warpzone_fixview_origin, e, world))
59                 {
60                         warpzone_saved = 1;
61                         warpzone_fixview_origin = AnglesTransform_Apply(e.warpzone_transform, warpzone_fixview_origin - e.enemy.oldorigin) + e.oldorigin;
62                         warpzone_fixview_angles = WarpZone_TransformVAngles(e.warpzone_transform, warpzone_fixview_angles);
63                         break;
64                 }
65         }
66
67         // if we are near any warpzone planes - MOVE AWAY (work around nearclip)
68         float nearclip = 1;
69         for(e = world; (e = find(e, classname, "warpzone_to")); )
70         {
71                 if(WarpZoneLib_BoxTouchesBrush(warpzone_fixview_origin - '1 1 1' * nearclip, warpzone_fixview_origin + '1 1 1' * nearclip, e, world))
72                 {
73                         fixedmakevectors(e.enemy.avelocity);
74                         pd = (warpzone_fixview_origin - e.enemy.oldorigin) * v_forward;
75                         if(pd >= 0 && pd < nearclip)
76                         {
77                                 warpzone_saved = 1;
78                                 warpzone_fixview_origin = warpzone_fixview_origin + v_forward * (nearclip - pd);
79                                 pd = (warpzone_fixview_origin - e.enemy.oldorigin) * v_forward;
80                         }
81                 }
82         }
83
84         if(warpzone_saved)
85         {
86                 R_SetView(VF_ORIGIN, warpzone_fixview_origin);
87                 R_SetView(VF_ANGLES, warpzone_fixview_angles);
88         }
89 }
90 void WarpZone_UnFixView()
91 {
92         if(warpzone_saved)
93         {
94                 warpzone_fixview_origin = warpzone_saved_origin;
95                 warpzone_fixview_angles = warpzone_saved_angles;
96                 R_SetView(VF_ORIGIN, warpzone_fixview_origin);
97                 R_SetView(VF_ANGLES, warpzone_fixview_angles);
98         }
99 }