1 /* bzflag
2 * Copyright (c) 1993-2021 Tim Riker
3 *
4 * This package is free software; you can redistribute it and/or
5 * modify it under the terms of the license found in the file
6 * named COPYING that should have accompanied this file.
7 *
8 * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
9 * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
10 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
11 */
12
13 #include "common.h"
14 #include <cmath>
15
16 // interface header
17 #include "BZDBCache.h"
18
19 BZDBCache::Bool BZDBCache::displayMainFlags;
20 BZDBCache::Bool BZDBCache::blend;
21 BZDBCache::Bool BZDBCache::texture;
22 BZDBCache::Bool BZDBCache::shadows;
23 BZDBCache::Bool BZDBCache::stencilShadows;
24 BZDBCache::Bool BZDBCache::zbuffer;
25 BZDBCache::Bool BZDBCache::useMeshForRadar;
26 BZDBCache::Bool BZDBCache::tesselation;
27 BZDBCache::Bool BZDBCache::lighting;
28 BZDBCache::Bool BZDBCache::smooth;
29 BZDBCache::Bool BZDBCache::colorful;
30 BZDBCache::Bool BZDBCache::animatedTreads;
31 BZDBCache::Int BZDBCache::leadingShotLine;
32 BZDBCache::Int BZDBCache::radarStyle;
33 BZDBCache::Float BZDBCache::radarTankPixels;
34 BZDBCache::Float BZDBCache::linedRadarShots;
35 BZDBCache::Float BZDBCache::sizedRadarShots;
36 BZDBCache::Int BZDBCache::radarPosition;
37 BZDBCache::Float BZDBCache::shotLength;
38 BZDBCache::Int BZDBCache::flagChunks;
39 BZDBCache::Float BZDBCache::pulseRate;
40 BZDBCache::Float BZDBCache::pulseDepth;
41 BZDBCache::Int BZDBCache::controlPanelTimestamp;
42 BZDBCache::Bool BZDBCache::showCollisionGrid;
43 BZDBCache::Bool BZDBCache::showCullingGrid;
44
45 BZDBCache::Bool BZDBCache::drawCelestial;
46 BZDBCache::Bool BZDBCache::drawClouds;
47 BZDBCache::Bool BZDBCache::drawGround;
48 BZDBCache::Bool BZDBCache::drawGroundLights;
49 BZDBCache::Bool BZDBCache::drawMountains;
50 BZDBCache::Bool BZDBCache::drawSky;
51
52 BZDBCache::Float BZDBCache::worldSize;
53 BZDBCache::Float BZDBCache::radarLimit;
54 BZDBCache::Float BZDBCache::gravity;
55 BZDBCache::Float BZDBCache::tankWidth;
56 BZDBCache::Float BZDBCache::tankLength;
57 BZDBCache::Float BZDBCache::tankHeight;
58 BZDBCache::Float BZDBCache::tankSpeed;
59 BZDBCache::Float BZDBCache::tankRadius;
60 BZDBCache::Float BZDBCache::flagRadius;
61 BZDBCache::Float BZDBCache::flagPoleSize;
62 BZDBCache::Float BZDBCache::flagPoleWidth;
63 BZDBCache::Float BZDBCache::maxLOD;
64
65 BZDBCache::Float BZDBCache::gmSize;
66
67 BZDBCache::Float BZDBCache::hudGUIBorderOpacityFactor;
68 BZDBCache::Float BZDBCache::shotBrightness;
69
70
getGoodPosValue(float oldVal,const std::string & var)71 static float getGoodPosValue(float oldVal, const std::string &var)
72 {
73 float newVal = BZDB.eval(var);
74 if (isnan(newVal) || newVal <= 0.0f)
75 {
76 // it's bad
77 BZDB.setFloat(var, oldVal, BZDB.getPermission(var));
78 return oldVal;
79 }
80 return newVal;
81 }
82
83
getGoodNonZeroValue(float oldVal,const std::string & var)84 static float getGoodNonZeroValue(float oldVal, const std::string &var)
85 {
86 float newVal = BZDB.eval(var);
87 if (isnan(newVal) || newVal == 0.0f)
88 {
89 // it's bad
90 BZDB.setFloat(var, oldVal, BZDB.getPermission(var));
91 return oldVal;
92 }
93 return newVal;
94 }
95
96
init()97 void BZDBCache::init()
98 {
99 // Client-side variables
100 BZDB.addCallback("displayMainFlags", clientCallback, NULL);
101 BZDB.addCallback("radarStyle", clientCallback, NULL);
102 BZDB.addCallback("radarTankPixels", clientCallback, NULL);
103 BZDB.addCallback("blend", clientCallback, NULL);
104 BZDB.addCallback("texture", clientCallback, NULL);
105 BZDB.addCallback("shadows", clientCallback, NULL);
106 BZDB.addCallback("stencilShadows", clientCallback, NULL);
107 BZDB.addCallback("zbuffer", clientCallback, NULL);
108 BZDB.addCallback("useMeshForRadar", clientCallback, NULL);
109 BZDB.addCallback("tesselation", clientCallback, NULL);
110 BZDB.addCallback("lighting", clientCallback, NULL);
111 BZDB.addCallback("smooth", clientCallback, NULL);
112 BZDB.addCallback("colorful", clientCallback, NULL);
113 BZDB.addCallback("animatedTreads", clientCallback, NULL);
114 BZDB.addCallback("shotLength", clientCallback, NULL);
115 BZDB.addCallback("leadingShotLine", clientCallback, NULL);
116 BZDB.addCallback("radarPosition", clientCallback, NULL);
117 BZDB.addCallback("flagChunks", clientCallback, NULL);
118 BZDB.addCallback("pulseRate", clientCallback, NULL);
119 BZDB.addCallback("pulseDepth", clientCallback, NULL);
120 BZDB.addCallback("controlPanelTimestamp", clientCallback, NULL);
121 BZDB.addCallback("showCollisionGrid", clientCallback, NULL);
122 BZDB.addCallback("showCullingGrid", clientCallback, NULL);
123 BZDB.addCallback("hudGUIBorderOpacityFactor", clientCallback, NULL);
124 BZDB.addCallback("shotBrightness", clientCallback, NULL);
125
126 // Server-side variables
127 BZDB.addCallback(StateDatabase::BZDB_DRAWCELESTIAL, serverCallback, NULL);
128 BZDB.addCallback(StateDatabase::BZDB_DRAWCLOUDS, serverCallback, NULL);
129 BZDB.addCallback(StateDatabase::BZDB_DRAWGROUND, serverCallback, NULL);
130 BZDB.addCallback(StateDatabase::BZDB_DRAWGROUNDLIGHTS, serverCallback, NULL);
131 BZDB.addCallback(StateDatabase::BZDB_DRAWMOUNTAINS, serverCallback, NULL);
132 BZDB.addCallback(StateDatabase::BZDB_DRAWSKY, serverCallback, NULL);
133 BZDB.addCallback(StateDatabase::BZDB_MAXLOD, serverCallback, NULL);
134 BZDB.addCallback(StateDatabase::BZDB_WORLDSIZE, serverCallback, NULL);
135 BZDB.addCallback(StateDatabase::BZDB_RADARLIMIT, serverCallback, NULL);
136 BZDB.addCallback(StateDatabase::BZDB_GRAVITY, serverCallback, NULL);
137 BZDB.addCallback(StateDatabase::BZDB_TANKWIDTH, serverCallback, NULL);
138 BZDB.addCallback(StateDatabase::BZDB_TANKLENGTH, serverCallback, NULL);
139 BZDB.addCallback(StateDatabase::BZDB_TANKHEIGHT, serverCallback, NULL);
140 BZDB.addCallback(StateDatabase::BZDB_TANKSPEED, serverCallback, NULL);
141 BZDB.addCallback(StateDatabase::BZDB_FLAGRADIUS, serverCallback, NULL);
142 BZDB.addCallback(StateDatabase::BZDB_FLAGPOLESIZE, serverCallback, NULL);
143 BZDB.addCallback(StateDatabase::BZDB_FLAGPOLEWIDTH, serverCallback, NULL);
144 BZDB.addCallback(StateDatabase::BZDB_GMSIZE, serverCallback, NULL);
145
146 drawCelestial = BZDB.isTrue(StateDatabase::BZDB_DRAWCELESTIAL);
147 drawClouds = BZDB.isTrue(StateDatabase::BZDB_DRAWCLOUDS);
148 drawGround = BZDB.isTrue(StateDatabase::BZDB_DRAWGROUND);
149 drawGroundLights = BZDB.isTrue(StateDatabase::BZDB_DRAWGROUNDLIGHTS);
150 drawMountains = BZDB.isTrue(StateDatabase::BZDB_DRAWMOUNTAINS);
151 drawSky = BZDB.isTrue(StateDatabase::BZDB_DRAWSKY);
152
153 maxLOD = BZDB.eval(StateDatabase::BZDB_MAXLOD);
154 worldSize = getGoodPosValue(worldSize,StateDatabase::BZDB_WORLDSIZE);
155 radarLimit = BZDB.eval(StateDatabase::BZDB_RADARLIMIT);
156 gravity = getGoodNonZeroValue(gravity,StateDatabase::BZDB_GRAVITY);
157 tankWidth = getGoodPosValue(tankWidth,StateDatabase::BZDB_TANKWIDTH);
158 tankLength = getGoodPosValue(tankLength,StateDatabase::BZDB_TANKLENGTH);
159 tankHeight = getGoodPosValue(tankHeight,StateDatabase::BZDB_TANKHEIGHT);
160 tankSpeed = getGoodPosValue(tankSpeed,StateDatabase::BZDB_TANKSPEED);
161 tankRadius = getGoodPosValue(tankRadius,StateDatabase::BZDB_TANKRADIUS);
162 flagRadius = getGoodPosValue(flagRadius,StateDatabase::BZDB_FLAGRADIUS);
163 flagPoleSize = getGoodPosValue(flagPoleSize,StateDatabase::BZDB_FLAGPOLESIZE);
164 flagPoleWidth = getGoodPosValue(flagPoleWidth,StateDatabase::BZDB_FLAGPOLEWIDTH);
165
166 gmSize = getGoodPosValue(flagPoleWidth,StateDatabase::BZDB_GMSIZE);
167
168 update();
169 }
170
171
clientCallback(const std::string & name,void *)172 void BZDBCache::clientCallback(const std::string& name, void *)
173 {
174 if (name == "blend")
175 blend = BZDB.isTrue("blend");
176 else if (name == "displayMainFlags")
177 displayMainFlags = BZDB.isTrue("displayMainFlags");
178 else if (name == "texture")
179 texture = BZDB.isTrue("texture");
180 else if (name == "shadows")
181 shadows = BZDB.isTrue("shadows");
182 else if (name == "stencilShadows")
183 stencilShadows = BZDB.isTrue("stencilShadows");
184 else if (name == "zbuffer")
185 zbuffer = BZDB.isTrue("zbuffer");
186 else if (name == "useMeshForRadar")
187 useMeshForRadar = BZDB.isTrue("useMeshForRadar");
188 else if (name == "tesselation")
189 tesselation = BZDB.isTrue("tesselation");
190 else if (name == "lighting")
191 lighting = BZDB.isTrue("lighting");
192 else if (name == "smooth")
193 smooth = BZDB.isTrue("smooth");
194 else if (name == "colorful")
195 colorful = BZDB.isTrue("colorful");
196 else if (name == "radarStyle")
197 radarStyle = BZDB.evalInt("radarStyle");
198 else if (name == "radarTankPixels")
199 radarTankPixels = BZDB.eval("radarTankPixels");
200 else if (name == "animatedTreads")
201 animatedTreads = BZDB.isTrue("animatedTreads");
202 else if (name == "shotLength")
203 shotLength = BZDB.eval("shotLength");
204 else if (name == "leadingShotLine")
205 leadingShotLine = BZDB.evalInt("leadingShotLine");
206 else if (name == "radarPosition")
207 radarPosition = BZDB.evalInt("radarPosition");
208 else if (name == "flagChunks")
209 flagChunks = BZDB.evalInt("flagChunks");
210 else if (name == "pulseRate")
211 pulseRate = BZDB.eval("pulseRate");
212 else if (name == "pulseDepth")
213 pulseDepth = BZDB.eval("pulseDepth");
214 else if (name == "controlPanelTimestamp")
215 controlPanelTimestamp = BZDB.evalInt("controlPanelTimestamp");
216 else if (name == "showCollisionGrid")
217 showCollisionGrid = BZDB.isTrue("showCollisionGrid");
218 else if (name == "showCullingGrid")
219 showCullingGrid = BZDB.isTrue("showCullingGrid");
220 else if (name == "hudGUIBorderOpacityFactor")
221 hudGUIBorderOpacityFactor = BZDB.eval("hudGUIBorderOpacityFactor");
222 else if (name == "shotBrightness")
223 shotBrightness = BZDB.eval("shotBrightness");
224 }
225
226
serverCallback(const std::string & name,void *)227 void BZDBCache::serverCallback(const std::string& name, void *)
228 {
229 if (name == StateDatabase::BZDB_DRAWCELESTIAL)
230 drawCelestial = BZDB.isTrue(StateDatabase::BZDB_DRAWCELESTIAL);
231 else if (name == StateDatabase::BZDB_DRAWCLOUDS)
232 drawClouds = BZDB.isTrue(StateDatabase::BZDB_DRAWCLOUDS);
233 else if (name == StateDatabase::BZDB_DRAWGROUND)
234 drawGround = BZDB.isTrue(StateDatabase::BZDB_DRAWGROUND);
235 else if (name == StateDatabase::BZDB_DRAWGROUNDLIGHTS)
236 drawGroundLights = BZDB.isTrue(StateDatabase::BZDB_DRAWGROUNDLIGHTS);
237 else if (name == StateDatabase::BZDB_DRAWMOUNTAINS)
238 drawMountains = BZDB.isTrue(StateDatabase::BZDB_DRAWMOUNTAINS);
239 else if (name == StateDatabase::BZDB_DRAWSKY)
240 drawSky = BZDB.isTrue(StateDatabase::BZDB_DRAWSKY);
241 else if (name == StateDatabase::BZDB_MAXLOD)
242 maxLOD = BZDB.eval(StateDatabase::BZDB_MAXLOD);
243 else if (name == StateDatabase::BZDB_WORLDSIZE)
244 worldSize = getGoodPosValue(worldSize,StateDatabase::BZDB_WORLDSIZE);
245 else if (name == StateDatabase::BZDB_RADARLIMIT)
246 radarLimit = BZDB.eval(StateDatabase::BZDB_RADARLIMIT);
247 else if (name == StateDatabase::BZDB_GRAVITY)
248 gravity = getGoodNonZeroValue(gravity,StateDatabase::BZDB_GRAVITY);
249 else if (name == StateDatabase::BZDB_TANKWIDTH)
250 tankWidth = getGoodPosValue(tankWidth,StateDatabase::BZDB_TANKWIDTH);
251 else if (name == StateDatabase::BZDB_TANKLENGTH)
252 tankLength = getGoodPosValue(tankLength,StateDatabase::BZDB_TANKLENGTH);
253 else if (name == StateDatabase::BZDB_TANKHEIGHT)
254 tankHeight = getGoodPosValue(tankHeight,StateDatabase::BZDB_TANKHEIGHT);
255 else if (name == StateDatabase::BZDB_TANKSPEED)
256 tankSpeed = getGoodPosValue(tankSpeed,StateDatabase::BZDB_TANKSPEED);
257 // Why only in update() ?
258 // else if (name == StateDatabase::BZDB_FLAGRADIUS) {
259 // flagRadius = BZDB.eval(StateDatabase::BZDB_FLAGRADIUS);
260 // }
261 else if (name == StateDatabase::BZDB_FLAGPOLESIZE)
262 flagPoleSize = getGoodPosValue(flagPoleSize,StateDatabase::BZDB_FLAGPOLESIZE);
263 else if (name == StateDatabase::BZDB_FLAGPOLEWIDTH)
264 flagPoleWidth = getGoodPosValue(flagPoleWidth,StateDatabase::BZDB_FLAGPOLEWIDTH);
265 else if (name == StateDatabase::BZDB_GMSIZE)
266 gmSize = getGoodPosValue(flagPoleWidth,StateDatabase::BZDB_GMSIZE);
267 }
268
269
update()270 void BZDBCache::update()
271 {
272 tankRadius = BZDB.eval(StateDatabase::BZDB_TANKRADIUS);
273 linedRadarShots = BZDB.eval("linedradarshots");
274 sizedRadarShots = BZDB.eval("sizedradarshots");
275 }
276
277
278 // Local Variables: ***
279 // mode: C++ ***
280 // tab-width: 4 ***
281 // c-basic-offset: 4 ***
282 // indent-tabs-mode: nil ***
283 // End: ***
284 // ex: shiftwidth=4 tabstop=4
285