Browse Source

direct: Fix use of various deprecated APIs

rdb 4 years ago
parent
commit
3fe1780f16

+ 5 - 5
direct/src/directtools/DirectSession.py

@@ -97,13 +97,13 @@ class DirectSession(DirectObject):
         self.joybox = None
         self.radamec = None
         self.fastrak = []
-        if base.config.GetBool('want-vrpn', 0):
+        if ConfigVariableBool('want-vrpn', False):
             from direct.directdevices import DirectDeviceManager
             self.deviceManager = DirectDeviceManager.DirectDeviceManager()
             # Automatically create any devices specified in config file
-            joybox = base.config.GetString('vrpn-joybox-device', '')
-            radamec = base.config.GetString('vrpn-radamec-device', '')
-            fastrak = base.config.GetString('vrpn-fastrak-device', '')
+            joybox = ConfigVariableString('vrpn-joybox-device', '').value
+            radamec = ConfigVariableString('vrpn-radamec-device', '').value
+            fastrak = ConfigVariableString('vrpn-fastrak-device', '').value
             if joybox:
                 from direct.directdevices import DirectJoybox
                 self.joybox = DirectJoybox.DirectJoybox(joybox)
@@ -300,7 +300,7 @@ class DirectSession(DirectObject):
             self.clusterMode = clusterMode
         except NameError:
             # Has the clusterMode been set via a config variable?
-            self.clusterMode = base.config.GetString("cluster-mode", '')
+            self.clusterMode = ConfigVariableString("cluster-mode", '').value
 
         if self.clusterMode == 'client':
             self.cluster = createClusterClient()

+ 5 - 5
direct/src/distributed/ClientRepositoryBase.py

@@ -33,7 +33,7 @@ class ClientRepositoryBase(ConnectionRepository):
         ConnectionRepository.__init__(self, connectMethod, base.config, hasOwnerView = True, threadedNet = threadedNet)
         self.dcSuffix = dcSuffix
         if hasattr(self, 'setVerbose'):
-            if self.config.GetBool('verbose-clientrepository'):
+            if ConfigVariableBool('verbose-clientrepository', False):
                 self.setVerbose(1)
 
         self.context=100000
@@ -42,7 +42,7 @@ class ClientRepositoryBase(ConnectionRepository):
         self.deferredGenerates = []
         self.deferredDoIds = {}
         self.lastGenerate = 0
-        self.setDeferInterval(base.config.GetDouble('deferred-generate-interval', 0.2))
+        self.setDeferInterval(ConfigVariableDouble('deferred-generate-interval', 0.2).value)
         self.noDefer = False  # Set this True to temporarily disable deferring.
 
         self.recorder = base.recorder
@@ -69,7 +69,7 @@ class ClientRepositoryBase(ConnectionRepository):
 
         # Keep track of how recently we last sent a heartbeat message.
         # We want to keep these coming at heartbeatInterval seconds.
-        self.heartbeatInterval = base.config.GetDouble('heartbeat-interval', 10)
+        self.heartbeatInterval = ConfigVariableDouble('heartbeat-interval', 10).value
         self.heartbeatStarted = 0
         self.lastHeartbeat = 0
 
@@ -497,7 +497,7 @@ class ClientRepositoryBase(ConnectionRepository):
 
     def handleServerHeartbeat(self, di):
         # Got a heartbeat message from the server.
-        if base.config.GetBool('server-heartbeat-info', 1):
+        if ConfigVariableBool('server-heartbeat-info', True):
             self.notify.info("Server heartbeat.")
 
     def handleSystemMessage(self, di):
@@ -581,7 +581,7 @@ class ClientRepositoryBase(ConnectionRepository):
         return worldNP
 
     def isLive(self):
-        if base.config.GetBool('force-live', 0):
+        if ConfigVariableBool('force-live', False):
             return True
         return not (__dev__ or launcher.isTestServer())
 

+ 1 - 1
direct/src/distributed/ClockDelta.py

@@ -248,7 +248,7 @@ class ClockDelta(DirectObject.DirectObject):
         # set movie-network-time 1, then we'll circumvent this logic
         # and always return now.
         if self.globalClock.getMode() == ClockObject.MNonRealTime and \
-           base.config.GetBool('movie-network-time', False):
+           ConfigVariableBool('movie-network-time', False):
             return now
 
         # First, determine what network time we have for 'now'.

+ 10 - 7
direct/src/distributed/DistributedCamera.py

@@ -4,6 +4,11 @@ from direct.fsm.FSM import FSM
 from direct.interval.IntervalGlobal import *
 from direct.distributed.DistributedObject import DistributedObject
 
+
+_camera_id = ConfigVariableInt('camera-id', -1)
+_aware_of_cameras = ConfigVariableInt('aware-of-cameras', 0)
+
+
 class Fixture(NodePath, FSM):
     def __init__(self, id, parent, pos, hpr, fov):
         NodePath.__init__(self, 'cam-%s' % id)
@@ -60,15 +65,13 @@ class Fixture(NodePath, FSM):
 
     def setRecordingInProgress(self, inProgress):
         self.recordingInProgress = inProgress
-        if self.recordingInProgress and \
-           base.config.GetInt('camera-id', -1) >= 0:
+        if self.recordingInProgress and _camera_id.value >= 0:
             self.hide()
         else:
             self.show()
 
     def show(self):
-        if base.config.GetBool('aware-of-cameras',0) and \
-           not self.recordingInProgress:
+        if _aware_of_cameras and not self.recordingInProgress:
             NodePath.show(self)
 
     def getScaleIval(self):
@@ -99,7 +102,7 @@ class Fixture(NodePath, FSM):
 
     def enterStandby(self):
         self.show()
-        if self.id == base.config.GetInt('camera-id', -1):
+        if self.id == _camera_id.value:
             self.setColorScale(3,0,0,1)
             self.getScaleIval().loop()
         else:
@@ -116,7 +119,7 @@ class Fixture(NodePath, FSM):
             self.scaleIval.finish()
 
     def enterRecording(self):
-        if base.config.GetInt('camera-id', -1) == self.id:
+        if _camera_id.value == self.id:
             self.demand('Using')
         else:
             self.show()
@@ -177,7 +180,7 @@ class DistributedCamera(DistributedObject):
         DistributedObject.__init__(self, cr)
         self.parent = None
         self.fixtures = {}
-        self.cameraId = base.config.GetInt('camera-id',0)
+        self.cameraId = _camera_id.value
 
     def __getitem__(self, index):
         return self.fixtures.get(index)

+ 10 - 11
direct/src/distributed/DistributedSmoothNode.py

@@ -7,22 +7,21 @@ from . import DistributedNode
 from . import DistributedSmoothNodeBase
 from direct.task.Task import cont
 from direct.task.TaskManagerGlobal import taskMgr
-from direct.showbase import DConfig as config
 from direct.showbase.PythonUtil import report
 
 # This number defines our tolerance for out-of-sync telemetry packets.
 # If a packet appears to have originated from more than MaxFuture
 # seconds in the future, assume we're out of sync with the other
 # avatar and suggest a resync for both.
-MaxFuture = config.GetFloat("smooth-max-future", 0.2)
+MaxFuture = ConfigVariableDouble("smooth-max-future", 0.2)
 
 # How frequently can we suggest a resynchronize with another client?
-MinSuggestResync = config.GetFloat("smooth-min-suggest-resync", 15)
+MinSuggestResync = ConfigVariableDouble("smooth-min-suggest-resync", 15)
 
 # These flags indicate whether global smoothing and/or prediction is
 # allowed or disallowed.
-EnableSmoothing = config.GetBool("smooth-enable-smoothing", 1)
-EnablePrediction = config.GetBool("smooth-enable-prediction", 1)
+EnableSmoothing = ConfigVariableBool("smooth-enable-smoothing", True)
+EnablePrediction = ConfigVariableBool("smooth-enable-prediction", True)
 
 # These values represent the amount of time, in seconds, to delay the
 # apparent position of other avatars, when non-predictive and
@@ -30,8 +29,8 @@ EnablePrediction = config.GetBool("smooth-enable-prediction", 1)
 # addition to the automatic delay of the observed average latency from
 # each avatar, which is intended to compensate for relative clock
 # skew.
-Lag = config.GetDouble("smooth-lag", 0.2)
-PredictionLag = config.GetDouble("smooth-prediction-lag", 0.0)
+Lag = ConfigVariableDouble("smooth-lag", 0.2)
+PredictionLag = ConfigVariableDouble("smooth-prediction-lag", 0.0)
 
 
 GlobalSmoothing = 0
@@ -358,10 +357,10 @@ class DistributedSmoothNode(DistributedNode.DistributedNode,
             # be just slightly in the past, but it might be off by as much
             # as this frame's amount of time forward or back.
             howFarFuture = local - now
-            if howFarFuture - chug >= MaxFuture:
+            if howFarFuture - chug >= MaxFuture.value:
                 # Too far off; advise the other client of our clock information.
                 if globalClockDelta.getUncertainty() is not None and \
-                   realTime - self.lastSuggestResync >= MinSuggestResync and \
+                   realTime - self.lastSuggestResync >= MinSuggestResync.value and \
                    hasattr(self.cr, 'localAvatarDoId'):
                     self.lastSuggestResync = realTime
                     timestampB = globalClockDelta.localToNetworkTime(realTime)
@@ -527,12 +526,12 @@ class DistributedSmoothNode(DistributedNode.DistributedNode,
                 # Prediction and smoothing.
                 self.smoother.setSmoothMode(SmoothMover.SMOn)
                 self.smoother.setPredictionMode(SmoothMover.PMOn)
-                self.smoother.setDelay(PredictionLag)
+                self.smoother.setDelay(PredictionLag.value)
             else:
                 # Smoothing, but no prediction.
                 self.smoother.setSmoothMode(SmoothMover.SMOn)
                 self.smoother.setPredictionMode(SmoothMover.PMOff)
-                self.smoother.setDelay(Lag)
+                self.smoother.setDelay(Lag.value)
         else:
             # No smoothing, no prediction.
             self.smoother.setSmoothMode(SmoothMover.SMOff)

+ 4 - 1
direct/src/distributed/ServerRepository.py

@@ -11,6 +11,9 @@ from direct.distributed.PyDatagram import PyDatagram
 import inspect
 
 
+_server_doid_range = ConfigVariableInt('server-doid-range', 1000000)
+
+
 class ServerRepository:
 
     """ This maintains the server-side connection with a Panda server.
@@ -134,7 +137,7 @@ class ServerRepository:
 
         # The number of doId's to assign to each client.  Must remain
         # constant during server lifetime.
-        self.doIdRange = base.config.GetInt('server-doid-range', 1000000)
+        self.doIdRange = _server_doid_range.value
 
         # An allocator object that assigns the next doIdBase to each
         # client.

+ 5 - 3
direct/src/gui/DirectGuiBase.py

@@ -102,6 +102,8 @@ from direct.task.TaskManagerGlobal import taskMgr
 
 guiObjectCollector = PStatCollector("Client::GuiObjects")
 
+_track_gui_items = ConfigVariableBool('track-gui-items', False)
+
 
 class DirectGuiBase(DirectObject.DirectObject):
     """Base class of all DirectGUI widgets."""
@@ -638,7 +640,7 @@ class DirectGuiBase(DirectObject.DirectObject):
         """
         # Need to tack on gui item specific id
         gEvent = event + self.guiId
-        if ShowBaseGlobal.config.GetBool('debug-directgui-msgs', False):
+        if ConfigVariableBool('debug-directgui-msgs', False):
             from direct.showbase.PythonUtil import StackTrace
             print(gEvent)
             print(StackTrace())
@@ -667,7 +669,7 @@ class DirectGuiWidget(DirectGuiBase, NodePath):
     # Determine the default initial state for inactive (or
     # unclickable) components.  If we are in edit mode, these are
     # actually clickable by default.
-    guiEdit = ShowBaseGlobal.config.GetBool('direct-gui-edit', False)
+    guiEdit = ConfigVariableBool('direct-gui-edit', False)
     if guiEdit:
         inactiveInitState = DGG.NORMAL
     else:
@@ -733,7 +735,7 @@ class DirectGuiWidget(DirectGuiBase, NodePath):
             guiObjectCollector.addLevel(1)
             guiObjectCollector.flushLevel()
             # track gui items by guiId for tracking down leaks
-            if ShowBaseGlobal.config.GetBool('track-gui-items', False):
+            if _track_gui_items:
                 if not hasattr(ShowBase, 'guiItems'):
                     ShowBase.guiItems = {}
                 if self.guiId in ShowBase.guiItems:

+ 22 - 3
direct/src/gui/OnscreenText.py

@@ -542,10 +542,18 @@ class OnscreenText(NodePath):
         for option, value in kw.items():
             # Use option string to access setter function
             try:
-                setter = getattr(self, 'set' + option[0].upper() + option[1:])
-                if setter == self.setPos:
-                    setter(value[0], value[1])
+                if option == 'pos':
+                    self.setTextPos(value[0], value[1])
+                elif option == 'roll':
+                    self.setTextR(-value)
+                elif option == 'scale':
+                    self.setTextScale(value)
+                elif option == 'x':
+                    self.setTextX(value)
+                elif option == 'y':
+                    self.setTextY(value)
                 else:
+                    setter = getattr(self, 'set' + option[0].upper() + option[1:])
                     setter(value)
             except AttributeError:
                 print('OnscreenText.configure: invalid option: %s' % option)
@@ -557,6 +565,17 @@ class OnscreenText(NodePath):
     def cget(self, option):
         # Get current configuration setting.
         # This is for compatibility with DirectGui functions
+        if option == 'pos':
+            return self.__pos
+        elif option == 'roll':
+            return self.__roll
+        elif option == 'scale':
+            return self.__scale
+        elif option == 'x':
+            return self.__pos[0]
+        elif option == 'y':
+            return self.__pos[1]
+
         getter = getattr(self, 'get' + option[0].upper() + option[1:])
         return getter()
 

+ 1 - 1
direct/src/leveleditor/ObjectMgrBase.py

@@ -64,7 +64,7 @@ class ObjectMgrBase:
         # [gjeon] to solve the problem of unproper $USERNAME
         userId = os.path.basename(os.path.expandvars('$USERNAME'))
         if userId == '':
-            userId = base.config.GetString("le-user-id")
+            userId = ConfigVariableString("le-user-id").value
         if userId == '':
             userId = 'unknown'
         newUid = str(time.time()) + userId

+ 4 - 1
direct/src/motiontrail/MotionTrail.py

@@ -7,6 +7,9 @@ from direct.directnotify.DirectNotifyGlobal import directNotify
 import warnings
 
 
+_want_python_motion_trails = ConfigVariableBool('want-python-motion-trails', False)
+
+
 def remove_task():
     if MotionTrail.task_added:
         total_motion_trails = len(MotionTrail.motion_trail_list)
@@ -134,7 +137,7 @@ class MotionTrail(NodePath, DirectObject):
         self.cmotion_trail.setGeomNode(self.geom_node)
 
         self.modified_vertices = True
-        if base.config.GetBool('want-python-motion-trails', 0):
+        if _want_python_motion_trails:
             self.use_python_version = True
         else:
             self.use_python_version = False

+ 7 - 6
direct/src/particles/SpriteParticleRendererExt.py

@@ -1,3 +1,4 @@
+from panda3d.core import ConfigVariableString
 from panda3d.physics import SpriteParticleRenderer
 
 
@@ -18,8 +19,8 @@ class SpriteParticleRendererExt(SpriteParticleRenderer):
 
     def getSourceTextureName(self):
         if self.sourceTextureName is None:
-            SpriteParticleRendererExt.sourceTextureName = base.config.GetString(
-                'particle-sprite-texture', 'maps/lightbulb.rgb')
+            SpriteParticleRendererExt.sourceTextureName = ConfigVariableString(
+                'particle-sprite-texture', 'maps/lightbulb.rgb').value
         # Return instance copy of class variable
         return self.sourceTextureName
 
@@ -57,8 +58,8 @@ class SpriteParticleRendererExt(SpriteParticleRenderer):
 
     def getSourceFileName(self):
         if self.sourceFileName is None:
-            SpriteParticleRendererExt.sourceFileName = base.config.GetString(
-                'particle-sprite-model', 'models/misc/smiley')
+            SpriteParticleRendererExt.sourceFileName = ConfigVariableString(
+                'particle-sprite-model', 'models/misc/smiley').value
         # Return instance copy of class variable
         return self.sourceFileName
 
@@ -68,8 +69,8 @@ class SpriteParticleRendererExt(SpriteParticleRenderer):
 
     def getSourceNodeName(self):
         if self.sourceNodeName is None:
-            SpriteParticleRendererExt.sourceNodeName = base.config.GetString(
-                'particle-sprite-node', '**/*')
+            SpriteParticleRendererExt.sourceNodeName = ConfigVariableString(
+                'particle-sprite-node', '**/*').value
         # Return instance copy of class variable
         return self.sourceNodeName
 

+ 5 - 7
direct/src/showbase/PythonUtil.py

@@ -641,9 +641,7 @@ if __debug__:
             def _profiled(*args, **kArgs):
                 name = '(%s) %s from %s' % (category, f.__name__, f.__module__)
 
-                # showbase might not be loaded yet, so don't use
-                # base.config.  Instead, query the ConfigVariableBool.
-                if (category is None) or ConfigVariableBool('want-profile-%s' % category, 0).getValue():
+                if category is None or ConfigVariableBool('want-profile-%s' % category, False).value:
                     return profileFunc(Functor(f, *args, **kArgs), name, terse)
                 else:
                     return f(*args, **kArgs)
@@ -1990,7 +1988,7 @@ def report(types = [], prefix = '', xform = None, notifyFunc = None, dConfigPara
         return f
 
     try:
-        if not (__dev__ or config.GetBool('force-reports', 0)):
+        if not __dev__ and not ConfigVariableBool('force-reports', False):
             return decorator
 
         # determine whether we should use the decorator
@@ -2006,7 +2004,7 @@ def report(types = [], prefix = '', xform = None, notifyFunc = None, dConfigPara
                 dConfigParams = dConfigParam
 
             dConfigParamList = [param for param in dConfigParams \
-                                if config.GetBool('want-%s-report' % (param,), 0)]
+                                if ConfigVariableBool('want-%s-report' % (param,), False)]
 
             doPrint = bool(dConfigParamList)
 
@@ -2256,12 +2254,12 @@ if __debug__:
     def quickProfile(name="unnamed"):
         import pstats
         def profileDecorator(f):
-            if not config.GetBool("use-profiler", False):
+            if not ConfigVariableBool("use-profiler", False):
                 return f
             def _profiled(*args, **kArgs):
                 # must do this in here because we don't have base/simbase
                 # at the time that PythonUtil is loaded
-                if not config.GetBool("profile-debug", False):
+                if not ConfigVariableBool("profile-debug", False):
                     #dumb timings
                     st=globalClock.getRealTime()
                     f(*args,**kArgs)

+ 56 - 60
direct/src/showbase/ShowBase.py

@@ -101,19 +101,21 @@ class ShowBase(DirectObject.DirectObject):
         including this instance itself (under the name ``base``).
         """
 
+        from . import ShowBaseGlobal
+
         #: Set if the want-dev Config.prc variable is enabled.  By default, it
         #: is set to True except when using Python with the -O flag.
-        self.__dev__ = self.config.GetBool('want-dev', __debug__)
+        self.__dev__ = ShowBaseGlobal.__dev__
         builtins.__dev__ = self.__dev__
 
-        logStackDump = (self.config.GetBool('log-stack-dump', False) or
-                        self.config.GetBool('client-log-stack-dump', False))
-        uploadStackDump = self.config.GetBool('upload-stack-dump', False)
+        logStackDump = (ConfigVariableBool('log-stack-dump', False).value or
+                        ConfigVariableBool('client-log-stack-dump', False).value)
+        uploadStackDump = ConfigVariableBool('upload-stack-dump', False).value
         if logStackDump or uploadStackDump:
             ExceptionVarDump.install(logStackDump, uploadStackDump)
 
         if __debug__:
-            self.__autoGarbageLogging = self.__dev__ and self.config.GetBool('auto-garbage-logging', False)
+            self.__autoGarbageLogging = self.__dev__ and ConfigVariableBool('auto-garbage-logging', False)
 
         #: The directory containing the main Python file of this application.
         self.mainDir = ExecutionEnvironment.getEnvironmentVariable("MAIN_DIR")
@@ -128,9 +130,12 @@ class ShowBase(DirectObject.DirectObject):
         self.debugRunningMultiplier = 4
 
         # [gjeon] to disable sticky keys
-        if self.config.GetBool('disable-sticky-keys', 0):
+        if ConfigVariableBool('disable-sticky-keys', False):
             storeAccessibilityShortcutKeys()
             allowAccessibilityShortcutKeys(False)
+            self.__disabledStickyKeys = True
+        else:
+            self.__disabledStickyKeys = False
 
         self.printEnvDebugInfo()
         vfs = VirtualFileSystem.getGlobalPtr()
@@ -140,18 +145,18 @@ class ShowBase(DirectObject.DirectObject):
         self.__deadInputs = 0
 
         # Store dconfig variables
-        self.sfxActive = self.config.GetBool('audio-sfx-active', 1)
-        self.musicActive = self.config.GetBool('audio-music-active', 1)
-        self.wantFog = self.config.GetBool('want-fog', 1)
-        self.wantRender2dp = self.config.GetBool('want-render2dp', 1)
+        self.sfxActive = ConfigVariableBool('audio-sfx-active', True).value
+        self.musicActive = ConfigVariableBool('audio-music-active', True).value
+        self.wantFog = ConfigVariableBool('want-fog', True).value
+        self.wantRender2dp = ConfigVariableBool('want-render2dp', True).value
 
-        self.screenshotExtension = self.config.GetString('screenshot-extension', 'jpg')
+        self.screenshotExtension = ConfigVariableString('screenshot-extension', 'jpg').value
         self.musicManager = None
         self.musicManagerIsValid = None
         self.sfxManagerList = []
         self.sfxManagerIsValidList = []
 
-        self.wantStats = self.config.GetBool('want-pstats', 0)
+        self.wantStats = ConfigVariableBool('want-pstats', False).value
         self.wantTk = False
         self.wantWx = False
         self.wantDirect = False
@@ -178,7 +183,7 @@ class ShowBase(DirectObject.DirectObject):
         # If the aspect ratio is 0 or None, it means to infer the
         # aspect ratio from the window size.
         # If you need to know the actual aspect ratio call base.getAspectRatio()
-        self.__configAspectRatio = ConfigVariableDouble('aspect-ratio', 0).getValue()
+        self.__configAspectRatio = ConfigVariableDouble('aspect-ratio', 0).value
         # This variable is used to see if the aspect ratio has changed when
         # we get a window-event.
         self.__oldAspectRatio = None
@@ -188,8 +193,8 @@ class ShowBase(DirectObject.DirectObject):
         #: be 'onscreen' (the default), 'offscreen' or 'none'.
         self.windowType = windowType
         if self.windowType is None:
-            self.windowType = self.config.GetString('window-type', 'onscreen')
-        self.requireWindow = self.config.GetBool('require-window', 1)
+            self.windowType = ConfigVariableString('window-type', 'onscreen').value
+        self.requireWindow = ConfigVariableBool('require-window', True).value
 
         #: This is the main, or only window; see `winList` for a list of *all* windows.
         self.win = None
@@ -262,11 +267,10 @@ class ShowBase(DirectObject.DirectObject):
             self.clusterSyncFlag = clusterSyncFlag
         except NameError:
             # Has the clusterSyncFlag been set via a config variable
-            self.clusterSyncFlag = self.config.GetBool('cluster-sync', 0)
+            self.clusterSyncFlag = ConfigVariableBool('cluster-sync', False)
 
         # We've already created aspect2d in ShowBaseGlobal, for the
         # benefit of creating DirectGui elements before ShowBase.
-        from . import ShowBaseGlobal
         self.hidden = ShowBaseGlobal.hidden
 
         #: The global :class:`~panda3d.core.GraphicsEngine`, as returned by
@@ -298,14 +302,14 @@ class ShowBase(DirectObject.DirectObject):
         # Maybe create a RecorderController to record and/or play back
         # the user session.
         self.recorder = None
-        playbackSession = self.config.GetString('playback-session', '')
-        recordSession = self.config.GetString('record-session', '')
-        if playbackSession:
+        playbackSession = ConfigVariableFilename('playback-session', '')
+        recordSession = ConfigVariableFilename('record-session', '')
+        if not playbackSession.empty():
             self.recorder = RecorderController()
-            self.recorder.beginPlayback(Filename.fromOsSpecific(playbackSession))
-        elif recordSession:
+            self.recorder.beginPlayback(playbackSession.value)
+        elif not recordSession.empty():
             self.recorder = RecorderController()
-            self.recorder.beginRecord(Filename.fromOsSpecific(recordSession))
+            self.recorder.beginRecord(recordSession.value)
 
         if self.recorder:
             # If we're either playing back or recording, pass the
@@ -319,19 +323,19 @@ class ShowBase(DirectObject.DirectObject):
 
         # For some reason, wx needs to be initialized before the graphics window
         if sys.platform == "darwin":
-            if self.config.GetBool("want-wx", 0):
+            if ConfigVariableBool("want-wx", False):
                 wx = importlib.import_module('wx')
                 self.wxApp = wx.App()
 
             # Same goes for Tk, which uses a conflicting NSApplication
-            if self.config.GetBool("want-tk", 0):
+            if ConfigVariableBool("want-tk", False):
                 Pmw = importlib.import_module('Pmw')
                 self.tkRoot = Pmw.initialise()
 
         # Open the default rendering window.
         if self.windowType != 'none':
             props = WindowProperties.getDefault()
-            if self.config.GetBool('read-raw-mice', 0):
+            if ConfigVariableBool('read-raw-mice', False):
                 props.setRawMice(1)
             self.openDefaultWindow(startDirect = False, props=props)
 
@@ -398,18 +402,18 @@ class ShowBase(DirectObject.DirectObject):
         # - pcalt-# (# is CPU number, 0-based)
         # - client-cpu-affinity config
         # - auto-single-cpu-affinity config
-        affinityMask = self.config.GetInt('client-cpu-affinity-mask', -1)
+        affinityMask = ConfigVariableInt('client-cpu-affinity-mask', -1).value
         if affinityMask != -1:
             TrueClock.getGlobalPtr().setCpuAffinity(affinityMask)
         else:
             # this is useful on machines that perform better with each process
             # assigned to a single CPU
-            autoAffinity = self.config.GetBool('auto-single-cpu-affinity', 0)
+            autoAffinity = ConfigVariableBool('auto-single-cpu-affinity', False).value
             affinity = None
             if autoAffinity and hasattr(builtins, 'clientIndex'):
                 affinity = abs(int(builtins.clientIndex))
             else:
-                affinity = self.config.GetInt('client-cpu-affinity', -1)
+                affinity = ConfigVariableInt('client-cpu-affinity', -1).value
             if (affinity in (None, -1)) and autoAffinity:
                 affinity = 0
             if affinity not in (None, -1):
@@ -467,13 +471,13 @@ class ShowBase(DirectObject.DirectObject):
 
         self.createBaseAudioManagers()
 
-        if self.__dev__ and self.config.GetBool('track-gui-items', False):
+        if self.__dev__ and ConfigVariableBool('track-gui-items', False):
             # dict of guiId to gui item, for tracking down leaks
             if not hasattr(ShowBase, 'guiItems'):
                 ShowBase.guiItems = {}
 
         # optionally restore the default gui sounds from 1.7.2 and earlier
-        if ConfigVariableBool('orig-gui-sounds', False).getValue():
+        if ConfigVariableBool('orig-gui-sounds', False).value:
             from direct.gui import DirectGuiGlobals as DGG
             DGG.setDefaultClickSound(self.loader.loadSfx("audio/sfx/GUI_click.wav"))
             DGG.setDefaultRolloverSound(self.loader.loadSfx("audio/sfx/GUI_rollover.wav"))
@@ -495,18 +499,15 @@ class ShowBase(DirectObject.DirectObject):
             self.setupWindowControls()
 
         # Client sleep
-        sleepTime = self.config.GetFloat('client-sleep', 0.0)
+        sleepTime = ConfigVariableDouble('client-sleep', 0.0)
         self.clientSleep = 0.0
-        self.setSleep(sleepTime)
+        self.setSleep(sleepTime.value)
 
         # Extra sleep for running 4+ clients on a single machine
         # adds a sleep right after the main render in igloop
         # tends to even out the frame rate and keeps it from going
         # to zero in the out of focus windows
-        if self.config.GetBool('multi-sleep', 0):
-            self.multiClientSleep = 1
-        else:
-            self.multiClientSleep = 0
+        self.multiClientSleep = ConfigVariableBool('multi-sleep', False)
 
         #: Utility for viewing offscreen buffers, see :mod:`.BufferViewer`.
         self.bufferViewer = BufferViewer(self.win, self.render2dp if self.wantRender2dp else self.render2d)
@@ -515,7 +516,7 @@ class ShowBase(DirectObject.DirectObject):
             if fStartDirect: # [gjeon] if this is False let them start direct manually
                 self.__doStartDirect()
 
-            if self.config.GetBool('show-tex-mem', False):
+            if ConfigVariableBool('show-tex-mem', False):
                 if not self.texmem or self.texmem.cleanedUp:
                     self.toggleTexMem()
 
@@ -543,10 +544,10 @@ class ShowBase(DirectObject.DirectObject):
         except ImportError:
             return
 
-        profile.Profile.bias = float(self.config.GetString("profile-bias","0"))
+        profile.Profile.bias = ConfigVariableDouble("profile-bias", 0.0).value
 
         def f8(x):
-            return ("%" + "8.%df" % self.config.GetInt("profile-decimals", 3)) % x
+            return ("%" + "8.%df" % ConfigVariableInt("profile-decimals", 3)) % x
         pstats.f8 = f8
 
     # temp; see ToonBase.py
@@ -558,7 +559,7 @@ class ShowBase(DirectObject.DirectObject):
         in.  Stuff like the model paths and other paths.  Feel free to
         add stuff to this.
         """
-        if self.config.GetBool('want-env-debug-info', 0):
+        if ConfigVariableBool('want-env-debug-info', False):
             print("\n\nEnvironment Debug Info {")
             print("* model path:")
             print(getModelPath())
@@ -593,8 +594,9 @@ class ShowBase(DirectObject.DirectObject):
         self.aspect2d.reparent_to(self.render2d)
 
         # [gjeon] restore sticky key settings
-        if self.config.GetBool('disable-sticky-keys', 0):
+        if self.__disabledStickyKeys:
             allowAccessibilityShortcutKeys(True)
+            self.__disabledStickyKeys = False
 
         self.ignoreAll()
         self.shutdown()
@@ -1076,16 +1078,10 @@ class ShowBase(DirectObject.DirectObject):
                 self.win.setClearStencilActive(oldClearStencilActive)
                 self.win.setClearStencil(oldClearStencil)
 
-            flag = self.config.GetBool('show-frame-rate-meter', False)
-            if self.appRunner is not None and self.appRunner.allowPythonDev:
-                # In an allow_python_dev p3d application, we always
-                # start up with the frame rate meter enabled, to
-                # provide a visual reminder that this flag has been
-                # set.
-                flag = True
-            self.setFrameRateMeter(flag)
-            flag = self.config.GetBool('show-scene-graph-analyzer-meter', False)
-            self.setSceneGraphAnalyzerMeter(flag)
+            flag = ConfigVariableBool('show-frame-rate-meter', False)
+            self.setFrameRateMeter(flag.value)
+            flag = ConfigVariableBool('show-scene-graph-analyzer-meter', False)
+            self.setSceneGraphAnalyzerMeter(flag.value)
         return success
 
     def setSleep(self, amount):
@@ -2240,7 +2236,7 @@ class ShowBase(DirectObject.DirectObject):
         # between collisionLoop and igLoop
         self.taskMgr.add(self.__collisionLoop, 'collisionLoop', sort = 30)
 
-        if ConfigVariableBool('garbage-collect-states').getValue():
+        if ConfigVariableBool('garbage-collect-states').value:
             self.taskMgr.add(self.__garbageCollectStates, 'garbageCollectStates', sort = 46)
         # give the igLoop task a reasonably "late" sort,
         # so that it will get run after most tasks
@@ -2508,7 +2504,7 @@ class ShowBase(DirectObject.DirectObject):
         # Make the spots round, so there's less static in the display.
         # This forces software point generation on many drivers, so
         # it's not on by default.
-        if self.config.GetBool('round-show-vertices', False):
+        if ConfigVariableBool('round-show-vertices', False):
             spot = PNMImage(256, 256, 1)
             spot.renderSpot((1, 1, 1, 1), (0, 0, 0, 0), 0.8, 1)
             tex = Texture('spot')
@@ -3134,7 +3130,7 @@ class ShowBase(DirectObject.DirectObject):
             # Set a timer to run the Panda frame 60 times per second.
             wxFrameRate = ConfigVariableDouble('wx-frame-rate', 60.0)
             self.wxTimer = wx.Timer(self.wxApp)
-            self.wxTimer.Start(1000.0 / wxFrameRate.getValue())
+            self.wxTimer.Start(1000.0 / wxFrameRate.value)
             self.wxApp.Bind(wx.EVT_TIMER, self.__wxTimerCallback)
 
             # wx is now the main loop, not us any more.
@@ -3221,7 +3217,7 @@ class ShowBase(DirectObject.DirectObject):
 
             # Set a timer to run the Panda frame 60 times per second.
             tkFrameRate = ConfigVariableDouble('tk-frame-rate', 60.0)
-            self.tkDelay = int(1000.0 / tkFrameRate.getValue())
+            self.tkDelay = int(1000.0 / tkFrameRate.value)
             self.tkRoot.after(self.tkDelay, self.__tkTimerCallback)
 
             # wx is now the main loop, not us any more.
@@ -3301,11 +3297,11 @@ class ShowBase(DirectObject.DirectObject):
         self.__directStarted = False
 
         # Start Tk, Wx and DIRECT if specified by Config.prc
-        fTk = self.config.GetBool('want-tk', 0)
-        fWx = self.config.GetBool('want-wx', 0)
+        fTk = ConfigVariableBool('want-tk', False).value
+        fWx = ConfigVariableBool('want-wx', False).value
         # Start DIRECT if specified in Config.prc or in cluster mode
-        fDirect = (self.config.GetBool('want-directtools', 0) or
-                   (self.config.GetString("cluster-mode", '') != ''))
+        fDirect = (ConfigVariableBool('want-directtools', 0).value or
+                   (not ConfigVariableString("cluster-mode", '').empty()))
         # Set fWantTk to 0 to avoid starting Tk with this call
         self.startDirect(fWantDirect = fDirect, fWantTk = fTk, fWantWx = fWx)
 

+ 2 - 2
direct/src/showbase/ShowBaseGlobal.py

@@ -16,12 +16,12 @@ __all__ = []
 from .ShowBase import ShowBase, WindowControls # pylint: disable=unused-import
 from direct.directnotify.DirectNotifyGlobal import directNotify, giveNotify # pylint: disable=unused-import
 from panda3d.core import VirtualFileSystem, Notify, ClockObject, PandaSystem
-from panda3d.core import ConfigPageManager, ConfigVariableManager
+from panda3d.core import ConfigPageManager, ConfigVariableManager, ConfigVariableBool
 from panda3d.core import NodePath, PGTop
 from . import DConfig as config
 import warnings
 
-__dev__ = config.GetBool('want-dev', __debug__)
+__dev__ = ConfigVariableBool('want-dev', __debug__).value
 
 #: The global instance of the :ref:`virtual-file-system`, as obtained using
 #: :meth:`panda3d.core.VirtualFileSystem.getGlobalPtr()`.