]> git.xonotic.org Git - xonotic/darkplaces.git/blob - cl_ents5.c
GFX : Adjusted gfx/net.jpg size and orientation
[xonotic/darkplaces.git] / cl_ents5.c
1 #include "quakedef.h"
2 #include "protocol.h"
3
4 static void EntityState5_ReadUpdate(entity_state_t *s, int number)
5 {
6         int bits;
7         int startoffset = cl_message.readcount;
8         int bytes = 0;
9         bits = MSG_ReadByte(&cl_message);
10         if (bits & E5_EXTEND1)
11         {
12                 bits |= MSG_ReadByte(&cl_message) << 8;
13                 if (bits & E5_EXTEND2)
14                 {
15                         bits |= MSG_ReadByte(&cl_message) << 16;
16                         if (bits & E5_EXTEND3)
17                                 bits |= MSG_ReadByte(&cl_message) << 24;
18                 }
19         }
20         if (bits & E5_FULLUPDATE)
21         {
22                 *s = defaultstate;
23                 s->active = ACTIVE_NETWORK;
24         }
25         if (bits & E5_FLAGS)
26                 s->flags = MSG_ReadByte(&cl_message);
27         if (bits & E5_ORIGIN)
28         {
29                 if (bits & E5_ORIGIN32)
30                 {
31                         s->origin[0] = MSG_ReadCoord32f(&cl_message);
32                         s->origin[1] = MSG_ReadCoord32f(&cl_message);
33                         s->origin[2] = MSG_ReadCoord32f(&cl_message);
34                 }
35                 else
36                 {
37                         s->origin[0] = MSG_ReadCoord13i(&cl_message);
38                         s->origin[1] = MSG_ReadCoord13i(&cl_message);
39                         s->origin[2] = MSG_ReadCoord13i(&cl_message);
40                 }
41         }
42         if (bits & E5_ANGLES)
43         {
44                 if (bits & E5_ANGLES16)
45                 {
46                         s->angles[0] = MSG_ReadAngle16i(&cl_message);
47                         s->angles[1] = MSG_ReadAngle16i(&cl_message);
48                         s->angles[2] = MSG_ReadAngle16i(&cl_message);
49                 }
50                 else
51                 {
52                         s->angles[0] = MSG_ReadAngle8i(&cl_message);
53                         s->angles[1] = MSG_ReadAngle8i(&cl_message);
54                         s->angles[2] = MSG_ReadAngle8i(&cl_message);
55                 }
56         }
57         if (bits & E5_MODEL)
58         {
59                 if (bits & E5_MODEL16)
60                         s->modelindex = (unsigned short) MSG_ReadShort(&cl_message);
61                 else
62                         s->modelindex = MSG_ReadByte(&cl_message);
63         }
64         if (bits & E5_FRAME)
65         {
66                 if (bits & E5_FRAME16)
67                         s->frame = (unsigned short) MSG_ReadShort(&cl_message);
68                 else
69                         s->frame = MSG_ReadByte(&cl_message);
70         }
71         if (bits & E5_SKIN)
72                 s->skin = MSG_ReadByte(&cl_message);
73         if (bits & E5_EFFECTS)
74         {
75                 if (bits & E5_EFFECTS32)
76                         s->effects = (unsigned int) MSG_ReadLong(&cl_message);
77                 else if (bits & E5_EFFECTS16)
78                         s->effects = (unsigned short) MSG_ReadShort(&cl_message);
79                 else
80                         s->effects = MSG_ReadByte(&cl_message);
81         }
82         if (bits & E5_ALPHA)
83                 s->alpha = MSG_ReadByte(&cl_message);
84         if (bits & E5_SCALE)
85                 s->scale = MSG_ReadByte(&cl_message);
86         if (bits & E5_COLORMAP)
87                 s->colormap = MSG_ReadByte(&cl_message);
88         if (bits & E5_ATTACHMENT)
89         {
90                 s->tagentity = (unsigned short) MSG_ReadShort(&cl_message);
91                 s->tagindex = MSG_ReadByte(&cl_message);
92         }
93         if (bits & E5_LIGHT)
94         {
95                 s->light[0] = (unsigned short) MSG_ReadShort(&cl_message);
96                 s->light[1] = (unsigned short) MSG_ReadShort(&cl_message);
97                 s->light[2] = (unsigned short) MSG_ReadShort(&cl_message);
98                 s->light[3] = (unsigned short) MSG_ReadShort(&cl_message);
99                 s->lightstyle = MSG_ReadByte(&cl_message);
100                 s->lightpflags = MSG_ReadByte(&cl_message);
101         }
102         if (bits & E5_GLOW)
103         {
104                 s->glowsize = MSG_ReadByte(&cl_message);
105                 s->glowcolor = MSG_ReadByte(&cl_message);
106         }
107         if (bits & E5_COLORMOD)
108         {
109                 s->colormod[0] = MSG_ReadByte(&cl_message);
110                 s->colormod[1] = MSG_ReadByte(&cl_message);
111                 s->colormod[2] = MSG_ReadByte(&cl_message);
112         }
113         if (bits & E5_GLOWMOD)
114         {
115                 s->glowmod[0] = MSG_ReadByte(&cl_message);
116                 s->glowmod[1] = MSG_ReadByte(&cl_message);
117                 s->glowmod[2] = MSG_ReadByte(&cl_message);
118         }
119         if (bits & E5_COMPLEXANIMATION)
120         {
121                 skeleton_t *skeleton;
122                 const model_t *model;
123                 int modelindex;
124                 int type;
125                 int bonenum;
126                 int numbones;
127                 short pose7s[7];
128                 type = MSG_ReadByte(&cl_message);
129                 switch(type)
130                 {
131                 case 0:
132                         s->framegroupblend[0].frame = MSG_ReadShort(&cl_message);
133                         s->framegroupblend[1].frame = 0;
134                         s->framegroupblend[2].frame = 0;
135                         s->framegroupblend[3].frame = 0;
136                         s->framegroupblend[0].start = cl.time - (unsigned short)MSG_ReadShort(&cl_message) * (1.0f / 1000.0f);
137                         s->framegroupblend[1].start = 0;
138                         s->framegroupblend[2].start = 0;
139                         s->framegroupblend[3].start = 0;
140                         s->framegroupblend[0].lerp = 1;
141                         s->framegroupblend[1].lerp = 0;
142                         s->framegroupblend[2].lerp = 0;
143                         s->framegroupblend[3].lerp = 0;
144                         break;
145                 case 1:
146                         s->framegroupblend[0].frame = MSG_ReadShort(&cl_message);
147                         s->framegroupblend[1].frame = MSG_ReadShort(&cl_message);
148                         s->framegroupblend[2].frame = 0;
149                         s->framegroupblend[3].frame = 0;
150                         s->framegroupblend[0].start = cl.time - (unsigned short)MSG_ReadShort(&cl_message) * (1.0f / 1000.0f);
151                         s->framegroupblend[1].start = cl.time - (unsigned short)MSG_ReadShort(&cl_message) * (1.0f / 1000.0f);
152                         s->framegroupblend[2].start = 0;
153                         s->framegroupblend[3].start = 0;
154                         s->framegroupblend[0].lerp = MSG_ReadByte(&cl_message) * (1.0f / 255.0f);
155                         s->framegroupblend[1].lerp = MSG_ReadByte(&cl_message) * (1.0f / 255.0f);
156                         s->framegroupblend[2].lerp = 0;
157                         s->framegroupblend[3].lerp = 0;
158                         break;
159                 case 2:
160                         s->framegroupblend[0].frame = MSG_ReadShort(&cl_message);
161                         s->framegroupblend[1].frame = MSG_ReadShort(&cl_message);
162                         s->framegroupblend[2].frame = MSG_ReadShort(&cl_message);
163                         s->framegroupblend[3].frame = 0;
164                         s->framegroupblend[0].start = cl.time - (unsigned short)MSG_ReadShort(&cl_message) * (1.0f / 1000.0f);
165                         s->framegroupblend[1].start = cl.time - (unsigned short)MSG_ReadShort(&cl_message) * (1.0f / 1000.0f);
166                         s->framegroupblend[2].start = cl.time - (unsigned short)MSG_ReadShort(&cl_message) * (1.0f / 1000.0f);
167                         s->framegroupblend[3].start = 0;
168                         s->framegroupblend[0].lerp = MSG_ReadByte(&cl_message) * (1.0f / 255.0f);
169                         s->framegroupblend[1].lerp = MSG_ReadByte(&cl_message) * (1.0f / 255.0f);
170                         s->framegroupblend[2].lerp = MSG_ReadByte(&cl_message) * (1.0f / 255.0f);
171                         s->framegroupblend[3].lerp = 0;
172                         break;
173                 case 3:
174                         s->framegroupblend[0].frame = MSG_ReadShort(&cl_message);
175                         s->framegroupblend[1].frame = MSG_ReadShort(&cl_message);
176                         s->framegroupblend[2].frame = MSG_ReadShort(&cl_message);
177                         s->framegroupblend[3].frame = MSG_ReadShort(&cl_message);
178                         s->framegroupblend[0].start = cl.time - (unsigned short)MSG_ReadShort(&cl_message) * (1.0f / 1000.0f);
179                         s->framegroupblend[1].start = cl.time - (unsigned short)MSG_ReadShort(&cl_message) * (1.0f / 1000.0f);
180                         s->framegroupblend[2].start = cl.time - (unsigned short)MSG_ReadShort(&cl_message) * (1.0f / 1000.0f);
181                         s->framegroupblend[3].start = cl.time - (unsigned short)MSG_ReadShort(&cl_message) * (1.0f / 1000.0f);
182                         s->framegroupblend[0].lerp = MSG_ReadByte(&cl_message) * (1.0f / 255.0f);
183                         s->framegroupblend[1].lerp = MSG_ReadByte(&cl_message) * (1.0f / 255.0f);
184                         s->framegroupblend[2].lerp = MSG_ReadByte(&cl_message) * (1.0f / 255.0f);
185                         s->framegroupblend[3].lerp = MSG_ReadByte(&cl_message) * (1.0f / 255.0f);
186                         break;
187                 case 4:
188                         if (!cl.engineskeletonobjects)
189                                 cl.engineskeletonobjects = (skeleton_t *) Mem_Alloc(cls.levelmempool, sizeof(*cl.engineskeletonobjects) * MAX_EDICTS);
190                         skeleton = &cl.engineskeletonobjects[number];
191                         modelindex = MSG_ReadShort(&cl_message);
192                         model = CL_GetModelByIndex(modelindex);
193                         numbones = MSG_ReadByte(&cl_message);
194                         if (model && numbones != model->num_bones)
195                                 Host_Error("E5_COMPLEXANIMATION: model has different number of bones than network packet describes\n");
196                         if (!skeleton->relativetransforms || skeleton->model != model)
197                         {
198                                 skeleton->model = model;
199                                 skeleton->relativetransforms = (matrix4x4_t *) Mem_Realloc(cls.levelmempool, skeleton->relativetransforms, sizeof(*skeleton->relativetransforms) * numbones);
200                                 for (bonenum = 0;bonenum < numbones;bonenum++)
201                                         skeleton->relativetransforms[bonenum] = identitymatrix;
202                         }
203                         for (bonenum = 0;bonenum < numbones;bonenum++)
204                         {
205                                 pose7s[0] = (short)MSG_ReadShort(&cl_message);
206                                 pose7s[1] = (short)MSG_ReadShort(&cl_message);
207                                 pose7s[2] = (short)MSG_ReadShort(&cl_message);
208                                 pose7s[3] = (short)MSG_ReadShort(&cl_message);
209                                 pose7s[4] = (short)MSG_ReadShort(&cl_message);
210                                 pose7s[5] = (short)MSG_ReadShort(&cl_message);
211                                 pose7s[6] = (short)MSG_ReadShort(&cl_message);
212                                 Matrix4x4_FromBonePose7s(skeleton->relativetransforms + bonenum, 1.0f / 64.0f, pose7s);
213                         }
214                         s->skeletonobject = *skeleton;
215                         break;
216                 default:
217                         Host_Error("E5_COMPLEXANIMATION: Parse error - unknown type %i\n", type);
218                         break;
219                 }
220         }
221         if (bits & E5_TRAILEFFECTNUM)
222                 s->traileffectnum = (unsigned short) MSG_ReadShort(&cl_message);
223         if (bits & E5_SOLID)
224         {
225                 s->solid = MSG_ReadByte(&cl_message);
226                 
227                 if (s->solid != SOLID_NOT && s->solid != SOLID_BSP)
228                 {
229                         s->mins[0] = MSG_ReadCoord32f(&cl_message);
230                         s->mins[1] = MSG_ReadCoord32f(&cl_message);
231                         s->mins[2] = MSG_ReadCoord32f(&cl_message);
232                         s->maxs[0] = MSG_ReadCoord32f(&cl_message);
233                         s->maxs[1] = MSG_ReadCoord32f(&cl_message);
234                         s->maxs[2] = MSG_ReadCoord32f(&cl_message);
235                 }
236         }
237
238
239         bytes = cl_message.readcount - startoffset;
240         if (developer_networkentities.integer >= 2)
241         {
242                 Con_Printf("ReadFields e%i (%i bytes)", number, bytes);
243
244                 if (bits & E5_ORIGIN)
245                         Con_Printf(" E5_ORIGIN %f %f %f", s->origin[0], s->origin[1], s->origin[2]);
246                 if (bits & E5_ANGLES)
247                         Con_Printf(" E5_ANGLES %f %f %f", s->angles[0], s->angles[1], s->angles[2]);
248                 if (bits & E5_MODEL)
249                         Con_Printf(" E5_MODEL %i", s->modelindex);
250                 if (bits & E5_FRAME)
251                         Con_Printf(" E5_FRAME %i", s->frame);
252                 if (bits & E5_SKIN)
253                         Con_Printf(" E5_SKIN %i", s->skin);
254                 if (bits & E5_EFFECTS)
255                         Con_Printf(" E5_EFFECTS %i", s->effects);
256                 if (bits & E5_FLAGS)
257                 {
258                         Con_Printf(" E5_FLAGS %i (", s->flags);
259                         if (s->flags & RENDER_STEP)
260                                 Con_Print(" STEP");
261                         if (s->flags & RENDER_GLOWTRAIL)
262                                 Con_Print(" GLOWTRAIL");
263                         if (s->flags & RENDER_VIEWMODEL)
264                                 Con_Print(" VIEWMODEL");
265                         if (s->flags & RENDER_EXTERIORMODEL)
266                                 Con_Print(" EXTERIORMODEL");
267                         if (s->flags & RENDER_LOWPRECISION)
268                                 Con_Print(" LOWPRECISION");
269                         if (s->flags & RENDER_COLORMAPPED)
270                                 Con_Print(" COLORMAPPED");
271                         if (s->flags & RENDER_SHADOW)
272                                 Con_Print(" SHADOW");
273                         if (s->flags & RENDER_LIGHT)
274                                 Con_Print(" LIGHT");
275                         if (s->flags & RENDER_NOSELFSHADOW)
276                                 Con_Print(" NOSELFSHADOW");
277                         Con_Print(")");
278                 }
279                 if (bits & E5_ALPHA)
280                         Con_Printf(" E5_ALPHA %f", s->alpha / 255.0f);
281                 if (bits & E5_SCALE)
282                         Con_Printf(" E5_SCALE %f", s->scale / 16.0f);
283                 if (bits & E5_COLORMAP)
284                         Con_Printf(" E5_COLORMAP %i", s->colormap);
285                 if (bits & E5_ATTACHMENT)
286                         Con_Printf(" E5_ATTACHMENT e%i:%i", s->tagentity, s->tagindex);
287                 if (bits & E5_LIGHT)
288                         Con_Printf(" E5_LIGHT %i:%i:%i:%i %i:%i", s->light[0], s->light[1], s->light[2], s->light[3], s->lightstyle, s->lightpflags);
289                 if (bits & E5_GLOW)
290                         Con_Printf(" E5_GLOW %i:%i", s->glowsize * 4, s->glowcolor);
291                 if (bits & E5_COLORMOD)
292                         Con_Printf(" E5_COLORMOD %f:%f:%f", s->colormod[0] / 32.0f, s->colormod[1] / 32.0f, s->colormod[2] / 32.0f);
293                 if (bits & E5_GLOWMOD)
294                         Con_Printf(" E5_GLOWMOD %f:%f:%f", s->glowmod[0] / 32.0f, s->glowmod[1] / 32.0f, s->glowmod[2] / 32.0f);
295                 if (bits & E5_COMPLEXANIMATION)
296                         Con_Printf(" E5_COMPLEXANIMATION");
297                 if (bits & E5_TRAILEFFECTNUM)
298                         Con_Printf(" E5_TRAILEFFECTNUM %i", s->traileffectnum);
299                 Con_Print("\n");
300         }
301 }
302
303 void EntityFrame5_CL_ReadFrame(void)
304 {
305         int n, enumber, framenum;
306         entity_t *ent;
307         entity_state_t *s;
308         // read the number of this frame to echo back in next input packet
309         framenum = MSG_ReadLong(&cl_message);
310         CL_NewFrameReceived(framenum);
311         if (cls.protocol != PROTOCOL_QUAKE && cls.protocol != PROTOCOL_QUAKEDP && cls.protocol != PROTOCOL_NEHAHRAMOVIE && cls.protocol != PROTOCOL_DARKPLACES1 && cls.protocol != PROTOCOL_DARKPLACES2 && cls.protocol != PROTOCOL_DARKPLACES3 && cls.protocol != PROTOCOL_DARKPLACES4 && cls.protocol != PROTOCOL_DARKPLACES5 && cls.protocol != PROTOCOL_DARKPLACES6)
312                 cls.servermovesequence = MSG_ReadLong(&cl_message);
313         // read entity numbers until we find a 0x8000
314         // (which would be remove world entity, but is actually a terminator)
315         while ((n = (unsigned short)MSG_ReadShort(&cl_message)) != 0x8000 && !cl_message.badread)
316         {
317                 // get the entity number
318                 enumber = n & 0x7FFF;
319                 // we may need to expand the array
320                 if (cl.num_entities <= enumber)
321                 {
322                         cl.num_entities = enumber + 1;
323                         if (enumber >= cl.max_entities)
324                                 CL_ExpandEntities(enumber);
325                 }
326                 // look up the entity
327                 ent = cl.entities + enumber;
328                 // slide the current into the previous slot
329                 ent->state_previous = ent->state_current;
330                 // read the update
331                 s = &ent->state_current;
332                 if (n & 0x8000)
333                 {
334                         // remove entity
335                         *s = defaultstate;
336                 }
337                 else
338                 {
339                         // update entity
340                         EntityState5_ReadUpdate(s, enumber);
341                 }
342                 // set the cl.entities_active flag
343                 cl.entities_active[enumber] = (s->active == ACTIVE_NETWORK);
344                 // set the update time
345                 s->time = cl.mtime[0];
346                 // fix the number (it gets wiped occasionally by copying from defaultstate)
347                 s->number = enumber;
348                 // check if we need to update the lerp stuff
349                 if (s->active == ACTIVE_NETWORK)
350                         CL_MoveLerpEntityStates(&cl.entities[enumber]);
351                 // print extra messages if desired
352                 if (developer_networkentities.integer >= 2 && cl.entities[enumber].state_current.active != cl.entities[enumber].state_previous.active)
353                 {
354                         if (cl.entities[enumber].state_current.active == ACTIVE_NETWORK)
355                                 Con_Printf("entity #%i has become active\n", enumber);
356                         else if (cl.entities[enumber].state_previous.active)
357                                 Con_Printf("entity #%i has become inactive\n", enumber);
358                 }
359         }
360 }