]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blob - qcsrc/client/wall.qc
Merge branch 'master' into terencehill/quickmenu
[xonotic/xonotic-data.pk3dir.git] / qcsrc / client / wall.qc
1 #include "wall.qh"
2
3 void Ent_Wall_Draw()
4 {
5         float f;
6         var .vector fld;
7
8         if(self.bgmscriptangular)
9                 fld = angles;
10         else
11                 fld = origin;
12         self.fld = self.saved;
13
14         if(self.lodmodelindex1)
15         {
16                 if(autocvar_cl_modeldetailreduction <= 0)
17                 {
18                         if(self.lodmodelindex2 && autocvar_cl_modeldetailreduction <= -2)
19                                 self.modelindex = self.lodmodelindex2;
20                         else if(autocvar_cl_modeldetailreduction <= -1)
21                                 self.modelindex = self.lodmodelindex1;
22                         else
23                                 self.modelindex = self.lodmodelindex0;
24                 }
25                 else
26                 {
27                         float distance = vlen(NearestPointOnBox(self, view_origin) - view_origin);
28                         f = (distance * current_viewzoom + 100.0) * autocvar_cl_modeldetailreduction;
29                         f *= 1.0 / bound(0.01, view_quality, 1);
30                         if(self.lodmodelindex2 && f > self.loddistance2)
31                                 self.modelindex = self.lodmodelindex2;
32                         else if(f > self.loddistance1)
33                                 self.modelindex = self.lodmodelindex1;
34                         else
35                                 self.modelindex = self.lodmodelindex0;
36                 }
37         }
38
39         InterpolateOrigin_Do();
40
41         self.saved = self.fld;
42
43         f = BGMScript(self);
44         if(f >= 0)
45         {
46                 if(self.lip < 0) // < 0: alpha goes from 1 to 1-|lip| when toggled (toggling subtracts lip)
47                         self.alpha = 1 + self.lip * f;
48                 else // > 0: alpha goes from 1-|lip| to 1 when toggled (toggling adds lip)
49                         self.alpha = 1 - self.lip * (1 - f);
50                 self.fld = self.fld + self.movedir * f;
51         }
52         else
53                 self.alpha = 1;
54
55         if(self.alpha >= ALPHA_MIN_VISIBLE)
56                 self.drawmask = MASK_NORMAL;
57         else
58                 self.drawmask = 0;
59 }
60
61 void Ent_Wall_Remove()
62 {
63         if(self.bgmscript)
64                 strunzone(self.bgmscript);
65         self.bgmscript = string_null;
66 }
67
68 void Ent_Wall()
69 {
70         int f;
71         var .vector fld;
72
73         InterpolateOrigin_Undo();
74         self.iflags = IFLAG_ANGLES | IFLAG_ORIGIN;
75
76         if(self.bgmscriptangular)
77                 fld = angles;
78         else
79                 fld = origin;
80         self.fld = self.saved;
81
82         f = ReadByte();
83
84         if(f & 1)
85         {
86                 if(f & 0x40)
87                         self.colormap = ReadShort();
88                 else
89                         self.colormap = 0;
90         }
91
92         if(f & 2)
93         {
94                 self.origin_x = ReadCoord();
95                 self.origin_y = ReadCoord();
96                 self.origin_z = ReadCoord();
97                 setorigin(self, self.origin);
98         }
99
100         if(f & 4)
101         {
102                 if(f & 0x10)
103                 {
104                         self.angles_x = ReadAngle();
105                         self.angles_y = ReadAngle();
106                         self.angles_z = ReadAngle();
107                 }
108                 else
109                         self.angles = '0 0 0';
110         }
111
112         if(f & 8)
113         {
114                 if(f & 0x80)
115                 {
116                         self.lodmodelindex0 = ReadShort();
117                         self.loddistance1 = ReadShort();
118                         self.lodmodelindex1 = ReadShort();
119                         self.loddistance2 = ReadShort();
120                         self.lodmodelindex2 = ReadShort();
121                 }
122                 else
123                 {
124                         self.modelindex = ReadShort();
125                         self.loddistance1 = 0;
126                         self.loddistance2 = 0;
127                 }
128                 self.solid = ReadByte();
129                 self.scale = ReadShort() / 256.0;
130                 if(f & 0x20)
131                 {
132                         self.mins_x = ReadCoord();
133                         self.mins_y = ReadCoord();
134                         self.mins_z = ReadCoord();
135                         self.maxs_x = ReadCoord();
136                         self.maxs_y = ReadCoord();
137                         self.maxs_z = ReadCoord();
138                 }
139                 else
140                         self.mins = self.maxs = '0 0 0';
141                 setsize(self, self.mins, self.maxs);
142
143                 if(self.bgmscript)
144                         strunzone(self.bgmscript);
145                 self.bgmscript = ReadString();
146                 if(substring(self.bgmscript, 0, 1) == "<")
147                 {
148                         self.bgmscript = strzone(substring(self.bgmscript, 1, -1));
149                         self.bgmscriptangular = 1;
150                 }
151                 else
152                 {
153                         self.bgmscript = strzone(self.bgmscript);
154                         self.bgmscriptangular = 0;
155                 }
156                 if(self.bgmscript != "")
157                 {
158                         self.bgmscriptattack = ReadByte() / 64.0;
159                         self.bgmscriptdecay = ReadByte() / 64.0;
160                         self.bgmscriptsustain = ReadByte() / 255.0;
161                         self.bgmscriptrelease = ReadByte() / 64.0;
162                         self.movedir_x = ReadCoord();
163                         self.movedir_y = ReadCoord();
164                         self.movedir_z = ReadCoord();
165                         self.lip = ReadByte() / 255.0;
166                 }
167                 BGMScript_InitEntity(self);
168         }
169
170         InterpolateOrigin_Note();
171
172         self.saved = self.fld;
173
174         self.entremove = Ent_Wall_Remove;
175         self.draw = Ent_Wall_Draw;
176 }