/
p_ticker.cpp
152 lines (124 loc) · 4.15 KB
/
p_ticker.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
/** @file p_ticker.cpp
*
* @authors Copyright © 2003-2013 Jaakko Keränen <jaakko.keranen@iki.fi>
* @authors Copyright © 2006-2013 Daniel Swanson <danij@dengine.net>
*
* @par License
* GPL: http://www.gnu.org/licenses/gpl.html
*
* <small>This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at your
* option) any later version. This program is distributed in the hope that it
* will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty
* of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
* Public License for more details. You should have received a copy of the GNU
* General Public License along with this program; if not, see:
* http://www.gnu.org/licenses</small>
*/
/**
* Timed Playsim Events.
*/
// HEADER FILES ------------------------------------------------------------
#include "de_base.h"
#include "de_network.h"
#include "de_render.h"
#include "de_play.h"
#include "de_misc.h"
#include "render/sky.h"
// MACROS ------------------------------------------------------------------
// TYPES -------------------------------------------------------------------
// EXTERNAL FUNCTION PROTOTYPES --------------------------------------------
// PUBLIC FUNCTION PROTOTYPES ----------------------------------------------
// PRIVATE FUNCTION PROTOTYPES ---------------------------------------------
// EXTERNAL DATA DECLARATIONS ----------------------------------------------
// PUBLIC DATA DEFINITIONS -------------------------------------------------
// PRIVATE DATA DEFINITIONS ------------------------------------------------
// CODE --------------------------------------------------------------------
int P_MobjTicker(thinker_t* th, void* context)
{
DENG_UNUSED(context);
uint i;
mobj_t* mo = (mobj_t*) th;
for(i = 0; i < DDMAXPLAYERS; ++i)
{
int f;
byte* haloFactor = &mo->haloFactors[i];
#ifdef __CLIENT__
// Set the high bit of halofactor if the light is clipped. This will
// make P_Ticker diminish the factor to zero. Take the first step here
// and now, though.
if(mo->lumIdx == 0 || LO_IsClipped(mo->lumIdx, i))
{
if(*haloFactor & 0x80)
{
f = (*haloFactor & 0x7f); // - haloOccludeSpeed;
if(f < 0)
f = 0;
*haloFactor = f;
}
}
else
{
if(!(*haloFactor & 0x80))
{
f = (*haloFactor & 0x7f); // + haloOccludeSpeed;
if(f > 127)
f = 127;
*haloFactor = 0x80 | f;
}
}
// Handle halofactor.
f = *haloFactor & 0x7f;
if(*haloFactor & 0x80)
{
// Going up.
f += haloOccludeSpeed;
if(f > 127)
f = 127;
}
else
{
// Going down.
f -= haloOccludeSpeed;
if(f < 0)
f = 0;
}
*haloFactor &= ~0x7f;
*haloFactor |= f;
#endif
}
return false; // Continue iteration.
}
#ifdef __CLIENT__
/**
* Process a tic of @a elapsed length, animating all materials.
* @param elapsed Length of tic to be processed.
*/
static void materialsTicker(timespan_t elapsed)
{
foreach(Material *material, App_Materials().all())
foreach(MaterialAnimation *animation, material->animations())
{
animation->animate(elapsed);
}
}
#endif // __CLIENT__
/**
* Doomsday's own play-ticker.
*/
void P_Ticker(timespan_t elapsed)
{
P_ControlTicker(elapsed);
#ifdef __CLIENT__
materialsTicker(elapsed);
#endif
if(!theMap || !GameMap_ThinkerListInited(theMap)) return; // Not initialized yet.
if(DD_IsSharpTick())
{
Sky_Ticker();
// Check all mobjs (always public).
GameMap_IterateThinkers(theMap, reinterpret_cast<thinkfunc_t>(gx.MobjThinker),
0x1, P_MobjTicker, NULL);
}
}