*** empty log message ***

This commit is contained in:
Joe Shochet 2001-05-15 17:38:35 +00:00
parent 1cb8444cf8
commit 086bed3a85
6 changed files with 47 additions and 49 deletions

View File

@ -10,6 +10,10 @@ DowncastMap = {}
# FFIConstants.notify.setInfo(1)
# FFIConstants.notify.setDebug(1)
# Uncomment the notify statements if you need to debug,
# otherwise leave them commented out to prevent runtime
# overhead of calling them
# Register a python class in the type map if it is a typed object
@ -41,8 +45,8 @@ class FFIExternalObject:
def getLineageInternal(self, thisClass, targetBaseClass, chain):
# Recursively determine the path in the heirarchy tree from thisClass
# to the targetBaseClass
FFIConstants.notify.debug('getLineageInternal: checking %s to %s'
% (thisClass.__name__, targetBaseClass.__name__))
#FFIConstants.notify.debug('getLineageInternal: checking %s to %s'
# % (thisClass.__name__, targetBaseClass.__name__))
if (targetBaseClass in thisClass.__bases__):
# Found a link
return chain + [targetBaseClass]
@ -54,15 +58,15 @@ class FFIExternalObject:
for base in thisClass.__bases__:
res = self.getLineageInternal(base, targetBaseClass, chain+[base])
if res:
FFIConstants.notify.debug('getLineageInternal: found path: ' + `res`)
# FFIConstants.notify.debug('getLineageInternal: found path: ' + `res`)
return res
# Not found anywhere
return 0
def getDowncastFunctions(self, thisClass, baseClass):
FFIConstants.notify.debug(
'getDowncastFunctions: Looking for downcast function from %s to %s'
% (baseClass.__name__, thisClass.__name__))
#FFIConstants.notify.debug(
# 'getDowncastFunctions: Looking for downcast function from %s to %s'
# % (baseClass.__name__, thisClass.__name__))
lineage = self.getLineage(thisClass, baseClass)
# Start with an empty list of downcast functions
downcastFunctionList = []
@ -80,36 +84,26 @@ class FFIExternalObject:
fromClass = lineage[top - i]
downcastFuncName = ('downcastTo' + toClass.__name__
+ 'From' + fromClass.__name__)
print downcastFuncName
# Look over this classes global modules dictionaries
# for the downcast function name
for globmod in toClass.__CModuleDowncasts__:
if globmod.__dict__.has_key(downcastFuncName):
func = globmod.__dict__[downcastFuncName]
FFIConstants.notify.debug(
'getDowncastFunctions: Found downcast function %s in %s'
% (downcastFuncName, globmod.__name__))
func = globmod.__dict__.get(downcastFuncName)
if func:
#FFIConstants.notify.debug(
# 'getDowncastFunctions: Found downcast function %s in %s'
# % (downcastFuncName, globmod.__name__))
downcastFunctionList.append(func)
else:
FFIConstants.notify.debug(
'getDowncastFunctions: Did not find downcast function %s in %s'
% (downcastFuncName, globmod.__name__))
return downcastFunctionList
def setPointer(self):
if (self.this == 0):
# Null pointer, return None
return None
# If it is not a typed object, our work is done, just return the object
if (not isinstance(self, TypedObject.TypedObject)):
return self
# Ok, it is a typed object. See what type it really is and downcast
# to that type (if necessary)
exactWrapperClass = self.wrapperClassForTypeHandle(self.getType())
# See what type it really is and downcast to that type (if necessary)
# Look up the TypeHandle in the dict. get() returns None if it is not there
exactWrapperClass = WrapperClassMap.get(self.getType().getIndex())
# We do not need to downcast if we already have the same class
if (exactWrapperClass and (exactWrapperClass != self.__class__)):
# Create a new wrapper class instance
exactObject = exactWrapperClass(None)
# Get the downcast pointer that has had all the downcast
# funcs called
downcastObject = self.downcast(exactWrapperClass)
@ -124,31 +118,22 @@ class FFIExternalObject:
else:
return self
def wrapperClassForTypeHandle(self, aTypeHandle):
if WrapperClassMap.has_key(aTypeHandle.getIndex()):
return WrapperClassMap[aTypeHandle.getIndex()]
else:
return None
def downcast(self, toClass):
fromClass = self.__class__
FFIConstants.notify.debug('downcast: downcasting from %s to %s' % \
(fromClass.__name__, toClass.__name__))
#FFIConstants.notify.debug('downcast: downcasting from %s to %s' % \
# (fromClass.__name__, toClass.__name__))
# Check the cache to see if we have looked this up before
if DowncastMap.has_key((fromClass, toClass)):
downcastChain = DowncastMap[(fromClass, toClass)]
FFIConstants.notify.debug('downcast: found cached downcast chain: ' + `downcastChain`)
else:
downcastChain = DowncastMap.get((fromClass, toClass))
if downcastChain == None:
downcastChain = self.getDowncastFunctions(toClass, fromClass)
FFIConstants.notify.debug('downcast: computed downcast chain: ' + `downcastChain`)
#FFIConstants.notify.debug('downcast: computed downcast chain: ' + `downcastChain`)
# Store it for next time
DowncastMap[(fromClass, toClass)] = downcastChain
newObject = self
for downcastFunc in downcastChain:
FFIConstants.notify.debug('downcast: downcasting %s using %s' % \
(newObject.__class__.__name__, downcastFunc))
#FFIConstants.notify.debug('downcast: downcasting %s using %s' % \
# (newObject.__class__.__name__, downcastFunc))
newObject = downcastFunc(newObject)
return newObject

View File

@ -21,6 +21,7 @@ FFIConstants.notify.info('Importing interrogate library: ' + FFIConstants.Interr
# to be dependent on the name of the interrogate library in this code
exec('from ' + FFIConstants.InterrogateModuleName + ' import *')
def constructGlobalFile(codeDir, CModuleName):
"""
Open a file that will hold the global values and functions code
@ -370,6 +371,12 @@ class FFIInterrogateDatabase:
self.typeIndexMap[typeIndex] = descriptor
#descriptor.environment = self.environment
descriptor.foreignTypeName = FFIRename.classNameFromCppName(getTypeName(typeIndex))
if (descriptor.foreignTypeName == "TypedObject"):
print "Found typed object descriptor"
FFITypes.TypedObjectDescriptor = descriptor
descriptor.isNested = interrogate_type_is_nested(typeIndex)
if descriptor.isNested:
outerTypeIndex = interrogate_type_outer_class(typeIndex)

View File

@ -17,6 +17,9 @@ import FFIOverload
from PythonUtil import *
TypedObjectDescriptor = None
class BaseTypeDescriptor:
"""
A type descriptor contains everything you need to know about a C++ function,
@ -803,10 +806,16 @@ class ClassTypeDescriptor(BaseTypeDescriptor):
file.write(typeName)
file.write('(None)\n')
indent(file, nesting, 'returnObject.this = returnValue\n')
# Zero this pointers get returned as the Python None object
indent(file, nesting, 'if (returnObject.this == 0): return None\n')
if userManagesMemory:
indent(file, nesting, 'returnObject.userManagesMemory = 1\n')
if needsDowncast:
indent(file, nesting, 'return returnObject.setPointer()\n')
if (FFIOverload.inheritsFrom(self, TypedObjectDescriptor) or
self == TypedObjectDescriptor):
indent(file, nesting, 'return returnObject.setPointer()\n')
else:
indent(file, nesting, 'return returnObject\n')
else:
indent(file, nesting, 'return returnObject\n')

View File

@ -22,7 +22,7 @@ class EventManager:
self.eventQueue = EventQueue.getGlobalEventQueue()
self.eventHandler = EventHandler(self.eventQueue)
def eventLoop(self, state):
def eventLoop(self, task):
"""
Process all the events on the C++ event queue
"""
@ -56,7 +56,6 @@ class EventManager:
if event.hasName():
# Get the event name
eventName = event.getName()
numParameters = event.getNumParameters()
paramList = []
for i in range(numParameters):

View File

@ -65,6 +65,8 @@ class ShowBase:
# And put it in the list
self.cameraList = [ self.camera ]
self.dataRoot = NodePath(NamedNode('dataRoot'), DataRelation.getClassType())
# Cache the node so we do not ask for it every frame
self.dataRootNode = self.dataRoot.node()
self.dataUnused = NodePath(NamedNode('dataUnused'), DataRelation.getClassType())
self.pipe = makeGraphicsPipe()
self.win = makeGraphicsWindow(self.pipe,
@ -302,8 +304,7 @@ class ShowBase:
# traverse the data graph. This reads all the control
# inputs (from the mouse and keyboard, for instance) and also
# directly acts upon them (for instance, to move the avatar).
traverseDataGraph(self.dataRoot.node())
traverseDataGraph(self.dataRootNode)
return Task.cont
def igloop(self, state):
@ -311,10 +312,8 @@ class ShowBase:
# CollisionTraverser set.
if self.cTrav:
self.cTrav.traverse(self.render)
# Finally, render the frame.
self.win.update()
return Task.cont
def restart(self):

View File

@ -260,7 +260,6 @@ class TaskManager:
self.currentTime, self.currentFrame = getTimeFrame()
if (TaskManager.notify == None):
TaskManager.notify = directNotify.newCategory("TaskManager")
# TaskManager.notify.setDebug(1)
self.taskTimerVerbose = 0
def stepping(value):