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