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.joybox = None
         self.radamec = None
         self.radamec = None
         self.fastrak = []
         self.fastrak = []
-        if base.config.GetBool('want-vrpn', 0):
+        if ConfigVariableBool('want-vrpn', False):
             from direct.directdevices import DirectDeviceManager
             from direct.directdevices import DirectDeviceManager
             self.deviceManager = DirectDeviceManager.DirectDeviceManager()
             self.deviceManager = DirectDeviceManager.DirectDeviceManager()
             # Automatically create any devices specified in config file
             # 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:
             if joybox:
                 from direct.directdevices import DirectJoybox
                 from direct.directdevices import DirectJoybox
                 self.joybox = DirectJoybox.DirectJoybox(joybox)
                 self.joybox = DirectJoybox.DirectJoybox(joybox)
@@ -300,7 +300,7 @@ class DirectSession(DirectObject):
             self.clusterMode = clusterMode
             self.clusterMode = clusterMode
         except NameError:
         except NameError:
             # Has the clusterMode been set via a config variable?
             # 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':
         if self.clusterMode == 'client':
             self.cluster = createClusterClient()
             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)
         ConnectionRepository.__init__(self, connectMethod, base.config, hasOwnerView = True, threadedNet = threadedNet)
         self.dcSuffix = dcSuffix
         self.dcSuffix = dcSuffix
         if hasattr(self, 'setVerbose'):
         if hasattr(self, 'setVerbose'):
-            if self.config.GetBool('verbose-clientrepository'):
+            if ConfigVariableBool('verbose-clientrepository', False):
                 self.setVerbose(1)
                 self.setVerbose(1)
 
 
         self.context=100000
         self.context=100000
@@ -42,7 +42,7 @@ class ClientRepositoryBase(ConnectionRepository):
         self.deferredGenerates = []
         self.deferredGenerates = []
         self.deferredDoIds = {}
         self.deferredDoIds = {}
         self.lastGenerate = 0
         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.noDefer = False  # Set this True to temporarily disable deferring.
 
 
         self.recorder = base.recorder
         self.recorder = base.recorder
@@ -69,7 +69,7 @@ class ClientRepositoryBase(ConnectionRepository):
 
 
         # Keep track of how recently we last sent a heartbeat message.
         # Keep track of how recently we last sent a heartbeat message.
         # We want to keep these coming at heartbeatInterval seconds.
         # 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.heartbeatStarted = 0
         self.lastHeartbeat = 0
         self.lastHeartbeat = 0
 
 
@@ -497,7 +497,7 @@ class ClientRepositoryBase(ConnectionRepository):
 
 
     def handleServerHeartbeat(self, di):
     def handleServerHeartbeat(self, di):
         # Got a heartbeat message from the server.
         # 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.")
             self.notify.info("Server heartbeat.")
 
 
     def handleSystemMessage(self, di):
     def handleSystemMessage(self, di):
@@ -581,7 +581,7 @@ class ClientRepositoryBase(ConnectionRepository):
         return worldNP
         return worldNP
 
 
     def isLive(self):
     def isLive(self):
-        if base.config.GetBool('force-live', 0):
+        if ConfigVariableBool('force-live', False):
             return True
             return True
         return not (__dev__ or launcher.isTestServer())
         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
         # set movie-network-time 1, then we'll circumvent this logic
         # and always return now.
         # and always return now.
         if self.globalClock.getMode() == ClockObject.MNonRealTime and \
         if self.globalClock.getMode() == ClockObject.MNonRealTime and \
-           base.config.GetBool('movie-network-time', False):
+           ConfigVariableBool('movie-network-time', False):
             return now
             return now
 
 
         # First, determine what network time we have for '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.interval.IntervalGlobal import *
 from direct.distributed.DistributedObject import DistributedObject
 from direct.distributed.DistributedObject import DistributedObject
 
 
+
+_camera_id = ConfigVariableInt('camera-id', -1)
+_aware_of_cameras = ConfigVariableInt('aware-of-cameras', 0)
+
+
 class Fixture(NodePath, FSM):
 class Fixture(NodePath, FSM):
     def __init__(self, id, parent, pos, hpr, fov):
     def __init__(self, id, parent, pos, hpr, fov):
         NodePath.__init__(self, 'cam-%s' % id)
         NodePath.__init__(self, 'cam-%s' % id)
@@ -60,15 +65,13 @@ class Fixture(NodePath, FSM):
 
 
     def setRecordingInProgress(self, inProgress):
     def setRecordingInProgress(self, inProgress):
         self.recordingInProgress = 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()
             self.hide()
         else:
         else:
             self.show()
             self.show()
 
 
     def show(self):
     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)
             NodePath.show(self)
 
 
     def getScaleIval(self):
     def getScaleIval(self):
@@ -99,7 +102,7 @@ class Fixture(NodePath, FSM):
 
 
     def enterStandby(self):
     def enterStandby(self):
         self.show()
         self.show()
-        if self.id == base.config.GetInt('camera-id', -1):
+        if self.id == _camera_id.value:
             self.setColorScale(3,0,0,1)
             self.setColorScale(3,0,0,1)
             self.getScaleIval().loop()
             self.getScaleIval().loop()
         else:
         else:
@@ -116,7 +119,7 @@ class Fixture(NodePath, FSM):
             self.scaleIval.finish()
             self.scaleIval.finish()
 
 
     def enterRecording(self):
     def enterRecording(self):
-        if base.config.GetInt('camera-id', -1) == self.id:
+        if _camera_id.value == self.id:
             self.demand('Using')
             self.demand('Using')
         else:
         else:
             self.show()
             self.show()
@@ -177,7 +180,7 @@ class DistributedCamera(DistributedObject):
         DistributedObject.__init__(self, cr)
         DistributedObject.__init__(self, cr)
         self.parent = None
         self.parent = None
         self.fixtures = {}
         self.fixtures = {}
-        self.cameraId = base.config.GetInt('camera-id',0)
+        self.cameraId = _camera_id.value
 
 
     def __getitem__(self, index):
     def __getitem__(self, index):
         return self.fixtures.get(index)
         return self.fixtures.get(index)

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

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

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

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

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

@@ -102,6 +102,8 @@ from direct.task.TaskManagerGlobal import taskMgr
 
 
 guiObjectCollector = PStatCollector("Client::GuiObjects")
 guiObjectCollector = PStatCollector("Client::GuiObjects")
 
 
+_track_gui_items = ConfigVariableBool('track-gui-items', False)
+
 
 
 class DirectGuiBase(DirectObject.DirectObject):
 class DirectGuiBase(DirectObject.DirectObject):
     """Base class of all DirectGUI widgets."""
     """Base class of all DirectGUI widgets."""
@@ -638,7 +640,7 @@ class DirectGuiBase(DirectObject.DirectObject):
         """
         """
         # Need to tack on gui item specific id
         # Need to tack on gui item specific id
         gEvent = event + self.guiId
         gEvent = event + self.guiId
-        if ShowBaseGlobal.config.GetBool('debug-directgui-msgs', False):
+        if ConfigVariableBool('debug-directgui-msgs', False):
             from direct.showbase.PythonUtil import StackTrace
             from direct.showbase.PythonUtil import StackTrace
             print(gEvent)
             print(gEvent)
             print(StackTrace())
             print(StackTrace())
@@ -667,7 +669,7 @@ class DirectGuiWidget(DirectGuiBase, NodePath):
     # Determine the default initial state for inactive (or
     # Determine the default initial state for inactive (or
     # unclickable) components.  If we are in edit mode, these are
     # unclickable) components.  If we are in edit mode, these are
     # actually clickable by default.
     # actually clickable by default.
-    guiEdit = ShowBaseGlobal.config.GetBool('direct-gui-edit', False)
+    guiEdit = ConfigVariableBool('direct-gui-edit', False)
     if guiEdit:
     if guiEdit:
         inactiveInitState = DGG.NORMAL
         inactiveInitState = DGG.NORMAL
     else:
     else:
@@ -733,7 +735,7 @@ class DirectGuiWidget(DirectGuiBase, NodePath):
             guiObjectCollector.addLevel(1)
             guiObjectCollector.addLevel(1)
             guiObjectCollector.flushLevel()
             guiObjectCollector.flushLevel()
             # track gui items by guiId for tracking down leaks
             # 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'):
                 if not hasattr(ShowBase, 'guiItems'):
                     ShowBase.guiItems = {}
                     ShowBase.guiItems = {}
                 if self.guiId in 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():
         for option, value in kw.items():
             # Use option string to access setter function
             # Use option string to access setter function
             try:
             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:
                 else:
+                    setter = getattr(self, 'set' + option[0].upper() + option[1:])
                     setter(value)
                     setter(value)
             except AttributeError:
             except AttributeError:
                 print('OnscreenText.configure: invalid option: %s' % option)
                 print('OnscreenText.configure: invalid option: %s' % option)
@@ -557,6 +565,17 @@ class OnscreenText(NodePath):
     def cget(self, option):
     def cget(self, option):
         # Get current configuration setting.
         # Get current configuration setting.
         # This is for compatibility with DirectGui functions
         # 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:])
         getter = getattr(self, 'get' + option[0].upper() + option[1:])
         return getter()
         return getter()
 
 

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

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

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

@@ -7,6 +7,9 @@ from direct.directnotify.DirectNotifyGlobal import directNotify
 import warnings
 import warnings
 
 
 
 
+_want_python_motion_trails = ConfigVariableBool('want-python-motion-trails', False)
+
+
 def remove_task():
 def remove_task():
     if MotionTrail.task_added:
     if MotionTrail.task_added:
         total_motion_trails = len(MotionTrail.motion_trail_list)
         total_motion_trails = len(MotionTrail.motion_trail_list)
@@ -134,7 +137,7 @@ class MotionTrail(NodePath, DirectObject):
         self.cmotion_trail.setGeomNode(self.geom_node)
         self.cmotion_trail.setGeomNode(self.geom_node)
 
 
         self.modified_vertices = True
         self.modified_vertices = True
-        if base.config.GetBool('want-python-motion-trails', 0):
+        if _want_python_motion_trails:
             self.use_python_version = True
             self.use_python_version = True
         else:
         else:
             self.use_python_version = False
             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
 from panda3d.physics import SpriteParticleRenderer
 
 
 
 
@@ -18,8 +19,8 @@ class SpriteParticleRendererExt(SpriteParticleRenderer):
 
 
     def getSourceTextureName(self):
     def getSourceTextureName(self):
         if self.sourceTextureName is None:
         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 instance copy of class variable
         return self.sourceTextureName
         return self.sourceTextureName
 
 
@@ -57,8 +58,8 @@ class SpriteParticleRendererExt(SpriteParticleRenderer):
 
 
     def getSourceFileName(self):
     def getSourceFileName(self):
         if self.sourceFileName is None:
         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 instance copy of class variable
         return self.sourceFileName
         return self.sourceFileName
 
 
@@ -68,8 +69,8 @@ class SpriteParticleRendererExt(SpriteParticleRenderer):
 
 
     def getSourceNodeName(self):
     def getSourceNodeName(self):
         if self.sourceNodeName is None:
         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 instance copy of class variable
         return self.sourceNodeName
         return self.sourceNodeName
 
 

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

@@ -641,9 +641,7 @@ if __debug__:
             def _profiled(*args, **kArgs):
             def _profiled(*args, **kArgs):
                 name = '(%s) %s from %s' % (category, f.__name__, f.__module__)
                 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)
                     return profileFunc(Functor(f, *args, **kArgs), name, terse)
                 else:
                 else:
                     return f(*args, **kArgs)
                     return f(*args, **kArgs)
@@ -1990,7 +1988,7 @@ def report(types = [], prefix = '', xform = None, notifyFunc = None, dConfigPara
         return f
         return f
 
 
     try:
     try:
-        if not (__dev__ or config.GetBool('force-reports', 0)):
+        if not __dev__ and not ConfigVariableBool('force-reports', False):
             return decorator
             return decorator
 
 
         # determine whether we should use the decorator
         # determine whether we should use the decorator
@@ -2006,7 +2004,7 @@ def report(types = [], prefix = '', xform = None, notifyFunc = None, dConfigPara
                 dConfigParams = dConfigParam
                 dConfigParams = dConfigParam
 
 
             dConfigParamList = [param for param in dConfigParams \
             dConfigParamList = [param for param in dConfigParams \
-                                if config.GetBool('want-%s-report' % (param,), 0)]
+                                if ConfigVariableBool('want-%s-report' % (param,), False)]
 
 
             doPrint = bool(dConfigParamList)
             doPrint = bool(dConfigParamList)
 
 
@@ -2256,12 +2254,12 @@ if __debug__:
     def quickProfile(name="unnamed"):
     def quickProfile(name="unnamed"):
         import pstats
         import pstats
         def profileDecorator(f):
         def profileDecorator(f):
-            if not config.GetBool("use-profiler", False):
+            if not ConfigVariableBool("use-profiler", False):
                 return f
                 return f
             def _profiled(*args, **kArgs):
             def _profiled(*args, **kArgs):
                 # must do this in here because we don't have base/simbase
                 # must do this in here because we don't have base/simbase
                 # at the time that PythonUtil is loaded
                 # at the time that PythonUtil is loaded
-                if not config.GetBool("profile-debug", False):
+                if not ConfigVariableBool("profile-debug", False):
                     #dumb timings
                     #dumb timings
                     st=globalClock.getRealTime()
                     st=globalClock.getRealTime()
                     f(*args,**kArgs)
                     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``).
         including this instance itself (under the name ``base``).
         """
         """
 
 
+        from . import ShowBaseGlobal
+
         #: Set if the want-dev Config.prc variable is enabled.  By default, it
         #: 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.
         #: 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__
         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:
         if logStackDump or uploadStackDump:
             ExceptionVarDump.install(logStackDump, uploadStackDump)
             ExceptionVarDump.install(logStackDump, uploadStackDump)
 
 
         if __debug__:
         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.
         #: The directory containing the main Python file of this application.
         self.mainDir = ExecutionEnvironment.getEnvironmentVariable("MAIN_DIR")
         self.mainDir = ExecutionEnvironment.getEnvironmentVariable("MAIN_DIR")
@@ -128,9 +130,12 @@ class ShowBase(DirectObject.DirectObject):
         self.debugRunningMultiplier = 4
         self.debugRunningMultiplier = 4
 
 
         # [gjeon] to disable sticky keys
         # [gjeon] to disable sticky keys
-        if self.config.GetBool('disable-sticky-keys', 0):
+        if ConfigVariableBool('disable-sticky-keys', False):
             storeAccessibilityShortcutKeys()
             storeAccessibilityShortcutKeys()
             allowAccessibilityShortcutKeys(False)
             allowAccessibilityShortcutKeys(False)
+            self.__disabledStickyKeys = True
+        else:
+            self.__disabledStickyKeys = False
 
 
         self.printEnvDebugInfo()
         self.printEnvDebugInfo()
         vfs = VirtualFileSystem.getGlobalPtr()
         vfs = VirtualFileSystem.getGlobalPtr()
@@ -140,18 +145,18 @@ class ShowBase(DirectObject.DirectObject):
         self.__deadInputs = 0
         self.__deadInputs = 0
 
 
         # Store dconfig variables
         # 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.musicManager = None
         self.musicManagerIsValid = None
         self.musicManagerIsValid = None
         self.sfxManagerList = []
         self.sfxManagerList = []
         self.sfxManagerIsValidList = []
         self.sfxManagerIsValidList = []
 
 
-        self.wantStats = self.config.GetBool('want-pstats', 0)
+        self.wantStats = ConfigVariableBool('want-pstats', False).value
         self.wantTk = False
         self.wantTk = False
         self.wantWx = False
         self.wantWx = False
         self.wantDirect = 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
         # If the aspect ratio is 0 or None, it means to infer the
         # aspect ratio from the window size.
         # aspect ratio from the window size.
         # If you need to know the actual aspect ratio call base.getAspectRatio()
         # 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
         # This variable is used to see if the aspect ratio has changed when
         # we get a window-event.
         # we get a window-event.
         self.__oldAspectRatio = None
         self.__oldAspectRatio = None
@@ -188,8 +193,8 @@ class ShowBase(DirectObject.DirectObject):
         #: be 'onscreen' (the default), 'offscreen' or 'none'.
         #: be 'onscreen' (the default), 'offscreen' or 'none'.
         self.windowType = windowType
         self.windowType = windowType
         if self.windowType is None:
         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.
         #: This is the main, or only window; see `winList` for a list of *all* windows.
         self.win = None
         self.win = None
@@ -262,11 +267,10 @@ class ShowBase(DirectObject.DirectObject):
             self.clusterSyncFlag = clusterSyncFlag
             self.clusterSyncFlag = clusterSyncFlag
         except NameError:
         except NameError:
             # Has the clusterSyncFlag been set via a config variable
             # 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
         # We've already created aspect2d in ShowBaseGlobal, for the
         # benefit of creating DirectGui elements before ShowBase.
         # benefit of creating DirectGui elements before ShowBase.
-        from . import ShowBaseGlobal
         self.hidden = ShowBaseGlobal.hidden
         self.hidden = ShowBaseGlobal.hidden
 
 
         #: The global :class:`~panda3d.core.GraphicsEngine`, as returned by
         #: 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
         # Maybe create a RecorderController to record and/or play back
         # the user session.
         # the user session.
         self.recorder = None
         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 = RecorderController()
-            self.recorder.beginPlayback(Filename.fromOsSpecific(playbackSession))
-        elif recordSession:
+            self.recorder.beginPlayback(playbackSession.value)
+        elif not recordSession.empty():
             self.recorder = RecorderController()
             self.recorder = RecorderController()
-            self.recorder.beginRecord(Filename.fromOsSpecific(recordSession))
+            self.recorder.beginRecord(recordSession.value)
 
 
         if self.recorder:
         if self.recorder:
             # If we're either playing back or recording, pass the
             # 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
         # For some reason, wx needs to be initialized before the graphics window
         if sys.platform == "darwin":
         if sys.platform == "darwin":
-            if self.config.GetBool("want-wx", 0):
+            if ConfigVariableBool("want-wx", False):
                 wx = importlib.import_module('wx')
                 wx = importlib.import_module('wx')
                 self.wxApp = wx.App()
                 self.wxApp = wx.App()
 
 
             # Same goes for Tk, which uses a conflicting NSApplication
             # 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')
                 Pmw = importlib.import_module('Pmw')
                 self.tkRoot = Pmw.initialise()
                 self.tkRoot = Pmw.initialise()
 
 
         # Open the default rendering window.
         # Open the default rendering window.
         if self.windowType != 'none':
         if self.windowType != 'none':
             props = WindowProperties.getDefault()
             props = WindowProperties.getDefault()
-            if self.config.GetBool('read-raw-mice', 0):
+            if ConfigVariableBool('read-raw-mice', False):
                 props.setRawMice(1)
                 props.setRawMice(1)
             self.openDefaultWindow(startDirect = False, props=props)
             self.openDefaultWindow(startDirect = False, props=props)
 
 
@@ -398,18 +402,18 @@ class ShowBase(DirectObject.DirectObject):
         # - pcalt-# (# is CPU number, 0-based)
         # - pcalt-# (# is CPU number, 0-based)
         # - client-cpu-affinity config
         # - client-cpu-affinity config
         # - auto-single-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:
         if affinityMask != -1:
             TrueClock.getGlobalPtr().setCpuAffinity(affinityMask)
             TrueClock.getGlobalPtr().setCpuAffinity(affinityMask)
         else:
         else:
             # this is useful on machines that perform better with each process
             # this is useful on machines that perform better with each process
             # assigned to a single CPU
             # assigned to a single CPU
-            autoAffinity = self.config.GetBool('auto-single-cpu-affinity', 0)
+            autoAffinity = ConfigVariableBool('auto-single-cpu-affinity', False).value
             affinity = None
             affinity = None
             if autoAffinity and hasattr(builtins, 'clientIndex'):
             if autoAffinity and hasattr(builtins, 'clientIndex'):
                 affinity = abs(int(builtins.clientIndex))
                 affinity = abs(int(builtins.clientIndex))
             else:
             else:
-                affinity = self.config.GetInt('client-cpu-affinity', -1)
+                affinity = ConfigVariableInt('client-cpu-affinity', -1).value
             if (affinity in (None, -1)) and autoAffinity:
             if (affinity in (None, -1)) and autoAffinity:
                 affinity = 0
                 affinity = 0
             if affinity not in (None, -1):
             if affinity not in (None, -1):
@@ -467,13 +471,13 @@ class ShowBase(DirectObject.DirectObject):
 
 
         self.createBaseAudioManagers()
         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
             # dict of guiId to gui item, for tracking down leaks
             if not hasattr(ShowBase, 'guiItems'):
             if not hasattr(ShowBase, 'guiItems'):
                 ShowBase.guiItems = {}
                 ShowBase.guiItems = {}
 
 
         # optionally restore the default gui sounds from 1.7.2 and earlier
         # 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
             from direct.gui import DirectGuiGlobals as DGG
             DGG.setDefaultClickSound(self.loader.loadSfx("audio/sfx/GUI_click.wav"))
             DGG.setDefaultClickSound(self.loader.loadSfx("audio/sfx/GUI_click.wav"))
             DGG.setDefaultRolloverSound(self.loader.loadSfx("audio/sfx/GUI_rollover.wav"))
             DGG.setDefaultRolloverSound(self.loader.loadSfx("audio/sfx/GUI_rollover.wav"))
@@ -495,18 +499,15 @@ class ShowBase(DirectObject.DirectObject):
             self.setupWindowControls()
             self.setupWindowControls()
 
 
         # Client sleep
         # Client sleep
-        sleepTime = self.config.GetFloat('client-sleep', 0.0)
+        sleepTime = ConfigVariableDouble('client-sleep', 0.0)
         self.clientSleep = 0.0
         self.clientSleep = 0.0
-        self.setSleep(sleepTime)
+        self.setSleep(sleepTime.value)
 
 
         # Extra sleep for running 4+ clients on a single machine
         # Extra sleep for running 4+ clients on a single machine
         # adds a sleep right after the main render in igloop
         # adds a sleep right after the main render in igloop
         # tends to even out the frame rate and keeps it from going
         # tends to even out the frame rate and keeps it from going
         # to zero in the out of focus windows
         # 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`.
         #: Utility for viewing offscreen buffers, see :mod:`.BufferViewer`.
         self.bufferViewer = BufferViewer(self.win, self.render2dp if self.wantRender2dp else self.render2d)
         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
             if fStartDirect: # [gjeon] if this is False let them start direct manually
                 self.__doStartDirect()
                 self.__doStartDirect()
 
 
-            if self.config.GetBool('show-tex-mem', False):
+            if ConfigVariableBool('show-tex-mem', False):
                 if not self.texmem or self.texmem.cleanedUp:
                 if not self.texmem or self.texmem.cleanedUp:
                     self.toggleTexMem()
                     self.toggleTexMem()
 
 
@@ -543,10 +544,10 @@ class ShowBase(DirectObject.DirectObject):
         except ImportError:
         except ImportError:
             return
             return
 
 
-        profile.Profile.bias = float(self.config.GetString("profile-bias","0"))
+        profile.Profile.bias = ConfigVariableDouble("profile-bias", 0.0).value
 
 
         def f8(x):
         def f8(x):
-            return ("%" + "8.%df" % self.config.GetInt("profile-decimals", 3)) % x
+            return ("%" + "8.%df" % ConfigVariableInt("profile-decimals", 3)) % x
         pstats.f8 = f8
         pstats.f8 = f8
 
 
     # temp; see ToonBase.py
     # temp; see ToonBase.py
@@ -558,7 +559,7 @@ class ShowBase(DirectObject.DirectObject):
         in.  Stuff like the model paths and other paths.  Feel free to
         in.  Stuff like the model paths and other paths.  Feel free to
         add stuff to this.
         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("\n\nEnvironment Debug Info {")
             print("* model path:")
             print("* model path:")
             print(getModelPath())
             print(getModelPath())
@@ -593,8 +594,9 @@ class ShowBase(DirectObject.DirectObject):
         self.aspect2d.reparent_to(self.render2d)
         self.aspect2d.reparent_to(self.render2d)
 
 
         # [gjeon] restore sticky key settings
         # [gjeon] restore sticky key settings
-        if self.config.GetBool('disable-sticky-keys', 0):
+        if self.__disabledStickyKeys:
             allowAccessibilityShortcutKeys(True)
             allowAccessibilityShortcutKeys(True)
+            self.__disabledStickyKeys = False
 
 
         self.ignoreAll()
         self.ignoreAll()
         self.shutdown()
         self.shutdown()
@@ -1076,16 +1078,10 @@ class ShowBase(DirectObject.DirectObject):
                 self.win.setClearStencilActive(oldClearStencilActive)
                 self.win.setClearStencilActive(oldClearStencilActive)
                 self.win.setClearStencil(oldClearStencil)
                 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
         return success
 
 
     def setSleep(self, amount):
     def setSleep(self, amount):
@@ -2240,7 +2236,7 @@ class ShowBase(DirectObject.DirectObject):
         # between collisionLoop and igLoop
         # between collisionLoop and igLoop
         self.taskMgr.add(self.__collisionLoop, 'collisionLoop', sort = 30)
         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)
             self.taskMgr.add(self.__garbageCollectStates, 'garbageCollectStates', sort = 46)
         # give the igLoop task a reasonably "late" sort,
         # give the igLoop task a reasonably "late" sort,
         # so that it will get run after most tasks
         # 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.
         # Make the spots round, so there's less static in the display.
         # This forces software point generation on many drivers, so
         # This forces software point generation on many drivers, so
         # it's not on by default.
         # 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 = PNMImage(256, 256, 1)
             spot.renderSpot((1, 1, 1, 1), (0, 0, 0, 0), 0.8, 1)
             spot.renderSpot((1, 1, 1, 1), (0, 0, 0, 0), 0.8, 1)
             tex = Texture('spot')
             tex = Texture('spot')
@@ -3134,7 +3130,7 @@ class ShowBase(DirectObject.DirectObject):
             # Set a timer to run the Panda frame 60 times per second.
             # Set a timer to run the Panda frame 60 times per second.
             wxFrameRate = ConfigVariableDouble('wx-frame-rate', 60.0)
             wxFrameRate = ConfigVariableDouble('wx-frame-rate', 60.0)
             self.wxTimer = wx.Timer(self.wxApp)
             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)
             self.wxApp.Bind(wx.EVT_TIMER, self.__wxTimerCallback)
 
 
             # wx is now the main loop, not us any more.
             # 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.
             # Set a timer to run the Panda frame 60 times per second.
             tkFrameRate = ConfigVariableDouble('tk-frame-rate', 60.0)
             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)
             self.tkRoot.after(self.tkDelay, self.__tkTimerCallback)
 
 
             # wx is now the main loop, not us any more.
             # wx is now the main loop, not us any more.
@@ -3301,11 +3297,11 @@ class ShowBase(DirectObject.DirectObject):
         self.__directStarted = False
         self.__directStarted = False
 
 
         # Start Tk, Wx and DIRECT if specified by Config.prc
         # 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
         # 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
         # Set fWantTk to 0 to avoid starting Tk with this call
         self.startDirect(fWantDirect = fDirect, fWantTk = fTk, fWantWx = fWx)
         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 .ShowBase import ShowBase, WindowControls # pylint: disable=unused-import
 from direct.directnotify.DirectNotifyGlobal import directNotify, giveNotify # 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 VirtualFileSystem, Notify, ClockObject, PandaSystem
-from panda3d.core import ConfigPageManager, ConfigVariableManager
+from panda3d.core import ConfigPageManager, ConfigVariableManager, ConfigVariableBool
 from panda3d.core import NodePath, PGTop
 from panda3d.core import NodePath, PGTop
 from . import DConfig as config
 from . import DConfig as config
 import warnings
 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
 #: The global instance of the :ref:`virtual-file-system`, as obtained using
 #: :meth:`panda3d.core.VirtualFileSystem.getGlobalPtr()`.
 #: :meth:`panda3d.core.VirtualFileSystem.getGlobalPtr()`.