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