Browse Source

Remove rest of the stuff from doc/

rdb 16 years ago
parent
commit
15265b12e1
47 changed files with 0 additions and 35858 deletions
  1. 0 11
      doc/SceneEditor/.project
  2. 0 188
      doc/SceneEditor/AlignTool.py
  3. 0 59
      doc/SceneEditor/MetadataPanel.py
  4. 0 458
      doc/SceneEditor/SideWindow.py
  5. 0 0
      doc/SceneEditor/__init__.py
  6. 0 302
      doc/SceneEditor/collisionWindow.py
  7. 0 695
      doc/SceneEditor/controllerWindow.py
  8. 0 1071
      doc/SceneEditor/dataHolder.py
  9. 0 172
      doc/SceneEditor/duplicateWindow.py
  10. 0 493
      doc/SceneEditor/lightingPanel.py
  11. 0 1456
      doc/SceneEditor/propertyWindow.py
  12. 0 676
      doc/SceneEditor/quad.py
  13. 0 1709
      doc/SceneEditor/sceneEditor.py
  14. 0 608
      doc/SceneEditor/seAnimPanel.py
  15. 0 666
      doc/SceneEditor/seBlendAnimPanel.py
  16. 0 670
      doc/SceneEditor/seCameraControl.py
  17. 0 49
      doc/SceneEditor/seColorEntry.py
  18. 0 915
      doc/SceneEditor/seFileSaver.py
  19. 0 134
      doc/SceneEditor/seForceGroup.py
  20. 0 256
      doc/SceneEditor/seGeometry.py
  21. 0 170
      doc/SceneEditor/seGrid.py
  22. 0 633
      doc/SceneEditor/seLights.py
  23. 0 956
      doc/SceneEditor/seManipulation.py
  24. 0 2073
      doc/SceneEditor/seMopathRecorder.py
  25. 0 267
      doc/SceneEditor/seParticleEffect.py
  26. 0 1976
      doc/SceneEditor/seParticlePanel.py
  27. 0 449
      doc/SceneEditor/seParticles.py
  28. 0 800
      doc/SceneEditor/sePlacer.py
  29. 0 209
      doc/SceneEditor/seSceneGraphExplorer.py
  30. 0 715
      doc/SceneEditor/seSelection.py
  31. 0 991
      doc/SceneEditor/seSession.py
  32. 0 418
      doc/SceneEditor/seTree.py
  33. BIN
      doc/makepanda/Panda3D-tpl.dmg
  34. 0 107
      doc/makepanda/confauto.in
  35. 0 86
      doc/makepanda/config.in
  36. 0 26
      doc/makepanda/expandimports.bat
  37. 0 21
      doc/makepanda/expandimports.py
  38. 0 26
      doc/makepanda/makechm.bat
  39. 0 278
      doc/makepanda/makechm.py
  40. 0 26
      doc/makepanda/makedocs.bat
  41. 0 77
      doc/makepanda/makedocs.py
  42. 0 28
      doc/makepanda/makepanda.bat
  43. 0 3839
      doc/makepanda/makepanda.py
  44. 0 20
      doc/makepanda/makepanda.sln
  45. 0 5061
      doc/makepanda/makepanda.vcproj
  46. 0 1220
      doc/makepanda/makepandacore.py
  47. 0 4798
      doc/makepanda/otherMakePanda.py

+ 0 - 11
doc/SceneEditor/.project

@@ -1,11 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>SceneEditor</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-	</buildSpec>
-	<natures>
-	</natures>
-</projectDescription>

+ 0 - 188
doc/SceneEditor/AlignTool.py

@@ -1,188 +0,0 @@
-#################################################################
-# AlignTool.py
-# Written by Yi-Hong Lin, [email protected], 2004
-#################################################################
-from direct.tkwidgets.AppShell import *
-from direct.showbase.TkGlobal import *
-
-
-class AlignTool(AppShell):
-    #################################################################
-    # AlignTool(AppShell)
-    #################################################################
-    appversion      = '1.0'
-    appname         = 'Align Tool'
-    frameWidth      = 220
-    frameHeight     = 330
-    frameIniPosX    = 250
-    frameIniPosY    = 250
-    padx            = 0
-    pady            = 0
-
-    
-    def __init__(self, list = [], parent = None, nodePath = None, **kw):
-        # Keep nodePath Data
-        self.nodePath = nodePath
-        self.targetList = list
-        self.targetName = None
-        # Rename App
-        self.appname += (' '+self.nodePath.getName())
-        # Define the megawidget options.
-        optiondefs = (
-            ('title',       self.appname,       None),
-            )
-        self.defineoptions(kw, optiondefs)
-        if parent == None:
-            self.parent = Toplevel()
-        AppShell.__init__(self, self.parent)
-        self.parent.geometry('%dx%d+%d+%d' % (self.frameWidth, self.frameHeight,self.frameIniPosX,self.frameIniPosY))
-        
-        self.initialiseoptions(AlignTool)
-        
-        self.parent.resizable(False,False) ## Disable the ability to resize for this Window.
-        
-    def appInit(self):
-        return
-        
-    def createInterface(self):
-        # The interior of the toplevel panel
-        interior = self.interior()
-        mainFrame = Frame(interior)
-        frame = Frame(mainFrame)
-        self.nameBox = self.createcomponent(
-            'Align Target', (), None,
-            Pmw.ComboBox, (frame,),
-            labelpos = W, label_text='Target Node:', entry_width = 20, entry_state = DISABLED,
-            selectioncommand = self.setTargetNode,
-            scrolledlist_items = self.targetList)
-        self.nameBox.pack(side=LEFT)
-        frame.pack(side=TOP, fill = X, expand = 1,pady=5)
-        group = Pmw.Group(mainFrame, tag_text = 'Setting')
-        group.pack(side=TOP, fill = 'both', expand = 1,pady=5)
-        groupFrame = group.interior()
-        # X and H checkbox
-        frame = Frame(groupFrame)
-        self.alignXVar = IntVar()
-        self.alignXVar.set(False)
-        self.alignXButton = Checkbutton(
-            frame,
-            text = ': Align X',
-            variable = self.alignXVar)
-        self.alignXButton.pack(side=LEFT, expand=False)
-        self.alignHVar = IntVar()
-        self.alignHVar.set(False)
-        self.alignHButton = Checkbutton(
-            frame,
-            text = ': Align H',
-            variable = self.alignHVar)
-        self.alignHButton.pack(side=RIGHT, expand=False)
-        frame.pack(side=TOP, fill = X, expand = 1,pady=5)
-        
-        groupFrame.pack(side=TOP, fill = 'both', expand = 1,padx=5,pady=5)
-        
-        frame = Frame(mainFrame)
-        Button(frame, text='Align', width = 13, command=self.Align_press).pack(side=LEFT)
-        Button(frame, text='OK', width = 13, command=self.ok_press).pack(side=RIGHT)
-        frame.pack(side=BOTTOM, fill = X, expand = 1,pady=5)
-        
-        # Y and P checkbox
-        frame = Frame(groupFrame)
-        self.alignYVar = IntVar()
-        self.alignYVar.set(False)
-        self.alignYButton = Checkbutton(
-            frame,
-            text = ': Align Y',
-            variable = self.alignYVar)
-        self.alignYButton.pack(side=LEFT, expand=False)
-        self.alignPVar = IntVar()
-        self.alignPVar.set(False)
-        self.alignPButton = Checkbutton(
-            frame,
-            text = ': Align P',
-            variable = self.alignPVar)
-        self.alignPButton.pack(side=RIGHT, expand=False)
-        frame.pack(side=TOP, fill = X, expand = 1,pady=5)
-
-        # Z and R checkbox
-        frame = Frame(groupFrame)
-        self.alignZVar = IntVar()
-        self.alignZVar.set(False)
-        self.alignZButton = Checkbutton(
-            frame,
-            text = ': Align Z',
-            variable = self.alignZVar)
-        self.alignZButton.pack(side=LEFT, expand=False)
-        self.alignRVar = IntVar()
-        self.alignRVar.set(False)
-        self.alignRButton = Checkbutton(
-            frame,
-            text = ': Align R',
-            variable = self.alignRVar)
-        self.alignRButton.pack(side=RIGHT, expand=False)
-        frame.pack(side=TOP, fill = X, expand = 1,pady=5)
-
-        # Scale
-        frame = Frame(groupFrame)
-        Label(frame,text='Align Scale:').pack(side=LEFT)
-        frame.pack(side=TOP, fill = X, expand = 1,pady=5)
-        frame = Frame(groupFrame)
-        self.alignSXVar = IntVar()
-        self.alignSXVar.set(False)
-        self.alignSXButton = Checkbutton(
-            frame,
-            text = ': X',
-            variable = self.alignSXVar)
-        self.alignSXButton.pack(side=LEFT, expand=False)
-        self.alignSYVar = IntVar()
-        self.alignSYVar.set(False)
-        self.alignSYButton = Checkbutton(
-            frame,
-            text = ': Y',
-            variable = self.alignSYVar)
-        self.alignSYButton.pack(side=LEFT, expand=False)
-        frame.pack(side=TOP, fill = X, expand = 1,pady=5)
-        self.alignSZVar = IntVar()
-        self.alignSZVar.set(False)
-        self.alignSZButton = Checkbutton(
-            frame,
-            text = ': Z',
-            variable = self.alignSZVar)
-        self.alignSZButton.pack(side=LEFT, expand=False)
-        frame.pack(side=TOP, fill = X, expand = 1,pady=5)
-        
-        
-        mainFrame.pack(fill = 'both', expand = 1,padx=7,pady=7)
-
-    
-    def createMenuBar(self):
-        self.menuBar.destroy()
-        
-    def onDestroy(self, event):
-        messenger.send('ALW_close', [self.nodePath.getName()])
-        '''
-        If you have open any thing, please rewrite here!
-        '''
-        pass
-
-    ###############################
-    
-    def ok_press(self):
-        #################################################################
-        # ok_press(self)
-        # Callback function
-        # This function will be called when user click on the "OK" button on the window.
-        #################################################################
-        self.quit()
-
-    def Align_press(self):
-        list = [self.alignXVar.get(), self.alignYVar.get(), self.alignZVar.get(),
-                self.alignHVar.get(), self.alignPVar.get(), self.alignRVar.get(),
-                self.alignSXVar.get(), self.alignSYVar.get(), self.alignSZVar.get()]
-        if self.targetName != None:
-            messenger.send('ALW_align', [self.nodePath, self.targetName, list])
-        return
-
-    def setTargetNode(self,name=None):
-        self.targetName = name
-        return
-

+ 0 - 59
doc/SceneEditor/MetadataPanel.py

@@ -1,59 +0,0 @@
-from direct.tkwidgets.AppShell import *
-from direct.showbase.TkGlobal import *
-import Pmw
-
-class MetadataPanel(AppShell,Pmw.MegaWidget):
-    appversion      = '1.0'
-    appname         = 'Metadata Panel'
-    frameWidth      = 400
-    frameHeight     = 400
-    padx            = 0
-    pady            = 0
-    usecommandarea  = 0
-    usestatusarea   = 0
-    Metatag=""
-    Metanode=None 
-    tag_text=None
-    def __init__(self,nodePath,parent=None,**kw):
-
-        # Initialise superclass
-        Pmw.MegaWidget.__init__(self, parent)
-        
-        # Define the megawidget options.
-        optiondefs = (
-            ('title',       self.appname,       None),
-            )
-        self.defineoptions(kw, optiondefs)
-        self.Metanode=nodePath
-        if(nodePath.hasTag("Metadata")):
-            self.Metatag=self.Metanode.getTag("Metadata")
-
-        if parent == None:
-            self.parent = Toplevel()
-        AppShell.__init__(self, self.parent)
-        
-        self.parent.resizable(False,False)
-
-    
-    def appInit(self):
-        print "Metadata Panel"
-
-    def createInterface(self):
-        interior = self.interior()
-        mainFrame = Frame(interior)
-        tag_label=Label (mainFrame,text="Enter Metadata",font=('MSSansSerif', 15),
-                           relief = RIDGE, borderwidth=5)
-        tag_label.pack()
-        source=StringVar()
-        source.set(self.Metatag)
-        self.tag_text=Entry(mainFrame, width=10,textvariable=source)
-        self.tag_text.pack()
-        set_button=Button(mainFrame, text='Set Metadata',font=('MSSansSerif', 15),
-                           relief = RIDGE, borderwidth=5, command= lambda:self.SetIt())
-        set_button.pack()
-        mainFrame.pack(fill = 'both', expand = 1)
-
-    def SetIt(self):
-        self.Metanode.setTag("Metadata",self.tag_text.get())
-        
-        

+ 0 - 458
doc/SceneEditor/SideWindow.py

@@ -1,458 +0,0 @@
-#################################################################
-# sideWindow.py
-# Written by Yi-Hong Lin, [email protected], 2004
-#################################################################
-from direct.tkwidgets.AppShell import AppShell
-from direct.tkwidgets.VectorWidgets import ColorEntry
-from direct.showbase.TkGlobal import spawnTkLoop, Toplevel
-import seSceneGraphExplorer
-from Tkinter import Frame, IntVar, Checkbutton
-import Pmw, Tkinter
-
-class sideWindow(AppShell):
-    #################################################################
-    # sideWindow(AppShell)
-    # This class will open a side window wich contains a scene graph and
-    # a world setting page.
-    #################################################################
-    appversion      = '1.0'
-    appname         = 'Navigation Window'
-    frameWidth      = 325
-    frameHeight     = 580
-    frameIniPosX    = 0
-    frameIniPosY    = 110
-    padx            = 0
-    pady            = 0
-
-    lightEnable = 0
-    ParticleEnable = 0
-    basedriveEnable = 0
-    collision = 0
-    backface = 0
-    texture = 1
-    wireframe = 0
-    
-    enableBaseUseDrive = 0
-    
-    def __init__(self, worldColor,lightEnable,ParticleEnable, basedriveEnable,collision,
-                 backface, texture, wireframe, grid, widgetVis, enableAutoCamera, parent = None, nodePath = render, **kw):
-        self.worldColor = worldColor
-        self.lightEnable = lightEnable
-        self.ParticleEnable = ParticleEnable
-        self.basedriveEnable = basedriveEnable
-        self.collision = collision
-        self.backface = backface
-        self.texture = texture
-        self.wireframe = wireframe
-        self.grid = grid
-        self.enableAutoCamera = enableAutoCamera
-        self.widgetVis = widgetVis
-
-        # Define the megawidget options.
-        optiondefs = (
-            ('title',       self.appname,       None),
-            )
-        self.defineoptions(kw, optiondefs)
-
-        if parent == None:
-            self.parent = Toplevel()
-        else:
-            self.parent = parent
-        
-        AppShell.__init__(self, self.parent)
-        self.parent.geometry('%dx%d+%d+%d' % (self.frameWidth, self.frameHeight,self.frameIniPosX,self.frameIniPosY))
-
-        self.parent.resizable(False,False) ## Disable the ability to resize for this Window.
-                
-    def appInit(self):
-        print '----SideWindow is Initialized!!'
-        
-    def createInterface(self):
-        # The interior of the toplevel panel
-        interior = self.interior()
-        mainFrame = Frame(interior)
-        ## Creat NoteBook
-        self.notebookFrame = Pmw.NoteBook(mainFrame)
-        self.notebookFrame.pack(fill=Tkinter.BOTH,expand=1)
-        sgePage = self.notebookFrame.add('Tree Graph')
-        envPage = self.notebookFrame.add('World Setting')
-        self.notebookFrame['raisecommand'] = self.updateInfo
-
-        ## Tree Grapgh Page
-        self.SGE = seSceneGraphExplorer.seSceneGraphExplorer(
-            sgePage, nodePath = render,
-            scrolledCanvas_hull_width = 270,
-            scrolledCanvas_hull_height = 570)
-        self.SGE.pack(fill = Tkinter.BOTH, expand = 0)
-
-        ## World Setting Page
-        envPage = Frame(envPage)
-        pageFrame = Frame(envPage)
-        self.LightingVar = IntVar()
-        self.LightingVar.set(self.lightEnable)
-        self.LightingButton = Checkbutton(
-            pageFrame,
-            text = 'Enable Lighting',
-            variable = self.LightingVar,
-            command = self.toggleLights)
-        self.LightingButton.pack(side=Tkinter.LEFT, expand=False)
-        pageFrame.pack(side=Tkinter.TOP, fill=Tkinter.X, expand=True)
-
-        pageFrame = Frame(envPage)
-        self.CollisionVar = IntVar()
-        self.CollisionVar.set(self.collision)
-        self.CollisionButton = Checkbutton(
-            pageFrame,
-            text = 'Show Collision Object',
-            variable = self.CollisionVar,
-            command = self.showCollision)
-        self.CollisionButton.pack(side=Tkinter.LEFT, expand=False)
-        pageFrame.pack(side=Tkinter.TOP, fill=Tkinter.X, expand=True)
-
-        pageFrame = Frame(envPage)
-        self.ParticleVar = IntVar()
-        self.ParticleVar.set(self.ParticleEnable)
-        self.ParticleButton = Checkbutton(
-            pageFrame,
-            text = 'Show Particle Dummy',
-            variable = self.ParticleVar,
-            command = self.enableParticle)
-        self.ParticleButton.pack(side=Tkinter.LEFT, expand=False)
-        pageFrame.pack(side=Tkinter.TOP, fill=Tkinter.X, expand=True)
-
-        pageFrame = Frame(envPage)
-        self.baseUseDriveVar = IntVar()
-        self.baseUseDriveVar.set(self.basedriveEnable)
-        self.baseUseDriveButton = Checkbutton(
-            pageFrame,
-            text = 'Enable base.usedrive',
-            variable = self.baseUseDriveVar,
-            command = self.enablebaseUseDrive)
-        self.baseUseDriveButton.pack(side=Tkinter.LEFT, expand=False)
-        pageFrame.pack(side=Tkinter.TOP, fill=Tkinter.X, expand=True)
-
-        pageFrame = Frame(envPage)
-        self.backfaceVar = IntVar()
-        self.backfaceVar.set(self.backface)
-        self.backfaceButton = Checkbutton(
-            pageFrame,
-            text = 'Enable BackFace',
-            variable = self.backfaceVar,
-            command = self.toggleBackface)
-        self.backfaceButton.pack(side=Tkinter.LEFT, expand=False)
-        pageFrame.pack(side=Tkinter.TOP, fill=Tkinter.X, expand=True)
-
-        pageFrame = Frame(envPage)
-        self.textureVar = IntVar()
-        self.textureVar.set(self.texture)
-        self.textureButton = Checkbutton(
-            pageFrame,
-            text = 'Enable Texture',
-            variable = self.textureVar,
-            command = self.toggleTexture)
-        self.textureButton.pack(side=Tkinter.LEFT, expand=False)
-        pageFrame.pack(side=Tkinter.TOP, fill=Tkinter.X, expand=True)
-
-        pageFrame = Frame(envPage)
-        self.wireframeVar = IntVar()
-        self.wireframeVar.set(self.wireframe)
-        self.wireframeButton = Checkbutton(
-            pageFrame,
-            text = 'Enable Wireframe',
-            variable = self.wireframeVar,
-            command = self.toggleWireframe)
-        self.wireframeButton.pack(side=Tkinter.LEFT, expand=False)
-        pageFrame.pack(side=Tkinter.TOP, fill=Tkinter.X, expand=True)
-
-        pageFrame = Frame(envPage)
-        self.gridVar = IntVar()
-        self.gridVar.set(self.grid)
-        self.gridButton = Checkbutton(
-            pageFrame,
-            text = 'Enable Grid',
-            variable = self.gridVar,
-            command = self.toggleGrid)
-        self.gridButton.pack(side=Tkinter.LEFT, expand=False)
-        pageFrame.pack(side=Tkinter.TOP, fill=Tkinter.X, expand=True)
-
-        pageFrame = Frame(envPage)
-        self.widgetVisVar = IntVar()
-        self.widgetVisVar.set(self.widgetVis)
-        self.widgetVisButton = Checkbutton(
-            pageFrame,
-            text = 'Enable WidgetVisible',
-            variable = self.widgetVisVar,
-            command = self.togglewidgetVis)
-        self.widgetVisButton.pack(side=Tkinter.LEFT, expand=False)
-        pageFrame.pack(side=Tkinter.TOP, fill=Tkinter.X, expand=True)
-
-        pageFrame = Frame(envPage)
-        self.enableAutoCameraVar = IntVar()
-        self.enableAutoCameraVar.set(self.enableAutoCamera)
-        self.enableAutoCameraButton = Checkbutton(
-            pageFrame,
-            text = 'Enable Auto Camera Movement for Loading Objects',
-            variable = self.enableAutoCameraVar,
-            command = self.toggleAutoCamera)
-        self.enableAutoCameraButton.pack(side=Tkinter.LEFT, expand=False)
-        pageFrame.pack(side=Tkinter.TOP, fill=Tkinter.X, expand=True)
-
-        pageFrame = Frame(envPage)
-        self.backgroundColor = ColorEntry(
-            pageFrame, text = 'BG Color', value=self.worldColor)
-        self.backgroundColor['command'] = self.setBackgroundColorVec
-        self.backgroundColor['resetValue'] = [0,0,0,0]
-        self.backgroundColor.pack(side=Tkinter.LEFT, expand=False)
-        self.bind(self.backgroundColor, 'Set background color')
-        pageFrame.pack(side=Tkinter.TOP, fill=Tkinter.X, expand=True)
-
-        envPage.pack(expand=False)
-
-        ## Set all stuff done
-        self.notebookFrame.setnaturalsize()
-        mainFrame.pack(fill = 'both', expand = 1)
-
-    
-    def createMenuBar(self):
-        # We don't need menu bar here.
-        self.menuBar.destroy()
-        
-    def onDestroy(self, event):
-        #################################################################
-        # onDestroy(self, event)
-        # This function will be called when user closed the side window.
-        # Here we will send out a message with whole data set we will need
-        # for the next time user open the side window.
-        #################################################################
-        messenger.send('SW_close',[self.worldColor,
-                                   self.lightEnable,
-                                   self.ParticleEnable,
-                                   self.basedriveEnable,
-                                   self.collision,
-                                   self.backface,
-                                   self.texture,
-                                   self.wireframe,
-                                   self.grid,
-                                   self.widgetVis,
-                                   self.enableAutoCamera])
-        '''
-        If you have open any thing, please rewrite here!
-        '''
-        pass
-
-    ###############################
-    def updateInfo(self, page = 'Tree Graph'):
-        #################################################################
-        # updateInfo(self, page = 'Tree Graph')
-        # This function will be called when each time user change the main
-        # page of the window.
-        # What it dose is to call right function to restore the data for current selected page.
-        #################################################################
-        if page=='Tree Graph':
-            self.updateTreeGraph()
-        elif page == 'World Setting':
-            self.updateWorldSetting()
-
-    def updateTreeGraph(self):
-        #################################################################
-        # updateTreeGraph(self)
-        # When scene graoh page has been opend, call sceneGraphExplorer to
-        # updata the tree.
-        #################################################################
-        self.SGE.update()
-        pass
-
-    def updateWorldSetting(self):
-        #################################################################
-        # updateWorldSetting(self)
-        # When world setting page has been selected, this function will
-        # reset those check box in the page to reflect the current world setting.
-        #################################################################
-        self.LightingVar.set(self.lightEnable)
-
-        self.CollisionVar.set(self.collision)
-        self.ParticleVar.set(self.ParticleEnable)
-        self.baseUseDriveVar.set(self.basedriveEnable)
-        self.backgroundColor.set(value = self.worldColor)
-        pass
-
-    def toggleLights(self):
-        #################################################################
-        # toggleLights(self)
-        # send out a message to let sceneEditor know we need to toggle the light.
-        # Then, sceneEditor will pass the message to dataHolder to disable/enable
-        # the lights. (lightManager is inside the dataHolder)
-        #################################################################
-        self.lightEnable = (self.lightEnable+1)%2
-        messenger.send('SW_lightToggle')
-        pass
-
-    def showCollision(self):
-        #################################################################
-        # showCollision(self)
-        # This function will send out a message to sceneEditor to toggle
-        # the visibility of collision objects.
-        #################################################################
-        self.collision = (self.collision+1)%2
-        messenger.send('SW_collisionToggle', [self.collision])
-        pass
-
-    def enableParticle(self):
-        #################################################################
-        # enableParticle(self)
-        # This function will send out a message to sceneEditor to toggle
-        # the visibility of particle objects.
-        #################################################################
-        self.ParticleEnable = (self.ParticleEnable+1)%2
-        messenger.send('SW_particleToggle', [self.ParticleEnable])
-        pass
-
-    def enablebaseUseDrive(self):
-        #################################################################
-        # enablebaseUseDrive(self)
-        # This function will toggle the usage of base.useDrive.
-        # Well, it may not usefull at all.
-        #
-        # We won't send out any message in this time to notice
-        # the sceneEditor this event happend.
-        # In the other hand, we will restore it back when
-        # the side window has been closed.
-        #
-        #################################################################
-        if self.enableBaseUseDrive==0:
-            print 'Enabled'
-            base.useDrive()
-            self.enableBaseUseDrive = 1
-        else:
-            print 'disabled'
-            #base.useTrackball()
-            base.disableMouse()
-            self.enableBaseUseDrive = 0
-        self.basedriveEnable = (self.basedriveEnable+1)%2
-        pass
-
-    def toggleBackface(self):
-        #################################################################
-        # toggleBackface(self)
-        # This function will toggle the back face setting. so it will
-        # render the polygon with two sides.
-        #################################################################
-        base.toggleBackface()
-        self.backface = (self.backface+1)%2
-        return
-
-    def toggleBackfaceFromMainW(self):
-        #################################################################
-        # toggleBackfaceFromMainW(self)
-        # This function is called by sceneEditor when user used hot key
-        # to toggle the back face setting in the main panda window.
-        # In here we will only reset the flag and reset the state of
-        # check box
-        #################################################################
-        self.backface = (self.backface+1)%2
-        self.backfaceButton.toggle()
-        return
-    
-    def toggleTexture(self):
-        #################################################################
-        # toggleTexture(self)
-        # This function will toggle the txture using option for the whole scene.
-        #################################################################
-        base.toggleTexture()
-        self.texture = (self.texture+1)%2
-        return
-    
-    def toggleTextureFromMainW(self):
-        #################################################################
-        # toggleTextureFromMainW(self)
-        # This function is called by sceneEditor when user used hot key
-        # to toggle the texture usage from the main panda window.
-        # In here we will only reset the flag and reset the state of
-        # check box
-        #################################################################
-        self.texture = (self.texture+1)%2
-        self.textureButton.toggle()
-        return
-    
-    def toggleWireframe(self):
-        #################################################################
-        # toggleWireframe(self)
-        # This function will toggle the wire frame mode.
-        #################################################################
-        base.toggleWireframe()
-        self.wireframe = (self.wireframe+1)%2
-        return
-
-    def toggleWireframeFromMainW(self):
-        #################################################################
-        # toggleWireframeFromMainW(self)
-        # This function is called by sceneEditor when user used hot key
-        # to toggle the wire frame mode in the main panda window.
-        # In here we will only reset the flag and reset the state of
-        # check box
-        #################################################################
-        self.wireframe = (self.wireframe+1)%2
-        self.wireframeButton.toggle()
-        return
-
-    def toggleGrid(self):
-        #################################################################
-        # toggleGrid(self)
-        # This function will toggle the usage of the grid.
-        #################################################################
-        self.grid = (self.grid+1)%2
-        if self.grid==1:
-            SEditor.grid.enable()
-        else:
-            SEditor.grid.disable()
-
-    def togglewidgetVis(self):
-        #################################################################
-        # togglewidgetVis(self)
-        # This function will toggle the visibility of the widget of the grid.
-        #################################################################
-        self.widgetVis = (self.widgetVis+1)%2
-        SEditor.toggleWidgetVis()
-        if SEditor.widget.fActive:
-                messenger.send('shift-f')
-        return
-
-    def toggleWidgetVisFromMainW(self):
-        #################################################################
-        # toggleWidgetVisFromMainW(self)
-        # This function is called by sceneEditor when user used hot key
-        # to toggle the visibility of widgets ('v') from the main panda window.
-        # In here we will only reset the flag and reset the state of
-        # check box
-        #################################################################
-        self.widgetVis = (self.widgetVis+1)%2
-        self.widgetVisButton.toggle()
-        return
-        
-    def setBackgroundColorVec(self,color):
-        #################################################################
-        # setBackgroundColorVec(self,color)
-        # Call back function
-        # This will be called from the colorEntry on the world setting page.
-        # The "color" here is a list containing three integer data, R, G and B.
-        #################################################################
-        base.setBackgroundColor(color[0]/255.0,
-                                color[1]/255.0,
-                                color[2]/255.0)
-        self.worldColor = [color[0],color[1],color[2],0]
-
-    def toggleAutoCamera(self):
-        #################################################################
-        # toggleAutoCamera(self)
-        # This function will toggle the usage of the auto-camera movement
-        # when user loaded model or actor into the scene.
-        #################################################################
-        self.enableAutoCamera = (self.enableAutoCamera+1)%2
-        SEditor.toggleAutoCamera()
-        return
-
-    def selectPage(self,page='Tree Graph'):
-        #################################################################
-        #################################################################
-        self.notebookFrame.selectpage(page)
-

+ 0 - 0
doc/SceneEditor/__init__.py


+ 0 - 302
doc/SceneEditor/collisionWindow.py

@@ -1,302 +0,0 @@
-#################################################################
-# collisionWindow.py
-# Written by Yi-Hong Lin, [email protected], 2004
-#################################################################
-# Import Tkinter, Pmw, and the floater code from this directory tree.
-from direct.tkwidgets.AppShell import *
-from direct.showbase.TkGlobal import *
-from seColorEntry import *
-from direct.tkwidgets import VectorWidgets
-from direct.tkwidgets import Floater
-from direct.tkwidgets import Slider
-from Tkinter import *
-import string, math, types
-from pandac.PandaModules import *
-
-
-class collisionWindow(AppShell):
-    #################################################################
-    # This will open a talk window for user to set the collision object
-    # In here, we won't finish the whole process to generate the
-    # collision object, half of process will be finished by dataHolder.
-    #################################################################
-    # Override class variables
-    appname = 'Creating Collision Object'
-    frameWidth  = 600
-    frameHeight = 300
-
-    widgetsDict = {}
-
-    # Define the types of collision we take care here
-    collisionType = ['collisionPolygon',
-                     'collisionSphere',
-                     'collisionSegment',
-                     'collisionRay']
-    
-    def __init__(self, nodePath, parent = None, **kw):
-        
-        self.nodePath = nodePath
-        self.objType = 'collisionSphere' # set default type to Collision Sphere
-        
-        INITOPT = Pmw.INITOPT
-        optiondefs = (
-            ('title',               self.appname,       None),
-            )
-        self.defineoptions(kw, optiondefs)
-
-        # Initialize the superclass
-        AppShell.__init__(self)
-
-        # Execute option callbacks
-        self.initialiseoptions(collisionWindow)
-
-        self.parent.resizable(False,False) ## Disable the ability to resize for this Window.
-
-    def createInterface(self):
-        # Handle to the toplevels interior
-        interior = self.interior()
-        menuBar = self.menuBar
-        self.menuBar.destroy()
-
-        # Create a frame to hold all stuff
-        mainFrame = Frame(interior)
-
-        frame = Frame(mainFrame)
-
-        self.collisionTypeEntry = self.createcomponent(
-            'Collision Type', (), None,
-            Pmw.ComboBox, (frame,),
-            labelpos = W, label_text='Collision Object Type:', entry_width = 20,
-            selectioncommand = self.setObjectType,
-            scrolledlist_items = self.collisionType)
-        self.collisionTypeEntry.pack(side=LEFT, padx=3)
-
-        label = Label(frame, text='Parent NodePath: '+ self.nodePath.getName(), font=('MSSansSerif', 12),
-                      relief = RIDGE)
-        label.pack(side=LEFT,expand=0,fill=X, padx=20)
-
-        frame.pack(side=TOP, fill=X, expand=True, padx=3)
-        self.collisionTypeEntry.selectitem('collisionSphere', setentry=True)
-        
-        self.inputZone = Pmw.Group(mainFrame, tag_pyclass = None)
-        self.inputZone.pack(fill='both',expand=1)
-        settingFrame = self.inputZone.interior()
-
-        ############################################
-        # Notebook pages for specific object setting
-        ############################################
-        self.objNotebook = Pmw.NoteBook(settingFrame, tabpos = None,
-                                        borderwidth = 0)
-        PolygonPage = self.objNotebook.add('Polygon')
-        SpherePage = self.objNotebook.add('Sphere')
-        SegmentPage = self.objNotebook.add('Segment')
-        RayPage = self.objNotebook.add('Ray')
-        self.objNotebook.selectpage('Sphere')
-        # Put this here so it isn't called right away
-        self.objNotebook['raisecommand'] = self.updateObjInfo
-
-        # Polygon object setting
-
-        Interior = Frame(PolygonPage)
-        label = Label(Interior, text='Attention! All Coordinates Are Related To Its Parent Node!')
-        label.pack(side=LEFT,expand=0,fill=X, padx=1)
-        Interior.pack(side=TOP, expand=0,fill=X)
-        
-        self.createPosEntry(PolygonPage, catagory='Polygon', id='Point A')
-        self.createPosEntry(PolygonPage, catagory='Polygon', id='Point B')
-        self.createPosEntry(PolygonPage, catagory='Polygon', id='Point C')
-
-        # Sphere object setting
-
-        Interior = Frame(SpherePage)
-        label = Label(Interior, text='Attention! All Coordinates Are Related To Its Parent Node!')
-        label.pack(side=LEFT,expand=0,fill=X, padx=1)
-        Interior.pack(side=TOP, expand=0,fill=X)
-        
-        self.createPosEntry(SpherePage, catagory='Sphere', id='Center Point')
-
-        self.createEntryField(SpherePage,catagory='Sphere', id='Size',
-                              value = 1.0,
-                              command = None,
-                              initialState='normal',
-                              side = 'top')
-
-        # Segment object setting
-
-        Interior = Frame(SegmentPage)
-        label = Label(Interior, text='Attention! All Coordinates Are Related To Its Parent Node!')
-        label.pack(side=LEFT,expand=0,fill=X, padx=1)
-        Interior.pack(side=TOP, expand=0,fill=X)
-        
-        self.createPosEntry(SegmentPage, catagory='Segment', id='Point A')
-        self.createPosEntry(SegmentPage, catagory='Segment', id='Point B')
-
-        # Ray object setting
-
-        Interior = Frame(RayPage)
-        label = Label(Interior, text='Attention! All Coordinates Are Related To Its Parent Node!')
-        label.pack(side=LEFT,expand=0,fill=X, padx=1)
-        Interior.pack(side=TOP, expand=0,fill=X)
-        
-        self.createPosEntry(RayPage, catagory='Ray', id='Origin')
-        self.createPosEntry(RayPage, catagory='Ray', id='Direction')
-
-
-           
-        self.objNotebook.setnaturalsize()
-        self.objNotebook.pack(expand = 1, fill = BOTH)
-
-        self.okButton = Button(mainFrame, text="OK", command=self.okPress,width=10)
-        self.okButton.pack(fill=BOTH,expand=0,side=RIGHT)
-
-        mainFrame.pack(expand=1, fill = BOTH)
-
-    def onDestroy(self, event):
-        messenger.send('CW_close')
-        '''
-        If you have open any thing, please rewrite here!
-        '''
-        pass
-
-    def setObjectType(self, typeName = 'collisionSphere'):
-        #################################################################
-        # setObjectType(self, typeName = 'collisionSphere')
-        # Call back function
-        # This function will be called when user select target collision
-        # type on the combo box on the panel.
-        # Basically, this function's job is to switch the notebook page to right one.
-        #################################################################
-        self.objType = typeName
-        if self.objType=='collisionPolygon':
-            self.objNotebook.selectpage('Polygon')
-        elif self.objType=='collisionSphere':
-            self.objNotebook.selectpage('Sphere')
-        elif self.objType=='collisionSegment':
-            self.objNotebook.selectpage('Segment')
-        elif self.objType=='collisionRay':
-            self.objNotebook.selectpage('Ray')
-            
-        return
-
-    def updateObjInfo(self, page=None):
-        #################################################################
-        # Nothing. Unlike in the lighting panel, we don't have to keep data
-        # once user switch the page.
-        #################################################################
-        return
-
-    def okPress(self):
-        #################################################################
-        # okPress(self)
-        # This function will be called when user click on the Ok button.
-        # Then this function will collect all parameters that we need to create
-        # a collision Object from the panel and generate the colision Object.
-        # In the last, it will send the object out with a message to dataHolder to
-        # put the object into a CollisionNode and attach it to the target nodePath
-        #################################################################
-        collisionObject = None
-        print self.objType
-        if self.objType=='collisionPolygon':
-            pointA =  Point3(float(self.widgetDict['PolygonPoint A'][0]._entry.get()),
-                             float(self.widgetDict['PolygonPoint A'][1]._entry.get()),
-                             float(self.widgetDict['PolygonPoint A'][2]._entry.get()))
-            pointB =  Point3(float(self.widgetDict['PolygonPoint B'][0]._entry.get()),
-                             float(self.widgetDict['PolygonPoint B'][1]._entry.get()),
-                             float(self.widgetDict['PolygonPoint B'][2]._entry.get()))
-            pointC =  Point3(float(self.widgetDict['PolygonPoint C'][0]._entry.get()),
-                             float(self.widgetDict['PolygonPoint C'][1]._entry.get()),
-                             float(self.widgetDict['PolygonPoint C'][2]._entry.get()))
-            collisionObject = CollisionPolygon(pointA, pointB, pointC)
-            
-        elif self.objType=='collisionSphere':
-            collisionObject = CollisionSphere(float(self.widgetDict['SphereCenter Point'][0]._entry.get()),
-                                              float(self.widgetDict['SphereCenter Point'][1]._entry.get()),
-                                              float(self.widgetDict['SphereCenter Point'][2]._entry.get()),
-                                              float(self.widgetDict['SphereSize'].getvalue()))
-        
-        elif self.objType=='collisionSegment':
-            pointA =  Point3(float(self.widgetDict['SegmentPoint A'][0]._entry.get()),
-                             float(self.widgetDict['SegmentPoint A'][1]._entry.get()),
-                             float(self.widgetDict['SegmentPoint A'][2]._entry.get()))
-            pointB =  Point3(float(self.widgetDict['SegmentPoint B'][0]._entry.get()),
-                             float(self.widgetDict['SegmentPoint B'][1]._entry.get()),
-                             float(self.widgetDict['SegmentPoint B'][2]._entry.get()))
-            
-            collisionObject = CollisionSegment()
-            collisionObject.setPointA(pointA)
-            collisionObject.setFromLens(base.cam.node(), Point2( -1, 1 ))  ## You must set up the camera lensNode before you set point B....
-            collisionObject.setPointB(pointB)
-        
-        elif self.objType=='collisionRay':
-            point =  Point3(float(self.widgetDict['RayOrigin'][0]._entry.get()),
-                            float(self.widgetDict['RayOrigin'][1]._entry.get()),
-                            float(self.widgetDict['RayOrigin'][2]._entry.get()))
-            
-            vector =  Vec3(float(self.widgetDict['RayDirection'][0]._entry.get()),
-                           float(self.widgetDict['RayDirection'][1]._entry.get()),
-                           float(self.widgetDict['RayDirection'][2]._entry.get()))
-
-            print vector, point
-            
-            collisionObject = CollisionRay()
-            collisionObject.setOrigin(point)
-            collisionObject.setDirection(vector)
-            #collisionObject.setFromLens(base.cam.node(), Point2( -1, 1 ))  ## You must set up the camera lensNode before you set up others...
-            
-        if self.objType=='collisionPolygon':
-            messenger.send('CW_addCollisionObj', [collisionObject, self.nodePath, pointA, pointB, pointC])
-        else:
-            messenger.send('CW_addCollisionObj', [collisionObject, self.nodePath])
-
-        self.quit()
-        
-        return
-
-    def createPosEntry(self, contentFrame, catagory, id):
-        posInterior = Frame(contentFrame)
-        label = Label(posInterior, text=id+':')
-        label.pack(side=LEFT,expand=0,fill=X, padx=1)
-        self.posX = self.createcomponent('posX'+catagory+id, (), None,
-                                         Floater.Floater, (posInterior,),
-                                         text = 'X', relief = FLAT,
-                                         value = 0.0,
-                                         entry_width = 6)
-        
-        self.posX.pack(side=LEFT,expand=0,fill=X, padx=1)
-        
-        self.posY = self.createcomponent('posY'+catagory+id, (), None,
-                                         Floater.Floater, (posInterior,),
-                                         text = 'Y', relief = FLAT,
-                                         value = 0.0,
-                                         entry_width = 6)
-        self.posY.pack(side=LEFT, expand=0,fill=X, padx=1)
-        
-        self.posZ = self.createcomponent('posZ'+catagory+id, (), None,
-                                         Floater.Floater, (posInterior,),
-                                         text = 'Z', relief = FLAT,
-                                         value = 0.0,
-                                         entry_width = 6)
-        self.posZ.pack(side=LEFT, expand=0,fill=X, padx=1)
-        self.widgetDict[catagory+id]=[self.posX, self.posY, self.posZ]
-        posInterior.pack(side=TOP, expand=0,fill=X, padx=3, pady=3)
-        return
-
-    def createEntryField(self, parent, catagory, id, value,
-                         command, initialState, labelWidth = 6,
-                         side = 'left', fill = X, expand = 0,
-                         validate = None,
-                         defaultButton = False, buttonText = 'Default',defaultFunction = None ):
-        frame = Frame(parent)
-        widget = Pmw.EntryField(frame, labelpos='w', label_text = id+':',
-                                value = value, entry_font=('MSSansSerif', 10),label_font=('MSSansSerif', 10),
-                                modifiedcommand=command, validate = validate,
-                                label_width = labelWidth)
-        widget.configure(entry_state = initialState)
-        widget.pack(side=LEFT)
-        self.widgetDict[catagory+id] = widget
-        if defaultButton and (defaultFunction!=None):
-            widget = Button(frame, text=buttonText, font=('MSSansSerif', 10), command = defaultFunction)
-            widget.pack(side=LEFT, padx=3)
-            self.widgetDict[catagory+id+'-'+'DefaultButton']=widget
-            
-        frame.pack(side = side, fill = fill, expand = expand,pady=3)

+ 0 - 695
doc/SceneEditor/controllerWindow.py

@@ -1,695 +0,0 @@
-#################################################################
-# controllerWindow.py
-# Written by Yi-Hong Lin, [email protected], 2004
-#################################################################
-
-from direct.tkwidgets.AppShell import AppShell
-from Tkinter import Frame, Label, Button
-import string, Pmw, Tkinter
-
-# Define the Category
-KEYBOARD = 'Keyboard-'
-TRACKER = 'Tarcker-'
-
-class controllerWindow(AppShell):
-    #################################################################
-    # This will open a talk window for user to set the control mechanism
-    # In here, user can choose to control what object by keyboard or other inputs.
-    #################################################################
-    
-    # Override class variables
-    appname = 'Controller Panel'
-    frameWidth  = 500
-    frameHeight = 500
-
-    widgetsDict = {} # category-id : widget obj
-
-    # setup the type of controller we handle here.
-    controllerList = ['Keyboard',
-                      'Tracker']
-    
-    # Default Keyboard setting
-    keyboardMapDict = {}
-    keyboardSpeedDict = {}
-    
-    def __init__(self, listOfObj, controlType , dataList, parent = None, **kw):
-        if controlType == 'Keyboard':
-            self.nodePath = dataList[0] # Default setting -> mainly used for Keyboard control now.
-            self.nameOfNode = self.nodePath.getName()
-            self.controllType = 'Keyboard'
-            self.keyboardMapDict.clear()
-            self.keyboardMapDict = dataList[1]
-            self.keyboardSpeedDict.clear()
-            self.keyboardSpeedDict = dataList[2]
-            
-        self.listOfObj = listOfObj
-        self.keepControl = False
-        
-        INITOPT = Pmw.INITOPT
-        optiondefs = (
-            ('title',               self.appname,       None),
-            )
-        self.defineoptions(kw, optiondefs)
-
-        # Initialize the superclass
-        AppShell.__init__(self)
-
-        # Execute option callbacks
-        self.initialiseoptions(controllerWindow)
-
-        self.parent.resizable(False,False) ## Disable the ability to resize for this Window.
-
-    def createInterface(self):
-        # Handle to the toplevels interior
-        interior = self.interior()
-        menuBar = self.menuBar
-        
-        # We don't need menu bar here
-        self.menuBar.destroy() 
-
-        # Create a frame to hold all stuff
-        mainFrame = Frame(interior)
-
-        # A comboBox to switch the controller
-        frame = Frame(mainFrame)
-        self.cotrollerTypeEntry = self.createcomponent(
-            'Controller Type', (), None,
-            Pmw.ComboBox, (frame,),
-            labelpos = Tkinter.W, label_text='Controller Type:', entry_width = 20,entry_state = Tkinter.DISABLED,
-            selectioncommand = self.setControllerType,
-            scrolledlist_items = self.controllerList)
-        self.cotrollerTypeEntry.pack(side=Tkinter.LEFT)
-        frame.pack(side=Tkinter.TOP, fill=Tkinter.X, expand=False, pady = 3)
-        self.cotrollerTypeEntry.selectitem('Keyboard', setentry=True)
-        
-        self.inputZone = Pmw.Group(mainFrame, tag_pyclass = None)
-        self.inputZone.pack(fill='both',expand=1)
-        settingFrame = self.inputZone.interior()
-
-        ###################################################
-        # Notebook pages for specific controller setting  #
-        ###################################################
-        self.contentWidge = self.createcomponent(
-            'scrolledFrame',
-            (), None,
-            Pmw.ScrolledFrame, (settingFrame,),
-            hull_width = 200, hull_height = 300,
-            usehullsize = 1)
-        self.contentFrame = self.contentWidge.component('frame')
-        self.contentWidge.pack(fill = 'both', expand = 1,padx = 3, pady = 5)
-        self.objNotebook = Pmw.NoteBook(self.contentFrame, tabpos = None,
-                                        borderwidth = 0)
-        keyboardPage = self.objNotebook.add('Keyboard')
-        tarckerPage = self.objNotebook.add('Tracker')
-        self.objNotebook.selectpage('Keyboard')
-        self.objNotebook.pack(side = Tkinter.TOP, fill='both',expand=False)
-        # Put this here so it isn't called right away
-        self.objNotebook['raisecommand'] = self.updateControlInfo
-
-        # Keyboard  setting
-        assignFrame = Frame(keyboardPage)
-
-        Interior = Frame(assignFrame)
-        widget = self.createcomponent(
-            'Target Type', (), None,
-            Pmw.ComboBox, (Interior,),
-            labelpos = Tkinter.W, label_text='Target Object:', entry_width = 20, entry_state = Tkinter.DISABLED,
-            selectioncommand = self.setTargetObj,
-            scrolledlist_items = self.listOfObj)
-        widget.pack(side=Tkinter.LEFT, padx=3)
-        Interior.pack(side=Tkinter.TOP, fill=Tkinter.X, expand=True, pady = 5)
-        widget.selectitem(self.nameOfNode, setentry=True)
-        self.widgetsDict[KEYBOARD+'ObjList'] = widget
-
-        inputZone = Pmw.Group(assignFrame, tag_pyclass = None)
-        inputZone.pack(fill='both',expand=1)
-        settingFrame = inputZone.interior()
-        
-        Interior = Frame(settingFrame)
-        widget = Label(Interior, text = 'Assign a Key For:').pack(side=Tkinter.LEFT, expand = False)
-        Interior.pack(side=Tkinter.TOP, fill=Tkinter.X, expand=True,pady = 6 )
-        
-        Interior = Frame(settingFrame)
-        widget = Label(Interior, text = 'Forward   :', width = 20, anchor = Tkinter.W).pack(side=Tkinter.LEFT, expand = False)
-        widget = self.createcomponent(
-            'Forward key', (), None,
-            Pmw.EntryField, (Interior,),
-            value = self.keyboardMapDict['KeyForward'],
-            labelpos = Tkinter.W, label_text='Key :', entry_width = 10)
-        widget.pack(side=Tkinter.LEFT, expand = False)
-        self.widgetsDict[KEYBOARD+'KeyForward'] = widget
-        widget = Label(Interior, text = '   ').pack(side=Tkinter.LEFT, expand = False)
-        widget = self.createcomponent(
-            'Forward Speed', (), None,
-            Pmw.EntryField, (Interior,),
-            value = self.keyboardSpeedDict['SpeedForward'],
-            labelpos = Tkinter.W, label_text='Speed :', entry_width = 10)
-        widget.pack(side=Tkinter.LEFT, expand = False)
-        self.widgetsDict[KEYBOARD+'SpeedForward'] = widget
-        widget = Label(Interior, text = 'Per Second').pack(side=Tkinter.LEFT, expand = False)
-        Interior.pack(side=Tkinter.TOP, fill=Tkinter.X, expand=True, pady = 4 )
-
-        Interior = Frame(settingFrame)
-        widget = Label(Interior, text = 'Backward  :', width = 20, anchor = Tkinter.W).pack(side=Tkinter.LEFT, expand = False)
-        widget = self.createcomponent(
-            'Backward key', (), None,
-            Pmw.EntryField, (Interior,),
-            value = self.keyboardMapDict['KeyBackward'],
-            labelpos = Tkinter.W, label_text='Key :', entry_width = 10)
-        widget.pack(side=Tkinter.LEFT, expand = False)
-        self.widgetsDict[KEYBOARD+'KeyBackward'] = widget
-        widget = Label(Interior, text = '   ').pack(side=Tkinter.LEFT, expand = False)
-        widget = self.createcomponent(
-            'Backward Speed', (), None,
-            Pmw.EntryField, (Interior,),
-            value = self.keyboardSpeedDict['SpeedBackward'],
-            labelpos = Tkinter.W, label_text='Speed :', entry_width = 10)
-        widget.pack(side=Tkinter.LEFT, expand = False)
-        self.widgetsDict[KEYBOARD+'SpeedBackward'] = widget
-        widget = Label(Interior, text = 'Per Second').pack(side=Tkinter.LEFT, expand = False)
-        Interior.pack(side=Tkinter.TOP, fill=Tkinter.X, expand=True, pady = 4 )
-
-        Interior = Frame(settingFrame)
-        widget = Label(Interior, text = 'Right     :', width = 20, anchor = Tkinter.W).pack(side=Tkinter.LEFT, expand = False)
-        widget = self.createcomponent(
-            'Right key', (), None,
-            Pmw.EntryField, (Interior,),
-            value = self.keyboardMapDict['KeyRight'],
-            labelpos = Tkinter.W, label_text='Key :', entry_width = 10)
-        widget.pack(side=Tkinter.LEFT, expand = False)
-        self.widgetsDict[KEYBOARD+'KeyRight'] = widget
-        widget = Label(Interior, text = '   ').pack(side=Tkinter.LEFT, expand = False)
-        widget = self.createcomponent(
-            'Right Speed', (), None,
-            Pmw.EntryField, (Interior,),
-            value = self.keyboardSpeedDict['SpeedRight'],
-            labelpos = Tkinter.W, label_text='Speed :', entry_width = 10)
-        widget.pack(side=Tkinter.LEFT, expand = False)
-        self.widgetsDict[KEYBOARD+'SpeedRight'] = widget
-        widget = Label(Interior, text = 'Per Second').pack(side=Tkinter.LEFT, expand = False)
-        Interior.pack(side=Tkinter.TOP, fill=Tkinter.X, expand=True, pady = 4 )
-
-        Interior = Frame(settingFrame)
-        widget = Label(Interior, text = 'Left      :', width = 20, anchor = Tkinter.W).pack(side=Tkinter.LEFT, expand = False)
-        widget = self.createcomponent(
-            'Left key', (), None,
-            Pmw.EntryField, (Interior,),
-            value = self.keyboardMapDict['KeyLeft'],
-            labelpos = Tkinter.W, label_text='Key :', entry_width = 10)
-        widget.pack(side=Tkinter.LEFT, expand = False)
-        self.widgetsDict[KEYBOARD+'KeyLeft'] = widget
-        widget = Label(Interior, text = '   ').pack(side=Tkinter.LEFT, expand = False)
-        widget = self.createcomponent(
-            'Left Speed', (), None,
-            Pmw.EntryField, (Interior,),
-            value = self.keyboardSpeedDict['SpeedLeft'],
-            labelpos = Tkinter.W, label_text='Speed :', entry_width = 10)
-        widget.pack(side=Tkinter.LEFT, expand = False)
-        self.widgetsDict[KEYBOARD+'SpeedLeft'] = widget
-        widget = Label(Interior, text = 'Per Second').pack(side=Tkinter.LEFT, expand = False)
-        Interior.pack(side=Tkinter.TOP, fill=Tkinter.X, expand=True, pady = 4 )
-
-        Interior = Frame(settingFrame)
-        widget = Label(Interior, text = 'Up        :', width = 20, anchor = Tkinter.W).pack(side=Tkinter.LEFT, expand = False)
-        widget = self.createcomponent(
-            'Up key', (), None,
-            Pmw.EntryField, (Interior,),
-            value = self.keyboardMapDict['KeyUp'],
-            labelpos = Tkinter.W, label_text='Key :', entry_width = 10)
-        widget.pack(side=Tkinter.LEFT, expand = False)
-        self.widgetsDict[KEYBOARD+'KeyUp'] = widget
-        widget = Label(Interior, text = '   ').pack(side=Tkinter.LEFT, expand = False)
-        widget = self.createcomponent(
-            'Up Speed', (), None,
-            Pmw.EntryField, (Interior,),
-            value = self.keyboardSpeedDict['SpeedUp'],
-            labelpos = Tkinter.W, label_text='Speed :', entry_width = 10)
-        widget.pack(side=Tkinter.LEFT, expand = False)
-        self.widgetsDict[KEYBOARD+'SpeedUp'] = widget
-        widget = Label(Interior, text = 'Per Second').pack(side=Tkinter.LEFT, expand = False)
-        Interior.pack(side=Tkinter.TOP, fill=Tkinter.X, expand=True, pady = 4 )
-
-        Interior = Frame(settingFrame)
-        widget = Label(Interior, text = 'Down      :', width = 20, anchor = Tkinter.W).pack(side=Tkinter.LEFT, expand = False)
-        widget = self.createcomponent(
-            'Down key', (), None,
-            Pmw.EntryField, (Interior,),
-            value = self.keyboardMapDict['KeyDown'],
-            labelpos = Tkinter.W, label_text='Key :', entry_width = 10)
-        widget.pack(side=Tkinter.LEFT, expand = False)
-        self.widgetsDict[KEYBOARD+'KeyDown'] = widget
-        widget = Label(Interior, text = '   ').pack(side=Tkinter.LEFT, expand = False)
-        widget = self.createcomponent(
-            'Down Speed', (), None,
-            Pmw.EntryField, (Interior,),
-            value = self.keyboardSpeedDict['SpeedDown'],
-            labelpos = Tkinter.W, label_text='Speed :', entry_width = 10)
-        widget.pack(side=Tkinter.LEFT, expand = False)
-        self.widgetsDict[KEYBOARD+'SpeedDown'] = widget
-        widget = Label(Interior, text = 'Per Second').pack(side=Tkinter.LEFT, expand = False)
-        Interior.pack(side=Tkinter.TOP, fill=Tkinter.X, expand=True, pady = 4 )
-
-        Interior = Frame(settingFrame)
-        widget = Label(Interior, text = 'Turn Right:', width = 20, anchor = Tkinter.W).pack(side=Tkinter.LEFT, expand = False)
-        widget = self.createcomponent(
-            'Turn Right key', (), None,
-            Pmw.EntryField, (Interior,),
-            value = self.keyboardMapDict['KeyTurnRight'],
-            labelpos = Tkinter.W, label_text='Key :', entry_width = 10)
-        widget.pack(side=Tkinter.LEFT, expand = False)
-        self.widgetsDict[KEYBOARD+'KeyTurnRight'] = widget
-        widget = Label(Interior, text = '   ').pack(side=Tkinter.LEFT, expand = False)
-        widget = self.createcomponent(
-            'Turn Right Speed', (), None,
-            Pmw.EntryField, (Interior,),
-            value = self.keyboardSpeedDict['SpeedTurnRight'],
-            labelpos = Tkinter.W, label_text='Speed :', entry_width = 10)
-        widget.pack(side=Tkinter.LEFT, expand = False)
-        self.widgetsDict[KEYBOARD+'SpeedTurnRight'] = widget
-        widget = Label(Interior, text = 'Per Second').pack(side=Tkinter.LEFT, expand = False)
-        Interior.pack(side=Tkinter.TOP, fill=Tkinter.X, expand=True, pady = 4 )
-
-        Interior = Frame(settingFrame)
-        widget = Label(Interior, text = 'Turn Left :', width = 20, anchor = Tkinter.W).pack(side=Tkinter.LEFT, expand = False)
-        widget = self.createcomponent(
-            'Turn Left key', (), None,
-            Pmw.EntryField, (Interior,),
-            value = self.keyboardMapDict['KeyTurnLeft'],
-            labelpos = Tkinter.W, label_text='Key :', entry_width = 10)
-        widget.pack(side=Tkinter.LEFT, expand = False)
-        self.widgetsDict[KEYBOARD+'KeyTurnLeft'] = widget
-        widget = Label(Interior, text = '   ').pack(side=Tkinter.LEFT, expand = False)
-        widget = self.createcomponent(
-            'Turn Left Speed', (), None,
-            Pmw.EntryField, (Interior,),
-            value = self.keyboardSpeedDict['SpeedTurnLeft'],
-            labelpos = Tkinter.W, label_text='Speed :', entry_width = 10)
-        widget.pack(side=Tkinter.LEFT, expand = False)
-        self.widgetsDict[KEYBOARD+'SpeedTurnLeft'] = widget
-        widget = Label(Interior, text = 'Per Second').pack(side=Tkinter.LEFT, expand = False)
-        Interior.pack(side=Tkinter.TOP, fill=Tkinter.X, expand=True, pady = 4 )
-
-        Interior = Frame(settingFrame)
-        widget = Label(Interior, text = 'Turn UP   :', width = 20, anchor = Tkinter.W).pack(side=Tkinter.LEFT, expand = False)
-        widget = self.createcomponent(
-            'Turn UP key', (), None,
-            Pmw.EntryField, (Interior,),
-            value = self.keyboardMapDict['KeyTurnUp'],
-            labelpos = Tkinter.W, label_text='Key :', entry_width = 10)
-        widget.pack(side=Tkinter.LEFT, expand = False)
-        self.widgetsDict[KEYBOARD+'KeyTurnUp'] = widget
-        widget = Label(Interior, text = '   ').pack(side=Tkinter.LEFT, expand = False)
-        widget = self.createcomponent(
-            'Turn UP Speed', (), None,
-            Pmw.EntryField, (Interior,),
-            value = self.keyboardSpeedDict['SpeedTurnUp'],
-            labelpos = Tkinter.W, label_text='Speed :', entry_width = 10)
-        widget.pack(side=Tkinter.LEFT, expand = False)
-        self.widgetsDict[KEYBOARD+'SpeedTurnUp'] = widget
-        widget = Label(Interior, text = 'Per Second').pack(side=Tkinter.LEFT, expand = False)
-        Interior.pack(side=Tkinter.TOP, fill=Tkinter.X, expand=True, pady = 4 )
-
-        Interior = Frame(settingFrame)
-        widget = Label(Interior, text = 'Turn Down :', width = 20, anchor = Tkinter.W).pack(side=Tkinter.LEFT, expand = False)
-        widget = self.createcomponent(
-            'Turn Down key', (), None,
-            Pmw.EntryField, (Interior,),
-            value = self.keyboardMapDict['KeyTurnDown'],
-            labelpos = Tkinter.W, label_text='Key :', entry_width = 10)
-        widget.pack(side=Tkinter.LEFT, expand = False)
-        self.widgetsDict[KEYBOARD+'KeyTurnDown'] = widget
-        widget = Label(Interior, text = '   ').pack(side=Tkinter.LEFT, expand = False)
-        widget = self.createcomponent(
-            'Turn Down Speed', (), None,
-            Pmw.EntryField, (Interior,),
-            value = self.keyboardSpeedDict['SpeedTurnDown'],
-            labelpos = Tkinter.W, label_text='Speed :', entry_width = 10)
-        widget.pack(side=Tkinter.LEFT, expand = False)
-        self.widgetsDict[KEYBOARD+'SpeedTurnDown'] = widget
-        widget = Label(Interior, text = 'Per Second').pack(side=Tkinter.LEFT, expand = False)
-        Interior.pack(side=Tkinter.TOP, fill=Tkinter.X, expand=True, pady = 4 )
-
-        Interior = Frame(settingFrame)
-        widget = Label(Interior, text = 'Roll Right:', width = 20, anchor = Tkinter.W).pack(side=Tkinter.LEFT, expand = False)
-        widget = self.createcomponent(
-            'Roll Right key', (), None,
-            Pmw.EntryField, (Interior,),
-            value = self.keyboardMapDict['KeyRollRight'],
-            labelpos = Tkinter.W, label_text='Key :', entry_width = 10)
-        widget.pack(side=Tkinter.LEFT, expand = False)
-        self.widgetsDict[KEYBOARD+'KeyRollRight'] = widget
-        widget = Label(Interior, text = '   ').pack(side=Tkinter.LEFT, expand = False)
-        widget = self.createcomponent(
-            'Roll Right Speed', (), None,
-            Pmw.EntryField, (Interior,),
-            value = self.keyboardSpeedDict['SpeedRollRight'],
-            labelpos = Tkinter.W, label_text='Speed :', entry_width = 10)
-        widget.pack(side=Tkinter.LEFT, expand = False)
-        self.widgetsDict[KEYBOARD+'SpeedRollRight'] = widget
-        widget = Label(Interior, text = 'Per Second').pack(side=Tkinter.LEFT, expand = False)
-        Interior.pack(side=Tkinter.TOP, fill=Tkinter.X, expand=True, pady = 4 )
-
-        Interior = Frame(settingFrame)
-        widget = Label(Interior, text = 'Roll Left :', width = 20, anchor = Tkinter.W).pack(side=Tkinter.LEFT, expand = False)
-        widget = self.createcomponent(
-            'Roll Left key', (), None,
-            Pmw.EntryField, (Interior,),
-            value = self.keyboardMapDict['KeyRollLeft'],
-            labelpos = Tkinter.W, label_text='Key :', entry_width = 10)
-        widget.pack(side=Tkinter.LEFT, expand = False)
-        self.widgetsDict[KEYBOARD+'KeyRollLeft'] = widget
-        widget = Label(Interior, text = '   ').pack(side=Tkinter.LEFT, expand = False)
-        widget = self.createcomponent(
-            'Roll Left Speed', (), None,
-            Pmw.EntryField, (Interior,),
-            value = self.keyboardSpeedDict['SpeedRollLeft'],
-            labelpos = Tkinter.W, label_text='Speed :', entry_width = 10)
-        widget.pack(side=Tkinter.LEFT, expand = False)
-        self.widgetsDict[KEYBOARD+'SpeedRollLeft'] = widget
-        widget = Label(Interior, text = 'Per Second').pack(side=Tkinter.LEFT, expand = False)
-        Interior.pack(side=Tkinter.TOP, fill=Tkinter.X, expand=True, pady = 4 )
-
-        Interior = Frame(settingFrame)
-        widget = Label(Interior, text = 'Scale UP :', width = 20, anchor = Tkinter.W).pack(side=Tkinter.LEFT, expand = False)
-        widget = self.createcomponent(
-            'Scale UP key', (), None,
-            Pmw.EntryField, (Interior,),
-            value = self.keyboardMapDict['KeyScaleUp'],
-            labelpos = Tkinter.W, label_text='Key :', entry_width = 10)
-        widget.pack(side=Tkinter.LEFT, expand = False)
-        self.widgetsDict[KEYBOARD+'KeyScaleUp'] = widget
-        widget = Label(Interior, text = '   ').pack(side=Tkinter.LEFT, expand = False)
-        widget = self.createcomponent(
-            'Scale UP Speed', (), None,
-            Pmw.EntryField, (Interior,),
-            value = self.keyboardSpeedDict['SpeedScaleUp'],
-            labelpos = Tkinter.W, label_text='Speed :', entry_width = 10)
-        widget.pack(side=Tkinter.LEFT, expand = False)
-        self.widgetsDict[KEYBOARD+'SpeedScaleUp'] = widget
-        widget = Label(Interior, text = 'Per Second').pack(side=Tkinter.LEFT, expand = False)
-        Interior.pack(side=Tkinter.TOP, fill=Tkinter.X, expand=True, pady = 4 )
-
-        Interior = Frame(settingFrame)
-        widget = Label(Interior, text = 'Scale Down:', width = 20, anchor = Tkinter.W).pack(side=Tkinter.LEFT, expand = False)
-        widget = self.createcomponent(
-            'Scale Down key', (), None,
-            Pmw.EntryField, (Interior,),
-            value = self.keyboardMapDict['KeyScaleDown'],
-            labelpos = Tkinter.W, label_text='Key :', entry_width = 10)
-        widget.pack(side=Tkinter.LEFT, expand = False)
-        self.widgetsDict[KEYBOARD+'KeyScaleDown'] = widget
-        widget = Label(Interior, text = '   ').pack(side=Tkinter.LEFT, expand = False)
-        widget = self.createcomponent(
-            'Scale Down Speed', (), None,
-            Pmw.EntryField, (Interior,),
-            value = self.keyboardSpeedDict['SpeedScaleDown'],
-            labelpos = Tkinter.W, label_text='Speed :', entry_width = 10)
-        widget.pack(side=Tkinter.LEFT, expand = False)
-        self.widgetsDict[KEYBOARD+'SpeedScaleDown'] = widget
-        widget = Label(Interior, text = 'Per Second').pack(side=Tkinter.LEFT, expand = False)
-        Interior.pack(side=Tkinter.TOP, fill=Tkinter.X, expand=True, pady = 4 )
-
-        Interior = Frame(settingFrame)
-        widget = Label(Interior, text = 'Scale X UP :', width = 20, anchor = Tkinter.W).pack(side=Tkinter.LEFT, expand = False)
-        widget = self.createcomponent(
-            'Scale X UP key', (), None,
-            Pmw.EntryField, (Interior,),
-            value = self.keyboardMapDict['KeyScaleXUp'],
-            labelpos = Tkinter.W, label_text='Key :', entry_width = 10)
-        widget.pack(side=Tkinter.LEFT, expand = False)
-        self.widgetsDict[KEYBOARD+'KeyScaleXUp'] = widget
-        widget = Label(Interior, text = '   ').pack(side=Tkinter.LEFT, expand = False)
-        widget = self.createcomponent(
-            'Scale X UP Speed', (), None,
-            Pmw.EntryField, (Interior,),
-            value = self.keyboardSpeedDict['SpeedScaleXUp'],
-            labelpos = Tkinter.W, label_text='Speed :', entry_width = 10)
-        widget.pack(side=Tkinter.LEFT, expand = False)
-        self.widgetsDict[KEYBOARD+'SpeedScaleXUp'] = widget
-        widget = Label(Interior, text = 'Per Second').pack(side=Tkinter.LEFT, expand = False)
-        Interior.pack(side=Tkinter.TOP, fill=Tkinter.X, expand=True, pady = 4 )
-
-        Interior = Frame(settingFrame)
-        widget = Label(Interior, text = 'Scale X Down:', width = 20, anchor = Tkinter.W).pack(side=Tkinter.LEFT, expand = False)
-        widget = self.createcomponent(
-            'Scale X Down key', (), None,
-            Pmw.EntryField, (Interior,),
-            value = self.keyboardMapDict['KeyScaleXDown'],
-            labelpos = Tkinter.W, label_text='Key :', entry_width = 10)
-        widget.pack(side=Tkinter.LEFT, expand = False)
-        self.widgetsDict[KEYBOARD+'KeyScaleXDown'] = widget
-        widget = Label(Interior, text = '   ').pack(side=Tkinter.LEFT, expand = False)
-        widget = self.createcomponent(
-            'Scale Down X Speed', (), None,
-            Pmw.EntryField, (Interior,),
-            value = self.keyboardSpeedDict['SpeedScaleXDown'],
-            labelpos = Tkinter.W, label_text='Speed :', entry_width = 10)
-        widget.pack(side=Tkinter.LEFT, expand = False)
-        self.widgetsDict[KEYBOARD+'SpeedScaleXDown'] = widget
-        widget = Label(Interior, text = 'Per Second').pack(side=Tkinter.LEFT, expand = False)
-        Interior.pack(side=Tkinter.TOP, fill=Tkinter.X, expand=True, pady = 4 )
-
-        Interior = Frame(settingFrame)
-        widget = Label(Interior, text = 'Scale Y UP :', width = 20, anchor = Tkinter.W).pack(side=Tkinter.LEFT, expand = False)
-        widget = self.createcomponent(
-            'Scale Y UP key', (), None,
-            Pmw.EntryField, (Interior,),
-            value = self.keyboardMapDict['KeyScaleYUp'],
-            labelpos = Tkinter.W, label_text='Key :', entry_width = 10)
-        widget.pack(side=Tkinter.LEFT, expand = False)
-        self.widgetsDict[KEYBOARD+'KeyScaleYUp'] = widget
-        widget = Label(Interior, text = '   ').pack(side=Tkinter.LEFT, expand = False)
-        widget = self.createcomponent(
-            'Scale Y UP Speed', (), None,
-            Pmw.EntryField, (Interior,),
-            value = self.keyboardSpeedDict['SpeedScaleYUp'],
-            labelpos = Tkinter.W, label_text='Speed :', entry_width = 10)
-        widget.pack(side=Tkinter.LEFT, expand = False)
-        self.widgetsDict[KEYBOARD+'SpeedScaleYUp'] = widget
-        widget = Label(Interior, text = 'Per Second').pack(side=Tkinter.LEFT, expand = False)
-        Interior.pack(side=Tkinter.TOP, fill=Tkinter.X, expand=True, pady = 4 )
-
-        Interior = Frame(settingFrame)
-        widget = Label(Interior, text = 'Scale Y Down:', width = 20, anchor = Tkinter.W).pack(side=Tkinter.LEFT, expand = False)
-        widget = self.createcomponent(
-            'Scale Y Down key', (), None,
-            Pmw.EntryField, (Interior,),
-            value = self.keyboardMapDict['KeyScaleYDown'],
-            labelpos = Tkinter.W, label_text='Key :', entry_width = 10)
-        widget.pack(side=Tkinter.LEFT, expand = False)
-        self.widgetsDict[KEYBOARD+'KeyScaleYDown'] = widget
-        widget = Label(Interior, text = '   ').pack(side=Tkinter.LEFT, expand = False)
-        widget = self.createcomponent(
-            'Scale Down XY Speed', (), None,
-            Pmw.EntryField, (Interior,),
-            value = self.keyboardSpeedDict['SpeedScaleYDown'],
-            labelpos = Tkinter.W, label_text='Speed :', entry_width = 10)
-        widget.pack(side=Tkinter.LEFT, expand = False)
-        self.widgetsDict[KEYBOARD+'SpeedScaleYDown'] = widget
-        widget = Label(Interior, text = 'Per Second').pack(side=Tkinter.LEFT, expand = False)
-        Interior.pack(side=Tkinter.TOP, fill=Tkinter.X, expand=True, pady = 4 )
-
-        Interior = Frame(settingFrame)
-        widget = Label(Interior, text = 'Scale Z UP :', width = 20, anchor = Tkinter.W).pack(side=Tkinter.LEFT, expand = False)
-        widget = self.createcomponent(
-            'Scale Z UP key', (), None,
-            Pmw.EntryField, (Interior,),
-            value = self.keyboardMapDict['KeyScaleZUp'],
-            labelpos = Tkinter.W, label_text='Key :', entry_width = 10)
-        widget.pack(side=Tkinter.LEFT, expand = False)
-        self.widgetsDict[KEYBOARD+'KeyScaleZUp'] = widget
-        widget = Label(Interior, text = '   ').pack(side=Tkinter.LEFT, expand = False)
-        widget = self.createcomponent(
-            'Scale Z UP Speed', (), None,
-            Pmw.EntryField, (Interior,),
-            value = self.keyboardSpeedDict['SpeedScaleZUp'],
-            labelpos = Tkinter.W, label_text='Speed :', entry_width = 10)
-        widget.pack(side=Tkinter.LEFT, expand = False)
-        self.widgetsDict[KEYBOARD+'SpeedScaleZUp'] = widget
-        widget = Label(Interior, text = 'Per Second').pack(side=Tkinter.LEFT, expand = False)
-        Interior.pack(side=Tkinter.TOP, fill=Tkinter.X, expand=True, pady = 4 )
-
-        Interior = Frame(settingFrame)
-        widget = Label(Interior, text = 'Scale Z Down:', width = 20, anchor = Tkinter.W).pack(side=Tkinter.LEFT, expand = False)
-        widget = self.createcomponent(
-            'Scale Z Down key', (), None,
-            Pmw.EntryField, (Interior,),
-            value = self.keyboardMapDict['KeyScaleZDown'],
-            labelpos = Tkinter.W, label_text='Key :', entry_width = 10)
-        widget.pack(side=Tkinter.LEFT, expand = False)
-        self.widgetsDict[KEYBOARD+'KeyScaleZDown'] = widget
-        widget = Label(Interior, text = '   ').pack(side=Tkinter.LEFT, expand = False)
-        widget = self.createcomponent(
-            'Scale Down Z Speed', (), None,
-            Pmw.EntryField, (Interior,),
-            value = self.keyboardSpeedDict['SpeedScaleZDown'],
-            labelpos = Tkinter.W, label_text='Speed :', entry_width = 10)
-        widget.pack(side=Tkinter.LEFT, expand = False)
-        self.widgetsDict[KEYBOARD+'SpeedScaleZDown'] = widget
-        widget = Label(Interior, text = 'Per Second').pack(side=Tkinter.LEFT, expand = False)
-        Interior.pack(side=Tkinter.TOP, fill=Tkinter.X, expand=True, pady = 4 )
-
-        assignFrame.pack(side=Tkinter.TOP, expand=True, fill = Tkinter.X)
-        keyboardPage.pack(side=Tkinter.TOP, expand=True, fill = Tkinter.X)
-        
-        ####################################################################
-        ####################################################################
-        # End of Keyboard control page
-        ####################################################################
-        ####################################################################
-        # Pack the mainFrame
-        frame = Frame(mainFrame)
-        widget = Button(frame, text='OK', width = 13, command=self.ok_press).pack(side=Tkinter.RIGHT)
-        widget = Button(frame, text='Enable Control', width = 13, command=self.enableControl).pack(side=Tkinter.LEFT)
-        widget = Button(frame, text='Disable Control', width = 13, command=self.disableControl).pack(side=Tkinter.LEFT)
-        widget = Button(frame, text='Save & Keep', width = 13, command=self.saveKeepControl).pack(side=Tkinter.LEFT)
-        frame.pack(side = Tkinter.BOTTOM, expand=1, fill = Tkinter.X)
-        mainFrame.pack(expand=1, fill = Tkinter.BOTH)
-
-    def onDestroy(self, event):
-        # Check if user wish to keep the control after the window closed.
-        if not self.keepControl:
-            messenger.send('ControlW_controlDisable',[self.controllType])
-        messenger.send('ControlW_close')
-        '''
-        If you have open any thing, please rewrite here!
-        '''
-        pass
-
-    def ok_press(self):
-        ####################################################################
-        # ok_press(self)
-        # After user clicked on "OK" button, this function will be called.
-        # This function will collect data from the panel and send it back to
-        # sceneEditor and close the window. It won't activate control at all.
-        ####################################################################
-        if self.controllType=='Keyboard':
-            for index in self.keyboardMapDict:
-                self.keyboardMapDict[index] = self.widgetsDict['Keyboard-'+index].getvalue()
-            for index in self.keyboardSpeedDict:
-                self.keyboardSpeedDict[index] = float(self.widgetsDict['Keyboard-'+index].getvalue())
-            messenger.send('ControlW_controlSetting', ['Keyboard', [self.nodePath, self.keyboardMapDict, self.keyboardSpeedDict]])
-        self.quit()
-        return
-
-    def enableControl(self):
-        ####################################################################
-        # enableControl(self)
-        # Call back function.
-        # THis function will be called each time when user clicks on the
-        # "Enable Control" button. This function will do pretty much
-        # the same thing with ok_press function, except that this function
-        # will activate the control process in sceneEditor.
-        # However, if user didn't click on the button "Keep ANd Save,"
-        # the control process will be terminated when user closed the panel.
-        ####################################################################
-        if self.controllType=='Keyboard':
-            for index in self.keyboardMapDict:
-                self.keyboardMapDict[index] = self.widgetsDict['Keyboard-'+index].getvalue()
-            for index in self.keyboardSpeedDict:
-                self.keyboardSpeedDict[index] = float(self.widgetsDict['Keyboard-'+index].getvalue())
-            messenger.send('ControlW_controlEnable', ['Keyboard', [self.nodePath, self.keyboardMapDict, self.keyboardSpeedDict]])
-        return
-
-    def disableControl(self):
-        ####################################################################
-        # disableControl(self)
-        # This function will send out a message to sceneEditor to stop the
-        # control task.
-        ####################################################################
-        messenger.send('ControlW_controlDisable',[self.controllType])
-        return
-
-    def setControllerType(self, typeName = 'Keyboard'):
-        #################################################################
-        # setControllerType(self, typeName = 'Keyboard')
-        # Call back function
-        # This function will be called when user select the type of
-        # controller they want on the combo box on the panel.
-        # Basically, this function's job is to switch the notebook page to right one.
-        #################################################################
-        self.controllType = typeName
-        if self.controllType=='Keyboard':
-            self.objNotebook.selectpage('Keyboard')
-        elif self.controllType=='Tracker':
-            self.objNotebook.selectpage('Tracker')
-            
-        return
-
-    def updateControlInfo(self, page=None):
-        #################################################################
-        # Nothing. Unlike in the lighting panel, we don't have to keep data
-        # once user switch the page.
-        #################################################################
-        return
-
-    def setTargetObj(self, name = None, tracker = None):
-        #################################################################
-        # setTargetObj(self, name = None)
-        # setup the target object we want to control
-        #################################################################
-        if tracker == None: # Call from Keyboard page.
-            if name=='camera':
-                self.nodePath = camera
-            else:
-                messenger.send('ControlW_require',[name])
-        return
-
-    def resetNameList(self, list, name = None, nodePath = None):
-        ####################################################################
-        # resetNameList(self, list, name = None, nodePath = None)
-        # This function will be called be sceneEditor in order to reset the
-        # object list inside the panel.
-        # list here is a name list for all objects that can be set on control
-        # in the scene. If user has specify a name and a nodePath in, it will
-        # check if the name is equal to the name of current control target.
-        # If so, it will change the name showed on panel.
-        ####################################################################
-        self.widgetsDict['Keyboard-ObjList'].setlist(list)
-        if name != None:
-            if self.nameOfNode == name:
-                self.nameOfNode = self.nodePath.getName()
-                self.widgetsDict['Keyboard-ObjList'].selectitem(self.nameOfNode, setentry=True)
-        return
-
-    def setNodePathIn(self, nodePath):
-        ####################################################################
-        # setNodePathIn(self, nodePath)
-        # THis function will be called by sceneEditor.
-        # After we send out a message to sceneEditor in setTargetObj function,
-        # This function will be called by sceneEditor after we get the reference
-        # of target object from dataHolder.
-        # This function will keep the reference.
-        ####################################################################
-        self.nodePath = nodePath
-        self.nameOfNode = self.nodePath.getName()
-        return
-
-    def saveKeepControl(self):
-        #################################################################
-        # saveKeepControl(self)
-        # When any time user has click on the "Save & Keep" button,
-        # This function will be called.
-        # This function will send out the message to sceneEditor to process
-        # the saving. Also, this function will change the "self.keepControl" flag.
-        # So, when user closes the window with control enabled, it will keep
-        # the control process runnning. otherwise program will disable the
-        # control automatically when panel has been closed.
-        #
-        # It doesn't mean that this function will automatically enable the
-        # control when user closed the window!!
-        # This flag will only decide that we will send out a "stopControl"
-        # message or not.
-        #
-        #################################################################
-        self.keepControl = True
-        if self.controllType=='Keyboard':
-            for index in self.keyboardMapDict:
-                self.keyboardMapDict[index] = self.widgetsDict['Keyboard-'+index].getvalue()
-            for index in self.keyboardSpeedDict:
-                self.keyboardSpeedDict[index] = float(self.widgetsDict['Keyboard-'+index].getvalue())
-            print self.nodePath
-            messenger.send('ControlW_saveSetting', ['Keyboard', [self.nodePath, self.keyboardMapDict, self.keyboardSpeedDict]])
-        return
-
-    

+ 0 - 1071
doc/SceneEditor/dataHolder.py

@@ -1,1071 +0,0 @@
-###############################
-# TK and PMW INTERFACE MODULES#
-###############################
-from direct.showbase.TkGlobal import*
-from tkFileDialog import *
-import Pmw
-import tkFileDialog
-import tkMessageBox
-from direct.tkwidgets import Dial
-from direct.tkwidgets import Floater
-
-
-#############################
-# Scene Editor Python Files #
-#############################
-from seLights import * # All the scene editor lighting
-from seFileSaver import * # The actual File Saving Module which generates Python code
-
-################################
-#Panda Modules                 #
-################################
-from direct.actor import Actor
-
-###############################
-# Core Python Modules         #
-###############################
-import os
-import string
-import sys
-
-import seParticleEffect
-import seParticles
-
-######################################################################################################
-# Data Holder
-# This class will actually hold all data in the form of dictionaries
-# This is essentially the entire state of the scene
-# When saving a scene, the dictionaries will be accessed and code generated for the loaded content
-# Dictionaries are used to access the objects in the scene and their properties so code can be generated
-# Write/Use Accessor Methods to interface with these dictionaries
-######################################################################################################
-
-class dataHolder:
-
-    ModelDic = {} # Name: Model Nodepath; ModelRoot (whatever loader.loadModel() returns)
-    ModelRefDic = {} # Name:File Path; (whatever the Open File Dialog Returns)
-    ActorDic = {} # Name:Actor Actor; Nodepath, ModelRoot (whatever Actor.Actor() returns)
-    ActorRefDic = {} # Name:File Path; (whatever the Open File Dialog Returns)
-    curveDict = {}  # Node Name: CurveCollection; The actual curve collection data
-    collisionDict = {} # Node Name: collisionNode; collisionNode in which contains a collision object
-    blendAnimDict = {} # Node Name: Dictionary of blended animation; User blened animation will be saved in here.
-                       # the data structure in the inner dictionary is
-                       # {"name of blended animation" : [Animation Name A, Animation Name B, Effect(Float)]}
-    collisionVisable = True # A flag used to record that collision objects are visable or not
-    dummyDict = {}  # Node Name: Dummy Obj; All Object created as a dummy will be save here.
-    particleDict={} # "Effect Name": Effect Object
-    particleNodes={} # "Effect Name": Node which is a parent to the effect used to move it aruond easily
-    ModelNum = 0 # Count of number of models loaded
-    ActorNum = 0 # Count of number of animations loaded
-    theScene=None # Global variable to hold a loaded scene
-    CollisionHandler = CollisionHandlerEvent() # This object shows what happend when collision appeared
-                                               # Now, the default is CollisionHandlerEvent Type, which will just send out message when collision happend
-
-    controlType = 'Keyboard' # default control input setting
-    # Default Control setting for keyboard.
-    controlTarget = camera
-    # This two dictionary set the basic setting for the keyboard contorl
-    # Those dictionaries will be passed into controller panel each time it has been opend
-    # Do NOT change anything about INDEX in the dictionary!! (But it's OK to change the values)
-    keyboardMapDict = {'KeyForward':'arrow_up',
-                       'KeyBackward':'arrow_down',
-                       'KeyLeft':'arrow_left',
-                       'KeyRight':'arrow_right',
-                       'KeyUp':'',
-                       'KeyDown':'',
-                       'KeyTurnRight':'',
-                       'KeyTurnLeft':'',
-                       'KeyTurnUp':'',
-                       'KeyTurnDown':'',
-                       'KeyRollRight':'',
-                       'KeyRollLeft':'',
-                       'KeyScaleUp':'',
-                       'KeyScaleDown':'',
-                       'KeyScaleXUp':'',
-                       'KeyScaleXDown':'',
-                       'KeyScaleYUp':'',
-                       'KeyScaleYDown':'',
-                       'KeyScaleZUp':'',
-                       'KeyScaleZDown':''}
-    keyboardSpeedDict = {'SpeedForward': 0,
-                         'SpeedBackward': 0,
-                         'SpeedLeft': 0,
-                         'SpeedRight': 0,
-                         'SpeedUp': 0,
-                         'SpeedDown': 0,
-                         'SpeedTurnRight': 0,
-                         'SpeedTurnLeft': 0,
-                         'SpeedTurnUp': 0,
-                         'SpeedTurnDown': 0,
-                         'SpeedRollRight':0,
-                         'SpeedRollLeft':0,
-                         'SpeedScaleUp':0,
-                         'SpeedScaleDown':0,
-                         'SpeedScaleXUp':0,
-                         'SpeedScaleXDown':0,
-                         'SpeedScaleYUp':0,
-                         'SpeedScaleYDown':0,
-                         'SpeedScaleZUp':0,
-                         'SpeedScaleZDown':0}
-
-    def __init__(self):
-
-        # Creat light manager to contorl the lighting
-        self.lightManager = seLightManager()
-        self.lightManager.allOn()
-
-        # Initialize the basic message formate from CollisionHandler
-        self.CollisionHandler.setInPattern("%fnenter%in")
-        self.CollisionHandler.setOutPattern("%fnexit%in")
- 
-        pass
-
-    
-    def resetAll(self):
-        #################################################################
-        # resetAll(self)
-        # This function will reset the whole scene
-        #################################################################
-        # Delete Everything in the Scene Graph
-        for index in self.ModelDic:
-            self.ModelDic[index].removeNode()
-        for index in self.ActorDic:
-            self.ActorDic[index].removeNode()
-        for index in self.dummyDict:
-            self.dummyDict[index].removeNode()
-        for index in self.collisionDict:
-            self.collisionDict[index].removeNode()
-        for index in self.particleNodes:
-            self.particleDict[index].cleanup()
-            self.particleNodes[index].removeNode()
-
-        # Clear all data containers in the dataHolder
-        self.ModelDic.clear()
-        self.ModelRefDic.clear()
-        self.ActorDic.clear()
-        self.ActorRefDic.clear()
-        self.dummyDict.clear()
-        self.lightManager.deleteAll()
-        self.blendAnimDict.clear()
-        self.particleDict.clear()
-        self.particleNodes.clear()
-        
-        self.ModelNum=0
-        self.ActorNum=0
-        self.theScene=None
-        messenger.send('SGE_Update Explorer',[render])
-        print 'Scene should be cleaned up!'
-
-    def removeObj(self, nodePath):
-        #################################################################
-        # removeObj(self, nodePath)
-        # This function will take one nodePath obj as a input
-        # and will remove this node from scene if it is legal to be removed.
-        # Also, this function will remove all children nodes belong to this specific nodePath by recursive call.
-        #################################################################
-        name = nodePath.getName()
-
-        ## Check if there is any child node, if so, remove it.
-        childrenList = nodePath.getChildren()
-        
-                
-        if self.ModelDic.has_key(name):
-            del self.ModelDic[name]
-            del self.ModelRefDic[name]
-            if len(childrenList) != 0:
-                for node in childrenList:
-                    self.removeObj(node)
-            nodePath.removeNode()
-            self.ModelNum -= 1
-            pass
-        elif self.ActorDic.has_key(name):
-            del self.ActorDic[name]
-            del self.ActorRefDic[name]
-            if len(childrenList) != 0:
-                for node in childrenList:
-                    self.removeObj(node)
-            nodePath.removeNode()
-            self.ActorNum -= 1
-            pass
-        elif self.collisionDict.has_key(name):
-            del self.collisionDict[name]
-            if len(childrenList) != 0:
-                for node in childrenList:
-                    self.removeObj(node)
-            nodePath.removeNode()
-            pass
-        elif self.dummyDict.has_key(name):
-            del self.dummyDict[name]
-            if len(childrenList) != 0:
-                for node in childrenList:
-                    self.removeObj(node)
-            nodePath.removeNode()
-            pass
-        elif self.lightManager.isLight(name):
-            if len(childrenList) != 0:
-                for node in childrenList:
-                    self.removeObj(node)
-            list = self.lightManager.delete(name)
-            return list
-        elif self.particleNodes.has_key(name):
-            self.particleNodes[name].removeNode()
-            del self.particleNodes[name]
-            del self.particleDict[name]
-        else:
-            print 'You cannot remove this NodePath'
-            return
-        
-        messenger.send('SGE_Update Explorer',[render])
-        return
-
-    def duplicateObj(self, nodePath, pos, hpr, scale, num):
-        #############################################################################
-        # duplicateObj(self, nodePath, pos, hpr, scale, num)
-        # This function now only worked for either Actor or Model type node.
-        # It won't duplicate lights or others!!!
-        #
-        # This function will duplicate the input nodePath "num" times.
-        # Each time it will use "pos", "hpr" and "scale" as a offset to change the properties of copy.
-        # Then, reparent copies to the same parent of origin
-        #
-        # To Do:
-        # Make it work for all kinds of objects....
-        #############################################################################
-        name = nodePath.getName()
-        isModel = True
-        cPos = pos
-        cHpr = hpr
-        cScale = scale
-        parent = nodePath.getParent()
-        if self.ActorDic.has_key(name):
-            holder = self.ActorDic
-            holderRef = self.ActorRefDic
-            isModel = False
-        elif self.ModelDic.has_key(name):
-            holder = self.ModelDic
-            holderRef = self.ModelRefDic
-        else:
-            print '---- DataHolder: Target Obj is not a legal object could be duplicate!'
-            return
-            
-        FilePath = holderRef[name]
-        oPos = holder[name].getPos()+cPos
-        oHpr = holder[name].getHpr()+cHpr
-        
-        for i in range(num):
-            if isModel:
-                ### copy model node from modelpool
-                newName = name+'_copy_%d'%i
-                while self.isInScene(newName):
-                    newName = newName + '_1'
-                holder[newName] = loader.loadModel(FilePath.getFullpath())
-                holderRef[newName] = FilePath
-                self.ModelNum += 1
-                holder[newName].reparentTo(parent)
-                holder[newName].setPos(oPos)
-                holder[newName].setHpr(oHpr)
-                holder[newName].setScale(cScale)
-                holder[newName].setName(newName)
-                oPos = oPos + cPos
-                oHpr = oHpr + cHpr
-                
-            else:
-                ### copy the actor- not includ its animations
-                '''
-                Yeah, Yeah, Yeah, I know I should not reload the Actor but get it from modelpool too.
-                I tried, but it caused some error.
-                I 'might' be back to fix this problem.
-                '''
-                newName = name+'_copy_%d'%i
-                while self.isInScene(newName):
-                    newName = newName + '_1'
-                holder[newName] = Actor.Actor(FilePath.getFullpath())
-                holderRef[newName] = FilePath
-                self.ActorNum += 1
-                holder[newName].reparentTo(parent)
-                holder[newName].setPos(oPos)
-                holder[newName].setHpr(oHpr)
-                holder[newName].setScale(cScale)
-                holder[newName].setName(newName)
-                oPos = oPos + cPos
-                oHpr = oHpr + cHpr
-            
-        messenger.send('SGE_Update Explorer',[render])
-        return
-
-    def loadModel(self, lFilePath, FilePath, Name='Model_'):
-        ###########################################################################
-        # loadModel(self, lFilePath, FilePath, Name='Model_')
-        # This funciton will load a model node into the scene
-        # and will keep its reference in the ModelDic dictionary. {"NameOfModel":ModelRoot}
-        # Also it will keep the file path in ModelRefDic dictionary.
-        #
-        # The "lFilePath" parameter now is completely useless,
-        # but I still keep it here because maybe some day we will need it...
-        # (NOT because I am laze to change the funtion call in the sceneEditor...)
-        #
-        ###########################################################################
-        self.ModelNum += 1
-        defaultName = Name + '%d'%self.ModelNum
-        while self.isInScene(defaultName):
-            defaultName = defaultName + '_1'
-        self.ModelDic[defaultName] = loader.loadModel(FilePath)
-        if self.ModelDic[defaultName]==None:
-            del self.ModelDic[defaultName]
-            self.ModelNum -= 1
-            return False
-        self.ModelRefDic[defaultName] = FilePath
-        self.ModelDic[defaultName].setName(defaultName)
-        self.ModelDic[defaultName].reparentTo(render)
-        messenger.send('SGE_Update Explorer',[render])
-        messenger.send('DH_LoadingComplete',[self.ModelDic[defaultName]])
-        return True
-
-    def loadActor(self, lFilePath, FilePath, Name='Actor_'):
-        ###########################################################################
-        # loadActor(self, lFilePath, FilePath, Name='Actor_')
-        # This funciton will load an actor node into the scene
-        # and will keep its reference in the ActorDic dictionary.{"NameOfActor":Actor}
-        # Also it will keep the file path in ActorRefDic dictionary.
-        #
-        # The "lFilePath" parameter now is completely useless,
-        # but I still keep it here because maybe some day we will need it...
-        # (NOT because I am laze to change the funtion call in the sceneEditor...)
-        #
-        ###########################################################################
-        self.ActorNum += 1
-        defaultName = Name + '%d'%self.ActorNum
-        while self.isInScene(defaultName):
-            defaultName = defaultName + '_1'
-        self.ActorDic[defaultName] = Actor.Actor(FilePath.getFullpath())
-        if self.ActorDic[defaultName]==None:
-            del self.ActorDic[defaultName]
-            self.ActorNum -= 1
-            return False
-        self.ActorRefDic[defaultName] = FilePath
-        self.ActorDic[defaultName].setName(defaultName)
-        self.ActorDic[defaultName].reparentTo(render)
-        messenger.send('SGE_Update Explorer',[render])
-        messenger.send('DH_LoadingComplete',[self.ActorDic[defaultName]])
-        return True
-
-
-    def isActor(self, name):
-        ###########################################################################
-        # isActor(self, name)
-        # This funciton will return True if there is an Actor in the scene named "name"
-        # and will return False if not.
-        ###########################################################################
-        return self.ActorDic.has_key(name)
-
-    def getActor(self, name):
-        ###########################################################################
-        # getActor(self, name)
-        # This funciton will return an Actor node named "name"
-        ###########################################################################
-        if self.isActor(name):
-            return self.ActorDic[name]
-        else:
-            print '----No Actor named: ', name
-            return None
-
-    def getModel(self, name):
-        ###########################################################################
-        # getModel(self, name)
-        # This funciton will return a model node named "name"
-        ###########################################################################
-        if self.isModel(name):
-            return self.ModelDic[name]
-        else:
-            print '----No Model named: ', name
-            return None
-
-    def isModel(self, name):
-        ###########################################################################
-        # isModel(self, name)
-        # This funciton will return True if there is a Model in the scene named "name"
-        # and will return False if not.
-        ###########################################################################
-        return self.ModelDic.has_key(name)
-
-    def loadAnimation(self,name, Dic):
-        ###########################################################################
-        # loadAnimation(self,name, Dic)
-        # This funciton will load animation into an Actor NOde named "name."
-        # All animation data needs to be put into a dictionary "Dic".
-        # The formate of this dictionary is {"Name of Animation" : Path to the animation Egg file}
-        #
-        # Also, it will send out a message after the loading complete.
-        # 'DataH_loadFinish'+"the name of actor",
-        # this message will be catched by the sub window in the animation penal.
-        ###########################################################################
-        if self.isActor(name):
-            self.ActorDic[name].loadAnims(Dic)
-            for anim in Dic:
-                self.ActorDic[name].bindAnim(anim)
-            messenger.send('DataH_loadFinish'+name)
-            return
-        else:
-            print '------ Error when loading animation for Actor: ', name
-
-    def removeAnimation(self, name, anim):
-        ###########################################################################
-        # removeAnimation(self, name, anim)
-        # This function will remove the specific animation "anim" from the actor named "name."
-        #
-        # After remove compelete, it will send out two messages.
-        # One is 'DataH_removeAnimFinish'+"name of the actor." It will be caught by Animation Panel of this actor.
-        # The other is 'animRemovedFromNode,' this will be caught by property window of this actor.
-        ###########################################################################
-        if self.isActor(name):
-            self.ActorDic[name].unloadAnims([anim])
-            AnimDict = self.ActorDic[name].getAnimControlDict()
-            del AnimDict['lodRoot']['modelRoot'][anim]
-            messenger.send('DataH_removeAnimFinish'+name)
-            messenger.send('animRemovedFromNode',[self.ActorDic[name],self.getAnimationDictFromActor(name)])
-        return
-
-    def toggleLight(self):
-        ###########################################################################
-        # toggleLight(self)
-        # This function do noting but call a function inside the lightManger to toggle the lighting.
-        # If it is on, then it will turn it to off.
-        # If it is off, it will turn it on.
-        ###########################################################################
-        self.lightManager.toggle()
-        return
-        
-    def isLight(self,name):
-        ###########################################################################
-        # isLight(self, name)
-        # This function will check that there is a light named "name" of not.
-        # If it dose have, then return True.
-        # If it doesn't, then return False
-        ###########################################################################
-        return self.lightManager.isLight(name)
-
-    def createLight(self, type = 'ambient',
-                   lightcolor=VBase4(0.3,0.3,0.3,1),
-                   specularColor = VBase4(1),
-                   position = Point3(0,0,0),
-                   orientation = Vec3(1,0,0),
-                   constant = 1.0,
-                   linear = 0.0,
-                   quadratic = 0.0,
-                   exponent = 0.0):
-        ###########################################################################
-        # createLight(self, type = 'ambient',
-        #            lightcolor=VBase4(0.3,0.3,0.3,1),
-        #            specularColor = VBase4(1),
-        #            position = Point3(0,0,0),
-        #            orientation = Vec3(1,0,0),
-        #            constant = 1.0,
-        #            linear = 0.0,
-        #            quadratic = 0.0,
-        #            exponent = 0.0)
-        # It will create a light(seLight) into the scene.
-        #
-        # For more detail about creating light, please look the seLight.py.
-        #
-        ###########################################################################
-        list,lightNode = self.lightManager.create(type, lightcolor, specularColor, position,
-                                                  orientation, constant, linear, quadratic, exponent)
-        messenger.send('SGE_Update Explorer',[render])
-        return list, lightNode
-
-    def getLightList(self):
-        ###########################################################################
-        # getLightList(self)
-        # This function will return the lights(seLight) as a list.
-        #
-        # For more detail about creating light, please look the seLight.py.
-        #
-        ###########################################################################
-        return self.lightManager.getLightList()
-
-    def getLightNode(self,lightName):
-        ###########################################################################
-        # getLightNode(self,lightName)
-        # This function will return the lightNode(seLigth) named 'lightName' back.
-        #
-        # For more detail about creating light, please look the seLight.py.
-        #
-        ###########################################################################
-        return self.lightManager.getLightNode(lightName)
-
-    def toggleLightNode(self, lightNode):
-        ###########################################################################
-        # toggleLightNode(self, lightNode)
-        # This function will enable of disable the lightNode user put in.
-        #
-        # For more detail about creating light, please look the seLight.py.
-        #
-        ###########################################################################
-        if lightNode.active:
-            self.lightManager.setOff(lightNode)
-        else:
-            self.lightManager.setOn(lightNode)
-        return
-
-    def rename(self,nodePath,nName):
-        ###########################################################################
-        # Rename(self,nodePath,nName)
-        # First, it will check the target object is legal to rename or not.
-        # this function now doesn't support user to rename everything on the scene gragh.
-        # If there already has object hase the same name with the target object,
-        # the new name will be changed.
-        ###########################################################################
-        oName = nodePath.getName()
-        if oName == nName:
-            # If the new name is the same with old name, do nothing.
-            return
-        
-        while self.isInScene(nName):
-            nName = nName + '_1'
-       
-        if self.isActor(oName):
-            self.ActorDic[nName]= self.ActorDic[oName]
-            self.ActorRefDic[nName]= self.ActorRefDic[oName]
-            self.ActorDic[nName].setName(nName)
-            if self.blendAnimDict.has_key(oName):
-                self.blendAnimDict[nName] = self.blendAnimDict[oName]
-                del self.blendAnimDict[oName]
-            del self.ActorDic[oName]
-            del self.ActorRefDic[oName]
-        elif self.isModel(oName):
-            self.ModelDic[nName]= self.ModelDic[oName]
-            self.ModelRefDic[nName]= self.ModelRefDic[oName]
-            self.ModelDic[nName].setName(nName)
-            del self.ModelDic[oName]
-            del self.ModelRefDic[oName]
-        elif self.lightManager.isLight(oName):
-            list, lightNode = self.lightManager.rename(oName, nName)
-        elif self.dummyDict.has_key(oName):
-            self.dummyDict[nName]= self.dummyDict[oName]
-            self.dummyDict[nName].setName(nName)
-            del self.dummyDict[oName]
-        elif self.collisionDict.has_key(oName):
-            self.collisionDict[nName]= self.collisionDict[oName]
-            self.collisionDict[nName].setName(nName)
-            del self.collisionDict[oName]
-            
-        elif self.particleNodes.has_key(oName):
-            self.particleNodes[nName]= self.particleNodes[oName]
-            self.particleDict[nName]= self.particleDict[oName]
-            self.particleDict[nName].setName(nName)
-            self.particleNodes[nName].setName(nName)
-            del self.particleNodes[oName]
-            del self.particleDict[oName]
-        else:
-            print '----Error: This Object is not allowed to this function!'
-
-        if self.curveDict.has_key(oName):
-            self.curveDict[nName] = self.curveDict[oName]
-            del self.curveDict[oName]
-
-        if self.lightManager.isLight(nName):
-            return list, lightNode
-
-    def isInScene(self,name):
-        ###########################################################################
-        # isInScene(self,name)
-        # Return True if there is a Node named "name" inside the scene.
-        # This will check the whole scene, including model, actor, dummy, collisionObj...
-        ###########################################################################
-        if self.isActor(name):
-            return True
-        elif self.isModel(name):
-            return True
-        elif self.lightManager.isLight(name):
-            return True
-        elif self.dummyDict.has_key(name):
-            return True
-        elif self.collisionDict.has_key(name):
-            return True
-        elif self.particleNodes.has_key(name):
-            return True
-        elif (name == 'render')or(name == 'SEditor')or(name == 'Lights')or(name == 'camera'):
-            return True
-
-        return False
-        
-    def bindCurveToNode(self,node,curveCollection):
-        ###########################################################################
-        # bindCurveToNode(self,node,curveCollection)
-        # This function will maintain the curvesDict
-        # using the node name as a reference to assosiate a list which contains all curves related to that node.
-        ###########################################################################
-        name = node.getName()
-        if self.curveDict.has_key(name):
-            self.curveDict[name].append(curveCollection)
-            return
-        else:
-            self.curveDict[name] = [curveCollection]
-            return
-        return
-
-    def getCurveList(self, nodePath):
-        ###########################################################################
-        # getCureveList(self, nodePath)
-        # This function will return a list
-        # which contains all curves taht have been binded with the inout node
-        # If the input node has not been bindedwith any curve, it will return None.
-        ###########################################################################
-        name = nodePath.getName()
-        if self.curveDict.has_key(name):
-            return self.curveDict[name]
-        else:
-            return None
-
-    def removeCurveFromNode(self, nodePath, curveName):
-        ###########################################################################
-        # removeCurveFromNode(self, nodePath, curveName)
-        # This function will remove the "curveName" curve(Motion path data) from the nodaPath.
-        # After remove, it will send out a message.
-        # 'curveRemovedFromNode'
-        # This message will be caught by Property Window for this node.
-        ###########################################################################
-        name =nodePath.getName()
-        if self.curveDict.has_key(name):
-            index = None
-            for curve in self.curveDict[name]:
-                if curve.getCurve(0).getName() == curveName:
-                    index = self.curveDict[name].index(curve)
-                    break
-            del self.curveDict[name][index]
-            if len(self.curveDict[name])!=0:
-                messenger.send('curveRemovedFromNode',[nodePath, self.curveDict[name]])
-            else:
-                del self.curveDict[name]
-                messenger.send('curveRemovedFromNode',[nodePath, None])
-        return
-
-    def getInfoOfThisNode(self, nodePath):
-        ###########################################################################
-        # getInfoOfThisNode(self, nodePath)
-        # This function will return a list which contains all object properies
-        # that will be used in property window.
-        ###########################################################################
-        type = ''
-        info = {}
-        name = nodePath.getName()
-        if name == 'render':
-            type = 'render'
-        elif name == 'camera':
-            type = 'camera'
-            cameraNode = base.cam.node()
-            lens = cameraNode.getLens()
-            info['lensType'] = lens.getClassType().getName()
-            info['far'] = lens.getFar()
-            info['near'] = lens.getNear()
-            info['FilmSize'] = lens.getFilmSize()
-            info['fov'] = lens.getFov()
-            info['hFov'] = lens.getHfov()
-            info['vFov'] = lens.getVfov()
-            info['focalLength'] = lens.getFocalLength()
-
-            
-        elif name == 'SEditor':
-            type = 'Special'
-        elif self.isActor(name):
-            type = 'Actor'
-            info['filePath'] = self.ActorRefDic[name]
-            info['animDict'] = self.getAnimationDictFromActor(name)
-        elif self.isModel(name):
-            type = 'Model'
-            info['filePath'] = self.ModelRefDic[name]
-        elif self.isLight(name):
-            type = 'Light'
-            info['lightNode'] = self.lightManager.getLightNode(name)
-        elif self.dummyDict.has_key(name):
-            type = 'dummy'
-        elif self.collisionDict.has_key(name):
-            type = 'collisionNode'
-            info['collisionNode'] = self.collisionDict[name]
-        if self.curveDict.has_key(name):
-            info['curveList'] = self.getCurveList(nodePath)
-        
-        return type, info
-
-    def getAnimationDictFromActor(self, actorName):
-        ###########################################################################
-        # getAnimationDictFromActor(self, actorName)
-        # This function will return a Dictionary which contains the animation data in the actor "actorName".
-        # The data inside is get from the actor, so, it can't be wrong...
-        ###########################################################################
-        animContorlDict = self.ActorDic[actorName].getAnimControlDict()
-        animNameList = self.ActorDic[actorName].getAnimNames()
-        if len(animNameList)==0:
-            return {}
-        animDict = {}
-        for anim in animNameList:
-            animDict[anim] = animContorlDict['lodRoot']['modelRoot'][anim][0]
-        return animDict
-
-    def addDummyNode(self,nodePath):
-        ###########################################################################
-        # addDummyNode(self,nodePath)
-        # This function will add a dummy node into the scane and reparent it to nodePath which user put in.
-        #
-        # This dummy actually is just a default sphere model.
-        #
-        ###########################################################################
-        number = len(self.dummyDict)
-        number += 1
-        name = 'Dummy%d'%number
-        self.dummyModel = loader.loadModel( "models/misc/sphere" )
-        self.dummyModel.reparentTo(nodePath)
-        while self.isInScene(name):
-            name = name + '_1'
-        self.dummyModel.setName(name)
-        self.dummyDict[name] = self.dummyModel
-        messenger.send('SGE_Update Explorer',[render])
-        return
-
-    def addCollisionObject(self, collisionObj, nodePath, pointA=None, pointB=None, pointC=None, name = None):
-        ###########################################################################
-        # addCollisionObject(self, collisionObj, nodePath, pointA=None, pointB=None, pointC=None, name = None)
-        # This function will add a collision object into a "CollisionNode" object and put it into scene.
-        # The collision object will be reparent to "nodePath" and
-        # will be show on the screen if user has enable the "show collision objects" option.
-        ###########################################################################
-        if name == None:
-            name = 'CollisionNode_%d'%len(self.collisionDict)
-        while self.isInScene(name):
-            name=name + '_1'
-        node = CollisionNode(name)
-        node.addSolid(collisionObj)
-        self.collisionDict[name] = nodePath.attachNewNode(node)
-
-        if pointA!=None:
-            self.collisionDict[name].setTag('A_X','%f'%pointA.getX())
-            self.collisionDict[name].setTag('A_Y','%f'%pointA.getY())
-            self.collisionDict[name].setTag('A_Z','%f'%pointA.getZ())
-            self.collisionDict[name].setTag('B_X','%f'%pointB.getX())
-            self.collisionDict[name].setTag('B_Y','%f'%pointB.getY())
-            self.collisionDict[name].setTag('B_Z','%f'%pointB.getZ())
-            self.collisionDict[name].setTag('C_X','%f'%pointC.getX())
-            self.collisionDict[name].setTag('C_Y','%f'%pointC.getY())
-            self.collisionDict[name].setTag('C_Z','%f'%pointC.getZ())
-
-        if self.collisionVisable:
-            self.collisionDict[name].show()
-        #Manakel 2/12/2005: replace node by its nodepath
-        base.cTrav.addCollider( self.collisionDict[name], self.CollisionHandler)
-
-        messenger.send('SGE_Update Explorer',[render])
-        
-        return
-
-    def toggleCollisionVisable(self, visable):
-        ###########################################################################
-        # toggleCollisionVisable(self, visable)
-        # This fucntion will toggle the visibility of all collision node in the scene.
-        ###########################################################################
-        if visable == 1:
-            self.collisionVisable = True
-            for name in self.collisionDict:
-                if self.collisionDict[name].isHidden():
-                    self.collisionDict[name].show()
-        else:
-            self.collisionVisable = False
-            for name in self.collisionDict:
-                if not self.collisionDict[name].isHidden():
-                    self.collisionDict[name].hide()
-
-    def toggleParticleVisable(self, visable):
-        if not visable:
-            for name in self.particleNodes:
-                self.particleNodes[name].setTransparency(True)
-                self.particleNodes[name].setAlphaScale(0)
-                self.particleNodes[name].setBin("fixed", 1)
-        else:
-            for name in self.particleNodes:
-                self.particleNodes[name].setTransparency(False)
-                self.particleNodes[name].setAlphaScale(1)
-                self.particleNodes[name].setBin("default", 1)
-        return
-
-    def getBlendAnimAsDict(self, name):
-        ###########################################################################
-        # getBlendAnimAsDict(self, name)
-        # This function will return a dictionry
-        # which contains user blended animation data for actor named "name."
-        # The formate of thsi dictionary is
-        # {"name of Blend Animation" : ["Animation A, Animation B, Effect(Float, 0~1)"]}
-        ###########################################################################
-        if self.blendAnimDict.has_key(name):
-            return self.blendAnimDict[name]
-        else:
-            return {}
-
-    def saveBlendAnim(self, actorName, blendName, animNameA, animNameB, effect):
-        ###########################################################################
-        # saveBlendAnim(self, actorName, blendName, animNameA, animNameB, effect)
-        # This function will save the blended Animation "blendname" for actor "actorNane"
-        # and keep the data in the blendAnimDict.
-        #
-        # Also, if this blend is the first blend animation that the target actor has,
-        # this function will add a "Blending" tag on this actor which is "True".
-        ###########################################################################
-        if self.blendAnimDict.has_key(actorName):
-            if self.blendAnimDict[actorName].has_key(blendName):
-                ### replace the original setting
-                self.blendAnimDict[actorName][blendName][0] = animNameA
-                self.blendAnimDict[actorName][blendName][1] = animNameB
-                self.blendAnimDict[actorName][blendName][2] = effect
-            else:
-                ### create new blend animation in the dictionary
-                self.blendAnimDict[actorName][blendName] = [animNameA, animNameB, effect]
-        else:
-            self.getActor(actorName).setTag('Blending','True')
-            self.blendAnimDict[actorName] = {blendName:[animNameA, animNameB, effect]}
-        return self.blendAnimDict[actorName]
-
-    def renameBlendAnim(self, actorName, nName, oName, animNameA, animNameB, effect):
-        ###########################################################################
-        # renameBlendAnim(self, actorName, nName, oName, animNameA, animNameB, effect)
-        # This function is used to rename a exist blended animation named "oName" to "nName."
-        # The way it doing this is first remove the original blend fomr the actor
-        # and then re-create a new one named "nName" in.
-        # Because it is not just simply rename the animation,
-        # it will also rewrite the data to the newest one.
-        ###########################################################################
-        self.removeBlendAnim(actorName,oName)
-        print self.blendAnimDict
-        return self.saveBlendAnim(actorName, nName, animNameA, animNameB, effect)
-
-    def removeBlendAnim(self, actorName, blendName):
-        ###########################################################################
-        # removeBlendAnim(self, actorName, blendName)
-        # This fucntion will remove the record of blended animation named "blendName"
-        # from the actor named "actorName".
-        #
-        # Also, it will check that there is any blended animation remained for this actor,
-        # If none, this function will clear the "Blending" tag of this object.
-        ###########################################################################
-        if self.blendAnimDict.has_key(actorName):
-            if self.blendAnimDict[actorName].has_key(blendName):
-                ### replace the original setting
-                del self.blendAnimDict[actorName][blendName]
-            if len(self.blendAnimDict[actorName])==0:
-                del self.blendAnimDict[actorName]
-                self.getActor(actorName).clearTag('Blending')
-                return {}
-            return self.blendAnimDict[actorName]
-        else:
-            return {}
-
-    def getAllObjNameAsList(self):
-        ###########################################################################
-        # getAllObjNameAsList(self)
-        # This function will return a list which contains all objects' names in the scene.
-        # It means which won't have any kinds of animation, blend animation or Mopath data inside.
-        ###########################################################################
-        list = ['camera'] # Default object you can select camera
-        list = list + self.ModelDic.keys() \
-               + self.ActorDic.keys() + self.collisionDict.keys() \
-               + self.dummyDict.keys() + self.particleNodes.keys() \
-               + self.lightManager.getLightList()
-        return list
-
-    def getObjFromSceneByName(self, name):
-        ###########################################################################
-        # getObjFromSceneByName(self, name)
-        # return a reference to the nodePath named "name"
-        ###########################################################################
-        if name == 'camera':
-            return camera
-        elif self.ModelDic.has_key(name):
-            return self.ModelDic[name]
-        elif self.ActorDic.has_key(name):
-            return self.ActorDic[name]
-        elif self.collisionDict.has_key(name):
-            return self.collisionDict[name]
-        elif self.dummyDict.has_key(name):
-            return self.dummyDict[name]
-        elif self.particleNodes.has_key(name):
-            return self.particleNodes[name]
-        elif self.lightManager.isLight(name):
-            return self.lightManager.getLightNode(name)
-        
-        return None
-
-    def getControlSetting(self):
-        ###########################################################################
-        # getControlSetting(self)
-        # return tqwo things.
-        # One is the type of the control. The other is the data about that control.
-        # Now we only support keyboard control, so it will return a list.
-        # The first object in the list is a reference to the target we want to control.
-        # The second object in the list is a dictionary which contains a map about
-        # which keyboard message should be accepted.
-        # The third and the last object here is a dictionary which contains the data
-        # indicating that the changing value for each keyboard control event.
-        ###########################################################################
-        if self.controlType == 'Keyboard':
-            return self.controlType, [self.controlTarget, self.keyboardMapDict.copy(), self.keyboardSpeedDict.copy()]
-        elif self.controlType == 'Tracker':
-            return self.controlType, []
-        return
-
-    def saveControlSetting(self, controlType, data):
-        ###########################################################################
-        # saveControlSetting(self, controlType, data)
-        # copy the current control setting into dataHolder
-        # Mainly called by sceneEditor.
-        ###########################################################################
-        if controlType == 'Keyboard':
-            self.controlType = controlType
-            self.controlTarget = data[0]
-            self.keyboardMapDict.clear()
-            self.keyboardMapDict = data[1].copy()
-            self.keyboardSpeedDict.clear()
-            self.keyboardSpeedDict = data[2].copy()
-            return
-  
-    def loadScene(self):
-        ###########################################################################
-        # loadScene(self)
-        # Opens a dialog box asking for a scene file to load.  It then removes
-        # the current scene and opens the new one.
-        # It basically proceeds by executig the python file containing the scene
-        # and then re-populating the various dictionaries based on the dictionaries
-        # in the scene file hence reviving the state for the scene
-        ###########################################################################
-
-        ### Ask for a filename  
-        OpenFilename = tkFileDialog.askopenfilename(filetypes = [("PY","py")],title = "Load Scene")
-        if(not OpenFilename):   
-            return None
-        f=Filename.fromOsSpecific(OpenFilename)
-        fileName=f.getBasenameWoExtension()
-        dirName=f.getFullpathWoExtension()
-        print "DATAHOLDER::" + dirName
-        ############################################################################
-        # Append the path to this file to our sys path where python looks for modules
-        # We do this so that we can use "import"  on our saved scene code and execute it
-        ############################################################################
-        sys.path.append(os.path.dirname(f.toOsSpecific()))
-
-        ############################################################################
-        # Actually import the scene... this executes the code in the scene
-        ############################################################################
-        self.theScene=__import__(fileName)
-        self.Scene=self.theScene.SavedScene(0,seParticleEffect,seParticles,dirName) # Specify load mode of 0 which will allow us to pass seParticle and seParticleEffect
-        messenger.send('SGE_Update Explorer',[render])    
-
-
-        # Lets call some important initialization methods on our scene:
-        #self.Scene.starteffects(0,seParticleEffect,seParticles,dirName)    # This special calling of start effect with mode 0 is to use seParticleEffect and seParticles
-
-
-        ############################################################################
-        # Populate Model related Dictionaries
-        ############################################################################
-        for model in self.Scene.ModelDic:
-            self.ModelDic[model]=self.Scene.ModelDic[model]
-            #self.ModelRefDic[model]=self.Scene.ModelRefDic[model] # The Old absolute paths way
-            self.ModelRefDic[model]=Filename(dirName + "/" + self.Scene.ModelRefDic[model]) # Relative Paths
-            self.ModelNum=self.ModelNum+1
-
-        ############################################################################
-        # Populate Actor related Dictionaries
-        ############################################################################
-        for actor in self.Scene.ActorDic:
-            self.ActorDic[actor]=self.Scene.ActorDic[actor]
-            #self.ActorRefDic[actor]=self.Scene.ActorRefDic[actor] # Old way of doing absolute paths
-            self.ActorRefDic[actor]=Filename(dirName + "/" + self.Scene.ActorRefDic[actor]) # Relative Paths
-            if(self.Scene.blendAnimDict.has_key(str(actor))):
-                self.blendAnimDict[actor]=self.Scene.blendAnimDict[actor]
-            self.ActorNum=self.ActorNum+1
-
-
-
-        ############################################################################
-        # Populate Light related Dictionaries
-        ############################################################################
-        #print self.Scene.LightDict
-        for light in self.Scene.LightDict:
-            #print light
-            alight=self.Scene.LightDict[light]
-            type=self.Scene.LightTypes[light]   
-            thenode=self.Scene.LightNodes[light]
-            #print type
-            if type == 'ambient':
-                self.lightManager.create('ambient',alight.getColor(),name=alight.getName(),tag=thenode.getTag("Metadata"))
-            elif type == 'directional':
-                #print alight.getPoint()
-                #print alight.getDirection()
-                self.lightManager.create('directional',alight.getColor(),alight.getSpecularColor(),thenode.getPos(),thenode.getHpr(),name=alight.getName(),tag=thenode.getTag("Metadata"))
-            elif type == 'point':
-                atten=alight.getAttenuation()
-                #print alight.getPoint()
-                self.lightManager.create('point',alight.getColor(),alight.getSpecularColor(),thenode.getPos(),Vec3(1,0,0),atten.getX(),atten.getY(),atten.getZ(),name=alight.getName(),tag=thenode.getTag("Metadata"))
-            elif type == 'spot':
-                atten=alight.getAttenuation()
-                self.lightManager.create('spot',alight.getColor(),alight.getSpecularColor(),thenode.getPos(),thenode.getHpr(),atten.getX(),atten.getY(),atten.getZ(),alight.getExponent(),name=alight.getName(),tag=thenode.getTag("Metadata"))
-            else:
-                print 'Invalid light type'
-
-        ############################################################################
-        # Populate Dummy related Dictionaries
-        ############################################################################
-        for dummy in self.Scene.dummyDict:
-            self.dummyDict[dummy] = self.Scene.dummyDict[dummy]
-
-        ############################################################################
-        # Populate Collision related Dictionaries
-        ############################################################################
-        for collnode in self.Scene.collisionDict:
-            self.collisionDict[collnode]=self.Scene.collisionDict[collnode]
-
-        ############################################################################
-        # Populate Mopath related Dictionaries
-        ############################################################################
-        for node in self.Scene.curveDict:
-            curveCollection=self.Scene.curveDict[node]
-            for curve in curveCollection:
-                curveColl=ParametricCurveCollection()
-                nodeP=loader.loadModel(curve)
-                curveColl.addCurves(nodeP.node())
-                nodeP.removeNode()
-                thenode=render.find("**/"+str(node))
-                self.bindCurveToNode(thenode,curveColl)
-        
-        ############################################################################
-        # Populate Particle related Dictionaries
-        ############################################################################
-        for effect in self.Scene.particleDict:
-            theeffect=self.Scene.particleDict[effect]
-            emitter=loader.loadModel("sphere")
-            emitter.setPosHprScale(theeffect.getX(),theeffect.getY(),theeffect.getZ(),theeffect.getH(),theeffect.getP(),theeffect.getR(),theeffect.getSx(),theeffect.getSy(),theeffect.getSz())
-            theeffect.setPos(0,0,0)
-            theeffect.setName(str(effect))
-            tempparent=theeffect.getParent()
-            theeffect.reparentTo(emitter)
-            emitter.setName(str(effect))
-            emitter.reparentTo(tempparent)
-            theeffect.enable()
-            self.particleDict[effect]=theeffect
-            self.particleNodes[effect]=emitter
-            
-        
- 
-        # Clean up things added to scene graph by saved file's code execution
-        for light in self.Scene.LightDict:
-            vestige=render.find('**/'+light)
-            if(vestige != None):
-                vestige.removeNode()
-
-        ############################################################################
-        # return the filename and update the scenegraph explorer window
-        ############################################################################
-        messenger.send('SGE_Update Explorer',[render])  
-        if(OpenFilename):
-            return OpenFilename
-        else:
-            return None
-
-    def getList(self):
-        return self.lightManager.getList()     

+ 0 - 172
doc/SceneEditor/duplicateWindow.py

@@ -1,172 +0,0 @@
-#################################################################
-# duplicateWindow.py
-# Written by Yi-Hong Lin, [email protected], 2004
-#################################################################
-from direct.tkwidgets.AppShell import *
-from direct.showbase.TkGlobal import *
-
-import seSceneGraphExplorer
-
-
-class duplicateWindow(AppShell):
-    #################################################################
-    # duplicateWindow(AppShell)
-    # This class is used to create a dialog window
-    # for handling the "dupicate" command from the sceneEditor
-    #
-    # Notice!
-    # The actual duplicating process is not happending here!
-    # The one handle the process is dataHolder...
-    #################################################################
-    appversion      = '1.0'
-    appname         = 'Duplication'
-    frameWidth      = 450
-    frameHeight     = 320
-    frameIniPosX    = 250
-    frameIniPosY    = 250
-    padx            = 0
-    pady            = 0
-
-    
-    def __init__(self, parent = None, nodePath = None, **kw):
-        # Define the megawidget options.
-        optiondefs = (
-            ('title',       self.appname,       None),
-            )
-        self.defineoptions(kw, optiondefs)
-
-        if parent == None:
-            self.parent = Toplevel()
-        AppShell.__init__(self, self.parent)
-        self.parent.geometry('%dx%d+%d+%d' % (self.frameWidth, self.frameHeight,self.frameIniPosX,self.frameIniPosY))
-
-        self.nodePath = nodePath
-
-        self.parent.resizable(False,False) ## Disable the ability to resize for this Window.
-        
-    def appInit(self):
-        print '----SideWindow is Initialized!!'
-        
-    def createInterface(self):
-        # The interior of the toplevel panel
-        interior = self.interior()
-        mainFrame = Frame(interior)
-        self.inputZone = Pmw.Group(mainFrame, tag_text='Offset setting')
-        self.inputZone.pack(fill='both',expand=1)
-        settingFrame = self.inputZone.interior()
-        Label(settingFrame,text='  X  ').place(anchor=NW,x=110,y=15)
-        Label(settingFrame,text='  Y  ').place(anchor=NW,x=205,y=15)
-        Label(settingFrame,text='  Z  ').place(anchor=NW,x=295,y=15)
-        self.move_x = Pmw.EntryField(settingFrame,label_text='Move  :',labelpos='w',value='0.0', validate=Pmw.realvalidator)
-        self.move_x.component('entry').config(width=10)
-        self.move_y = Pmw.EntryField(settingFrame,value='0.0', validate=Pmw.realvalidator)
-        self.move_y.component('entry').config(width=10)
-        self.move_z = Pmw.EntryField(settingFrame, value='0.0', validate=Pmw.realvalidator)
-        self.move_z.component('entry').config(width=10)
-        self.move_x.place(anchor=NW,x=50,y=40)
-        self.move_y.place(anchor=NW,x=185,y=40)
-        self.move_z.place(anchor=NW,x=275,y=40)
-
-        self.rotate_x = Pmw.EntryField(settingFrame,label_text='Rotate:',labelpos='w',value='0.0', validate=Pmw.realvalidator)
-        self.rotate_x.component('entry').config(width=10)
-        self.rotate_y = Pmw.EntryField(settingFrame,value='0.0', validate=Pmw.realvalidator)
-        self.rotate_y.component('entry').config(width=10)
-        self.rotate_z = Pmw.EntryField(settingFrame, value='0.0', validate=Pmw.realvalidator)
-        self.rotate_z.component('entry').config(width=10)
-        self.rotate_x.place(anchor=NW,x=50,y=70)
-        self.rotate_y.place(anchor=NW,x=185,y=70)
-        self.rotate_z.place(anchor=NW,x=275,y=70)
-
-        self.scale_x = Pmw.EntryField(settingFrame,label_text='Scale :',labelpos='w',value='1.0', validate=Pmw.realvalidator)
-        self.scale_x.component('entry').config(width=10)
-        self.scale_y = Pmw.EntryField(settingFrame,value='1.0', validate=Pmw.realvalidator)
-        self.scale_y.component('entry').config(width=10)
-        self.scale_z = Pmw.EntryField(settingFrame, value='1.0', validate=Pmw.realvalidator)
-        self.scale_z.component('entry').config(width=10)
-        self.scale_x.place(anchor=NW,x=52,y=100)
-        self.scale_y.place(anchor=NW,x=185,y=100)
-        self.scale_z.place(anchor=NW,x=275,y=100)
-
-        self.numberOfCopy = Pmw.EntryField(settingFrame,label_text='Number of Copy :',labelpos='w',value='1', validate=Pmw.integervalidator)
-        self.numberOfCopy.component('entry').config(width=15)
-        self.numberOfCopy.place(anchor=NW,x=52,y=150)
-        
-        settingFrame.pack(fill=BOTH,expand=1,padx=7,pady=7)
-
-        self.button_ok = Button(mainFrame, text="OK", command=self.ok_press,width=10)
-        self.button_ok.pack(fill=BOTH,expand=0,side=RIGHT)
-        
-        mainFrame.pack(fill = 'both', expand = 1,padx=7,pady=7)
-
-    
-    def createMenuBar(self):
-        self.menuBar.destroy()
-        
-    def onDestroy(self, event):
-        messenger.send('DW_close')
-        '''
-        If you have open any thing, please rewrite here!
-        '''
-        pass
-
-    ###############################
-    
-    def ok_press(self):
-        #################################################################
-        # ok_press(self)
-        # Callback function
-        # This function will be called when user click on the "OK" button on the window.
-        # After collect all data we need for the duplication process,
-        # this function will send out a message with all data.
-        # 'DW_duplicating'
-        # This message will be caught by sceneEditor.
-        #################################################################
-        if not self.allEntryValid():
-            print '---- Duplication Window: Invalid value!!'
-            return
-        x = self.move_x.getvalue()
-        y = self.move_y.getvalue()
-        z = self.move_z.getvalue()
-        pos=Vec3(FloatType(x),FloatType(y),FloatType(z))
-        x = self.rotate_x.getvalue()
-        y = self.rotate_y.getvalue()
-        z = self.rotate_z.getvalue()
-        hpr=Vec3(FloatType(x),FloatType(y),FloatType(z))
-        x = self.scale_x.getvalue()
-        y = self.scale_y.getvalue()
-        z = self.scale_z.getvalue()
-        scale=Vec3(FloatType(x),FloatType(y),FloatType(z))
-        num = int(self.numberOfCopy.getvalue())
-        messenger.send('DW_duplicating',[self.nodePath,pos,hpr,scale,num])
-        self.quit()
-
-    def allEntryValid(self):
-        #################################################################
-        # allEntryValid(self)
-        # This function is used to check all data in the input entries are valid.
-        #
-        # For example, none of entries contains blank data.
-        #
-        #################################################################
-        if not self.move_x.valid():
-            return False
-        elif not self.move_y.valid():
-            return False
-        elif not self.move_z.valid():
-            return False
-        elif not self.rotate_x.valid():
-            return False
-        elif not self.rotate_y.valid():
-            return False
-        elif not self.rotate_z.valid():
-            return False
-        elif not self.scale_x.valid():
-            return False
-        elif not self.scale_y.valid():
-            return False
-        elif not self.scale_z.valid():
-            return False
-        elif not self.numberOfCopy.valid():
-            return False
-
-        return True

+ 0 - 493
doc/SceneEditor/lightingPanel.py

@@ -1,493 +0,0 @@
-#################################################################
-# lightingPanel.py
-# Written by Yi-Hong Lin, [email protected], 2004
-#################################################################
-# Import Tkinter, Pmw, and the floater code from this directory tree.
-from direct.tkwidgets.AppShell import AppShell
-from seColorEntry import *
-from direct.tkwidgets.VectorWidgets import Vector3Entry
-from direct.tkwidgets.Slider import Slider
-from Tkinter import Frame, Button, Menubutton, Menu
-import string, math, types, Pmw, Tkinter
-from pandac.PandaModules import *
-
-class lightingPanel(AppShell):
-    #################################################################
-    # lightingPanel(AppShell)
-    # This will create a window to let user
-    # create any kinds of lighting into the scene
-    #################################################################
-    # Override class variables
-    appname = 'Lighting Panel'
-    frameWidth  = 400
-    frameHeight = 400
-    currentLight = None
-    
-    def __init__(self, lightList, parent = None, **kw):
-        self.lightList = lightList
-        self.lightColor = [0.3*255,0.3*255,0.3*255]
-        self.type = ''
-        INITOPT = Pmw.INITOPT
-        optiondefs = (
-            ('title',               self.appname,       None),
-            )
-        self.defineoptions(kw, optiondefs)
-
-        # Initialize the superclass
-        AppShell.__init__(self)
-
-        # Execute option callbacks
-        self.initialiseoptions(lightingPanel)
-
-        self.parent.resizable(False,False) ## Disable the ability to resize for this Window.
-
-    def createInterface(self):
-        # Handle to the toplevels interior
-        interior = self.interior()
-        menuBar = self.menuBar
-        self.menuBar.destroy()
-
-        # Create a frame to hold all stuff
-        mainFrame = Frame(interior)
-
-        self.listZone = Pmw.Group(mainFrame,tag_pyclass = None)
-        self.listZone.pack(expand=0, fill=Tkinter.X,padx=3,pady=3)
-        listFrame = self.listZone.interior()
-        
-        self.lightEntry = self.createcomponent(
-            'Lights List', (), None,
-            Pmw.ComboBox, (listFrame,),label_text='Light :',
-            labelpos = Tkinter.W, entry_width = 25, selectioncommand = self.selectLight,
-            scrolledlist_items = self.lightList)
-        self.lightEntry.pack(side=Tkinter.LEFT)
-        
-        self.renameButton = self.createcomponent(
-            'Rename Light', (), None,
-            Button, (listFrame,),
-            text = ' Rename ',
-            command = self.renameLight)
-        self.renameButton.pack(side=Tkinter.LEFT)
-
-        self.addLighZone = Pmw.Group(listFrame,tag_pyclass = None)
-        self.addLighZone.pack(side=Tkinter.LEFT)
-        insideFrame = self.addLighZone.interior()
-        self.lightsButton = Menubutton(insideFrame, text = 'Add light',borderwidth = 3,
-                                       activebackground = '#909090')
-        lightsMenu = Menu(self.lightsButton)
-        lightsMenu.add_command(label = 'Add Ambient Light',
-                            command = self.addAmbient)
-        lightsMenu.add_command(label = 'Add Directional Light',
-                            command = self.addDirectional)
-        lightsMenu.add_command(label = 'Add Point Light',
-                            command = self.addPoint)
-        lightsMenu.add_command(label = 'Add Spotlight',
-                            command = self.addSpot)
-            
-        self.lightsButton.pack(expand=0)
-        self.lightsButton['menu'] = lightsMenu
-
-        self.deleteButton = self.createcomponent(
-            'delete Light', (), None,
-            Button, (listFrame,),
-            text = '  Delete  ',
-            command = self.deleteLight)
-        self.deleteButton.pack(side=Tkinter.LEFT)
-
-        self.lightColor = seColorEntry(
-            mainFrame, text = 'Light Color', value=self.lightColor)
-        self.lightColor['command'] = self.setLightingColorVec
-        self.lightColor['resetValue'] = [0.3*255,0.3*255,0.3*255,0]
-        self.lightColor.pack(fill=Tkinter.X,expand=0)
-        self.bind(self.lightColor, 'Set light color')
-
-        # Notebook pages for light specific controls
-        self.lightNotebook = Pmw.NoteBook(mainFrame, tabpos = None,
-                                          borderwidth = 0)
-        ambientPage = self.lightNotebook.add('Ambient')
-        directionalPage = self.lightNotebook.add('Directional')
-        pointPage = self.lightNotebook.add('Point')
-        spotPage = self.lightNotebook.add('Spot')
-        # Put this here so it isn't called right away
-        self.lightNotebook['raisecommand'] = self.updateLightInfo
-
-        # Directional light controls
-        self.dSpecularColor = seColorEntry(
-            directionalPage, text = 'Specular Color')
-        self.dSpecularColor['command'] = self.setSpecularColor
-        self.dSpecularColor.pack(fill = Tkinter.X, expand = 0)
-        self.bind(self.dSpecularColor,
-                  'Set directional light specular color')
-        self.dPosition = Vector3Entry(
-            directionalPage, text = 'Position')
-        self.dPosition['command'] = self.setPosition
-        self.dPosition['resetValue'] = [0,0,0,0]
-        self.dPosition.pack(fill = Tkinter.X, expand = 0)
-        self.bind(self.dPosition, 'Set directional light position')
-        self.dOrientation = Vector3Entry(
-            directionalPage, text = 'Orientation')
-        self.dOrientation['command'] = self.setOrientation
-        self.dOrientation['resetValue'] = [0,0,0,0]
-        self.dOrientation.pack(fill = Tkinter.X, expand = 0)
-        self.bind(self.dOrientation, 'Set directional light orientation')
-
-        # Point light controls
-        self.pSpecularColor = seColorEntry(
-            pointPage, text = 'Specular Color')
-        self.pSpecularColor['command'] = self.setSpecularColor
-        self.pSpecularColor.pack(fill = Tkinter.X, expand = 0)
-        self.bind(self.pSpecularColor,
-                  'Set point light specular color')
-
-        self.pPosition = Vector3Entry(
-            pointPage, text = 'Position')
-        self.pPosition['command'] = self.setPosition
-        self.pPosition['resetValue'] = [0,0,0,0]
-        self.pPosition.pack(fill = Tkinter.X, expand = 0)
-        self.bind(self.pPosition, 'Set point light position')
-
-        self.pConstantAttenuation = Slider(
-            pointPage,
-            text = 'Constant Attenuation',
-            max = 1.0,
-            resolution = 0.01,
-            value = 1.0)
-        self.pConstantAttenuation['command'] = self.setConstantAttenuation
-        self.pConstantAttenuation.pack(fill = Tkinter.X, expand = 0)
-        self.bind(self.pConstantAttenuation,
-                  'Set point light constant attenuation')
-           
-        self.pLinearAttenuation = Slider(
-            pointPage,
-            text = 'Linear Attenuation',
-            max = 1.0,
-            resolution = 0.01,
-            value = 0.0)
-        self.pLinearAttenuation['command'] = self.setLinearAttenuation
-        self.pLinearAttenuation.pack(fill = Tkinter.X, expand = 0)
-        self.bind(self.pLinearAttenuation,
-                  'Set point light linear attenuation')
-           
-        self.pQuadraticAttenuation = Slider(
-            pointPage,
-            text = 'Quadratic Attenuation',
-            max = 1.0,
-            resolution = 0.01,
-            value = 0.0)
-        self.pQuadraticAttenuation['command'] = self.setQuadraticAttenuation
-        self.pQuadraticAttenuation.pack(fill = Tkinter.X, expand = 0)
-        self.bind(self.pQuadraticAttenuation,
-                  'Set point light quadratic attenuation')
-           
-        # Spot light controls
-        self.sSpecularColor = seColorEntry(
-            spotPage, text = 'Specular Color')
-        self.sSpecularColor['command'] = self.setSpecularColor
-        self.sSpecularColor.pack(fill = Tkinter.X, expand = 0)
-        self.bind(self.sSpecularColor,
-                  'Set spot light specular color')
-
-        self.sConstantAttenuation = Slider(
-            spotPage,
-            text = 'Constant Attenuation',
-            max = 1.0,
-            resolution = 0.01,
-            value = 1.0)
-        self.sConstantAttenuation['command'] = self.setConstantAttenuation
-        self.sConstantAttenuation.pack(fill = Tkinter.X, expand = 0)
-        self.bind(self.sConstantAttenuation,
-                  'Set spot light constant attenuation')
-           
-        self.sLinearAttenuation = Slider(
-            spotPage,
-            text = 'Linear Attenuation',
-            max = 1.0,
-            resolution = 0.01,
-            value = 0.0)
-        self.sLinearAttenuation['command'] = self.setLinearAttenuation
-        self.sLinearAttenuation.pack(fill = Tkinter.X, expand = 0)
-        self.bind(self.sLinearAttenuation,
-                  'Set spot light linear attenuation')
-           
-        self.sQuadraticAttenuation = Slider(
-            spotPage,
-            text = 'Quadratic Attenuation',
-            max = 1.0,
-            resolution = 0.01,
-            value = 0.0)
-        self.sQuadraticAttenuation['command'] = self.setQuadraticAttenuation
-        self.sQuadraticAttenuation.pack(fill = Tkinter.X, expand = 0)
-        self.bind(self.sQuadraticAttenuation,
-                  'Set spot light quadratic attenuation')
-           
-        self.sExponent = Slider(
-            spotPage,
-            text = 'Exponent',
-            max = 1.0,
-            resolution = 0.01,
-            value = 0.0)
-        self.sExponent['command'] = self.setExponent
-        self.sExponent.pack(fill = Tkinter.X, expand = 0)
-        self.bind(self.sExponent,
-                  'Set spot light exponent')
-
-        # MRM: Add frustum controls
-           
-        self.lightNotebook.setnaturalsize()
-        self.lightNotebook.pack(expand = 1, fill = Tkinter.BOTH)
-
-        mainFrame.pack(expand=1, fill = Tkinter.BOTH)
-
-    def onDestroy(self, event):
-        messenger.send('LP_close')
-        '''
-        If you have open any thing, please rewrite here!
-        '''
-        pass
-
-    def renameLight(self):
-        #################################################################
-        # renameLight(self)
-        # Call Back function
-        # This function will be called when user push
-        # the "Rename" button on the panel.
-        #
-        # Then, this function will collect data and send out them with a message
-        # "LP_rename"
-        # Which will be caught by sceneEditor and pass to dataHolder to
-        # complete the renaming.
-        #
-        #################################################################
-        oName = self.currentLight
-        nName = self.lightEntry.get()
-        messenger.send('LP_rename',[oName,nName])
-        return
-
-    def deleteLight(self):
-        #################################################################
-        # deleteLight(self)
-        # Call Back Function.
-        # This function will be called when user click on
-        # the "Delete" button on the panel.
-        #
-        # Then, this function will send out a message with current seleted light
-        # "LP_removeLight"
-        # Which will be caught by sceneEditor and pass to dataHolder to
-        # complete the delete process.
-        #
-        #################################################################
-        messenger.send('LP_removeLight',[self.currentLight])
-        return
-
-    def updateList(self, list, node=None):
-        #################################################################
-        # updataList(self, list, node = None)
-        # This function will take a list object which contains names of lights in the scene.
-        # Also, if user has put node as a parameter,
-        # this function will automatically select that node as the current working target.
-        #################################################################
-        self.lightList = list
-        self.lightEntry.setlist(list)
-        if node!=None:
-            self.lightEntry.selectitem(index=node.getName(), setentry=True )
-            self.updateDisplay(node)
-        elif len(list)>0:
-            self.lightEntry.selectitem(index=0, setentry=True )
-            self.selectLight(list[0])
-        else:
-            self.lightEntry.clear()
-        return
-
-    def selectLight(self, lightName):
-        #################################################################
-        # selectLight(self, lightName)
-        # This function will be called each time when
-        # user select a light from the list on the panel.
-        # Then, this function will send out the message,
-        # 'LP_selectLight' to sceneEditorand get the current light information from dataHolder.
-        #################################################################
-        if lightName in self.lightList:
-            messenger.send('LP_selectLight',[lightName])
-        return
-
-    def updateDisplay(self, lightNode):
-        #################################################################
-        # updateDisplay(self, lightNode)
-        # This function will update the information showing on the panel.
-        # For example, give a lightNode which is a Point Light.
-        # This function will switch the page to specify the type.
-        # Also, new node is the same type with the previous one,
-        # then this is function won't do the page switching,
-        # but will call other function to refresh the data to target node.
-        #################################################################
-        self.currentLight = lightNode
-        if self.currentLight != None:
-            color = lightNode.getLightColor()
-            self.lightColor.set([255*color.getX(),255*color.getY(),255*color.getZ()])
-            oldType = self.type
-            self.type = lightNode.getType()
-        else:
-            self.lightColor.set([255*0.3,255*0.3,255*0.3])
-            oldType = self.type
-            self.type = 'ambient'
-            
-        if self.type=='ambient':
-            self.lightNotebook.selectpage('Ambient')
-        elif self.type =='directional':
-            self.lightNotebook.selectpage('Directional')
-        elif self.type =='point':
-            self.lightNotebook.selectpage('Point')
-        elif self.type =='spot':
-            self.lightNotebook.selectpage('Spot')
-        if oldType == self.type:
-            # The same type with previous one, call updateLightInfo to refresh the values.
-            self.updateLightInfo()
-        return
-
-    def updateLightInfo(self, page=None):
-        #################################################################
-        # updateLightInfo(self, page=None)
-        # This function will refresh the data we user have done any selection.
-        #################################################################
-        if self.currentLight != None:
-            light = self.currentLight.getLight()
-        if self.type != 'ambient':
-            specColor = light.getSpecularColor()
-        if self.type =='directional':
-            point = self.currentLight.getPosition()
-            dir = self.currentLight.getOrientation()
-            self.dSpecularColor.set([specColor.getX()*255,specColor.getY()*255,specColor.getZ()*255])
-            self.dPosition.set([point.getX(),point.getY(),point.getZ()])
-            self.dOrientation.set([dir.getX(),dir.getY(),dir.getZ()])
-        elif self.type =='point':
-            point = self.currentLight.getPosition()
-            attenuation = light.getAttenuation()
-            self.pSpecularColor.set([specColor.getX()*255,specColor.getY()*255,specColor.getZ()*255])
-            self.pPosition.set([point.getX(),point.getY(),point.getZ()])
-            self.pConstantAttenuation.set(attenuation.getX())
-            self.pLinearAttenuation.set(attenuation.getY())
-            self.pQuadraticAttenuation.set(attenuation.getZ())
-        elif self.type =='spot':
-            attenuation = light.getAttenuation()
-            expo = light.getExponent()
-            self.sSpecularColor.set([specColor.getX()*255,specColor.getY()*255,specColor.getZ()*255])
-            self.sConstantAttenuation.set(attenuation.getX())
-            self.sLinearAttenuation.set(attenuation.getY())
-            self.sQuadraticAttenuation.set(attenuation.getZ())
-            self.sExponent.set(expo)
-        return
-
-    def addAmbient(self):
-        #################################################################
-        # addAmbient(self)
-        # This function will send out a message to
-        # ask dataHolder to create a default ambient light
-        #################################################################
-        messenger.send('LP_addLight',['ambient'])
-        return
-    
-    def addDirectional(self):
-        #################################################################
-        # addDirectional(self)
-        # This function will send out a message to
-        # sk dataHolder to create a default Directional light
-        #################################################################
-        messenger.send('LP_addLight',['directional'])
-        return
-    
-    def addPoint(self):
-        #################################################################
-        # addPoint(self)
-        # This function will send out a message to
-        # ask dataHolder to create a default Point light
-        #################################################################
-        messenger.send('LP_addLight',['point'])
-        return
-    
-    def addSpot(self):
-        #################################################################
-        # addSpot(self)
-        # This function will send out a message to
-        # ask dataHolder to create a default Spot light
-        #################################################################
-        messenger.send('LP_addLight',['spot'])
-        return
-
-    def setLightingColorVec(self,color):
-        #################################################################
-        # setLightingColorVec(self,color)
-        # Call Back function. This will be called
-        # when user try to change the color of light.
-        #################################################################
-        if self.currentLight==None:
-            return
-        self.currentLight.setColor(VBase4((color[0]/255),(color[1]/255),(color[2]/255),1))
-        return
-
-    def setSpecularColor(self,color):
-        #################################################################
-        # setSpecularColor(self,color)
-        # Call Back function. This will be called
-        # when user try to change the Specular color of light.
-        #################################################################
-        if self.currentLight==None:
-            return
-        self.currentLight.setSpecColor(VBase4((color[0]/255),(color[1]/255),(color[2]/255),1))
-        return
-
-    def setPosition(self,position):
-        #################################################################
-        # setPosition(self,position)
-        # Call Back function. This will be called
-        # when user try to change the position of light.
-        #################################################################
-        if self.currentLight==None:
-            return
-        self.currentLight.setPosition(Point3(position[0],position[1],position[2]))
-        return
-
-    def setOrientation(self, orient):
-        #################################################################
-        # setOrientation(self, orient)
-        # Call Back function. This will be called
-        # when user try to change the orientation of light.
-        #################################################################
-        if self.currentLight==None:
-            return
-        self.currentLight.setOrientation(Vec3(orient[0],orient[1],orient[2]))
-        return
-    
-    def setConstantAttenuation(self, value):
-        #################################################################
-        # setConstantAttenuation(self, value)
-        # Call Back function. This will be called
-        # when user try to change the Constant Attenuation of light.
-        #################################################################
-        self.currentLight.setConstantAttenuation(value)
-        return
-    
-    def setLinearAttenuation(self, value):
-        #################################################################
-        # setLinearAttenuation(self, value)
-        # Call Back function. This will be called
-        # when user try to change the Linear Attenuation of light.
-        #################################################################
-        self.currentLight.setLinearAttenuation(value)
-        return
-    
-    def setQuadraticAttenuation(self, value):
-        #################################################################
-        # setQuadraticAttenuation(self, value)
-        # Call Back function. This will be called
-        # when user try to change the Quadratic Attenuation of light.
-        #################################################################
-        self.currentLight.setQuadraticAttenuation(value)
-        return
-    
-    def setExponent(self, value):
-        #################################################################
-        # setExponent(self, value)
-        # Call Back function. This will be called
-        # when user try to change Exponent value of light.
-        #################################################################
-        self.currentLight.setExponent(value)
-        return

+ 0 - 1456
doc/SceneEditor/propertyWindow.py

@@ -1,1456 +0,0 @@
-#################################################################
-# propertyWindow.py
-# Written by Yi-Hong Lin, [email protected], 2004
-#################################################################
-from direct.tkwidgets.AppShell import *
-from direct.showbase.TkGlobal import *
-
-from seColorEntry import *
-
-from direct.tkwidgets import Floater
-from direct.tkwidgets import Dial
-from direct.tkwidgets import Slider
-from direct.tkwidgets import VectorWidgets
-from pandac.PandaModules import *
-from Tkinter import *
-import Pmw
-
-class propertyWindow(AppShell,Pmw.MegaWidget):
-    #################################################################
-    # propertyWindow(AppShell,Pmw.MegaWidget)
-    # This class will create a widow to show the object property and
-    # let user can change shoe of them.
-    #################################################################
-    appversion      = '1.0'
-    appname         = 'Property Window'
-    frameWidth      = 400
-    frameHeight     = 400
-    padx            = 0
-    pady            = 0
-    usecommandarea  = 0
-    usestatusarea   = 0
-    widgetsDict = {}
-
-    
-    def __init__(self, target, type, info, parent = None, nodePath = render, **kw):
-        self.nodePath = target
-        self.name = target.getName()
-        self.type = type
-        self.info = info
-        
-
-        # Initialise superclass
-        Pmw.MegaWidget.__init__(self, parent)
-        
-        # Define the megawidget options.
-        optiondefs = (
-            ('title',       self.appname,       None),
-            )
-        self.defineoptions(kw, optiondefs)
-
-        if parent == None:
-            self.parent = Toplevel()
-        AppShell.__init__(self, self.parent)
-        
-        self.parent.resizable(False,False) ## Disable the ability to resize for this Window.
-        
-    def appInit(self):
-        return
-        
-    def createInterface(self):
-        # The interior of the toplevel panel
-        interior = self.interior()
-        mainFrame = Frame(interior)
-        name_label = Label(mainFrame, text= self.name,font=('MSSansSerif', 15),
-                           relief = RIDGE, borderwidth=5)
-        name_label.pack()
-        outFrame = Frame(mainFrame, relief = RIDGE, borderwidth=3)
-        self.contentWidge = self.createcomponent(
-            'scrolledFrame',
-            (), None,
-            Pmw.ScrolledFrame, (outFrame,),
-            hull_width = 200, hull_height = 300,
-            usehullsize = 1)
-        self.contentFrame = self.contentWidge.component('frame')
-        self.contentWidge.pack(fill = 'both', expand = 1,padx = 3, pady = 5)
-        outFrame.pack(fill = 'both', expand = 1)
-
-        # Creating different interface depands on object's type
-        if self.type == 'camera':
-            self.cameraInterface(self.contentFrame)
-            self.accept('forPorpertyWindow'+self.name, self.trackDataFromSceneCamera)
-        elif self.type == 'Model':
-            self.modelInterface(self.contentFrame)
-            self.accept('forPorpertyWindow'+self.name, self.trackDataFromSceneModel)
-        elif self.type == 'Actor':
-            self.modelInterface(self.contentFrame)
-            self.actorInterface(self.contentFrame)
-            self.accept('forPorpertyWindow'+self.name, self.trackDataFromSceneActor)
-            pass
-        elif self.type == 'Light':
-            self.lightInterface(self.contentFrame)
-            self.accept('forPorpertyWindow'+self.name, self.trackDataFromSceneLight)
-            pass
-        elif self.type == 'dummy':
-            self.dummyInterface(self.contentFrame)
-            self.accept('forPorpertyWindow'+self.name, self.trackDataFromSceneDummy)
-            pass
-        elif self.type == 'collisionNode':
-            self.collisionInterface(self.contentFrame)
-            self.accept('forPorpertyWindow'+self.name, self.trackDataFromSceneCollision)
-            pass
-        elif self.type == 'Special':
-            # If user try to open the property window for node "SEditor"
-            # It will show the grid property.
-            self.gridInterface(self.contentFrame)
-            self.accept('forPorpertyWindow'+self.name, None)
-            pass
-
-        self.curveFrame = None
-        #### If nodePath has been binded with any curves
-        if self.info.has_key('curveList'):
-            self.createCurveFrame(self.contentFrame)
-       
-        ## Set all stuff done
-        mainFrame.pack(fill = 'both', expand = 1)
-
-    
-    def createMenuBar(self):
-        # we don't need menu bar here.
-        self.menuBar.destroy()
-        
-    def onDestroy(self, event):
-        self.ignore('forPorpertyWindow'+self.name)
-        messenger.send('PW_close', [self.name])
-        '''
-        If you have open any thing, please rewrite here!
-        '''
-        pass
-
-    def createEntryField(self, parent,text, value,
-                         command, initialState, labelWidth = 12,
-                         side = 'left', fill = X, expand = 0,
-                         validate = None,
-                         defaultButton = False, buttonText = 'Default',defaultFunction = None ):
-        #################################################################
-        # createEntryField(self, parent,text, value,
-        #                  command, initialState, labelWidth = 12,
-        #                  side = 'left', fill = X, expand = 0,
-        #                  validate = None,
-        #                  defaultButton = False, buttonText = 'Default',defaultFunction = None ):
-        # This function will create a Entry on the frame "parent"
-        # Also, if user has enabled the "defaultButton," it will create a button right after the entry.
-        #################################################################
-        frame = Frame(parent)
-        widget = Pmw.EntryField(frame, labelpos='w', label_text = text,
-                                value = value, entry_font=('MSSansSerif', 10),label_font=('MSSansSerif', 10),
-                                modifiedcommand=command, validate = validate,
-                                label_width = labelWidth)
-        widget.configure(entry_state = initialState)
-        widget.pack(side=LEFT)
-        self.widgetsDict[text] = widget
-        if defaultButton and (defaultFunction!=None):
-            # create a button if they need.
-            widget = Button(frame, text=buttonText, font=('MSSansSerif', 10), command = defaultFunction)
-            widget.pack(side=LEFT, padx=3)
-            self.widgetsDict[text+'-'+'DefaultButton']=widget
-            
-        frame.pack(side = side, fill = fill, expand = expand,pady=3)
-
-
-    def createPosEntry(self, contentFrame):
-        #################################################################
-        # createPosEntry(self, contentFrame)
-        # This function will create three entries for setting position for the objects.
-        # the entry type is Floater.
-        # And, it will set the call back function to setNodePathPosHprScale()
-        #################################################################
-        posInterior = Frame(contentFrame)
-        self.posX = self.createcomponent('posX', (), None,
-                                         Floater.Floater, (posInterior,),
-                                         text = 'X', relief = FLAT,
-                                         value = self.nodePath.getX(),
-                                         label_foreground = 'Red',
-                                         entry_width = 9)
-        self.posX['commandData'] = ['x']
-        self.posX['command'] = self.setNodePathPosHprScale
-        self.posX.pack(side=LEFT,expand=0,fill=X, padx=1)
-        
-        self.posY = self.createcomponent('posY', (), None,
-                                         Floater.Floater, (posInterior,),
-                                         text = 'Y', relief = FLAT,
-                                         value = self.nodePath.getY(),
-                                         label_foreground = '#00A000',
-                                         entry_width = 9)
-        self.posY['commandData'] = ['y']
-        self.posY['command'] = self.setNodePathPosHprScale
-        self.posY.pack(side=LEFT, expand=0,fill=X, padx=1)
-        
-        self.posZ = self.createcomponent('posZ', (), None,
-                                         Floater.Floater, (posInterior,),
-                                         text = 'Z', relief = FLAT,
-                                         value = self.nodePath.getZ(),
-                                         label_foreground = 'Blue',
-                                         entry_width = 9)
-        self.posZ['commandData'] = ['z']
-        self.posZ['command'] = self.setNodePathPosHprScale
-        self.posZ.pack(side=LEFT, expand=0,fill=X, padx=1)
-        posInterior.pack(side=TOP, expand=0,fill=X, padx=3, pady=3)
-
-    def createHprEntry(self, contentFrame):
-        #################################################################
-        # createHprEntry(self, contentFrame)
-        # This function will create three entries for setting orientation for the objects.
-        # the entry type is Floater.
-        # And, it will set the call back function to setNodePathPosHprScale()
-        #################################################################
-        hprInterior = Frame(contentFrame)
-        self.hprH = self.createcomponent('hprH', (), None,
-                                         Dial.AngleDial, (hprInterior,),
-                                         style = 'mini',
-                                         text = 'H', value = self.nodePath.getH(),
-                                         relief = FLAT,
-                                         label_foreground = 'blue',
-                                         entry_width = 9)
-        self.hprH['commandData'] = ['h']
-        self.hprH['command'] = self.setNodePathPosHprScale
-        self.hprH.pack(side = LEFT, expand=0,fill=X)
-        
-        self.hprP = self.createcomponent('hprP', (), None,
-                                         Dial.AngleDial, (hprInterior,),
-                                         style = 'mini',
-                                         text = 'P', value = self.nodePath.getP(),
-                                         relief = FLAT,
-                                         label_foreground = 'red',
-                                         entry_width = 9)
-        self.hprP['commandData'] = ['p']
-        self.hprP['command'] = self.setNodePathPosHprScale
-        self.hprP.pack(side = LEFT, expand=0,fill=X)
-        
-        self.hprR = self.createcomponent('hprR', (), None,
-                                         Dial.AngleDial, (hprInterior,),
-                                         style = 'mini',
-                                         text = 'R', value = self.nodePath.getR(),
-                                         relief = FLAT,
-                                         label_foreground = '#00A000',
-                                         entry_width = 9)
-        self.hprR['commandData'] = ['r']
-        self.hprR['command'] = self.setNodePathPosHprScale
-        self.hprR.pack(side = LEFT, expand=0,fill=X)
-
-        hprInterior.pack(side=TOP, expand=0,fill=X, padx=3, pady=3)
-
-
-    def createScaleEntry(self, contentFrame):
-        #################################################################
-        # createScaleEntry(self, contentFrame)
-        # This function will create three entries for setting scale for the objects.
-        # the entry type is Floater.
-        # And, it will set the call back function to setNodePathPosHprScale()
-        #################################################################
-        scaleInterior = Frame(contentFrame)
-        
-        self.scale = self.createcomponent('scale', (), None,
-                                           Floater.Floater, (scaleInterior,),
-                                           text = 'Scale',
-                                           relief = FLAT,
-                                           min = 0.0001, value = self.nodePath.getScale().getX(),
-                                           resetValue = 1.0,
-                                           label_foreground = 'Blue')
-        self.scale['commandData'] = ['s']
-        self.scale['command'] = self.setNodePathPosHprScale
-        self.scale.pack(side=LEFT,expand=0,fill=X)
-
-        scaleInterior.pack(side=TOP,expand=0,fill=X, padx=3, pady=3)
-
-    def createColorEntry(self, contentFrame):
-        #################################################################
-        # createColorEntry(self, contentFrame)
-        # This function will create three entries for setting color for the objects.
-        # the entry type is Floater.
-        # And, it will set the call back function to setNodeColorVec()
-        #################################################################
-        color = self.nodePath.getColor()
-        print color
-        self.nodeColor = VectorWidgets.ColorEntry(
-            contentFrame, text = 'Node Color', value=[color.getX()*255,
-                                                      color.getY()*255,
-                                                      color.getZ()*255,
-                                                      color.getW()*255])
-        self.nodeColor['command'] = self.setNodeColorVec
-        self.nodeColor['resetValue'] = [255,255,255,255]
-        self.nodeColor.place(anchor=NW,y=235)
-        self.bind(self.nodeColor, 'Set nodePath color')        
-        self.nodeColor.pack(side=TOP,expand=0,fill=X, padx=3, pady=3)
-        return
-    
-    def setNodeColorVec(self, color):
-        #################################################################
-        # setNodeColorVec(self, color)
-        # This function will set the color of the object
-        #################################################################
-        self.nodePath.setColor(color[0]/255.0,
-                               color[1]/255.0,
-                               color[2]/255.0,
-                               color[3]/255.0)
-        return
-
-    
-    def setNodePathPosHprScale(self, data, axis):
-        #################################################################
-        # setNodePathPosHprScale(self, data, axis)
-        # This function will set the postion, orientation or scale of the object
-        # use the "axis" parameter to decide which property should be set.
-        #################################################################
-        if axis == 'x':
-            self.nodePath.setX(data)
-        elif axis == 'y':
-            self.nodePath.setY(data)
-        elif axis == 'z':
-            self.nodePath.setZ(data)
-        elif axis == 'h':
-            self.nodePath.setH(data)
-        elif axis == 'p':
-            self.nodePath.setP(data)
-        elif axis == 'r':
-            self.nodePath.setR(data)
-        elif axis == 's':
-            self.nodePath.setScale(data)
-
-
-    #### Curve property
-    def createCurveFrame(self, contentFrame):
-        #################################################################
-        # createCurveFrame(self, contentFrame)
-        # Draw the curve property frame
-        # This function will draw the property frame and content of curves
-        # pass the target frame as a variable
-        #################################################################
-        if self.curveFrame==None:
-            self.curveFrame = Frame(contentFrame)
-            group = Pmw.Group(self.curveFrame,
-                              tag_text='Motion Path List for this Node',
-                              tag_font=('MSSansSerif', 10))
-            innerFrame = group.interior()
-            n = 0
-            for curve in self.info['curveList']:
-                n += 1
-                self.createEntryField(innerFrame,'Curve %d:' %n,
-                                      value = curve.getCurve(0).getName(),
-                                      command = None,
-                                      initialState='disabled',
-                                      side = 'top',
-                                      defaultButton = True,
-                                      buttonText = 'delete',
-                                      defaultFunction = lambda a = n, b = self : b.deleteCurve(a))
-            group.pack(side = TOP, fill = X, expand = 0,pady=3, padx=3)
-            self.curveFrame.pack(side = TOP, fill = X, expand = 0,pady=3, padx=3)
-            
-        return
-    
-    def deleteCurve(self, number = 0):
-        #################################################################
-        # deleteCurve(self, number = 0)
-        # Call back function, will be called when user click on the "delete" button beside the curve name.
-        # This function will send the message to sceneEditor to remove the target curve
-        # and will set a callback function waitting the result.
-        #################################################################
-        widget = self.widgetsDict['Curve %d:' %number]
-        curveName = widget.getvalue()
-        self.accept('curveRemovedFromNode',self.redrawCurveProperty)
-        messenger.send('PW_removeCurveFromNode',[self.nodePath, curveName])
-        return
-
-    def redrawCurveProperty(self, nodePath, curveList):
-        #################################################################
-        # redrawCurveProperty(self, nodePath, curveList)
-        # Callback function, will be called once get the result from dataHolder.
-        # It will check the target nodePath first, then check the curve list is empty or not.
-        # If yes, then delete whole curve frame. If not, then renew the data and redraw the curve frame again.
-        #################################################################
-        self.name = self.nodePath.getName()
-        if self.name != nodePath.getName():
-            messenger.send('curveRemovedFromNode',[nodePath, curveList])
-            return
-        else:
-            self.ignore('curveRemovedFromNode')
-            
-        if curveList!= None:
-            del self.info['curveList']
-            self.info['curveList'] = curveList
-            self.curveFrame.destroy()
-            del self.curveFrame
-            self.curveFrame = None
-            self.createCurveFrame(self.contentFrame)
-        else:
-            del self.info['curveList']
-            self.curveFrame.destroy()
-            del self.curveFrame
-            self.curveFrame = None
-        return
-
-    ####
-    ####  Anything about Camera will be here!
-    ####
-    def cameraInterface(self, contentFrame):
-        #################################################################
-        # cameraInterface(self, interior, mainFrame)
-        # Create the interface for camera node.
-        #################################################################
-        
-        ## Type entry : unchageable
-        widget = self.createEntryField(contentFrame,'Type:',
-                                       value = self.type,
-                                       command = None,
-                                       initialState='disabled',
-                                       side = 'top')
-
-        ## lens Type entry
-        widget = self.createEntryField(contentFrame, 'Lens Type:',
-                                       value = self.info['lensType'],
-                                       command = None,
-                                       initialState='disabled',
-                                       side = 'top')
-
-        ## Pos
-        group = Pmw.Group(contentFrame,tag_text='Position',
-                          tag_font=('MSSansSerif', 10))
-        self.createPosEntry(group.interior())
-        group.pack(side=TOP,fill = X, expand = 0, pady=3)
-
-        ## Orientation
-        group = Pmw.Group(contentFrame,tag_text='Orientation',
-                          tag_font=('MSSansSerif', 10))
-        self.createHprEntry(group.interior())
-        group.pack(side=TOP,fill = X, expand = 0, pady=3)
-        
-        ## near entry
-        group = Pmw.Group(contentFrame,tag_text='Lens Property',
-                          tag_font=('MSSansSerif', 10))
-        lensFrame = group.interior()
-        widget = self.createEntryField(lensFrame, 'Near:',value = self.info['near'],
-                                       command = self.setCameraNear,
-                                       initialState='normal',
-                                       validate = Pmw.realvalidator,
-                                       side = 'top',
-                                       defaultButton = True,
-                                       defaultFunction = self.defaultCameraNear)
-
-        ## far entry
-        widget = self.createEntryField(lensFrame, 'Far:',
-                                       value = self.info['far'],
-                                       command = self.setCameraFar,
-                                       initialState='normal',
-                                       side = 'top',
-                                       validate = Pmw.realvalidator,
-                                       defaultButton = True,
-                                       defaultFunction = self.defaultCameraFar)
-
-        ## Hfov entry
-        widget = self.createEntryField(lensFrame, 'H.F.O.V.:',
-                                           value = self.info['hFov'],
-                                           command = self.setCameraFov,
-                                           validate = Pmw.realvalidator,
-                                           initialState='normal',
-                                           side = 'top',
-                                           defaultButton = True,
-                                           defaultFunction = self.defaultCameraHfov)
-
-        ## Vfov entry
-        widget = self.createEntryField(lensFrame, 'V.F.O.V.:',
-                                       value = self.info['vFov'],
-                                       command = self.setCameraFov,
-                                       validate = Pmw.realvalidator,
-                                       initialState='normal',
-                                       side = 'top',
-                                       defaultButton = True,
-                                       defaultFunction = self.defaultCameraVfov)
-
-        ## Film Size entry
-        frame = Frame(lensFrame)
-        widget = Label(frame, text = "Film Size:", font=('MSSansSerif', 10),width=12)
-        widget.pack(side=LEFT)
-        frame.pack(side = TOP, fill = X, expand = 0, pady=3)
-            
-        frame = Frame(lensFrame)
-        widget = Pmw.EntryField(frame, labelpos='w', label_text = '                        ',
-                                value = self.info['FilmSize'].getX(),
-                                entry_font=('MSSansSerif', 10),
-                                label_font=('MSSansSerif', 10),
-                                modifiedcommand=self.setCameraFilmSize, validate = Pmw.realvalidator,
-                                entry_width = 8)
-        self.widgetsDict['FilmSizeX']=widget
-        widget.pack(side=LEFT, padx=3)
-        widget = Pmw.EntryField(frame, labelpos='w', label_text = ': ', value = self.info['FilmSize'].getY() ,
-                                label_font=('MSSansSerif', 10),
-                                entry_font=('MSSansSerif', 10),
-                                modifiedcommand=self.setCameraFilmSize, validate = Pmw.realvalidator,
-                                entry_width = 8)
-        self.widgetsDict['FilmSizeY']=widget
-        widget.pack(side=LEFT, padx=3)
-        widget = Button(frame, text='Default', font=('MSSansSerif', 10), command = self.defaultCameraFilmSize)
-        widget.pack(side=LEFT, padx=3)
-        self.widgetsDict['FilmSize'+'-'+'DefaultButton']=widget            
-        frame.pack(side = TOP, fill = X, expand = 0,pady=0)
-
-        ## Focal Length entry
-        widget = self.createEntryField(lensFrame, 'Focal Length:',
-                                       value = self.info['focalLength'],
-                                       command = self.setCameraFocalLength,
-                                       validate = Pmw.realvalidator,
-                                       initialState='normal',
-                                       side = 'top',
-                                       defaultButton = True,
-                                       defaultFunction = self.defaultCameraFocalLength)
-        group.pack(side = TOP, fill = X, expand = 0,pady=2)
-
-        
-    def defaultCameraFar(self):
-        #################################################################
-        # defaultCameraFar(self)
-        # set the camera "Far" value back to default.
-        #################################################################
-        widget = self.widgetsDict['Far:']
-        widget.setvalue(base.cam.node().getLens().getDefaultFar())
-        return
-
-    def setCameraFar(self):
-        #################################################################
-        # setCameraFar(self)
-        # set the camera "Far" value to what now user has typed in the entry
-        #################################################################
-        if self.widgetsDict['Far:'].getvalue() != '':
-            value = float(self.widgetsDict['Far:'].getvalue())
-        else:
-            value = 0
-        camera.getChild(0).node().getLens().setFar(value)
-        return
-
-    def defaultCameraNear(self):
-        #################################################################
-        # defaultCameraNear(self)
-        # set the camera "Near" value back to default.
-        #################################################################
-        widget = self.widgetsDict['Near:']
-        widget.setvalue(base.cam.node().getLens().getDefaultNear())
-        return
-
-    def setCameraNear(self):
-        #################################################################
-        # setCameraNear(self)
-        # set the camera "Near" value to what now user has typed in the entry
-        #################################################################
-        if self.widgetsDict['Near:'].getvalue() != '':
-            value = float(self.widgetsDict['Near:'].getvalue())
-        else:
-            value = 0
-        camera.getChild(0).node().getLens().setNear(value)
-        return
-
-    def defaultCameraHfov(self):
-        #################################################################
-        # defaultCameraHfov(self)
-        # set the camera "Hfov" value back to default.
-        #################################################################
-        widget = self.widgetsDict['H.F.O.V.:']
-        widget.setvalue(45.0)
-        return
-
-    def setCameraFov(self):
-        #################################################################
-        # setCameraFov(self)
-        # set the camera "Fov" value to what now user has typed in the entry
-        #################################################################
-        if self.widgetsDict['H.F.O.V.:'].getvalue() != '':
-            value1 = float(self.widgetsDict['H.F.O.V.:'].getvalue())
-        else:
-            value1 = 0
-        if self.widgetsDict['V.F.O.V.:'].getvalue() != '':
-            value2 = float(self.widgetsDict['V.F.O.V.:'].getvalue())
-        else:
-            value2 = 0
-        camera.getChild(0).node().getLens().setFov(VBase2(value1,value2))
-        return
-
-    def defaultCameraVfov(self):
-        #################################################################
-        # defaultCameraVfov(self)
-        # set the camera "Vfov" value back to default.
-        #################################################################
-        widget = self.widgetsDict['V.F.O.V.:']
-        widget.setvalue(34.51587677)
-        return
-
-    def defaultCameraFocalLength(self):
-        #################################################################
-        # defaultCameraFocalLength(self)
-        # set the camera "Focal Length" value back to default.
-        #################################################################
-        widget = self.widgetsDict['Focal Length:']
-        widget.setvalue(1.20710682869)
-        return
-
-    def setCameraFocalLength(self):
-        #################################################################
-        # setCameraFocalLength(self)
-        # set the camera "Focal Length" value to what now user has typed in the entry
-        #################################################################
-        if self.widgetsDict['Focal Length:'].getvalue() != '':
-            value = float(self.widgetsDict['Focal Length:'].getvalue())
-        else:
-            value = 0
-        camera.getChild(0).node().getLens().setFocalLength(value)
-        camera.getChild(0).node().getLens().setFilmSize(VBase2(float(self.widgetsDict['FilmSizeX'].getvalue()),float(self.widgetsDict['FilmSizeY'].getvalue())))
-        return
-
-    def defaultCameraFilmSize(self):
-        #################################################################
-        # defaultCameraFilmSize(self)
-        # set the camera "Film Size" value back to default.
-        #################################################################
-        widget = self.widgetsDict['FilmSizeX']
-        widget.setvalue(1)
-        widget = self.widgetsDict['FilmSizeY']
-        widget.setvalue(0.75)
-        return
-
-    def setCameraFilmSize(self):
-        #################################################################
-        # setCameraFilmSize(self)
-        # set the camera "Film Size" value to what now user has typed in the entry
-        #################################################################
-        if self.widgetsDict['FilmSizeX'].getvalue() != '':
-            value1 = float(self.widgetsDict['FilmSizeX'].getvalue())
-        else:
-            value1 = 0
-        if self.widgetsDict['FilmSizeY'].getvalue() != '':
-            value2 = float(self.widgetsDict['FilmSizeY'].getvalue())
-        else:
-            value2 = 0
-        camera.getChild(0).node().getLens().setFilmSize(VBase2(value1,value2))
-        return
-
-    ####
-    ####  Anything about Model & Actor will be here!
-    ####
-    def modelInterface(self, contentFrame):
-        #################################################################
-        # modelInterface(self, contentFrame)
-        # Create the basic interface for ModelRoot Type Node
-        #################################################################
-        widget = self.createEntryField(contentFrame,'Type:',
-                                       value = self.type,
-                                       command = None,
-                                       initialState='disabled',
-                                       side = 'top')
-        widget = self.createEntryField(contentFrame,'Model File:',
-                                       value = self.info['filePath'].getFullpath(),
-                                       command = None,
-                                       initialState='disabled',
-                                       side = 'top',
-                                       defaultButton = False,
-                                       buttonText = 'Change',
-                                       defaultFunction = None)
-        group = Pmw.Group(contentFrame,tag_text='Position',
-                          tag_font=('MSSansSerif', 10))
-        self.createPosEntry(group.interior())
-        group.pack(side=TOP,fill = X, expand = 0, pady=3)
-        
-        group = Pmw.Group(contentFrame,tag_text='Orientation',
-                          tag_font=('MSSansSerif', 10))
-        self.createHprEntry(group.interior())
-        group.pack(side=TOP,fill = X, expand = 0, pady=3)
-
-        self.createScaleEntry(contentFrame)
-
-        group = Pmw.Group(contentFrame,tag_text='Color',
-                          tag_font=('MSSansSerif', 10))
-        frame = group.interior()
-        self.createColorEntry(frame)
-        self.varAlpha = IntVar()
-        self.varAlpha.set(self.nodePath.hasTransparency())
-        checkButton = Checkbutton(frame, text='Enable Alpha',
-                                  variable=self.varAlpha, command=self.toggleAlpha)
-        checkButton.pack(side=RIGHT,pady=3)
-        group.pack(side=TOP,fill = X, expand = 0, pady=3)
-        return
-
-    def toggleAlpha(self):
-        #################################################################
-        # toggleAlpha(self)
-        # This funtion will toggle the objects alpha value
-        # And, it will also reset the "Bin" to
-        # "fixed" if user enable the alpha for this object.
-        #################################################################
-        if self.nodePath.hasTransparency():
-            self.nodePath.clearTransparency()
-            self.nodePath.setBin("default", 0)
-        else:
-            self.nodePath.setTransparency(True)
-            self.nodePath.setBin("fixed", 1)
-        return
-    
-    def actorInterface(self, contentFrame):
-        #################################################################
-        # actorInterface(self, contentFrame)
-        # Create the basic interface for Actor Type Node
-        #################################################################
-        self.animFrame = None
-        animeDict = self.info['animDict']
-        if len(animeDict)==0:
-            return
-
-        self.animFrame = Frame(contentFrame)
-        group = Pmw.Group(self.animFrame,tag_text='Animations',
-                                   tag_font=('MSSansSerif', 10))
-        innerFrame = group.interior()
-        for name in animeDict:
-            self.createEntryField(innerFrame, name,
-                                  value = animeDict[name],
-                                  command = None,
-                                  initialState='disabled',
-                                  side = 'top',
-                                  defaultButton = True,
-                                  buttonText = 'Remove',
-                                  defaultFunction = lambda a = name, b = self : b.deleteAnimation(a))
-        group.pack(side=TOP,fill = X, expand = 0, pady=3)
-        self.animFrame.pack(side=TOP,fill = X, expand = 0, pady=3)
-        return
-
-
-    def deleteAnimation(self, anim):
-        #################################################################
-        # deleteAnimation(self, anim)
-        # This function will delete the animation named "anim" in this actor
-        # But, not directly removed be this function.
-        # This function will send out a message to notice dataHolder to remove this animation
-        #################################################################
-        print anim
-        widget = self.widgetsDict[anim]
-        self.accept('animRemovedFromNode',self.redrawAnimProperty)
-        messenger.send('PW_removeAnimFromNode',[self.name, anim])
-        return
-
-    def redrawAnimProperty(self, nodePath, animDict):
-        #################################################################
-        # redrawCurveProperty(self, nodePath, curveList)
-        # Callback function, will be called once get the result from dataHolder.
-        # It will check the target nodePath first, then check the curve list is empty or not.
-        # If yes, then delete whole curve frame. If not, then renew the data and redraw the curve frame again.
-        #################################################################
-        self.name = self.nodePath.getName()
-        if self.name != nodePath.getName():
-            messenger.send('animRemovedFromNode',[nodePath, animDict])
-            return
-        else:
-            self.ignore('animRemovedFromNode')
-            
-        if len(animDict)!= 0:
-            del self.info['animDict']
-            self.info['animDict'] = animDict
-            self.animFrame.destroy()
-            del self.animFrame
-            self.animFrame = None
-            self.actorInterface(self.contentFrame)
-        else:
-            del self.info['animDict']
-            self.animFrame.destroy()
-            del self.animFrame
-            self.animFrame = None
-        return
-
-    ####
-    ####  Anything about Light will be here!
-    ####
-    def lightInterface(self, contentFrame):
-        #################################################################
-        # lightInterface(self, contentFrame)
-        # Create the basic interface for light Type Node
-        #################################################################
-        widget = self.createEntryField(contentFrame,'Type:',
-                                       value = self.nodePath.node().getType().getName(),
-                                       command = None,
-                                       initialState='disabled',
-                                       side = 'top')
-
-        self.lightNode = self.info['lightNode']
-
-        lightingGroup = Pmw.Group(contentFrame,tag_pyclass=None)
-        frame = lightingGroup.interior()
-        self.lightColor = seColorEntry(
-            frame, text = 'Light Color', label_font=('MSSansSerif', 10),
-            value=[self.lightNode.lightcolor.getX()*255, self.lightNode.lightcolor.getY()*255,self.lightNode.lightcolor.getZ()*255,0])
-        self.lightColor['command'] = self.setLightingColorVec
-        self.lightColor['resetValue'] = [0.3*255,0.3*255,0.3*255,0]
-        self.lightColor.pack(side=TOP, fill=X,expand=1, padx = 2, pady =2)
-        self.bind(self.lightColor, 'Set light color')
-        
-        self.varActive = IntVar()
-        self.varActive.set(self.lightNode.active)
-        checkButton = Checkbutton(frame, text='Enable This Light',
-                                  variable=self.varActive, command=self.toggleLight)
-        checkButton.pack(side=RIGHT,pady=3)
-        lightingGroup.pack(side=TOP, fill = X, expand =1)
-        
-        # Directional light controls
-        if self.lightNode.type == 'directional':
-            lightingGroup = Pmw.Group(contentFrame,tag_pyclass=None)
-            directionalPage = lightingGroup.interior()
-            self.dSpecularColor = seColorEntry(
-                directionalPage, text = 'Specular Color',  label_font=('MSSansSerif', 10),value = [self.lightNode.specularColor.getX()*255,self.lightNode.specularColor.getY()*255,self.lightNode.specularColor.getZ()*255,0])
-            self.dSpecularColor['command'] = self.setSpecularColor
-            self.dSpecularColor.pack(fill = X, expand = 1)
-            self.bind(self.dSpecularColor,
-                      'Set directional light specular color')
-            self.dPosition = VectorWidgets.Vector3Entry(
-                directionalPage, text = 'Position',  label_font=('MSSansSerif', 10),value = [self.lightNode.getPosition().getX(),self.lightNode.getPosition().getY(),self.lightNode.getPosition().getZ()])
-            self.dPosition['command'] = self.setPosition
-            self.dPosition['resetValue'] = [0,0,0,0]
-            self.dPosition.pack(fill = X, expand = 1)
-            self.bind(self.dPosition, 'Set directional light position')
-            self.dOrientation = VectorWidgets.Vector3Entry(
-                directionalPage, text = 'Orientation', label_font=('MSSansSerif', 10),
-                value = [self.lightNode.getOrientation().getX(),self.lightNode.getOrientation().getY(),self.lightNode.getOrientation().getZ(),0])
-            self.dOrientation['command'] = self.setOrientation
-            self.dOrientation['resetValue'] = [0,0,0,0]
-            self.dOrientation.pack(fill = X, expand = 1)
-            self.bind(self.dOrientation, 'Set directional light orientation')
-            
-            lightingGroup.pack(side=TOP, fill = X, expand =1)
-
-        
-        elif self.lightNode.type == 'point':
-            # Point light controls
-            lightingGroup = Pmw.Group(contentFrame,tag_pyclass=None)
-            pointPage = lightingGroup.interior()
-            self.pSpecularColor = seColorEntry(
-                pointPage, text = 'Specular Color', label_font=('MSSansSerif', 10),
-                value = [self.lightNode.specularColor.getX(),self.lightNode.specularColor.getY(),self.lightNode.specularColor.getZ(),0])
-            self.pSpecularColor['command'] = self.setSpecularColor
-            self.pSpecularColor.pack(fill = X, expand = 1)
-            self.bind(self.pSpecularColor,
-                      'Set point light specular color')
-    
-            self.pPosition = VectorWidgets.Vector3Entry(
-                pointPage, text = 'Position',  label_font=('MSSansSerif', 10),
-                value = [self.lightNode.getPosition().getX(),self.lightNode.getPosition().getY(),self.lightNode.getPosition().getZ(),0])
-            self.pPosition['command'] = self.setPosition
-            self.pPosition['resetValue'] = [0,0,0,0]
-            self.pPosition.pack(fill = X, expand = 1)
-            self.bind(self.pPosition, 'Set point light position')
-
-            self.pConstantAttenuation = Slider.Slider(
-                pointPage,
-                text = 'Constant Attenuation', label_font=('MSSansSerif', 10),
-                max = 1.0,
-                value = self.lightNode.constant)
-            self.pConstantAttenuation['command'] = self.setConstantAttenuation
-            self.pConstantAttenuation.pack(fill = X, expand = 1)
-            self.bind(self.pConstantAttenuation,
-                      'Set point light constant attenuation')
-           
-            self.pLinearAttenuation = Slider.Slider(
-                pointPage,
-                text = 'Linear Attenuation', label_font=('MSSansSerif', 10),
-                max = 1.0,
-                value = self.lightNode.linear)
-            self.pLinearAttenuation['command'] = self.setLinearAttenuation
-            self.pLinearAttenuation.pack(fill = X, expand = 1)
-            self.bind(self.pLinearAttenuation,
-                      'Set point light linear attenuation')
-           
-            self.pQuadraticAttenuation = Slider.Slider(
-                pointPage,
-                text = 'Quadratic Attenuation', label_font=('MSSansSerif', 10),
-                max = 1.0,
-                value = self.lightNode.quadratic)
-            self.pQuadraticAttenuation['command'] = self.setQuadraticAttenuation
-            self.pQuadraticAttenuation.pack(fill = X, expand = 1)
-            self.bind(self.pQuadraticAttenuation,
-                      'Set point light quadratic attenuation')
-
-            lightingGroup.pack(side=TOP, fill = X, expand =1)
-
-           
-        elif self.lightNode.type == 'spot':     
-            # Spot light controls
-            lightingGroup = Pmw.Group(contentFrame,tag_pyclass=None)
-            spotPage = lightingGroup.interior()
-            self.sSpecularColor = seColorEntry(
-                spotPage, text = 'Specular Color', label_font=('MSSansSerif', 10),
-                value = [self.lightNode.specularColor.getX()*255,self.lightNode.specularColor.getY()*255,self.lightNode.specularColor.getZ()*255,0])
-            self.sSpecularColor['command'] = self.setSpecularColor
-            self.sSpecularColor.pack(fill = X, expand = 1)
-            self.bind(self.sSpecularColor,
-                      'Set spot light specular color')
-
-            self.sConstantAttenuation = Slider.Slider(
-                spotPage,
-                text = 'Constant Attenuation', label_font=('MSSansSerif', 10),
-                max = 1.0,
-                value = self.lightNode.constant)
-            self.sConstantAttenuation['command'] = self.setConstantAttenuation
-            self.sConstantAttenuation.pack(fill = X, expand = 1)
-            self.bind(self.sConstantAttenuation,
-                      'Set spot light constant attenuation')
-           
-            self.sLinearAttenuation = Slider.Slider(
-                spotPage,
-                text = 'Linear Attenuation', label_font=('MSSansSerif', 10),
-                max = 1.0,
-                value = self.lightNode.linear)
-            self.sLinearAttenuation['command'] = self.setLinearAttenuation
-            self.sLinearAttenuation.pack(fill = X, expand = 1)
-            self.bind(self.sLinearAttenuation,
-                      'Set spot light linear attenuation')
-           
-            self.sQuadraticAttenuation = Slider.Slider(
-                spotPage,
-                text = 'Quadratic Attenuation', label_font=('MSSansSerif', 10),
-                max = 1.0,
-                value = self.lightNode.quadratic)
-            self.sQuadraticAttenuation['command'] = self.setQuadraticAttenuation
-            self.sQuadraticAttenuation.pack(fill = X, expand = 1)
-            self.bind(self.sQuadraticAttenuation,
-                      'Set spot light quadratic attenuation')
-           
-            self.sExponent = Slider.Slider(
-                spotPage,
-                text = 'Exponent', label_font=('MSSansSerif', 10),
-                max = 1.0,
-                value = self.lightNode.exponent)
-            self.sExponent['command'] = self.setExponent
-            self.sExponent.pack(fill = X, expand = 1)
-            self.bind(self.sExponent,
-                      'Set spot light exponent')
-            lightingGroup.pack(side=TOP, fill = X, expand =1)
-            
-        return
-
-    def setLightingColorVec(self,color):
-        if self.lightNode==None:
-            return
-        self.lightNode.setColor(VBase4((color[0]/255),(color[1]/255),(color[2]/255),1))
-        return
-
-    def setSpecularColor(self,color):
-        if self.lightNode==None:
-            return
-        self.lightNode.setSpecColor(VBase4((color[0]/255),(color[1]/255),(color[2]/255),1))
-        return
-
-    def setPosition(self,position):
-        if self.lightNode==None:
-            return
-        self.lightNode.setPosition(Point3(position[0],position[1],position[2]))
-        return
-
-    def setOrientation(self, orient):
-        if self.lightNode==None:
-            return
-        self.lightNode.setOrientation(Vec3(orient[0],orient[1],orient[2]))
-        return
-    
-    def setConstantAttenuation(self, value):
-        self.lightNode.setConstantAttenuation(value)
-        return
-    
-    def setLinearAttenuation(self, value):
-        self.lightNode.setLinearAttenuation(value)
-        return
-    
-    def setQuadraticAttenuation(self, value):
-        self.lightNode.setQuadraticAttenuation(value)
-        return
-    
-    def setExponent(self, value):
-        self.lightNode.setExponent(value)
-        return
-
-    def toggleLight(self):
-        messenger.send('PW_toggleLight',[self.lightNode])
-        return
-
-
-    ####
-    ####  Anything about Dummy will be here!
-    ####
-    def dummyInterface(self, contentFrame):
-        #################################################################
-        # dummyInterface(self, contentFrame)
-        # Create the basic interface for dummy Type Node
-        #################################################################
-        '''dummyInterface(self, contentFrame)
-        Create the basic interface for dummy Node
-        '''
-        widget = self.createEntryField(contentFrame,'Type:',
-                                       value = 'Dummy Nodepath',
-                                       command = None,
-                                       initialState='disabled',
-                                       side = 'top')
-        
-        group = Pmw.Group(contentFrame,tag_text='Position',
-                          tag_font=('MSSansSerif', 10))
-        self.createPosEntry(group.interior())
-        group.pack(side=TOP,fill = X, expand = 0, pady=3)
-        
-        group = Pmw.Group(contentFrame,tag_text='Orientation',
-                          tag_font=('MSSansSerif', 10))
-        self.createHprEntry(group.interior())
-        group.pack(side=TOP,fill = X, expand = 0, pady=3)
-
-        self.createScaleEntry(contentFrame)
-
-        group = Pmw.Group(contentFrame,tag_text='Color',
-                          tag_font=('MSSansSerif', 10))
-        frame = group.interior()
-        self.createColorEntry(frame)
-        self.varAlpha = IntVar()
-        self.varAlpha.set(self.nodePath.hasTransparency())
-        checkButton = Checkbutton(frame, text='Enable Alpha',
-                                  variable=self.varAlpha, command=self.toggleAlpha)
-        checkButton.pack(side=RIGHT,pady=3)
-        group.pack(side=TOP,fill = X, expand = 0, pady=3)
-        return
-
-
-    #########
-    #######  This will be called when user try to open property window for SEditor Node
-    #########
-    def gridInterface(self, contentFrame):
-        #################################################################
-        # gridInterface(self, contentFrame)
-        # Create the basic interface for grid (Which is stolen from directGrid)
-        #################################################################
-        group = Pmw.Group(contentFrame,tag_text='Grid Property',
-                          tag_font=('MSSansSerif', 10))
-        group.pack(side=TOP,fill = X, expand = 0, padx = 3, pady=3)
-
-        gridPage = group.interior()
-        
-        self.xyzSnap = BooleanVar()
-        self.xyzSnapButton = Checkbutton(
-            gridPage,
-            text = 'XYZ Snap',
-            anchor = 'w', justify = LEFT,
-            variable = self.xyzSnap,
-            command = self.toggleXyzSnap)
-        self.xyzSnapButton.pack(fill = X, expand = 0, pady=3)
-
-        self.hprSnap = BooleanVar()
-        self.hprSnapButton = Checkbutton(
-            gridPage,
-            text = 'HPR Snap',
-            anchor = 'w', justify = LEFT,
-            variable = self.hprSnap,
-            command = self.toggleHprSnap)
-        self.hprSnapButton.pack(fill = X, expand = 0, pady=3)
-
-        self.xyzSnap.set(SEditor.grid.getXyzSnap())
-        self.hprSnap.set(SEditor.grid.getHprSnap())
-
-        self.gridSpacing = Floater.Floater(
-            gridPage,
-            text = 'Grid Spacing',
-            min = 0.1,
-            value = SEditor.grid.getGridSpacing())
-        self.gridSpacing['command'] = SEditor.grid.setGridSpacing
-        self.gridSpacing.pack(fill = X, expand = 0, pady=3)
-        
-        self.gridSize = Floater.Floater(
-            gridPage,
-            text = 'Grid Size',
-            min = 1.0,
-            value = SEditor.grid.getGridSize())
-        self.gridSize['command'] = SEditor.grid.setGridSize
-        self.gridSize.pack(fill = X, expand = 0, pady=3)
-
-        self.gridSnapAngle = Dial.AngleDial(
-            gridPage,
-            text = 'Snap Angle',
-            style = 'mini',
-            value = SEditor.grid.getSnapAngle())
-        self.gridSnapAngle['command'] = SEditor.grid.setSnapAngle
-        self.gridSnapAngle.pack(fill = X, expand = 0, pady=3)
-        
-        return
-
-    def toggleXyzSnap(self):
-        SEditor.grid.setXyzSnap(self.xyzSnap.get())
-        return
-
-    def toggleHprSnap(self):
-        SEditor.grid.setHprSnap(self.hprSnap.get())
-        return
-
-
-
-    ###### Collision Section!!!!
-    def collisionInterface(self, contentFrame):
-        #################################################################
-        # collisionInterface(self, contentFrame)
-        # Create the basic interface for CollisionNode Type Node
-        #################################################################
-        collisionNode = self.info['collisionNode']
-        self.collisionObj = collisionNode.node().getSolid(0)
-        widget = self.createEntryField(contentFrame,'Node Type:',
-                                       value = self.type,
-                                       command = None,
-                                       initialState='disabled',
-                                       side = 'top')
-        cType = self.collisionObj.getType().getName()
-        widget = self.createEntryField(contentFrame,'Object Type:',
-                                       value = cType,
-                                       command = None,
-                                       initialState='disabled',
-                                       side = 'top')
-        group = Pmw.Group(contentFrame,tag_text='Position',
-                          tag_font=('MSSansSerif', 10))
-        self.createPosEntry(group.interior())
-        group.pack(side=TOP,fill = X, expand = 0, pady=3)
-        
-        group = Pmw.Group(contentFrame,tag_text='Orientation',
-                          tag_font=('MSSansSerif', 10))
-        self.createHprEntry(group.interior())
-        group.pack(side=TOP,fill = X, expand = 0, pady=3)
-
-        self.createScaleEntry(contentFrame)
-        
-        collisionGroup = Pmw.Group(contentFrame,tag_text='Collision Object Properties',
-                          tag_font=('MSSansSerif', 10))
-        cObjFrame = collisionGroup.interior()
-
-        ### Generate different Interface for each different kinds of Collision Objects
-        ### Yeah, yeah. I know this part of code looks so ugly...
-        if cType == 'CollisionSphere':
-            centerPos = self.collisionObj.getCenter()
-            radius = self.collisionObj.getRadius()
-            group = Pmw.Group(cObjFrame,tag_text='Origin',
-                              tag_font=('MSSansSerif', 10))
-
-
-            posInterior = Frame(group.interior())
-            self.cPosX = self.createcomponent('originX', (), None,
-                                             Floater.Floater, (posInterior,),
-                                             text = 'X', relief = FLAT,
-                                             value = centerPos.getX(),
-                                             label_foreground = 'Red',
-                                             entry_width = 9)
-            self.cPosX['commandData'] = ['sphere-o']
-            self.cPosX['command'] = self.setCollisionPosHprScale
-            self.cPosX.pack(side=LEFT,expand=0,fill=X, padx=1)
-        
-            self.cPosY = self.createcomponent('originY', (), None,
-                                             Floater.Floater, (posInterior,),
-                                             text = 'Y', relief = FLAT,
-                                             value = centerPos.getY(),
-                                             label_foreground = '#00A000',
-                                             entry_width = 9)
-            self.cPosY['commandData'] = ['sphere-o']
-            self.cPosY['command'] = self.setCollisionPosHprScale
-            self.cPosY.pack(side=LEFT, expand=0,fill=X, padx=1)
-        
-            self.cPosZ = self.createcomponent('originZ', (), None,
-                                             Floater.Floater, (posInterior,),
-                                             text = 'Z', relief = FLAT,
-                                             value = centerPos.getZ(),
-                                             label_foreground = 'Blue',
-                                             entry_width = 9)
-            self.cPosZ['commandData'] = ['sphere-o']
-            self.cPosZ['command'] = self.setCollisionPosHprScale
-            self.cPosZ.pack(side=LEFT, expand=0,fill=X, padx=1)
-            posInterior.pack(side=TOP, expand=0,fill=X, padx=3, pady=3)
-
-            group.pack(side=TOP,fill = X, expand = 0, pady=3)
-
-            scaleInterior = Frame(cObjFrame)
-        
-            self.scaleS = self.createcomponent('radius', (), None,
-                                               Floater.Floater, (scaleInterior,),
-                                               text = 'Radius',
-                                               relief = FLAT,
-                                               min = 0.0001, value = radius,
-                                               resetValue = 1.0,
-                                               label_foreground = 'Blue')
-            self.scaleS['commandData'] = ['sphere-radius']
-            self.scaleS['command'] = self.setCollisionPosHprScale
-            self.scaleS.pack(side=LEFT,expand=0,fill=X)
-
-            scaleInterior.pack(side=TOP,expand=0,fill=X, padx=3, pady=3)
-            pass
-        
-        elif cType == 'CollisionPolygon':
-            frame = Frame(cObjFrame)
-            label = Label(frame, text= "Sorry!",font=('MSSansSerif', 10),
-                          borderwidth=5)
-            label.pack(side=LEFT)
-            frame.pack(side=TOP, fill=X, expand=True)
-            frame = Frame(cObjFrame)
-            label = Label(frame, text= "There is no way to change",font=('MSSansSerif', 10),
-                          borderwidth=5)
-            label.pack(side=LEFT)
-            frame.pack(side=TOP, fill=X, expand=True)
-            frame = Frame(cObjFrame)
-            label = Label(frame, text= "the basic properties of Collision Polygon!",font=('MSSansSerif', 10),
-                          borderwidth=5)
-            label.pack(side=LEFT)
-            frame.pack(side=TOP, fill=X, expand=True)
-            frame = Frame(cObjFrame)
-            label = Label(frame, text= "If you really need to change, recreate one...",font=('MSSansSerif', 10),
-                          borderwidth=5)
-            label.pack(side=LEFT)
-            frame.pack(side=TOP, fill=X, expand=True)        
-            pass
-        
-        elif cType == 'CollisionSegment':
-            pointA = self.collisionObj.getPointA()
-            pointB = self.collisionObj.getPointB()
-            group = Pmw.Group(cObjFrame,tag_text='Point A',
-                              tag_font=('MSSansSerif', 10))
-            posInterior = Frame(group.interior())
-            self.cPosX = self.createcomponent('pointA-X', (), None,
-                                             Floater.Floater, (posInterior,),
-                                             text = 'X', relief = FLAT,
-                                             value = pointA.getX(),
-                                             label_foreground = 'Red',
-                                             entry_width = 9)
-            self.cPosX['commandData'] = ['segment-A']
-            self.cPosX['command'] = self.setCollisionPosHprScale
-            self.cPosX.pack(side=LEFT,expand=0,fill=X, padx=1)
-        
-            self.cPosY = self.createcomponent('pointA-Y', (), None,
-                                             Floater.Floater, (posInterior,),
-                                             text = 'Y', relief = FLAT,
-                                             value = pointA.getY(),
-                                             label_foreground = '#00A000',
-                                             entry_width = 9)
-            self.cPosY['commandData'] = ['segment-A']
-            self.cPosY['command'] = self.setCollisionPosHprScale
-            self.cPosY.pack(side=LEFT, expand=0,fill=X, padx=1)
-        
-            self.cPosZ = self.createcomponent('pointA-Z', (), None,
-                                             Floater.Floater, (posInterior,),
-                                             text = 'Z', relief = FLAT,
-                                             value = pointA.getZ(),
-                                             label_foreground = 'Blue',
-                                             entry_width = 9)
-            self.cPosZ['commandData'] = ['segment-A']
-            self.cPosZ['command'] = self.setCollisionPosHprScale
-            self.cPosZ.pack(side=LEFT, expand=0,fill=X, padx=1)
-            posInterior.pack(side=TOP, expand=0,fill=X, padx=3, pady=3)
-            group.pack(side=TOP,fill = X, expand = 0, pady=3)
-            group = Pmw.Group(cObjFrame,tag_text='Point B',
-                              tag_font=('MSSansSerif', 10))
-            posInterior = Frame(group.interior())
-            self.cPosXB = self.createcomponent('pointB-X', (), None,
-                                             Floater.Floater, (posInterior,),
-                                             text = 'X', relief = FLAT,
-                                             value = pointB.getX(),
-                                             label_foreground = 'Red',
-                                             entry_width = 9)
-            self.cPosXB['commandData'] = ['segment-B']
-            self.cPosXB['command'] = self.setCollisionPosHprScale
-            self.cPosXB.pack(side=LEFT,expand=0,fill=X, padx=1)
-        
-            self.cPosYB = self.createcomponent('pointB-Y', (), None,
-                                             Floater.Floater, (posInterior,),
-                                             text = 'Y', relief = FLAT,
-                                             value = pointB.getY(),
-                                             label_foreground = '#00A000',
-                                             entry_width = 9)
-            self.cPosYB['commandData'] = ['segment-B']
-            self.cPosYB['command'] = self.setCollisionPosHprScale
-            self.cPosYB.pack(side=LEFT, expand=0,fill=X, padx=1)
-        
-            self.cPosZB = self.createcomponent('pointB-Z', (), None,
-                                             Floater.Floater, (posInterior,),
-                                             text = 'Z', relief = FLAT,
-                                             value = pointB.getZ(),
-                                             label_foreground = 'Blue',
-                                             entry_width = 9)
-            self.cPosZB['commandData'] = ['segment-B']
-            self.cPosZB['command'] = self.setCollisionPosHprScale
-            self.cPosZB.pack(side=LEFT, expand=0,fill=X, padx=1)
-            posInterior.pack(side=TOP, expand=0,fill=X, padx=3, pady=3)
-            group.pack(side=TOP,fill = X, expand = 0, pady=3)
-            pass
-        elif cType == 'CollisionRay':
-            origin = self.collisionObj.getOrigin()
-            direction = self.collisionObj.getDirection()
-            group = Pmw.Group(cObjFrame,tag_text='Origin Point',
-                              tag_font=('MSSansSerif', 10))
-            posInterior = Frame(group.interior())
-            self.cPosX = self.createcomponent('origin-X', (), None,
-                                             Floater.Floater, (posInterior,),
-                                             text = 'X', relief = FLAT,
-                                             value = origin.getX(),
-                                             label_foreground = 'Red',
-                                             entry_width = 9)
-            self.cPosX['commandData'] = ['ray-A']
-            self.cPosX['command'] = self.setCollisionPosHprScale
-            self.cPosX.pack(side=LEFT,expand=0,fill=X, padx=1)
-        
-            self.cPosY = self.createcomponent('origin-Y', (), None,
-                                             Floater.Floater, (posInterior,),
-                                             text = 'Y', relief = FLAT,
-                                             value = origin.getY(),
-                                             label_foreground = '#00A000',
-                                             entry_width = 9)
-            self.cPosY['commandData'] = ['ray-A']
-            self.cPosY['command'] = self.setCollisionPosHprScale
-            self.cPosY.pack(side=LEFT, expand=0,fill=X, padx=1)
-        
-            self.cPosZ = self.createcomponent('origin-Z', (), None,
-                                             Floater.Floater, (posInterior,),
-                                             text = 'Z', relief = FLAT,
-                                             value = origin.getZ(),
-                                             label_foreground = 'Blue',
-                                             entry_width = 9)
-            self.cPosZ['commandData'] = ['ray-A']
-            self.cPosZ['command'] = self.setCollisionPosHprScale
-            self.cPosZ.pack(side=LEFT, expand=0,fill=X, padx=1)
-            posInterior.pack(side=TOP, expand=0,fill=X, padx=3, pady=3)
-            group.pack(side=TOP,fill = X, expand = 0, pady=3)
-            group = Pmw.Group(cObjFrame,tag_text='Direction',
-                              tag_font=('MSSansSerif', 10))
-            posInterior = Frame(group.interior())
-            self.cPosXB = self.createcomponent('direction-X', (), None,
-                                             Floater.Floater, (posInterior,),
-                                             text = 'X', relief = FLAT,
-                                             value = direction.getX(),
-                                             label_foreground = 'Red',
-                                             entry_width = 9)
-            self.cPosXB['commandData'] = ['ray-B']
-            self.cPosXB['command'] = self.setCollisionPosHprScale
-            self.cPosXB.pack(side=LEFT,expand=0,fill=X, padx=1)
-        
-            self.cPosYB = self.createcomponent('direction-Y', (), None,
-                                             Floater.Floater, (posInterior,),
-                                             text = 'Y', relief = FLAT,
-                                             value = direction.getY(),
-                                             label_foreground = '#00A000',
-                                             entry_width = 9)
-            self.cPosYB['commandData'] = ['ray-B']
-            self.cPosYB['command'] = self.setCollisionPosHprScale
-            self.cPosYB.pack(side=LEFT, expand=0,fill=X, padx=1)
-        
-            self.cPosZB = self.createcomponent('direction-Z', (), None,
-                                             Floater.Floater, (posInterior,),
-                                             text = 'Z', relief = FLAT,
-                                             value = direction.getZ(),
-                                             label_foreground = 'Blue',
-                                             entry_width = 9)
-            self.cPosZB['commandData'] = ['ray-B']
-            self.cPosZB['command'] = self.setCollisionPosHprScale
-            self.cPosZB.pack(side=LEFT, expand=0,fill=X, padx=1)
-            posInterior.pack(side=TOP, expand=0,fill=X, padx=3, pady=3)
-            group.pack(side=TOP,fill = X, expand = 0, pady=3)
-            pass
-            
-        collisionGroup.pack(side=TOP,fill = X, expand = 0, pady=3)
-
-        return
-
-    def setCollisionPosHprScale(self, data, dataType):
-        #################################################################
-        # setCollisionPosHprScale(self, data, dataType)
-        # Well, the reason that we didn't use the same one with other nodePath
-        # is that each tyoe of collsion objects has its unique properties and way to set value.
-        # So, they have to be separated from other nodePath
-        #################################################################
-        if dataType == 'sphere-o':
-            origin = Point3(float(self.cPosX._entry.get()),
-                            float(self.cPosY._entry.get()),
-                            float(self.cPosZ._entry.get()))
-            self.collisionObj.setCenter(origin)
-        elif dataType == 'sphere-radius':
-            self.collisionObj.setRadius(data)
-        elif dataType == 'segment-A':
-            pointA = Point3(float(self.cPosX._entry.get()),
-                            float(self.cPosY._entry.get()),
-                            float(self.cPosZ._entry.get()))
-            self.collisionObj.setPointA(pointA)
-        elif dataType == 'segment-B':
-            pointB = Point3(float(self.cPosXB._entry.get()),
-                            float(self.cPosYB._entry.get()),
-                            float(self.cPosZB._entry.get()))
-            self.collisionObj.setPointB(pointB)
-        elif dataType == 'ray-A':
-            pointA = Point3(float(self.cPosX._entry.get()),
-                            float(self.cPosY._entry.get()),
-                            float(self.cPosZ._entry.get()))
-            self.collisionObj.setOrigin(pointA)
-        elif dataType == 'ray-B':
-            pointB = Vec3(float(self.cPosXB._entry.get()),
-                          float(self.cPosYB._entry.get()),
-                          float(self.cPosZB._entry.get()))
-            self.collisionObj.setDirection(pointB)
-        return
-
-    #################################################################
-    #################################################################
-    # Functions below are all call back function
-    # They will be called when user has manipulated its node on the screen
-    # The message itself is sent by a task called monitorSelectedNode in the sceneEditor.
-    #################################################################
-    #################################################################
-    def trackDataFromSceneCamera(self, pos=Point3(0,0,0), hpr=Vec3(0,0,0), scale=Point3(0,0,0)):
-        self.posX.set(pos.getX())
-        self.posY.set(pos.getY())
-        self.posZ.set(pos.getZ())
-        self.hprH.set(hpr.getX())
-        self.hprP.set(hpr.getY())
-        self.hprR.set(hpr.getZ())
-        return
-
-    def trackDataFromSceneModel(self, pos=Point3(0,0,0), hpr=Vec3(0,0,0), scale=Point3(0,0,0)):
-        self.posX.set(pos.getX())
-        self.posY.set(pos.getY())
-        self.posZ.set(pos.getZ())
-        self.hprH.set(hpr.getX())
-        self.hprP.set(hpr.getY())
-        self.hprR.set(hpr.getZ())
-        self.scale.set(scale.getX())
-        return
-
-    def trackDataFromSceneActor(self, pos=Point3(0,0,0), hpr=Vec3(0,0,0), scale=Point3(0,0,0)):
-        self.posX.set(pos.getX())
-        self.posY.set(pos.getY())
-        self.posZ.set(pos.getZ())
-        self.hprH.set(hpr.getX())
-        self.hprP.set(hpr.getY())
-        self.hprR.set(hpr.getZ())
-        self.scale.set(scale.getX())
-        return
-    
-    def trackDataFromSceneLight(self, pos=Point3(0,0,0), hpr=Vec3(0,0,0), scale=Point3(0,0,0)):
-        if self.lightNode.type == 'directional':
-            self.dPosition.set([pos.getX(),pos.getY(),pos.getZ()])
-            self.dOrientation.set([hpr.getX(),hpr.getY(),hpr.getZ()])
-            pass
-        
-        elif self.lightNode.type == 'point':
-            self.pPosition.set([pos.getX(),pos.getY(),pos.getZ()])
-            pass       
-        return
-    
-    def trackDataFromSceneDummy(self, pos=Point3(0,0,0), hpr=Vec3(0,0,0), scale=Point3(0,0,0)):
-        self.posX.set(pos.getX())
-        self.posY.set(pos.getY())
-        self.posZ.set(pos.getZ())
-        self.hprH.set(hpr.getX())
-        self.hprP.set(hpr.getY())
-        self.hprR.set(hpr.getZ())
-        self.scale.set(scale.getX())
-        return
-    
-    def trackDataFromSceneCollision(self, pos=Point3(0,0,0), hpr=Vec3(0,0,0), scale=Point3(0,0,0)):
-        self.posX.set(pos.getX())
-        self.posY.set(pos.getY())
-        self.posZ.set(pos.getZ())
-        self.hprH.set(hpr.getX())
-        self.hprP.set(hpr.getY())
-        self.hprR.set(hpr.getZ())
-        self.scale.set(scale.getX())
-        return
-        

+ 0 - 676
doc/SceneEditor/quad.py

@@ -1,676 +0,0 @@
-#########################################################################################################################################
-# This file implements a Quad View for the level editor
-# This feature is not yet enabled in the level editor because picking objects in quad view doesnt work
-# I have tried to send the picking function in seSelection.py the correct camera and mouse coordinates but something seems to be wron
-# There are two classes in this file..the QuadView and the viewPort...there are four instances of viewport, one for each view in QuadView
-#########################################################################################################################################
-
-
-from direct.showbase.ShowBaseGlobal import *
-from direct.interval.IntervalGlobal import *
-from direct.showbase.DirectObject import DirectObject
-from pandac.PandaModules import *
-import math
-#Manakel 2/12/2005: replace from pandac import by from pandac.PandaModules import
-from pandac.PandaModules import MouseWatcher 
-
-
-class ViewPort:
-#########################################################################################################################################
-# The ViewPort class has the camera and associated display region set up for actually rendering the four sub-views
-# The constructor needs the bounds, window layer, camera, color, projection type, name and scene for the view
-#########################################################################################################################################           
-    
-    def __init__(self,X1,X2,Y1,Y2,layer,cam,background=Vec4(0.3,0.3,0.3,1),projection="perspective",type="top",scene=render):
-        self.VPType=type
-        self.VP_X1=X1
-        self.VP_Y1=Y1
-        self.VP_X2=X2
-        self.VP_Y2=Y2
-        self.VP_width=self.VP_X2 - self.VP_X1
-        self.VP_height=self.VP_Y2 - self.VP_Y1
-        
-        self.the_viewport=layer.makeDisplayRegion(self.VP_X1, self.VP_X2,self.VP_Y1, self.VP_Y2)
-        self.the_viewport.setCamera(cam)
-        self.the_viewport.setClearDepthActive(1)
-        self.the_viewport.setClearColorActive(1)
-        self.the_viewport.setClearColor(background)
-        self.cam=cam   
-     
-
-        # Set up the cameras to look in the right place.
-        if(type=="top"):
-            self.cam.setP(-90)
-            self.cam.setZ(-40)
-        elif(type=="left"):
-            self.cam.setH(-90)
-            self.cam.setX(10)
-        elif(type=="front"):
-            self.cam.setY(-10) 
-        elif(type=="perspective"):
-            cam.setY(-100)
-            #cam.setX(10)
-            #cam.setZ(-10)
-            #cam.setH(45)
-            #cam.setP(-45)   
-            #print "aa"
-
-
-        if(projection=="ortho"):
-            self.lens=OrthographicLens()
-            self.lens.setAspectRatio((self.VP_X2-self.VP_X1)/(self.VP_Y2-self.VP_Y1))
-            self.lens.setFilmSize(self.VP_width*200,self.VP_height*200)
-            #lens.setFilmOffset((self.VP_X2 + self.VP_X1) * 0.5, (self.VP_Y2 + self.VP_Y1) * 0.5)
-            self.lens.setNearFar(-1000, 1000)
-            self.cam.node().setLens(self.lens)
-            self.cam.node().setScene(scene)
-        elif(projection=="perspective"):
-            self.lens=base.cam.node().getLens()
-            self.lens.setAspectRatio((self.VP_X2-self.VP_X1)/(self.VP_Y2-self.VP_Y1))
-            self.cam.node().setLens(self.lens)
-            self.cam.node().setScene(scene)
-
-        self.the_viewport.setCamera(self.cam)
-
-    def resizeX(self,width_increment):
-        if(self.VPType=="top" or self.VPType=="left"):
-            self.the_viewport.setDimensions(self.VP_X1,self.VP_X2+width_increment,self.VP_Y1,self.VP_Y2)
-        elif(self.VPType=="perspective" or self.VPType=="front"):
-            self.the_viewport.setDimensions(self.VP_X1+width_increment,self.VP_X2,self.VP_Y1,self.VP_Y2)
-
-    def resizeY(self,height_increment,direction):
-        if(self.VPType=="left" or self.type=="perspective"):
-            self.the_viewport.setDimensions(self.VP_X1,self.VP_X2,self.VP_Y1,self.VP_Y2+height_increment)
-        else:
-            self.the_viewport.setDimensions(self.VP_X1,self.VP_X2,self.VP_Y1+height_increment,self.VP_Y2)
-
-    def AdjustAspect(self,x,y):
-        if (y==0):
-            y=1
-        self.lens.setAspectRatio(x/y)
-        self.cam.node().setLens(self.lens)
-   
-    def resize(self,x,y):
-        
-        if(self.VPType=="left"):
-            self.the_viewport.setDimensions(0,x,0,y)
-            w=abs(x-self.VP_X1)
-            h=abs(y-self.VP_Y1)
-            if(h==0):
-                h=1
-            self.lens.setAspectRatio(w/h)
-            self.cam.node().setLens(self.lens)
-        if(self.VPType=="top"):
-            self.the_viewport.setDimensions(0,x,y,1)
-            w=abs(x-self.VP_X1)
-            h=abs(self.VP_Y2-y)
-            if(h==0):
-                h=1
-            self.lens.setAspectRatio(w/h)
-            self.cam.node().setLens(self.lens)
-        if(self.VPType=="front"):
-            self.the_viewport.setDimensions(x,1,y,1)
-            w=abs(self.VP_X2-x)
-            h=abs(self.VP_Y2-y)
-            if(h==0):
-                h=1
-            self.lens.setAspectRatio(w/h)
-            self.cam.node().setLens(self.lens)
-        if(self.VPType=="perspective"):
-            self.the_viewport.setDimensions(x,1,0,y)
-            w=abs(self.VP_X2-x)
-            h=abs(y-self.VP_Y1)
-            if(h==0):
-                h=1
-            self.lens.setAspectRatio(w/h)
-            self.cam.node().setLens(self.lens)
-
-    def setScene(self,scene):
-        self.cam.node().setScene(scene)
-    
-    def setDR(self,mouseWatcher):
-        #mouseWatcher.setDisplayRegion(self.the_viewport)
-        pass
-
-    def setCam(self):
-        #base.cam=self.cam
-        #base.cam.node().setLens(self.cam.node().getLens())
-        base.camNode=self.cam.node()
-        #base.camNode.setLens(self.cam.node().getLens())
-        #base.camLens=self.cam.node().getLens()
-
-    def getCam(self):
-        return self.cam
-        
-
-class QuadView(DirectObject):
-#########################################################################################################################################
-# This class sets up four cameras for the scene (ideally we want four instances of render too)
-# and then instatiates a ViewPort class for each of them
-#
-#########################################################################################################################################
-
-    def __init__(self):
-
-        self.PTracker=1
-        self.ControlPressed=0
-        self.AltPressed=0
-        self.PanConstantX=50
-        self.PanConstantY=50
-        self.ZoomConstant=1     
-        self.FrontWidth=100
-        self.FrontHeight=100
-        self.TopWidth=100
-        self.TopHeight=100
-        self.LeftWidth=100
-        self.LeftHeight=100
-
-        self.MouseButton=0
-        self.CurrentQuad=4
-        self.HorizontalAxis=0.0
-        self.VerticalAxis=0.0
-        #base.disableMouse()
-        self.MouseDragging=0
-        self.currX= 0
-        self.oldX=self.currX
-        self.currY= 0
-        self.oldY=self.currY
-
-        self.FrontTexture=1
-        self.LeftTexture=1
-        self.PerspectiveTexture=1
-        self.TopTexture=1
-
-        self.FrontWire=0
-        self.LeftWire=0
-        self.PerspectiveWire=0
-        self.TopWire=0
-
-        # Keep track of the currently selected window... values are 1-4 for four quadrants of a standard 
-        # Cartesian coordinate system
-        
-        # These are the orthographic cameras
-        # They will be restricted to panning and zooming i.e. no rotation
-        # Top could be flipped to back, left to right and front to back
-        self.topCam= render.attachNewNode(Camera('topCam'))
-        self.frontCam = render.attachNewNode(Camera('frontCam'))
-        self.leftCam= render.attachNewNode(Camera('leftCam'))
-
-        # This camera will have a trackball control since its perspective
-        self.perspectiveCam = render.attachNewNode(Camera('perspectiveCam'))
-        
-        #self.toplens=OrthographicLens()
-        #self.leftLens=OrthographicLens()
-        #self.frontLens=OrthographicLens()
-        #self.perspectiveLens=base.cam.node().getLens()
-
-        # For now all lenses are same as that of base.cam
-        #self.topCamLens=OrthographicLens()
-        #self.frontCamLens= base.cam.node().getLens()
-        #self.leftCamLens= base.cam.node().getLens()
-        #self.perspectiveCamLens= base.cam.node().getLens()
-
-        # Manipulate lenses here if need be     
-        #self.topCamLens.setFilmSize(250)
-
-        # Set the Lenses
-        #self.topCam.node().setLens(self.topCamLens)
-        #self.frontCam.node().setLens(self.frontCamLens)
-        #self.leftCam.node().setLens(self.leftCamLens)
-        #self.perspectiveCam.node().setLens(self.perspectiveCamLens)
-
-        #self.badwiz = loader.loadModel('badwizard1')
-        #self.badwiz.reparentTo(render)
-
-        # Create four separate display regions for the quad view.
-        # These will overlap the main display region
-        # To stack these overlapping DisplayRegions, we need a new layer.  If
-        # they didn't overlap, we could put them in the same layer.
-
-        self.newLayer = base.win.getChannel(0).makeLayer()
-
-        self.PerspectiveScene=NodePath('PerspectiveScene')
-        self.FrontScene=NodePath('FrontScene')
-        self.TopScene=NodePath('TopScene')
-        self.LeftScene=NodePath('LeftScene')
-        self.SceneParent=NodePath('SceneParent')
-
-        #self.PerspectiveScene=render.copyTo(self.SceneParent)
-        #self.FrontScene=render.copyTo(self.SceneParent)
-        #self.TopScene=render.copyTo(self.SceneParent)
-        #self.LeftScene=render.copyTo(self.SceneParent)
-                
-        self.PerspectiveScene=render
-        self.FrontScene=render
-        self.TopScene=render
-        self.LeftScene=render
-        
-        #self.PerspectiveScene.reparentTo(self.SceneParent)
-        #self.FrontScene.reparentTo(self.SceneParent)
-        #self.TopScene.reparentTo(self.SceneParent)
-        #self.LeftScene.reparentTo(self.SceneParent)
-        
-        self.Perspective=ViewPort(0.5,1.0,0.0,0.5,self.newLayer,self.perspectiveCam,Vec4(0.75,0.75,0.75,1),"perspective","perspective",self.PerspectiveScene)
-        self.Top=ViewPort(0.0,0.5,0.5,1.0,self.newLayer,self.topCam,Vec4(0.80,0.80,0.80,1),"ortho","top",self.TopScene)
-        self.Left=ViewPort(0.0,0.5,0.0,0.5,self.newLayer,self.leftCam,Vec4(0.85,0.85,0.85,1),"ortho","left",self.LeftScene)
-        self.Front=ViewPort(0.5,1.0,0.5,1.0,self.newLayer,self.frontCam,Vec4(0.85,0.85,0.85,1),"ortho","front",self.FrontScene)
-        #self.Perspective=None
-        #self.Top=None
-        #self.Front=None
-        #self.Left=None
-
-        #self.raycaster = RayCaster( camera )
-        #self.lastPickPoint = None
-
-        #base.useTrackball()
-        
-        #self.dataRoot = NodePath('dataRoot')
-        # Cache the node so we do not ask for it every frame
-        #self.dataRootNode = self.dataRoot.node()
-        #self.dataUnused = NodePath('dataUnused')
-        #self.mak=None
-        #self.mak = self.dataRoot.attachNewNode(MouseAndKeyboard(base.win, 0, 'mak'))
-        #self.mak.node().setSource(base.win, 0)
-        self.mouseWatcherNode = MouseWatcher('mouseWatcher')
-        
-        self.mouseWatcher = base.mak.attachNewNode(self.mouseWatcherNode)
-        #self.Perspective.setDR(self.mouseWatcherNode)
-
-        self.buttonThrower = self.mouseWatcher.attachNewNode(ButtonThrower('buttons'))
-
-
-        #ddr=DisplayRegionContext(self.Perspective.getCam())
-        #base.setMouseOnNode(self.smiley.node()) # Let Mouse Control Perspective View for now
-        #base.enableSoftwareMousePointer()
-        
-        # Message Handlers
-        self.accept("a",self.setLeft)
-        self.accept("q",self.setTop)
-        self.accept("w",self.setFront)
-        self.accept("s",self.setPerspective)
-        self.accept("mouse1",self.MouseTell,[1])
-        self.accept("mouse2",self.MouseTell,[2])
-        self.accept("mouse3",self.MouseTell,[3])
-        self.accept("mouse1-up",self.MouseTellUp,[4])
-        self.accept("mouse2-up",self.MouseTellUp,[5])
-        self.accept("mouse3-up",self.MouseTellUp,[6])
-        self.accept("mouse2-scroll",self.resizedr)
-        self.accept("r",self.resizedr)
-        self.accept("alt",self.AltHandler)
-        self.accept("alt-up",self.AltUpHandler)
-        self.accept("alt-mouse1",self.AltDown)
-        self.accept("alt-mouse1-up",self.AltUp)
-        self.accept("control-mouse1",self.CtlDown)
-        self.accept("control-mouse1-up",self.CtlUp)
-        
-    # Methods
-
-    #def setLastPickPoint( self ):
-    #    mouseX, mouseY = self.mouseWatcherNode.getMouseX(), self.mouseWatcherNode.getMouseY()
-    #    self.lastPickPoint = self.raycaster.pick( mouseX, mouseY )
-    #    print self.lastPickPoint
-
-    def AltDown(self):
-        self.AltPressed=1
-
-
-    def AltUp(self):
-        self.AltPressed=0
-
-
-    def CtlDown(self):
-        self.ControlPressed=1
-
-
-    def CtlUp(self):
-        self.ControlPressed=0
-
-
-    def ToggleWire(self):
-        if (self.CurrentQuad==1): # Front View
-            if(self.FrontWire): # Wireframe is On so turn it off
-                self.FrontScene.setRenderModeWireframe(100)
-                self.FrontScene.setTwoSided(1)
-                self.FrontScene.setTextureOff(100)
-                self.FrontWire=0
-            else:
-                self.FrontScene.clearRenderMode()
-                #self.FrontScene.setTwoSided(not self.backfaceCullingEnabled)
-                if(self.FrontTexture):
-                    self.FrontScene.clearTexture()
-                self.FrontWire=1
-        elif (self.CurrentQuad==2): # Front View
-            if(self.TopWire): # Wireframe is On so turn it off
-                self.TopScene.setRenderModeWireframe(100)
-                self.TopScene.setTwoSided(1)
-                self.TopScene.setTextureOff(100)
-                self.TopWire=0
-            else:
-                self.TopScene.clearRenderMode()
-                #self.TopScene.setTwoSided(not self.backfaceCullingEnabled)
-                if(self.TopTexture):
-                    self.TopScene.clearTexture()
-                self.TopWire=1
-        elif (self.CurrentQuad==3): # Front View
-            if(self.LeftWire): # Wireframe is On so turn it off
-                self.LeftScene.setRenderModeWireframe(100)
-                self.LeftScene.setTwoSided(1)
-                self.LeftScene.setTextureOff(100)
-                self.LeftWire=0
-            else:
-                self.LeftScene.clearRenderMode()
-                #self.LeftScene.setTwoSided(not self.backfaceCullingEnabled)
-                if(self.LeftTexture):
-                    self.LeftScene.clearTexture()
-                self.LeftWire=1
-        elif (self.CurrentQuad==4): # Front View
-            if(self.PerspectiveWire): # Wireframe is On so turn it off
-                self.PerspectiveScene.setRenderModeWireframe(100)
-                self.PerspectiveScene.setTwoSided(1)
-                self.PerspectiveScene.setTextureOff(100)
-                self.PerspectiveWire=0
-            else:
-                self.PerspectiveScene.clearRenderMode()
-                #self.PerspectiveScene.setTwoSided(not self.backfaceCullingEnabled)
-                if(self.PerspectiveTexture):
-                         self.PerspectiveScene.clearTexture()
-                self.PerspectiveWire=1
-
-
-    def ToggleTexture(self):
-        if (self.CurrentQuad==1): # Front View
-            if(self.FrontTexture): # Texture is on so turn it off
-                self.FrontScene.setTextureOff(100)
-                self.FrontTexture=0
-            else:
-                self.FrontScene.clearTexture()
-                self.FrontTexture=1
-        elif (self.CurrentQuad==2): # Top View
-            if(self.TopTexture): # Texture is on so turn it off
-                self.TopScene.setTextureOff(100)
-                self.TopTexture=0
-            else:
-                self.TopScene.clearTexture()
-                self.TopTexture=1
-        elif (self.CurrentQuad==3): # Left View
-            if(self.LeftTexture): # Texture is on so turn it off
-                self.LeftScene.setTextureOff(100)
-                self.LeftTexture=0
-            else:
-                self.LeftScene.clearTexture()
-                self.LeftTexture=1
-        elif (self.CurrentQuad==4): # Perspective View
-            if(self.PerspectiveTexture): # Texture is on so turn it off
-                self.PerspectiveScene.setTextureOff(100)
-                self.PerspectiveTexture=0
-            else:
-                self.PerspectiveScene.clearTexture()
-                self.PerspectiveTexture=1
-
-   
-
-    def reparenter(self):
-        #self.FrontScene.reparentTo(render)
-        #self.Front.setScene(render)
-        #self.Top.setScene(render)
-        #self.Left.setScene(render)
-        #self.Perspective.setScene(render)
-        pass
-
-    def unparenter(self):
-        #self.PerspectiveScene=render.copyTo(render)
-        #self.FrontScene=render.copyTo(render)
-        #self.TopScene=render.copyTo(render)
-        #self.LeftScene=render.copyTo(render)
-        #self.SceneParent.reparentTo(render)
-        #self.PerspectiveScene.reparentTo(self.SceneParent)
-        #self.FrontScene.reparentTo(self.SceneParent)
-        #self.TopScene.reparentTo(self.SceneParent)
-        #self.LeftScene.reparentTo(self.SceneParent)
-        pass
-
-    def AltHandler(self):
-        self.oldX=self.mouseWatcherNode.getMouseX()
-        if(self.oldX<-1 or self.oldX>1):
-            return
-        self.oldY=self.mouseWatcherNode.getMouseY()
-        if(self.oldY<-1 or self.oldY>1):
-            return
-        taskMgr.add(self.DragAction,'DragAction')
-            
-    def AltUpHandler(self):
-        taskMgr.remove('DragAction')    
-        
-    def gridtoggle(self):
-        #grid=DirectGrid()
-        #grid.enable()
-        pass
-
-    def resizedr(self,x,y):
-        #print "X: " + str(x) + " Y: " + str(y)
-        x=(x+1)/2.0
-        y=(y+1)/2.0
-        self.Perspective.resize(x,y)
-        self.Top.resize(x,y)
-        self.Front.resize(x,y)
-        self.Left.resize(x,y)
-
-    def setAppropriateViewPort(self,x,y):
-        #print "SET APPROPRIATE:" + str(x) + " " + str(y)
-        if(x<self.VerticalAxis):
-            if(y<self.HorizontalAxis):
-                self.setLeft()
-            else:
-                self.setTop()
-        else:
-            if(y<self.HorizontalAxis):
-                self.setPerspective()
-            else:
-                self.setFront()
-        
-    def MouseTell(self,buttonCode):
-        self.MouseButton=buttonCode
-        self.setAppropriateViewPort(self.mouseWatcherNode.getMouseX(),self.mouseWatcherNode.getMouseY())
-        
-        x=base.mouseWatcherNode.getMouseX()
-        y=base.mouseWatcherNode.getMouseY()
-
-        #Perspective and Front
-        if(self.CurrentQuad==4 or self.CurrentQuad==1):
-            x1=abs(x-self.VerticalAxis)
-            w1=abs(1-self.VerticalAxis)
-            x2=x1*2.0/w1
-            ansX=-1+x2
-
-
-        #Left and top
-        if(self.CurrentQuad==2 or self.CurrentQuad==3):
-            x1=abs(x-(-1.0))
-            w1=abs(self.VerticalAxis-(-1.0))
-            x2=x1*2.0/w1
-            ansX=-1.0+x2
-
-        #Left and Perspective
-        if(self.CurrentQuad==4 or self.CurrentQuad==3):
-            y1=abs(y-(-1.0))
-            h1=abs(self.HorizontalAxis-(-1.0))
-            y2=y1*2.0/h1
-            ansY=-1.0+y2
-
-
-        #Front and top
-        if(self.CurrentQuad==1 or self.CurrentQuad==2):
-            y1=abs(y-self.HorizontalAxis)
-            h1=abs(1.0-self.HorizontalAxis)
-            y2=y1*2.0/h1
-            ansY=-1.0+y2
-
-        self.xy=[ansX,ansY]
-        print "Sent X:%f Sent Y:%f"%(ansX,ansY)
-        #SEditor.iRay.pick(render,self.xy)
-        SEditor.manipulationControl.manipulationStop(self.xy)
-        #print "MouseX " + str(base.mouseWatcherNode.getMouseX()) + "MouseY " + str(base.mouseWatcherNode.getMouseY()) + "\n" 
-        #print "MouseX " + str(self.mouseWatcherNode.getMouseX()) + "MouseY " + str(self.mouseWatcherNode.getMouseY()) + "\n" 
-        
-
-        base.mouseWatcherNode=self.mouseWatcherNode
-        
-        self.oldX=self.mouseWatcherNode.getMouseX()
-        if(self.oldX<-1 or self.oldX>1):
-            return
-
-        self.oldY=self.mouseWatcherNode.getMouseY()
-        if(self.oldY<-1 or self.oldY>1):
-            return
-        self.Mouse_Dragging=1
-        taskMgr.add(self.DragAction,'DragAction')
-
-    def MouseTellUp(self,buttoncode):
-        #self.MouseButton=0
-        self.PanConstantX= 50
-        self.PanConstantY= 50
-        self.ZoomConstant=1
-        taskMgr.remove('DragAction')
-        self.Mouse_Draggin=0
-        #print "Mouse Up"
-        
-
-    def Max_Style_Mouse_View(self,buttoncode):
-        pass
-        
-    def ChangeBaseDR(self):
-        dr=base.win.getDisplayRegion(0)
-        if(self.CurrentQuad==1): #Front
-            dr.setDimensions(0.5,1,0.5,1)
-        elif(self.CurrentQuad==2): #Top
-            dr.setDimensions(0,0.5,0.5,1)
-        elif(self.CurrentQuad==3): #Left
-            dr.setDimensions(0,0.5,0,0.5)
-        elif(self.CurrentQuad==4): #Perspective
-            dr.setDimensions(0.5,1,0,0.5)
-
-    def setLeft(self):
-        print "LEFT"
-        self.CurrentQuad=3
-        self.ChangeBaseDR()
-        self.Left.setCam()
-        #self.Left.setDR(self.mouseWatcherNode)
-
-    def setTop(self):
-        print "TOP"
-        self.CurrentQuad=2
-        self.ChangeBaseDR()
-        self.Top.setCam()
-        #self.Top.setDR(self.mouseWatcherNode)
-
-    def setPerspective(self):
-        print "PERSPECTIVE"
-        self.CurrentQuad=4
-        self.ChangeBaseDR()
-        self.Perspective.setCam()
-        #self.Perspective.setDR(self.mouseWatcherNode)
-        
-    def setFront(self):
-        print "FRONT"
-        self.CurrentQuad=1
-        self.ChangeBaseDR()
-        self.Front.setCam()
-        #self.Front.setDR(self.mouseWatcherNode)
-
-    
-    def DragAction(self,task):
-        #if(self.MouseDragging==1):
-        self.currX= self.mouseWatcherNode.getMouseX()
-        if(self.currX<-1 or self.currX>1):
-            return
-        self.currY= self.mouseWatcherNode.getMouseY()
-        if(self.currY<-1 or self.currY>1):
-            return
-
-
-        self.diffX=self.currX-self.oldX
-        self.diffY=self.currY-self.oldY
-
-        if(self.ControlPressed): # Change Size of the ViewPorts
-        #if(base.getControl()):
-             self.VerticalAxis=self.currX
-             self.HorizontalAxis=self.currY
-             if(self.HorizontalAxis<-1 or self.HorizontalAxis>1 or self.VerticalAxis<-1 or self.VerticalAxis>1):
-                 return
-             self.resizedr(self.VerticalAxis,self.HorizontalAxis)
-        
-        #if(self.AltPressed): # View Camera Transforms -> Maya style
-        elif(1):
-            #print "ALTPRESSED"
-            if(self.PanConstantX<4096):
-                self.PanConstantX= self.PanConstantX * 2
-                self.PanConstantY= self.PanConstantY * 2
-            self.ZoomConstant= self.ZoomConstant + 50
-            if(self.MouseButton==1): # TrackBall rotation only for Perspective View
-                if(self.CurrentQuad==4):
-                    pass
-            elif(self.MouseButton==2): # Do Panning
-                if(self.CurrentQuad==1): # Y and Z values change meanings for different cameras
-                    self.MoveCamera(-self.diffX*self.PanConstantX,0,-self.diffY*self.PanConstantY,self.CurrentQuad)
-                elif(self.CurrentQuad==2):
-                    self.MoveCamera(-self.diffX*self.PanConstantX,-self.diffY*self.PanConstantY,0,self.CurrentQuad)
-                elif(self.CurrentQuad==3):
-                    self.MoveCamera(0,self.diffX*self.PanConstantX,-self.diffY*self.PanConstantY,self.CurrentQuad)
-                elif(self.CurrentQuad==4):
-                    pass
-            elif(self.MouseButton==3): # Do Zoom 
-                if(self.CurrentQuad==1): # Y and Z values change meanings for different cameras
-                    #lens = OrthographicLens()
-                    #lens.setFilmSize(l,self.VP_height*200)
-                    #lens.setFilmOffset((self.VP_X2 + self.VP_X1) * 0.5, (self.VP_Y2 + self.VP_Y1) * 0.5)
-                    #lens.setNearFar(-1000, 1000)
-                    self.FrontWidth= self.FrontWidth + self.diffX
-                    self.FrontHeight= self.FrontHeight + self.diffX
-                    self.FrontWidth= self.FrontWidth + self.diffY
-                    self.FrontHeight= self.FrontHeight + self.diffY
-
-                    if(self.FrontWidth<=0):
-                        Frontwidth=1
-                    if(self.FrontHeight<=0):
-                        FrontHeight=1
-                    self.frontCam.node().getLens().setFilmSize(self.FrontWidth,self.FrontHeight)
-                    self.resizedr(self.VerticalAxis,self.HorizontalAxis)        
-                elif(self.CurrentQuad==2):
-                    self.TopWidth= self.TopWidth + self.diffX
-                    self.TopHeight= self.TopHeight + self.diffX
-                    self.TopWidth= self.TopWidth + self.diffY
-                    self.TopHeight= self.TopHeight + self.diffY
-                    self.topCam.node().getLens().setFilmSize(self.TopWidth,self.TopHeight)
-                    self.resizedr(self.VerticalAxis,self.HorizontalAxis)        
-                elif(self.CurrentQuad==3):
-                    self.LeftWidth= self.LeftWidth + self.diffX
-                    self.LeftHeight= self.LeftHeight + self.diffX
-                    self.LeftWidth= self.LeftWidth + self.diffY
-                    self.LeftHeight= self.LeftHeight + self.diffY
-                    self.leftCam.node().getLens().setFilmSize(self.LeftWidth,self.LeftHeight)
-                    self.resizedr(self.VerticalAxis,self.HorizontalAxis)        
-                elif(self.CurrentQuad==4):
-                    pass
-        else:
-             pass
-                
-        self.oldX=self.currX
-        self.oldY=self.currY
-        return Task.cont
-
-
-
-    def MoveCamera(self,X_amt,Y_amt,Z_amt,quad):
-        if(quad==1):
-            self.frontCam.setPos(self.frontCam.getX()+X_amt,self.frontCam.getY()+Y_amt,self.frontCam.getZ()+Z_amt)
-        elif(quad==2):
-            self.topCam.setPos(self.topCam.getX()+X_amt,self.topCam.getY()+Y_amt,self.topCam.getZ()+Z_amt)
-        elif(quad==3):
-            self.leftCam.setPos(self.leftCam.getX()+X_amt,self.leftCam.getY()+Y_amt,self.leftCam.getZ()+Z_amt)
-        elif(quad==4):
-            self.perspectiveCam.setPos(self.perspectiveCam.getX()+X_amt,self.perspectiveCam.getY()+Y_amt,self.perspectiveCam.getZ()+Z_amt)
-        
-    
-
-#View=QuadView()
-#run()

+ 0 - 1709
doc/SceneEditor/sceneEditor.py

@@ -1,1709 +0,0 @@
-
-import sys
-try: import _tkinter
-except: sys.exit("Please install python module 'Tkinter'")
-
-import direct
-from direct.directbase.DirectStart import*
-from direct.showbase.TkGlobal import *
-from direct.showbase.TkGlobal import spawnTkLoop, Toplevel
-from tkFileDialog import *
-from direct.directtools.DirectGlobals import *
-from direct.tkwidgets.AppShell import*
-
-from SideWindow import*
-from duplicateWindow import*
-from lightingPanel import *
-from seMopathRecorder import *
-from seSession import *
-from quad import *
-from sePlacer import *
-from seFileSaver import *
-from propertyWindow import *
-import seParticlePanel
-from collisionWindow import *
-from direct.gui.DirectGui import *
-from MetadataPanel import *
-from seBlendAnimPanel import *
-from controllerWindow import *
-from AlignTool import *
-
-
-
-import os
-import string
-from direct.tkwidgets import Dial
-from direct.tkwidgets import Floater
-from direct.tkwidgets import Slider
-from direct.actor import Actor
-import seAnimPanel
-from direct.task import Task
-import math
-
-
-#################################################################
-# All scene and windows object will be stored in here.
-# So, any event which will or need to change contents
-# should be wirtten in here or imported into here!
-#################################################################
-from dataHolder import*  ## Use this thing to Save/load data.
-AllScene = dataHolder()
-
-
-
-class myLevelEditor(AppShell):
-    ## overridden the basic app info ##
-    appname = 'Scene Editor - New Scene'
-    appversion      = '1.0'
-    copyright       = ('Copyright 2004 E.T.C. Carnegie Mellon U.' +
-                       ' All Rights Reserved')
-    contactname     = 'Jesse Schell, Shalin Shodhan & YiHong Lin'
-    contactphone    = '(412) 268-5791'
-    contactemail    = '[email protected]'
-    frameWidth      = 1024
-    frameHeight     = 80
-    frameIniPosX    = 0
-    frameIniPosY    = 0
-    usecommandarea = 0
-    usestatusarea  = 0
-    padx            = 5
-    pady            = 5
-
-    sideWindowCount = 0
-
-    ## Basic World default setting (For side window)
-    worldColor = [0,0,0,0]
-    lightEnable = 1
-    ParticleEnable = 1
-    basedriveEnable = 0
-    collision = 1
-    backface = 0
-    texture = 1
-    wireframe = 0
-    grid = 0
-    widgetVis = 0
-    enableAutoCamera = 1
-
-    enableControl = False
-    controlType = 'Keyboard'
-    keyboardMapDict = {}
-    keyboardSpeedDict = {}
-    
-    Scene=None
-    isSelect = False
-    nodeSelected = None
-    undoDic = {}
-    redoDic = {}
-    animPanel = {}
-    animBlendPanel = {}
-    propertyWindow = {}
-    CurrentFileName=None #Holds the current scene file name
-    CurrentDirName=None # Holds the current file name without extension which is the path where file's data gets saved
-    Dirty=0 # Keeps track of whether there are any modifications that should be saved
-  
-    
-    
-    def __init__(self, parent = None, **kw):
-
-        base.setBackgroundColor(0,0,0)
-        self.parent = parent
-        ## Check TkTool is activated! ##
-        self.wantTK = config.GetBool('want-tk', 0)
-        if self.wantTK:
-            pass
-        else:
-            taskMgr.remove('tkloop')
-            spawnTkLoop()
-        ## Set up window frame
-        INITOPT = Pmw.INITOPT
-        optiondefs = (
-            ('title',       self.appname,       None),
-            )
-        self.defineoptions(kw, optiondefs)
-
-        AppShell.__init__(self, parent)
-        self.parent.geometry('%dx%d+%d+%d' % (self.frameWidth, self.frameHeight,self.frameIniPosX,self.frameIniPosY))
-
-
-        ###### Put th directLabel on the screen to show the selected object Data
-        self.posLabel = DirectLabel(
-            relief = None,
-            pos = (-1.3, 0, 0.90),
-            text = "Position   : X: 00.00 Y: 00.00 Z: 00.00",
-            color = Vec4(1, 1, 1, 1),
-            text_scale = 0.05,
-            text_align = TextNode.ALeft
-            )
-        self.hprLabel = DirectLabel(
-            relief = None,
-            pos = (-1.3 , 0, 0.80),
-            text = "Orientation: H: 00.00 P: 00.00 R: 00.00",
-            color = Vec4(1, 1, 1, 1),
-            text_scale = 0.05,
-            text_align = TextNode.ALeft
-            )
-        self.scaleLabel = DirectLabel(
-            relief = None,
-            pos = (-1.3, 0, 0.70),
-            text = "Scale      : X: 00.00 Y: 00.00 Z: 00.00",
-            color = Vec4(1, 1, 1, 1),
-            text_scale = 0.05,
-            text_align = TextNode.ALeft
-            )
-        
-
-        self.initialiseoptions(myLevelEditor)
-
-        self.parent.resizable(False,False) ## Disable the ability to resize for this Window.
-        
-        ######### Set the event handler ##########
-        self.dataFlowEvents = [
-            ## Event from Side Window
-            ['SW_lightToggle',self.lightToggle],
-            ['SW_collisionToggle',AllScene.toggleCollisionVisable],
-            ['SW_particleToggle',self.toggleParticleVisable],
-            ['SW_close',self.sideWindowClose],
-            ## From Duplication Window
-            ['DW_duplicating',self.duplicationObj],
-            ## From Animation Panel
-            ['AW_AnimationLoad',self.animationLoader],
-            ['AW_removeAnim',self.animationRemove],
-            ['AW_close',self.animPanelClose],
-            ## From Blending Animation Window
-            ['BAW_saveBlendAnim',self.animBlendPanelSave],
-            ['BAW_removeBlendAnim',self.animBlendPanelRemove],
-            ['BAW_renameBlendAnim',self.animBlendPanelRename],
-            ['BAW_close',self.animBlendPanelClose],
-            ## From Lighting Panel
-            ['LP_selectLight', self.lightSelect],
-            ['LP_addLight',self.addLight],
-            ['LP_rename',self.lightRename],
-            ['LP_removeLight',self.removeLight],
-            ['LP_close',self.lightingPanelClose],
-            ## From MotionPath Panel
-            ['mPath_bindPathToNode',AllScene.bindCurveToNode],
-            ['mPath_requestCurveList', self.requestCurveList],
-            ['mPath_close', self.mopathClosed],
-            ## From Property Window
-            ['PW_removeCurveFromNode', AllScene.removeCurveFromNode],
-            ['PW_removeAnimFromNode', AllScene.removeAnimation],
-            ['PW_toggleLight', AllScene.toggleLightNode],
-            ['PW_close', self.closePropertyWindow],
-            ## From collisionWindow
-            ['CW_addCollisionObj', AllScene.addCollisionObject],
-            ## From AlignWindow
-            ['ALW_close', self.closeAlignPanel],
-            ['ALW_align', self.alignObject],
-            ## From controllerWindow
-            ['ControlW_close', self.closeInputPanel],
-            ['ControlW_require', self.requestObjFromControlW],
-            ['ControlW_controlSetting', self.setControlSet],
-            ['ControlW_controlEnable', self.startControl],
-            ['ControlW_controlDisable', self.stopControl],
-            ['ControlW_saveSetting', AllScene.saveControlSetting],
-            ## From Placer
-            ['Placer_close', self.closePlacerPanel],
-            ## From Particle Panel
-            ['ParticlePanle_close', self.closeParticlePanel],
-            ## From SEditor object which is a altered DirectSession
-            ['SEditor-ToggleWidgetVis',self.toggleWidgetVis],
-            ['SEditor-ToggleBackface',self.toggleBackface],
-            ['SEditor-ToggleTexture',self.toggleTexture],
-            ['SEditor-ToggleWireframe',self.toggleWireframe],
-            ['ParticlePanel_Added_Effect',self.addParticleEffect],
-            ['f11',self.loadFromBam],
-            ['f12',self.saveAsBam],
-            ]
-        
-
-        #################################
-        ###  Collision detection
-        #################################
-        self.cTrav = CollisionTraverser()
-        base.cTrav = self.cTrav
-
-        for event in self.dataFlowEvents:
-            self.accept(event[0], event[1], extraArgs = event[2:])
-        
-        self.actionEvents = [
-            # Scene graph explorer functions
-            ['SGE_changeName', self.changeName],
-            ['SGE_Properties', self.openPropertyPanel],
-            ['SGE_Duplicate', self.duplicate],
-            ['SGE_Remove', self.remove],
-            ['SGE_Add Dummy', self.addDummyNode],
-            ['SGE_Add Collision Object', self.addCollisionObj],
-            ['SGE_Metadata', self.openMetadataPanel],
-            ['SGE_Set as Reparent Target', self.setAsReparentTarget],
-            ['SGE_Reparent to Target', self.reparentToNode],
-            ['SGE_Animation Panel', self.openAnimPanel],
-            ['SGE_Blend Animation Panel', self.openBlendAnimPanel],
-            ['SGE_MoPath Panel', self.openMoPathPanel],
-            ['SGE_Align Tool', self.openAlignPanel],
-            ['SGE_Flash', self.flash],
-            ['SGE_madeSelection', self.selectNode],
-            ['select',self.selectNode],
-            ['deselect', self.deSelectNode],
-            ['se_selectedNodePath',self.selectFromScene],
-            ['se_deselectedAll',self.deselectFromScene],
-            ]
-        ''' All messages starting with "SGE_" are generated in seSceneGraphExplorer'''
-        
-        for event in self.actionEvents:
-            self.accept(event[0], event[1], extraArgs = event[2:])
-
-        camera.toggleVis()
-        self.selectNode(base.camera) ## Initially, we select camera as the first node...
-
-    def appInit(self):
-        #################################################################
-        # appInit(self)
-        # Initialize the application.
-        # This function will be called when you call AppShell's constructor
-        #################################################################
-        
-        ### Create SceneEditor Ver. DirectSession
-        self.seSession = SeSession()
-        self.seSession.enable()
-        SEditor.camera.setPos(0,-50,10)
-
-        self.placer=None
-        self.MopathPanel = None
-        self.alignPanelDict = {}
-        #self.quadview=QuadView()
-        
-
-        self.lightingPanel = None
-        self.controllerPanel = None
-        self.particlePanel = None
-
-        ### Create Side Window
-        self.sideWindow = sideWindow(worldColor = self.worldColor,
-                                     lightEnable = self.lightEnable,
-                                     ParticleEnable = self.ParticleEnable,
-                                     basedriveEnable = self.basedriveEnable,
-                                     collision = self.collision,
-                                     backface = self.backface,
-                                     texture = self.texture,
-                                     wireframe = self.wireframe,
-                                     grid = self.grid,
-                                     widgetVis = self.widgetVis,
-                                     enableAutoCamera = self.enableAutoCamera)
-        self.sideWindowCount = 1
-        self.sideWindow.selectPage()
-        messenger.send('SGE_Update Explorer',[render]) ## Update the Scene Graph
-        
-        pass
-        
-    def getPhotoImage(self,name):
-        modpath = ConfigVariableSearchPath("model-path")
-        path = modpath.findFile(Filename(name))
-        return PhotoImage(file=path.toOsSpecific())
-
-    def createInterface(self):
-        # The interior of the toplevel panel
-        interior = self.interior()
-
-        #######################################################
-        ### Creating the Buttons in the window frame
-        #######################################################
-        buttonFrame = Frame(interior)
-        self.image=[]
-
-        self.image.append(self.getPhotoImage('models/icons/new.gif'))#0
-        self.image.append(self.getPhotoImage('models/icons/open.gif'))#1
-        self.image.append(self.getPhotoImage('models/icons/save.gif'))#2
-        self.image.append(self.getPhotoImage('models/icons/model.gif'))#3
-        self.image.append(self.getPhotoImage('models/icons/actor.gif'))#4
-        self.image.append(self.getPhotoImage('models/icons/placer.gif'))#5
-        self.image.append(self.getPhotoImage('models/icons/mopath.gif'))#6
-        self.image.append(self.getPhotoImage('models/icons/lights.gif'))#7
-        self.image.append(self.getPhotoImage('models/icons/particles.gif'))#8
-        self.image.append(self.getPhotoImage('models/icons/control.gif'))
-        self.image.append(self.getPhotoImage('models/icons/help.gif'))#9
-        self.image.append(self.getPhotoImage('models/icons/blank.gif'))
-        self.image.append(self.getPhotoImage('models/icons/blank.gif'))
-        self.image.append(self.getPhotoImage('models/icons/blank.gif'))
-        self.image.append(self.getPhotoImage('models/icons/blank.gif'))
-        self.image.append(self.getPhotoImage('models/icons/blank.gif'))
-        self.image.append(self.getPhotoImage('models/icons/blank.gif'))
-        self.image.append(self.getPhotoImage('models/icons/blank.gif'))
-        self.image.append(self.getPhotoImage('models/icons/blank.gif'))
-        self.image.append(self.getPhotoImage('models/icons/blank.gif'))
-        self.image.append(self.getPhotoImage('models/icons/blank.gif'))
-        self.image.append(self.getPhotoImage('models/icons/blank.gif'))
-        self.image.append(self.getPhotoImage('models/icons/blank.gif'))
-
-        i = 0
-        for element in self.image:
-            i += 1
-            button = Button(buttonFrame, image = element, command=lambda n=i : self.buttonPushed(n))
-            button.pack(fill=X, side = LEFT)
-            
-
-        buttonFrame.pack(fill=X, side=LEFT,expand=True)
-        
-        
-    def buttonPushed(self, buttonIndex):
-        #################################################################
-        # buttonPushed(self, buttonNum)
-        # This function will handle all button events from top level window
-        # Take the button index as a reference to sence which button has been pushed.
-        #################################################################
-        ####
-        ####  Change here to process the button event further.
-        ####
-        if buttonIndex==1: # New Scene
-            self.newScene()
-            return
-        elif buttonIndex==2: # Open Scene
-            self.openScene()
-            return
-        elif buttonIndex==3: # Save Scene
-            self.saveScene()
-            return
-        elif buttonIndex==4: # Load Model
-            self.loadModel()
-            return
-        elif buttonIndex==5: # Load Actor
-            self.loadActor()
-            return
-        elif buttonIndex==6: # Open Placer
-            self.openPlacerPanel()
-            return
-        elif buttonIndex==7: # Open Mopath Panel
-            self.openMoPathPanel()
-            return
-        elif buttonIndex==8: # Open Lighting Panel
-            self.openLightingPanel()
-            return
-        elif buttonIndex==9: # Open Particle Panel
-            self.openParticlePanel()
-            return
-        elif buttonIndex==10: 
-            self.openInputPanel()
-            return
-        elif buttonIndex==11: # Help
-            self.showAbout()
-            return
-        elif buttonIndex==12:
-            print "You haven't defined the function for this Button, Number %d."%buttonIndex
-            return
-        elif buttonIndex==13:
-            print "You haven't defined the function for this Button, Number %d."%buttonIndex
-            return
-        elif buttonIndex==14:
-            print "You haven't defined the function for this Button, Number %d."%buttonIndex
-            return
-        elif buttonIndex==15:
-            print "You haven't defined the function for this Button, Number %d."%buttonIndex
-            return
-        elif buttonIndex==16:
-            print "Your scene will be eliminated within five seconds, Save your world!!!, Number %d."%buttonIndex
-            return
-        elif buttonIndex==17:
-            print "You haven't defined the function for this Button, Number %d."%buttonIndex
-            return
-        elif buttonIndex==18:
-            print "You haven't defined the function for this Button, Number %d."%buttonIndex
-            return
-        elif buttonIndex==19:
-            print "You haven't defined the function for this Button, Number %d."%buttonIndex
-            return
-        elif buttonIndex==20:
-            print "You haven't defined the function for this Button, Number %d."%buttonIndex
-            return
-        
-        return
-
-    def createMenuBar(self):
-        # Creates default menus.  Can be overridden or simply augmented
-        # Using button Add below
-        self.menuBar.addmenuitem('Help', 'command',
-                                 'Get information on application', 
-                                 label='About...', command=self.showAbout)
-        ## Creat stuff inside the "File"
-        self.menuBar.addmenuitem('File', 'command', 'Creat New Scene',
-                                label='New Scene',
-                                command=self.newScene)
-
-        self.menuBar.addmenuitem('File', 'command', 'Open a Scene',
-                                label='Open Scene',
-                                command=self.openScene)
-
-        self.menuBar.addmenuitem('File', 'command', 'Save a Scene',
-                                label='Save Scene',
-                                command=self.saveScene)
-
-        self.menuBar.addmenuitem('File', 'command', 'Save Scene as...',
-                                label='Save as...',
-                                command=self.saveAsScene)
-
-        self.menuBar.addmenuitem('File', 'separator')
-
-        self.menuBar.addmenuitem('File', 'command', 'Load Model',
-                                label='Load Model',
-                                command=self.loadModel)
-
-        self.menuBar.addmenuitem('File', 'command', 'Load Actor',
-                                label='Load Actor',
-                                command=self.loadActor)
-        
-        self.menuBar.addmenuitem('File', 'separator')
-
-        self.menuBar.addmenuitem('File', 'command', 'Import a Scene',
-                                label='Import...',
-                                command=self.importScene)
-
-        self.menuBar.addmenuitem('File', 'separator')
-        
-        self.menuBar.addmenuitem('File', 'command', 'Quit this application',
-                                label='Exit',
-                                command=self.quit)
-
-        ## Creat "Edit" on the menu and its stuff
-        self.menuBar.addmenu('Edit', 'Editting tools')
-        self.menuBar.addmenuitem('Edit', 'command', 'Un-do',
-                                label='Undo...',
-                                command=self.unDo)
-        self.menuBar.addmenuitem('Edit', 'command', 'Re-do',
-                                label='Redo...',
-                                command=self.reDo)
-        self.menuBar.addmenuitem('Edit', 'separator')
-        self.menuBar.addmenuitem('Edit', 'command', 'Deselect nodepath',
-                                label='Deselect',
-                                command=self.deSelectNode)
-        self.menuBar.addmenuitem('Edit', 'separator')
-        self.menuBar.addmenuitem('Edit', 'command', 'Add a Dummy',
-                                label='Add Dummy',
-                                command=self.addDummy)
-        self.menuBar.addmenuitem('Edit', 'command', 'Duplicate nodepath',
-                                label='Duplicate',
-                                command=self.duplicateNode)
-        self.menuBar.addmenuitem('Edit', 'command', 'Remove the nodepath',
-                                label='Remove',
-                                command=self.removeNode)
-        self.menuBar.addmenuitem('Edit', 'command', 'Show the object properties',
-                                label='Object Properties',
-                                command=self.showObjProp)
-        self.menuBar.addmenuitem('Edit', 'separator')
-        self.menuBar.addmenuitem('Edit', 'command', 'Show the Camera setting',
-                                label='Camera Setting',
-                                command=self.showCameraSetting)
-        self.menuBar.addmenuitem('Edit', 'command', 'Render setting',
-                                label='Render Setting',
-                                command=self.showRenderSetting)
-
-        ## Creat "Panel" on the menu and its stuff
-        self.menuBar.addmenu('Panel', 'Panel tools')
-        self.menuBar.addmenuitem('Panel', 'command', 'Open Side Window',
-                                label='Side Window',
-                                command=self.openSideWindow)
-        self.menuBar.addmenuitem('Panel', 'command', 'Placer Panel',
-                                label='Placer Panel',
-                                command=self.openPlacerPanel)
-        self.menuBar.addmenuitem('Panel', 'command', 'Animation Panel',
-                                label='Animation Panel',
-                                command=self.openAnimationPanel)
-        self.menuBar.addmenuitem('Panel', 'command', 'Motion Path Panel',
-                                label='Mopath Panel',
-                                command=self.openMopathPanel)
-        self.menuBar.addmenuitem('Panel', 'command', 'Lighting Panel',
-                                label='Lighting Panel',
-                                command=self.openLightingPanel)
-        self.menuBar.addmenuitem('Panel', 'command', 'Particle Panel',
-                                label='Particle Panel',
-                                command=self.openParticlePanel)
-        self.menuBar.addmenuitem('Panel', 'separator')
-        self.menuBar.addmenuitem('Panel', 'command', 'Input control Panel',
-                                label='Input device panel',
-                                command=self.openInputPanel)
-
-        self.menuBar.pack(fill=X, side = LEFT)
-
-        ## get "Menu" items in order to control the entry status
-        self.menuFile = self.menuBar.component('File-menu')
-        self.menuEdit = self.menuBar.component('Edit-menu')
-        self.menuPanel = self.menuBar.component('Panel-menu')
-
-        ## Disable entries when user doesn't select anything
-        if not self.isSelect:
-            self.menuEdit.entryconfig('Deselect', state=DISABLED)
-            self.menuEdit.entryconfig('Add Dummy', state=DISABLED)
-            self.menuEdit.entryconfig('Duplicate', state=DISABLED)
-            self.menuEdit.entryconfig('Remove', state=DISABLED)
-            self.menuEdit.entryconfig('Object Properties', state=DISABLED)
-            self.menuPanel.entryconfig('Animation Panel', state=DISABLED)
-            self.menuPanel.entryconfig('Side Window', state=DISABLED)
-
-        
-    def onDestroy(self, event):
-        #################################################################
-        # If you have open any thing, please rewrite here!
-        #################################################################
-        if taskMgr.hasTaskNamed('seMonitorSelectedNode'):
-                taskMgr.remove('seMonitorSelectedNode')
-        pass
-
-    def closeAllSubWindows(self):
-        #################################################################
-        # closeAllSubWindows(self)
-        # except side window. this function will close all sub window if there is any.
-        #################################################################
-        if self.lightingPanel != None:
-            self.lightingPanel.quit()
-        if self.placer != None:
-            self.placer.quit()
-        if self.MopathPanel != None:
-            self.MopathPanel.quit()
-
-        if self.particlePanel != None:
-            self.particlePanel.quit()
-
-        if self.controllerPanel != None:
-            self.controllerPanel.quit()
-
-        list = self.animPanel.keys()
-        for index in list:
-            self.animPanel[index].quit()
-        list = self.animBlendPanel.keys()
-        for index in list:
-            self.animBlendPanel[index].quit()
-        list = self.propertyWindow.keys()
-        for index in list:
-            self.propertyWindow[index].quit()
-        list = self.alignPanelDict.keys()
-        for index in list:
-            self.alignPanelDict[index].quit()
-        self.animPanel.clear()
-        self.animBlendPanel.clear()
-        self.propertyWindow.clear()
-        self.alignPanelDict.clear()
-
-        return
-
-    ## Processing message events
-
-    def makeDirty(self):
-        self.Dirty=1
-
-    def removeLight(self, lightNode):
-        #################################################################
-        # removeLight(self, lightNode)
-        # This function will be called when user try to remove the light from lightingPanel
-        # (by sending out the message)
-        # So, in here we will call dataHolder(AllScene) to remove the light
-        # and return a list contains the newest data of lights in he scene.
-        # Then, this function will reset the lighting list in the lightingPanel
-        #################################################################
-        list = AllScene.removeObj(lightNode)
-        if self.lightingPanel != None:
-            self.lightingPanel.updateList(list)
-        return
-        
-    def lightRename(self,oName, nName):
-        #################################################################
-        # lightRename(self,oName, nName)
-        # This function will be called when user try to rename the light from lightingPanel
-        # (by sending out the message)
-        # So, in here we will call dataHolder(AllScene) to rename the light
-        # and return a list contains the newest data of lights in he scene.
-        # Then, this function will reset the lighting list in the lightingPanel
-        #################################################################
-        list, lightNode = AllScene.rename(oName, nName)
-        if self.lightingPanel != None:
-            self.lightingPanel.updateList(list,lightNode)
-        return
-    
-    def lightSelect(self,lightName):
-        #################################################################
-        # lightSelect(self,lightName)
-        # This function will be called when user try to select the light from lightingPanel
-        # (by sending out the message)
-        # So, in here we will call dataHolder(AllScene) to get the target light node
-        # Then, this function will put this light node back into lighting
-        # panel and update the data on the panel.
-        #################################################################
-        lightNode = AllScene.getLightNode(lightName)
-        if self.lightingPanel != None:
-            self.lightingPanel.updateDisplay(lightNode)
-        return
-    
-    def addLight(self, type):
-        #################################################################
-        # addLight(self, type)
-        # This function will be called when user try to add a light from lightingPanel
-        # (by sending out the message)
-        # So, in here we will call dataHolder(AllScene) to create a default light node
-        # by the type that user assigned.
-        # Then, this function will put this light node back into lighting
-        # panel with the newest lighting list and update the data on the panel.
-        #################################################################
-        list, lightNode = AllScene.createLight(type = type)
-        if self.lightingPanel != None:
-            self.lightingPanel.updateList(list,lightNode)
-        self.makeDirty()
-        return
-    
-    def lightingPanelClose(self):
-        #################################################################
-        # lightingPanelClose(self)
-        # This function will be called when user try to close the lighting panel
-        # This function will re-config the state of the lighting panel button on the top screen
-        # And it will set the self.lightingPanel to None
-        #################################################################
-        self.menuPanel.entryconfig('Lighting Panel', state=NORMAL)
-        self.lightingPanel = None
-        return
-    
-    def openPropertyPanel(self, nodePath = None):
-        #################################################################
-        # openPropertyPanel(self, nodePath = None)
-        # This function will be called when user try to open a property window
-        # for one specific node in the scene.
-        # Here we will call dataHolder to get the basic properties
-        # we would like to let user to see and cange.
-        # And then we pass those information into propertyWindow
-        #################################################################
-        type, info = AllScene.getInfoOfThisNode(nodePath)
-        name = nodePath.getName()
-        if not self.propertyWindow.has_key(name):
-            self.propertyWindow[name] = propertyWindow(nodePath, type,info )
-        pass
-
-    def closePropertyWindow(self, name):
-        if self.propertyWindow.has_key(name):
-            del self.propertyWindow[name]
-        return
-
-    def openMetadataPanel(self,nodePath=None):
-        print nodePath
-        self.MetadataPanel=MetadataPanel(nodePath)
-        pass
-
-    def duplicate(self, nodePath = None):
-        #################################################################
-        # duplicate(self, nodePath = None)
-        # This function will be called when user try to open the duplication window
-        #################################################################
-        print '----Duplication!!'
-        if nodePath != None:
-            self.duplicateWindow = duplicateWindow(nodePath = nodePath)
-        pass
-
-    def remove(self, nodePath = None):
-        #################################################################
-        # remove(self, nodePath = None)
-        # This function will be called when user try to delete a node from scene
-        #
-        # For safty issue,
-        # we will do deselect first then remove the certain node.
-        #
-        #################################################################
-        if nodePath==None:
-            if self.nodeSelected == None:
-                return
-            nodePath = self.nodeSelected
-        self.deSelectNode()
-        if AllScene.isLight(nodePath.getName()):
-            self.removeLight(nodePath)
-        else:
-            AllScene.removeObj(nodePath)
-        pass
-
-    def addDummyNode(self, nodepath = None):
-        #################################################################
-        # addDummyNode(self, nodepath = None)
-        # This function will be called when user try to create a dummy node into scene
-        # 
-        # Here we will call dataHolder to create a dummy node
-        # and reparent it to the nodePath that user has assigned.
-        #
-        #################################################################
-        AllScene.addDummyNode(nodepath)
-        self.makeDirty()
-        pass
-
-    def addCollisionObj(self, nodepath = None):
-        #################################################################
-        # addCollisionObj(self, nodepath = None)
-        # This function will be called when user try to create a collision object into the scene
-        # 
-        # Here we will call collisionWindow to ask user what kind of collision objects they want to have.
-        # Then, send the information and generated collision object to dataHolder to finish the whole process
-        # and reparent it to the nodePath that user has assigned.
-        #
-        #################################################################
-        self.collisionWindow = collisionWindow(nodepath)
-        pass
-
-    def setAsReparentTarget(self, nodepath = None):
-        #################################################################
-        # setAsReparentTarget(self, nodepath = None)
-        # This function will be called when user select a nodePaht
-        # and want to reparent other node under it. (Drom side window pop-up nemu)
-        #################################################################
-        SEditor.setActiveParent(nodepath)
-        return
-
-    def reparentToNode(self, nodepath = None):
-        #################################################################
-        # reparentToNode(self, nodepath = None)
-        # This function will be call when user try to reparent a node to
-        # that node he selected as a reparent target before.
-        #
-        # The whole reparent process is handled by seSession,
-        # which is tunned from DirectSession
-        #
-        #################################################################
-        SEditor.reparent(nodepath, fWrt = 1)
-        return
-    
-    def openPlacerPanel(self, nodePath = None):
-        #################################################################
-        # openPlacerPanel(self, nodePath = None)
-        # This function will be call when user try to open a placer panel.
-        # This call will only success if there is no other placer panel been activated
-        #################################################################
-        if(self.placer==None):
-            self.placer = Placer()
-            self.menuPanel.entryconfig('Placer Panel', state=DISABLED)          
-        return
-
-    def closePlacerPanel(self):
-        #################################################################
-        # closePlacerPanel(self)
-        # This function will be called when user close the placer panel.
-        # Here we will reset the self.placer back to None.
-        # (You can think this is just like a reference count)
-        #################################################################
-        self.placer = None
-        self.menuPanel.entryconfig('Placer Panel', state=NORMAL)
-        return
-        
-    def openAnimPanel(self, nodePath = None):
-        #################################################################
-        # openAnimPanel(self, nodePath = None)
-        # This function will be called when user tries to open an Animation Panel
-        # This will generated a panel and put it
-        # into a dictionary using the actor's name as an index.
-        # So, if there already has an animation panel for the target actor,
-        # it won't allow user to open another one.
-        #################################################################
-        name = nodePath.getName()
-        if AllScene.isActor(name):
-            if self.animPanel.has_key(name):
-                print '---- You already have an animation panel for this Actor!'
-                return
-            else:
-                Actor = AllScene.getActor(name)
-                self.animPanel[name] = seAnimPanel.AnimPanel(aNode=Actor)
-                pass
-
-    def openMoPathPanel(self, nodepath = None):
-        #################################################################
-        # openMoPathPanel(self, nodepath = None)
-        # This function will open a Motion Path Recorder for you.
-        #################################################################
-        if self.MopathPanel == None:
-            self.MopathPanel = MopathRecorder()
-        pass
-
-    def mopathClosed(self):
-        self.MopathPanel = None
-        return
-
-    def changeName(self, nodePath, nName):
-        #################################################################
-        # changeName(self, nodePath, nName)
-        # This function will be called when user tries to change the name of the node
-        #################################################################
-        oName = nodePath.getName() # I need this line in order to check the obj name in the control panel.
-        AllScene.rename(nodePath,nName)
-        
-        # reset the list in the controller panel if it has been opened.
-        if (self.controllerPanel) != None:
-            list = AllScene.getAllObjNameAsList()
-            self.controllerPanel.resetNameList(list = list, name = oName, nodePath = nodePath)
-        return
-
-    # Take care things under File menu
-    def newScene(self):
-        #################################################################
-        # newScene(self)
-        # This function will clear whole stuff in the scene
-        # and will reset the application title to "New Scene"
-        #################################################################
-        self.closeAllSubWindows() ## Close all sub window
-        if(self.CurrentFileName):
-            currentF=Filename(self.CurrentFileName)
-            self.CurrentFileName=None
-            AllScene.resetAll()
-            currentModName=currentF.getBasenameWoExtension()
-            # Let us actually remove the scene from sys modules... this is done because every scene is loaded as a module
-            # And if we reload a scene python wont reload since its already in sys.modules... and hence we delete it
-            # If there is ever a garbage colleciton bug..this might be a point to look at 
-            if sys.modules.has_key(currentModName):
-                del sys.modules[currentModName]
-                print sys.getrefcount(AllScene.theScene)
-                del AllScene.theScene
-        else:
-            AllScene.resetAll()
-        self.parent.title('Scene Editor - New Scene')
-        pass
-
-    def openScene(self):
-        #################################################################
-        # openScene(self)
-        #################################################################
-        # In the future try and provide merging of two scenes
-        
-        if(self.CurrentFileName or self.Dirty):
-            saveScene = tkMessageBox._show("Load scene","Save the current scene?",icon = tkMessageBox.QUESTION,type = tkMessageBox.YESNOCANCEL)
-            if (saveScene == "yes"):
-                self.saveScene()
-            elif (saveScene == "cancel"):
-                return
-        
-        self.closeAllSubWindows() ## Close all sub window
-        if(self.CurrentFileName):
-            currentF=Filename(self.CurrentFileName)
-            AllScene.resetAll()
-            currentModName=currentF.getBasenameWoExtension()
-            # Let us actually remove the scene from sys modules... this is done because every scene is loaded as a module
-            # And if we reload a scene python wont reload since its already in sys.modules... and hence we delete it
-            # If there is ever a garbage colleciton bug..this might be a point to look at 
-            if sys.modules.has_key(currentModName):
-                del sys.modules[currentModName]
-                print sys.getrefcount(AllScene.theScene)
-                del AllScene.theScene
-        else:
-            AllScene.resetAll()
-
-        self.CurrentFileName = AllScene.loadScene()
-        
-        if(self.CurrentFileName==None):
-            return
-
-        thefile=Filename(self.CurrentFileName)
-        thedir=thefile.getFullpathWoExtension()
-        print "SCENE EDITOR::" + thedir
-        self.CurrentDirName=thedir
-        if self.CurrentFileName != None:
-            self.parent.title('Scene Editor - '+ Filename.fromOsSpecific(self.CurrentFileName).getBasenameWoExtension())
-        if self.lightingPanel !=None:
-            lightList=AllScene.getList()
-            self.lightingPanel.updateList(lightList)
-        messenger.send('SGE_Update Explorer',[render])
-        
-
-        # Close the side window in order to reset all world settings to fit the scene we have loaded.
-        self.sideWindow.quit()
-
-        # Try to re-open the side window again
-        while self.sideWindow == None:
-            wColor = base.getBackgroundColor()
-            self.worldColor[0] = wColor.getX()
-            self.worldColor[1] = wColor.getY()
-            self.worldColor[2] = wColor.getZ()
-            self.worldColor[3] = wColor.getW()
-            self.lightEnable = 1
-            self.ParticleEnable = 1
-            self.collision = 1
-            self.openSideWindow()
-
-    def saveScene(self):
-        #################################################################
-        # saveScene(self)
-        # If this is an open file call saveAsScene
-        # or else instantiate FileSaver from seFileSaver.py and pass it the filename
-        # If this filename exists in sys.modules you cannot use it
-        #################################################################
-
-        if(self.CurrentFileName):
-            f=FileSaver()       
-            f.SaveFile(AllScene,self.CurrentFileName,self.CurrentDirName,1)
-            self.Dirty=0
-        else:
-            self.saveAsScene()
-        pass
-
-    def saveAsBam(self):
-        fileName = tkFileDialog.asksaveasfilename(filetypes = [("BAM",".bam")],title = "Save Scenegraph as Bam file")
-        theScene=render.find("**/Scene")
-        if not theScene is None:
-            theScene.writeBamFile(fileName)
-        else:
-            render.writeBamFile(fileName+".bad")
-        print " Scenegraph saved as :" +str(fileName)
-
-    def loadFromBam(self):
-        fileName = tkFileDialog.askopenfilename(filetypes = [("BAM",".bam")],title = "Load Scenegraph from Bam file")
-        if not fileName is None:
-            d=path(fileName)
-            scene=loader.loadModel(d.relpath())
-            scene.reparentTo(render)
-
-    def saveAsScene(self):
-        #################################################################
-        # saveAsScene(self)
-        # Ask for filename using a file save dialog
-        # If this filename exists in sys.modules you cannot use it
-        # Instantiate FileSaver from seFileSaver.py and pass it the filename
-        #################################################################
-
-        fileName = tkFileDialog.asksaveasfilename(filetypes = [("PY","py")],title = "Save Scene")
-        if(not fileName):
-            return
-        fCheck=Filename(fileName)
-        #print fCheck.getBasenameWoExtension()
-        ###############################################################################
-        # !!!!! See if a module exists by this name... if it does you cannot use this filename !!!!!
-        ###############################################################################
-        if(sys.modules.has_key(fCheck.getBasenameWoExtension())):
-            tkMessageBox.showwarning(
-            "Save file",
-            "Cannot save with this name because there is a system module with the same name. Please resave as something else."
-                )
-
-            return
-        self.CurrentDirName=fileName
-        fileName=fileName+".py"
-        f=FileSaver()
-        self.CurrentFileName=fileName
-        f.SaveFile(AllScene,fileName,self.CurrentDirName,0)
-        self.Dirty=0
-        self.parent.title('Scene Editor - '+ Filename.fromOsSpecific(self.CurrentFileName).getBasenameWoExtension())
-        pass
-
-    def loadModel(self):
-        #################################################################
-        # loadModel(self)
-        # This function will be called when user tries to load a model into the scene.
-        # Here we will pop-up a dialog to ask user which model file should be loaded in.
-        # Then, pass the path to dataHolder to load the model in.
-        #################################################################
-        modelFilename = askopenfilename(
-            defaultextension = '.egg',
-            filetypes = (('Egg Files', '*.egg'),
-                         ('Bam Files', '*.bam'),
-                         ('All files', '*')),
-            initialdir = '.',
-            title = 'Load New Model',
-            parent = self.parent)
-        if modelFilename:
-            self.makeDirty()
-            if not AllScene.loadModel(modelFilename, Filename.fromOsSpecific(modelFilename)):
-                print '----Error! No Such Model File!'
-        pass
-
-    def loadActor(self):
-        #################################################################
-        # loadActor(self)
-        # This function will be called when user tries to load an Actor into the scene.
-        # Here we will pop-up a dialog to ask user which Actor file should be loaded in.
-        # Then, pass the path to dataHolder to load the Actor in.
-        #################################################################
-        ActorFilename = askopenfilename(
-            defaultextension = '.egg',
-            filetypes = (('Egg Files', '*.egg'),
-                         ('Bam Files', '*.bam'),
-                         ('All files', '*')),
-            initialdir = '.',
-            title = 'Load New Actor',
-            parent = self.parent)
-
-        
-        if ActorFilename:
-            self.makeDirty()
-            if not AllScene.loadActor(ActorFilename, Filename.fromOsSpecific(ActorFilename)):
-                print '----Error! No Such Model File!'
-        pass
-
-    def importScene(self):
-        self.makeDirty()
-        print '----God bless you Please Import!'
-        pass
-
-
-    ## Take care those things under Edit nemu
-    def unDo(self):
-        pass
-    
-    def reDo(self):
-        pass
-
-    def deSelectNode(self, nodePath=None):
-        #################################################################
-        # deSelectNode(self, nodePath=None)
-        # This function will deselect the node which we have selected currently.
-        # This will also remove the monitor task which monitor selected object's
-        # position, orientation and scale each frame.
-        #################################################################
-        if nodePath != None:
-            self.seSession.deselect(nodePath)
-        if self.isSelect:
-            self.isSelect = False
-            #if self.nodeSelected != None:
-            #    self.nodeSelected.hideBounds()
-            self.nodeSelected =None
-            self.menuEdit.entryconfig('Deselect', state=DISABLED)
-            self.menuEdit.entryconfig('Add Dummy', state=DISABLED)
-            self.menuEdit.entryconfig('Duplicate', state=DISABLED)
-            self.menuEdit.entryconfig('Remove', state=DISABLED)
-            self.menuEdit.entryconfig('Object Properties', state=DISABLED)
-            if self.sideWindowCount==1:
-                self.sideWindow.SGE.deSelectTree()
-            if taskMgr.hasTaskNamed('seMonitorSelectedNode'):
-                taskMgr.remove('seMonitorSelectedNode')
-            return
-        pass
-
-    def addDummy(self):
-        #################################################################
-        # addDummy(self)
-        # This function will do nothing but call other function
-        # to add a dummy into the scene.
-        #
-        # Ok... this is really redundancy... 
-        #
-        #################################################################
-        self.addDummyNode(self.nodeSelected)
-        pass
-
-    def duplicateNode(self):
-        #################################################################
-        # duplicateNode(self)
-        # This function will do nothing but call other function
-        # to open the duplication window.
-        #
-        # Ok... this is really redundancy... 
-        #
-        #################################################################
-        if self.nodeSelected!=None:
-            self.duplicate(self.nodeSelected)
-        pass
-
-    def removeNode(self):
-        #################################################################
-        # removeNode(self)
-        # This function will do nothing but call other function
-        # to remove the current selected node..
-        #
-        # Ok... this is really redundancy... 
-        #
-        ################################################################
-        self.remove(self.nodeSelected)
-        pass
-
-    def showObjProp(self):
-        ################################################################
-        # showObjProp(self)
-        # This function will do nothing but call other function
-        # to open the property window of current selected node..
-        #
-        # Ok... this is really redundancy... 
-        #
-        ################################################################
-        self.openPropertyPanel(self.nodeSelected)
-        pass 
-
-    def showCameraSetting(self):
-        ################################################################
-        # showCameraSetting(self)
-        # This function will do nothing but call other function
-        # to open the property window of camera..
-        #
-        # Ok... this is really redundancy... 
-        #
-        ################################################################
-        self.openPropertyPanel(camera)
-        pass
-
-    def showRenderSetting(self):
-        '''Currently, no idea what gonna pop-out here...'''
-        pass
-
-    ## Take care those thins under Edit nemu
-    def openSideWindow(self):
-        ################################################################
-        # openSideWindow(self)
-        # This function will open the side window and set the reference number
-        # so that we can make sure there won't have two or more side windows in the same time.
-        ################################################################
-        if self.sideWindowCount==0:
-            self.sideWindow = sideWindow(worldColor = self.worldColor,
-                                         lightEnable = self.lightEnable,
-                                         ParticleEnable = self.ParticleEnable,
-                                         basedriveEnable = self.basedriveEnable,
-                                         collision = self.collision,
-                                         backface = self.backface,
-                                         texture = self.texture,
-                                         wireframe = self.wireframe,
-                                         grid = self.grid,
-                                         widgetVis = self.widgetVis,
-                                         enableAutoCamera = self.enableAutoCamera)
-            self.sideWindowCount = 1
-            self.menuPanel.entryconfig('Side Window', state=DISABLED)
-        return
-    
-    def openAnimationPanel(self):
-        ################################################################
-        # openAnimationPanel(self)
-        # This function will do nothing but call other function
-        # to open the animation window for selected node(if it is an Actor)..
-        #
-        # Ok... this is really redundancy... 
-        #
-        ################################################################
-        if AllScene.isActor(self.nodeSelected):
-            self.openAnimPanel(self.nodeSelected)
-        pass
-    
-    def openMopathPanel(self):
-        ################################################################
-        # openMopathPanel(self)
-        # This function will create a Motion Path Recorder
-        ################################################################
-        MopathPanel = MopathRecorder()
-        pass
-
-    def toggleParticleVisable(self, visable):
-        ################################################################
-        # toggleParticleVisable(self, visable)
-        # This function will be called each time user has toggled
-        # the check box of Particle visibility in the side window.
-        # The reason we keep track this is because
-        # we have to know we should show/hide the model on the new-created particle
-        ################################################################
-        self.ParticleEnable = visable
-        AllScene.toggleParticleVisable(visable)
-        return
-    
-    def openLightingPanel(self):
-        ################################################################
-        # openLightingPanel(self)
-        # open the lighting panel here.
-        # If there is already exist a lighting panel, then do nothing
-        ################################################################
-        if self.lightingPanel==None:
-            self.lightingPanel = lightingPanel(AllScene.getLightList())
-            self.menuPanel.entryconfig('Lighting Panel', state=DISABLED)
-        return
-    
-    def addParticleEffect(self,effect_name,effect,node):
-        AllScene.particleDict[effect_name]=effect
-        AllScene.particleNodes[effect_name]=node
-        if not self.ParticleEnable:
-            AllScene.particleNodes[effect_name].setTransparency(True)
-            AllScene.particleNodes[effect_name].setAlphaScale(0)
-            AllScene.particleNodes[effect_name].setBin("fixed",1)
-        return
-
-    def openParticlePanel(self):
-        if self.particlePanel != None:
-            ## There already has a Particle panel!
-            return
-        if(len(AllScene.particleDict)==0):
-            self.particlePanel=seParticlePanel.ParticlePanel()
-        else:
-            for effect in AllScene.particleDict:
-                theeffect=AllScene.particleDict[effect]
-            self.particlePanel=seParticlePanel.ParticlePanel(particleEffect=theeffect,effectsDict=AllScene.particleDict)
-
-        pass
-
-    def closeParticlePanel(self):
-        self.particlePanel = None
-        return
-    
-    def openInputPanel(self):
-        if self.controllerPanel==None:
-            list = AllScene.getAllObjNameAsList()
-            type, dataList = AllScene.getControlSetting()
-            self.controllerPanel = controllerWindow(listOfObj = list, controlType = type, dataList = dataList)
-        pass
-
-    def closeInputPanel(self):
-        self.controllerPanel = None
-        return
-
-    def requestObjFromControlW(self, name):
-        ################################################################
-        # requestObjFromControlW(self, name)
-        # Call back function
-        # Each time when user selects a node from Control Panel,
-        # this function will be called.
-        # This function will get the actual nodePath from dataHolder and then
-        # set it back into controller panel
-        ################################################################
-        node = AllScene.getObjFromSceneByName(name)
-        
-        if (self.controllerPanel) != None and (node!=None):
-            self.controllerPanel.setNodePathIn(node)
-            
-        return
-
-    def setControlSet(self, controlType, dataList):
-        if controlType == 'Keyboard':
-            self.controlTarget = dataList[0]
-            self.keyboardMapDict.clear()
-            self.keyboardMapDict = dataList[1].copy()
-            self.keyboardSpeedDict.clear()
-            self.keyboardSpeedDict = dataList[2].copy()
-        return
-
-    def startControl(self, controlType, dataList):
-        if not self.enableControl:
-            self.enableControl = True
-        else:
-            # Stop the current control setting first
-            # Also this will make sure we won't catch wrong keyboard message
-            self.stopControl(controlType)
-            self.enableControl = True
-        
-        self.setControlSet(controlType, dataList)
-        self.lastContorlTimer = globalClock.getFrameTime()
-        if controlType == 'Keyboard':
-            self.controlType = 'Keyboard'
-            self.keyControlEventDict = {}
-            self.transNodeKeyboard = self.controlTarget.attachNewNode('transformNode')
-            self.transNodeKeyboard.hide()
-            for index in self.keyboardMapDict:
-                self.keyControlEventDict[index] = 0
-                self.accept(self.keyboardMapDict[index], lambda a = index:self.keyboardPushed(a))
-                self.accept(self.keyboardMapDict[index]+'-up', lambda a = index:self.keyboardReleased(a))
-        return
-
-    def stopControl(self, controlType):
-        if not self.enableControl:
-            return
-        if controlType == 'Keyboard':
-            self.enableControl = False
-            for index in self.keyboardMapDict:
-                self.ignore(self.keyboardMapDict[index])
-                self.ignore(self.keyboardMapDict[index]+'-up')
-            taskMgr.remove("KeyboardControlTask")
-            self.transNodeKeyboard.removeNode()
-        return
-
-    def keyboardPushed(self, key):
-        self.keyControlEventDict[key] = 1
-        if not taskMgr.hasTaskNamed("KeyboardControlTask"):
-            self.keyboardLastTimer = globalClock.getFrameTime()
-            taskMgr.add(self.keyboardControlTask, "KeyboardControlTask")
-        return
-
-    def keyboardReleased(self, key):
-        self.keyControlEventDict[key] = 0
-        for index in self.keyControlEventDict:
-            if self.keyControlEventDict[index] == 1:
-                return
-        if taskMgr.hasTaskNamed("KeyboardControlTask"):
-            taskMgr.remove("KeyboardControlTask")
-        return
-
-    def keyboardControlTask(self, task):
-        newTimer = globalClock.getFrameTime()
-        delta = newTimer - self.keyboardLastTimer
-        self.keyboardLastTimer = newTimer
-        pos = self.controlTarget.getPos()
-        hpr = self.controlTarget.getHpr()
-        scale = self.controlTarget.getScale()
-        self.transNodeKeyboard.setPosHpr((self.keyControlEventDict['KeyRight']*self.keyboardSpeedDict['SpeedRight']-self.keyControlEventDict['KeyLeft']*self.keyboardSpeedDict['SpeedLeft'])*delta,
-                                         (self.keyControlEventDict['KeyForward']*self.keyboardSpeedDict['SpeedForward']-self.keyControlEventDict['KeyBackward']*self.keyboardSpeedDict['SpeedBackward'])*delta,
-                                         (self.keyControlEventDict['KeyUp']*self.keyboardSpeedDict['SpeedUp']-self.keyControlEventDict['KeyDown']*self.keyboardSpeedDict['SpeedDown'])*delta,
-                                         (self.keyControlEventDict['KeyTurnLeft']*self.keyboardSpeedDict['SpeedTurnLeft']-self.keyControlEventDict['KeyTurnRight']*self.keyboardSpeedDict['SpeedTurnRight'])*delta,
-                                         (self.keyControlEventDict['KeyTurnUp']*self.keyboardSpeedDict['SpeedTurnUp']-self.keyControlEventDict['KeyTurnDown']*self.keyboardSpeedDict['SpeedTurnDown'])*delta,
-                                         (self.keyControlEventDict['KeyRollLeft']*self.keyboardSpeedDict['SpeedRollLeft']-self.keyControlEventDict['KeyRollRight']*self.keyboardSpeedDict['SpeedRollRight'])*delta)
-        newPos = self.transNodeKeyboard.getPos(self.controlTarget.getParent())
-        newHpr = self.transNodeKeyboard.getHpr(self.controlTarget.getParent())
-        overAllScale = self.keyControlEventDict['KeyScaleUp']*self.keyboardSpeedDict['SpeedScaleUp']-self.keyControlEventDict['KeyScaleDown']*self.keyboardSpeedDict['SpeedScaleDown']
-        newScale = Point3(scale.getX() + (overAllScale + self.keyControlEventDict['KeyScaleXUp']*self.keyboardSpeedDict['SpeedScaleXUp'] - self.keyControlEventDict['KeyScaleXDown']*self.keyboardSpeedDict['SpeedScaleXDown'])*delta,
-                          scale.getY() + (overAllScale + self.keyControlEventDict['KeyScaleYUp']*self.keyboardSpeedDict['SpeedScaleYUp'] - self.keyControlEventDict['KeyScaleYDown']*self.keyboardSpeedDict['SpeedScaleYDown'])*delta,
-                          scale.getZ() + (overAllScale + self.keyControlEventDict['KeyScaleZUp']*self.keyboardSpeedDict['SpeedScaleZUp'] - self.keyControlEventDict['KeyScaleZDown']*self.keyboardSpeedDict['SpeedScaleZDown'])*delta
-                          )
-        self.controlTarget.setPos(newPos.getX(), newPos.getY() , newPos.getZ())
-        self.controlTarget.setHpr(newHpr.getX(), newHpr.getY() , newHpr.getZ())
-        self.controlTarget.setScale(newScale.getX(),newScale.getY(),newScale.getZ())
-        self.transNodeKeyboard.setPosHpr(0,0,0,0,0,0)
-        return Task.cont
-    
-    ## Misc
-    ##### This one get the event from SGE (Scene Graph Explorer) and Picking
-    def selectNode(self, nodePath=None, callBack = True):
-        ################################################################
-        # selectNode(self, nodePath=None, callBack = True)
-        # This will be called when user try to select nodes from the
-        # side window.
-        # It will also call seSession to select this node in order to keep data's consistency
-        ################################################################
-        if nodePath==None:
-            self.isSelect = False
-            self.nodeSelected =None
-            if taskMgr.hasTaskNamed('seMonitorSelectedNode'):
-                taskMgr.remove('seMonitorSelectedNode')
-            return
-        else:
-            self.isSelect = True
-            #if self.nodeSelected != None:
-            #    self.nodeSelected.hideBounds()
-            self.nodeSelected = nodePath
-            #self.nodeSelected.showBounds()
-            self.menuEdit.entryconfig('Deselect', state=NORMAL)
-            self.menuEdit.entryconfig('Add Dummy', state=NORMAL)
-            self.menuEdit.entryconfig('Duplicate', state=NORMAL)
-            self.menuEdit.entryconfig('Remove', state=NORMAL)
-            self.menuEdit.entryconfig('Object Properties', state=NORMAL)
-            if callBack:
-                self.seSession.select(nodePath,fResetAncestry=1)
-            messenger.send('SGE_Update Explorer',[render])
-            if not taskMgr.hasTaskNamed('seMonitorSelectedNode'):
-                self.oPos = self.nodeSelected.getPos()
-                self.oHpr = self.nodeSelected.getHpr()
-                self.oScale = self.nodeSelected.getScale()
-                taskMgr.add(self.monitorSelectedNodeTask, 'seMonitorSelectedNode')
-            return
-        pass
-
-    def selectFromScene(self, nodePath=None, callBack=True):
-        ################################################################
-        # selectFromScene(self, nodePath=None, callBack = True)
-        # This will be called when user try to select nodes from the
-        # scene. (By picking)
-        # Actually this will be called by seSession
-        # The reason we make two selections is we don't want they call each other and never stop...
-        ################################################################
-        if nodePath==None:
-            self.isSelect = False
-            self.nodeSelected =None
-            if taskMgr.hasTaskNamed('seMonitorSelectedNode'):
-                taskMgr.remove('seMonitorSelectedNode')
-            return
-        else:
-            self.isSelect = True
-            #if self.nodeSelected != None:
-            #    self.nodeSelected.hideBounds()
-            self.nodeSelected = nodePath
-            #self.nodeSelected.showBounds()
-            self.menuEdit.entryconfig('Deselect', state=NORMAL)
-            self.menuEdit.entryconfig('Add Dummy', state=NORMAL)
-            self.menuEdit.entryconfig('Duplicate', state=NORMAL)
-            self.menuEdit.entryconfig('Remove', state=NORMAL)
-            self.menuEdit.entryconfig('Object Properties', state=NORMAL)
-            self.sideWindow.SGE.selectNodePath(nodePath,callBack)
-            messenger.send('SGE_Update Explorer',[render])
-            if not taskMgr.hasTaskNamed('seMonitorSelectedNode'):
-                self.oPos = self.nodeSelected.getPos()
-                self.oHpr = self.nodeSelected.getHpr()
-                self.oScale = self.nodeSelected.getScale()
-                taskMgr.add(self.monitorSelectedNodeTask, 'seMonitorSelectedNode')
-            return
-        pass
-
-    def monitorSelectedNodeTask(self, task):
-        ################################################################
-        # monitorSelectedNodeTask(self, task)
-        # This is a function which will keep tracking
-        # the position, orientation and scale data of selected node and update the display on the screen.
-        # Alos, it will send out message to sychronize the data in the placer and property window.
-        ################################################################
-        if self.nodeSelected != None:
-            pos = self.nodeSelected.getPos()
-            hpr = self.nodeSelected.getHpr()
-            scale = self.nodeSelected.getScale()
-            if ((self.oPos != pos )or(self.oScale != scale)or(self.oHpr != hpr)):
-                messenger.send('forPorpertyWindow'+self.nodeSelected.getName(),[pos, hpr, scale])
-                messenger.send('placerUpdate')
-                self.oPos = pos
-                self.oScale = scale
-                self.oHpr = hpr
-                self.posLabel['text'] = "Position   : X: %2.2f Y: %2.2f Z: %2.2f"%(pos.getX(), pos.getY(),pos.getZ())
-                self.hprLabel['text'] = "Orientation: H: %2.2f P: %2.2f R: %2.2f"%(hpr.getX(), hpr.getY(),hpr.getZ())
-                self.scaleLabel['text'] = "Scale      : X: %2.2f Y: %2.2f Z: %2.2f"%(scale.getX(), scale.getY(),scale.getZ())
-        return Task.cont
-
-    def deselectFromScene(self):
-        ################################################################
-        # deselectFromScene(self)
-        # This function will do nothing but call other function
-        # to delete selected node...
-        #
-        # Ok... this is really redundancy... 
-        #
-        ################################################################
-        self.deSelectNode(self.nodeSelected)
-        messenger.send('SGE_Update Explorer',[render])
-
-    ##### Take care the even quest from Side Window
-    def lightToggle(self):
-        ################################################################
-        # lightToggle(self)
-        # This function will do nothing but call other function
-        # to toggle the light...
-        ################################################################
-        self.makeDirty()
-        AllScene.toggleLight()
-        return
-    
-    def sideWindowClose(self,worldColor,lightEnable,ParticleEnable, basedriveEnable,collision,
-                        backface, texture, wireframe, grid, widgetVis, enableAutoCamera):
-        ################################################################
-        # sideWindowClose(self,worldColor,lightEnable,ParticleEnable, basedriveEnable,collision,
-        #                 backface, texture, wireframe, grid, widgetVis, enableAutoCamera):
-        # This function will be called when user close the side window.
-        # Here we will restore all parameters about world setting back in the sceneEditor.
-        # So, when next time people recall the side window, it will still keep the same world setting.
-        ################################################################
-        if self.sideWindowCount==1:
-            self.worldColor = worldColor
-            self.lightEnable = lightEnable
-            self.ParticleEnable = ParticleEnable
-            self.basedriveEnable = basedriveEnable
-            self.collision = collision
-            self.backface = backface
-            self.texture = texture
-            self.wireframe = wireframe
-            self.grid = grid
-            self.enableAutoCamera = enableAutoCamera
-            self.widgetVis = widgetVis
-            self.sideWindowCount=0
-            self.sideWindow = None
-            self.menuPanel.entryconfig('Side Window', state=NORMAL)
-            return
-
-    ## Process message from Duplication Window
-    def duplicationObj(self, nodePath, pos, hpr, scale, num):
-        ################################################################
-        # duplicationObj(self, nodePath, pos, hpr, scale, num)
-        # This function will do nothing but call other function
-        # to duplicate selected node...
-        #
-        # Ok... this is really redundancy... 
-        #
-        ################################################################
-        AllScene.duplicateObj(nodePath, pos, hpr, scale, num)
-        return
-
-    ## Process message from Animation Panel
-    def animationLoader(self, nodePath, Dic):
-        name = nodePath.getName()
-        AllScene.loadAnimation(name, Dic)
-        return
-
-    def animationRemove(self, nodePath, name):
-        AllScene.removeAnimation(nodePath.getName(),name)
-        return
-
-    def animPanelClose(self, name):
-        if self.animPanel.has_key(name):
-            del self.animPanel[name]
-        return
-
-    ### Blend Animation Panel
-    def openBlendAnimPanel(self, nodePath=None):
-        ################################################################
-        # openBlendAnimPanel(self, nodePath=None)
-        # This function will get the user defined blending animation data from dataHolder.
-        # And then open a blendAnimPanel by passing those data in.
-        ################################################################
-        name = nodePath.getName()
-        if AllScene.isActor(name):
-            if self.animBlendPanel.has_key(name):
-                print '---- You already have an Blend Animation Panel for this Actor!'
-                return
-            else:
-                Actor = AllScene.getActor(name)
-                Dict = AllScene.getBlendAnimAsDict(name)
-                self.animBlendPanel[name] = BlendAnimPanel(aNode=Actor, blendDict=Dict)
-                pass
-        return
-
-    def animBlendPanelSave(self, actorName, blendName, animNameA, animNameB, effect):
-        ################################################################
-        # animBlendPanelSave(self, actorName, blendName, animNameA, animNameB, effect)
-        # This function will call dataHolder to save the blended animation.
-        # Then, it will reset the newest blended animation list back to animBlendPanel
-        ################################################################
-        dict = AllScene.saveBlendAnim(actorName, blendName, animNameA, animNameB, effect)
-        self.animBlendPanel[actorName].setBlendAnimList(dict)
-        return
-
-    def animBlendPanelRemove(self, actorName, blendName):
-        ################################################################
-        # animBlendPanelRemove(self, actorName, blendName)
-        # This function will call dataHolder to remove the blended animation.
-        # Then, it will reset the newest blended animation list back to animBlendPanel
-        ################################################################
-        dict = AllScene.removeBlendAnim(actorName, blendName)
-        self.animBlendPanel[actorName].setBlendAnimList(dict, True)
-        return
-
-    def animBlendPanelRename(self, actorName, nName, oName, animNameA, animNameB, effect):
-        ################################################################
-        # animBlendPanelRename(self, actorName, nName, oName, animNameA, animNameB, effect)
-        # This function will call dataHolder to rename the blended animation.
-        # Then, it will reset the newest blended animation list back to animBlendPanel
-        ################################################################
-        dict = AllScene.renameBlendAnim(actorName, nName, oName, animNameA, animNameB, effect)
-        self.animBlendPanel[actorName].setBlendAnimList(dict)
-        return
-
-    def animBlendPanelClose(self, name):
-        ################################################################
-        # animBlendPanelClose(self, name)
-        # This function will be called when Blend panel has been closed.
-        # Here we will reset the reference dictionary so it can be open again.
-        ################################################################
-        if self.animBlendPanel.has_key(name):
-            del self.animBlendPanel[name]
-        return
-
-    ## Process message from SEditor object
-    def toggleWidgetVis(self):
-        ################################################################
-        # toggleWidgetVis(self)
-        # This function will be called when user use the hot-key to change the
-        # world setting. (From seSession)
-        # In this function we will restore the change and let side window know
-        # the hot-key ahs been pushed.
-        ################################################################
-        if self.sideWindow != None:
-            self.sideWindow.toggleWidgetVisFromMainW()
-        else:
-            self.widgetVis = (self.widgetVis+1)%2
-
-    def toggleBackface(self):
-        ################################################################
-        # toggleBackface(self)
-        # This function will be called when user use the hot-key to change the
-        # world setting. (From seSession)
-        # In this function we will restore the change and let side window know
-        # the hot-key ahs been pushed.
-        ################################################################
-        if self.sideWindow != None:
-            self.sideWindow.toggleBackfaceFromMainW()
-        else:
-            self.backface = (self.backface+1)%2
-
-    def toggleTexture(self):
-        ################################################################
-        # toggleTexture(self)
-        # This function will be called when user use the hot-key to change the
-        # world setting. (From seSession)
-        # In this function we will restore the change and let side window know
-        # the hot-key ahs been pushed.
-        ################################################################
-        if self.sideWindow != None:
-            self.sideWindow.toggleTextureFromMainW()
-        else:
-            self.texture = (self.texture+1)%2
-
-    def toggleWireframe(self):
-        ################################################################
-        # toggleWireframe(self)
-        # This function will be called when user use the hot-key to change the
-        # world setting. (From seSession)
-        # In this function we will restore the change and let side window know
-        # the hot-key ahs been pushed.
-        ################################################################
-        if self.sideWindow != None:
-            self.sideWindow.toggleWireframeFromMainW()
-        else:
-            self.wireframe = (self.wireframe+1)%2
-
-    def openAlignPanel(self, nodePath=None):
-        name = nodePath.getName()
-        if not self.alignPanelDict.has_key(name):
-            list = AllScene.getAllObjNameAsList()
-            if name in list:
-                list.remove(name)
-            else:
-                return
-            self.alignPanelDict[name] = AlignTool(nodePath = nodePath, list = list)
-        return
-
-    def closeAlignPanel(self, name=None):
-        if self.alignPanelDict.has_key(name):
-            del self.alignPanelDict[name]
-
-    def alignObject(self, nodePath, name, list):
-        target = AllScene.getObjFromSceneByName(name)
-        pos = target.getPos()
-        hpr = target.getHpr()
-        scale = target.getScale()
-        if list[0]: # Align X
-            nodePath.setX(pos.getX())
-        if list[1]: # Align Y
-            nodePath.setY(pos.getY())
-        if list[2]: # Align Z
-            nodePath.setZ(pos.getZ())
-        if list[3]: # Align H
-            nodePath.setH(hpr.getX())
-        if list[4]: # Align P
-            nodePath.setP(hpr.getY())
-        if list[5]: # Align R
-            nodePath.setR(hpr.getZ())
-        if list[6]: # Scale X
-            nodePath.setSx(scale.getX())
-        if list[7]: # Scale Y
-            nodePath.setSy(scale.getY())
-        if list[8]: # Scale Z
-            nodePath.setSz(scale.getZ())
-        return
-
-    ### Event from Motion Path Panel
-    def requestCurveList(self, nodePath,name):
-        curveList = AllScene.getCurveList(nodePath)
-        messenger.send('curveListFor'+name, [curveList])
-
-
-    ## Steal from DirectSession...
-    def flash(self, nodePath = 'None Given'):
-        """ Highlight an object by setting it red for a few seconds """
-        # Clean up any existing task
-        taskMgr.remove('flashNodePath')
-        # Spawn new task if appropriate
-        if nodePath == 'None Given':
-            # If nothing specified, try selected node path
-            nodePath = self.selected.last
-        if nodePath:
-            if nodePath.hasColor():
-                doneColor = nodePath.getColor()
-                flashColor = VBase4(1) - doneColor
-                flashColor.setW(1)
-            else:
-                doneColor = None
-                flashColor = VBase4(1,0,0,1)
-            # Temporarily set node path color
-            nodePath.setColor(flashColor)
-            # Clean up color in a few seconds
-            t = taskMgr.doMethodLater(1.5,
-                                      # This is just a dummy task
-                                      self.flashDummy,
-                                      'flashNodePath')
-            t.nodePath = nodePath
-            t.doneColor = doneColor
-            # This really does all the work
-            t.uponDeath = self.flashDone
-            
-    def flashDummy(self, state):
-        # Real work is done in upon death function
-        return Task.done
-        
-    def flashDone(self,state):
-        # Return node Path to original state
-        if state.nodePath.isEmpty():
-            # Node path doesn't exist anymore, bail
-            return
-        if state.doneColor:
-            state.nodePath.setColor(state.doneColor)
-        else:
-            state.nodePath.clearColor()
-
-
-    
-
-editor = myLevelEditor(parent = tkroot)
-
-run()

+ 0 - 608
doc/SceneEditor/seAnimPanel.py

@@ -1,608 +0,0 @@
-#################################################################
-# collisionWindow.py
-# Written by Yi-Hong Lin, [email protected], 2004
-#################################################################
-# Import Tkinter, Pmw, and the floater code from this directory tree.
-from direct.tkwidgets.AppShell import *
-from direct.showbase.TkGlobal import *
-from tkSimpleDialog import askfloat
-import string
-import math
-import types
-from direct.task import Task
-
-FRAMES = 0
-SECONDS = 1
-
-class AnimPanel(AppShell):
-    #################################################################
-    # This class will generate a animation panel for an actor
-    # which user assigned. Inside this panel, instead of using actorInterval
-    # or just simply calling the play function in Actor, we create a task to
-    # set animation frame by frame using setPose.
-    #################################################################
-    # Override class variables
-    appname = 'Anim Panel'
-    frameWidth  = 575
-    frameHeight = 250
-    usecommandarea = 0
-    usestatusarea  = 0
-    index = 0
-    dragMode = False
-    rateList= ['1/24.0', '0.1', '0.5', '1.0', '2.0', '5.0' , '10.0']
-
-    
-    def __init__(self, aNode =  None, parent = None, **kw):
-        INITOPT = Pmw.INITOPT
-        self.id = 'AnimPanel '+ aNode.getName()
-        self.appname = self.id
-        optiondefs = (
-            ('title',               self.appname,       None),
-            ('actor',           aNode,               None),
-            ('animList',        [],      None),
-            )
-        self.defineoptions(kw, optiondefs)
-
-        self.frameHeight = 300
-        self.id = 'AnimPanel '+ aNode.getName()
-        self.nodeName = aNode.getName()
-        # Initialize the superclass
-        AppShell.__init__(self)
-
-        # Execute option callbacks
-        self.initialiseoptions(AnimPanel)
-
-        self.currTime = 0.0 # Initialize the start time
-        self.animName = None
-
-        self.parent.resizable(False,False) ## Disable the ability to resize for this Window.
-
-    def createInterface(self):
-        # Handle to the toplevels interior
-        interior = self.interior()
-        menuBar = self.menuBar
-
-        menuBar.addmenu('Anim', 'Anim Panel Operations')
-        
-        # Reset all actor controls
-        menuBar.addmenuitem('File', 'command',
-                            'Load Animation',
-                            label = 'Load Animation',
-                            command = self.loadAnimation)
-        menuBar.addmenuitem('Anim', 'command',
-                            'Set actor controls to t = 0.0',
-                            label = 'Jump all to zero',
-                            command = self.resetAllToZero)
-        menuBar.addmenuitem('Anim', 'command',
-                            'Set Actor controls to end time',
-                            label = 'Jump all to end time',
-                            command = self.resetAllToEnd)
-        menuBar.addmenuitem('Anim', 'separator')
-        menuBar.addmenuitem('Anim', 'command',
-                            'Play Current Animation',
-                            label = 'Play',
-                            command = self.play)
-        menuBar.addmenuitem('Anim', 'command',
-                            'Stop Current Animation',
-                            label = 'stop',
-                            command = self.stop)
-
-        # Create a frame to hold all the actor controls
-        actorFrame = Frame(interior)
-        name_label = Label(actorFrame, text= self.nodeName,font=('MSSansSerif', 16),
-                           relief = SUNKEN, borderwidth=3)
-        name_label.place(x=5,y=5,anchor=NW)
-        Label(actorFrame, text= "Animation:", font=('MSSansSerif', 12)).place(x=140,y=5,anchor=NW)
-        Label(actorFrame, text= "Play Rate:", font=('MSSansSerif', 12)).place(x=140,y=35,anchor=NW)
-        self['animList'] = self['actor'].getAnimNames()
-        self.AnimEntry = self.createcomponent(
-            'AnimationMenu', (), None,
-            Pmw.ComboBox, (actorFrame,),
-            labelpos = W, entry_width = 20, selectioncommand = self.setAnimation,
-            scrolledlist_items = self['animList'])
-        self.AnimEntry.place(x=240,y=10,anchor=NW)
-
-        
-        self.playRateEntry = self.createcomponent(
-            'playRateMenu', (), None,
-            Pmw.ComboBox, (actorFrame,),
-            labelpos = W, entry_width = 20, selectioncommand = self.setPlayRate,
-            scrolledlist_items = self.rateList)
-        self.playRateEntry.place(x=240,y=40,anchor=NW)
-        self.playRateEntry.selectitem('1.0')
-
-        ### Loop checkbox
-        Label(actorFrame, text= "Loop:", font=('MSSansSerif', 12)).place(x=420,y=05,anchor=NW)
-
-        self.loopVar = IntVar()
-        self.loopVar.set(0)
-        self.loopButton = self.createcomponent(
-            'loopButton', (), None,
-            Checkbutton, (actorFrame,),
-            variable = self.loopVar)
-        self.loopButton.place(x=470,y=7,anchor=NW)
-
-        ### Display Frames/Seconds
-        Label(actorFrame, text= "Frame/Second:", font=('MSSansSerif', 11)).place(x=5,y=75,anchor=NW)
-
-        self.unitsVar = IntVar()
-        self.unitsVar.set(FRAMES)
-        self.displayButton = self.createcomponent(
-            'displayButton', (), None,
-            Checkbutton, (actorFrame,),
-            command = self.updateDisplay,
-            variable = self.unitsVar)
-        self.displayButton.place(x=120,y=77,anchor=NW)
-        
-        ## scale control
-        frameFrame = Frame(actorFrame, relief = SUNKEN, bd = 1)
-        self.minLabel = self.createcomponent(
-            'minLabel', (), 'sLabel',
-            Label, (frameFrame,),
-            text = 0)
-        self.minLabel.pack(side = LEFT)
-
-        self.frameControl = self.createcomponent(
-            'scale', (), None,
-            Scale, (frameFrame,),
-            from_ = 0, to = 24, resolution = 1.0,
-            command = self.goTo, length = 500,
-            orient = HORIZONTAL, showvalue = 1)
-        self.frameControl.pack(side = LEFT, expand = 1)
-        self.frameControl.bind('<Button-1>', self.onPress)
-        self.frameControl.bind('<ButtonRelease-1>', self.onRelease)
-
-        self.maxLabel = self.createcomponent(
-            'maxLabel', (), 'sLabel',
-            Label, (frameFrame,),
-            text = 24)
-        self.maxLabel.pack(side = LEFT)
-        frameFrame.pack(side = LEFT, expand = 1, fill = X)
-        
-        ## button contorl
-        ButtomFrame = Frame(actorFrame, relief = SUNKEN, bd = 1,borderwidth=5)
-        self.toStartButton = self.createcomponent(
-            'toStart', (), None,
-            Button, (ButtomFrame,),
-            text = '<<',
-            width = 8,
-            command = self.resetAllToZero)
-        self.toStartButton.pack(side = LEFT, expand = 1, fill = X)
-        
-        self.playButton = self.createcomponent(
-            'playButton', (), None,
-            Button, (ButtomFrame,),
-            text = 'Play', width = 8,
-            command = self.play)
-        self.playButton.pack(side = LEFT, expand = 1, fill = X)
-
-        self.stopButton = self.createcomponent(
-            'stopButton', (), None,
-            Button, (ButtomFrame,),
-            text = 'Stop', width = 8, state=DISABLED,
-            command = self.stop)
-        self.stopButton.pack(side = LEFT, expand = 1, fill = X)
-
-        self.toEndButton = self.createcomponent(
-            'toEnd', (), None,
-            Button, (ButtomFrame,),
-            text = '>>',
-            width = 8,
-            command = self.resetAllToEnd)
-        self.toEndButton.pack(side = LEFT, expand = 1, fill = X)
-
-        ButtomFrame.place(anchor=NW,x=5,y=165)
-
-        self.removeButton = self.createcomponent(
-            'Remove Animation', (), None,
-            Button, (actorFrame,),
-            text = 'Remove This Animation', width = 20,
-            command = self.removeAnim)
-        self.removeButton.place(anchor=NW,x=5,y=220)
-
-        self.loadButton = self.createcomponent(
-            'Load Animation', (), None,
-            Button, (actorFrame,),
-            text = 'Load New Animation', width = 20,
-            command = self.loadAnimation)
-        self.loadButton.place(anchor=NW,x=180,y=220)
-
-        # Now pack the actor frame
-        actorFrame.pack(expand = 1, fill = BOTH)
-
-    def updateList(self):
-        #################################################################
-        # updateList(self)
-        # This function will update the list of animations that the Actor
-        # currently has into the combo box widget. 
-        #################################################################
-        self.ignore('DataH_loadFinish'+self.nodeName)
-        del self.loaderWindow
-        self['animList'] = self['actor'].getAnimNames()
-        animL = self['actor'].getAnimNames()
-        self.AnimEntry.setlist(animL)
-            
-
-    def removeAnim(self):
-        #################################################################
-        # removeAnim(self)
-        # This function will stop the animation and get the name of animation
-        # which user wish to remove from the panel. Then, it will send out
-        # a message to dataHolder to remove the target animation.
-        # And in the same time, it will start waiting a return message to
-        # make sure that target animation has been removed.
-        #################################################################
-        name = self.AnimEntry.get()
-        if taskMgr.hasTaskNamed(self.id + '_UpdateTask'):
-            self.stop()
-        self.accept('DataH_removeAnimFinish'+self.nodeName,self.afterRemove)
-        messenger.send('AW_removeAnim',[self['actor'],name])
-        return
-
-    def afterRemove(self):
-        #################################################################
-        # afterRemove(self)
-        # This function will be called once panel has received the return
-        # message from dataHolder. This function will call setList to
-        # reset the list of Animations
-        #################################################################
-        self.ignore('DataH_removeAnimFinish'+self.nodeName)
-        self['animList'] = self['actor'].getAnimNames()
-        animL = self['actor'].getAnimNames()
-        self.AnimEntry.setlist(animL)
-        print '-----',animL
-        return
-
-    def loadAnimation(self):
-        #################################################################
-        # loadAnimation(self)
-        # This function will open a dialog window to require user to input
-        # the animation he wants to load in for this actor.
-        #################################################################
-        self.loaderWindow = LoadAnimPanel(aNode=self['actor'])
-        self.accept('DataH_loadFinish'+self.nodeName,self.updateList)
-        return
-
-    def play(self):
-        #################################################################
-        # play(self)
-        # This function will be called when user click on the "play" button.
-        # First, this function will initialize all parameter that the actual
-        # play task need to run and add the play task into the taskMgr.
-        #################################################################
-        self.animName = self.AnimEntry.get()
-        if self.animName in self['animList']:
-            animName = self.AnimEntry.get()
-            self.playButton.config(state=DISABLED)
-            self.lastT = globalClock.getFrameTime()
-            taskMgr.add(self.playTask, self.id + '_UpdateTask')
-            self.stopButton.config(state=NORMAL)
-        else:
-            print '----Illegal Animaion name!!', self.animName
-        return
-
-    def playTask(self, task):
-        #################################################################
-        # playTask(self, task)
-        # This task will record time by each frame
-        # In fact it is just a clock keeper.
-        # If the current frame time over the max long of the animation,
-        # it will reset the timer.
-        # Anyway, this function will call gotoT by each frame.
-        #################################################################
-        fLoop = self.loopVar.get()
-        currT = globalClock.getFrameTime()
-        deltaT = currT - self.lastT
-        self.lastT = currT
-        if self.dragMode:
-            return Task.cont
-        self.currTime = self.currTime + deltaT
-        if (self.currTime > self.maxSeconds):
-            if fLoop:
-                self.currTime = self.currTime%self.duration
-                self.gotoT(self.currTime)
-            else:
-                self.currTime = 0.0
-                self.gotoT(0.0)
-                self.playButton.config(state=NORMAL)
-                self.stopButton.config(state=DISABLED)
-                return Task.done
-        else:
-            self.gotoT(self.currTime)    
-        return Task.cont
-
-    def stop(self):
-        #################################################################
-        # stop(self)
-        # This function will remove the play task from taskMgr when user
-        # click on the "Stop" button
-        #################################################################
-        taskMgr.remove(self.id + '_UpdateTask')
-        self.playButton.config(state=NORMAL)
-        self.stopButton.config(state=DISABLED)
-        return
-
-    def setAnimation(self, animation):
-        #################################################################
-        # setAnimation(self, animation)
-        # This function will be called each time when user change
-        # the current animation. Most important thing this function do is
-        # to recalculate all variables to fit the selected animation
-        #################################################################
-        self.animName = self.AnimEntry.get()        
-        playRate = '%0.1f' % self['actor'].getPlayRate(self.animName)
-        if playRate not in self.rateList:
-            def strCmp(a, b):
-                return cmp(eval(a), eval(b))
-            self.rateList.append(playRate)
-            self.rateList.sort(strCmp)
-            self.playRateEntry.reset(self.rateList)
-            self.playRateEntry.selectitem(playRate)
-        self.currTime = 0.0
-        self.frameControl.set(0)
-        self.updateDisplay()
-        return
-
-    def setPlayRate(self,rate):
-        #################################################################
-        # setPlayRate(self, rate)
-        # This function will be called each time when user changes the current play rate.
-        #################################################################
-        self.animName = self.AnimEntry.get()
-        if self.animName in self['animList']:
-            self['actor'].setPlayRate(eval(rate), self.animName)
-            self.updateDisplay()
-        return
-
-    def updateDisplay(self):
-        #################################################################
-        # updateDisplay(self)
-        # This function will be called whenever something has been changed
-        # on the panel. In here we will re-new all widgets on the panel to
-        # correct value.
-        #################################################################
-        self.fps = self['actor'].getFrameRate(self.animName)
-        self.duration = self['actor'].getDuration(self.animName)
-        self.maxFrame = self['actor'].getNumFrames(self.animName) - 1
-        self.maxSeconds = self.duration
-        if self.unitsVar.get() == FRAMES:
-            fromFrame = 0
-            toFrame = self.maxFrame
-            self.minLabel['text'] = fromFrame
-            self.maxLabel['text'] = toFrame
-            self.frameControl.configure(from_ = fromFrame,
-                                        to = toFrame,
-                                        resolution = 1.0)
-        else:
-            self.minLabel['text'] = '0.0'
-            self.maxLabel['text'] = "%.2f" % self.duration
-            self.frameControl.configure(from_ = 0.0, 
-                                        to = self.duration,
-                                        resolution = 0.01)
-
-    def gotoT(self,time):
-        #################################################################
-        # gotoT(self, time)
-        # calculate the right parameter which will be send to set Frame
-        # Control slider, which is the real place we play the animation.
-        #################################################################
-        if self.unitsVar.get() == FRAMES:
-            self.frameControl.set(time * self.fps)
-        else:
-            self.frameControl.set(time)
-        return
-
-    def goTo(self,frame):
-        #################################################################
-        # goto(self, frame)
-        # Call back function for the frame control slider.
-        # This function will set the animation by the value on the slider.
-        #
-        # This function is the real function we "play" the animation.
-        #
-        #################################################################
-        if self.animName in self['animList']:
-            # Convert scale value to float
-            frame = string.atof(frame)
-            # Now convert t to seconds for offset calculations
-            if self.unitsVar.get() == FRAMES:
-                frame = frame / self.fps
-            if self.dragMode:
-                # If user is clicking on the slider and is draging the bar, reset the global timer.
-                self.currTime = frame
-            self['actor'].pose(self.animName,
-                            min(self.maxFrame, int(frame * self.fps)))
-        return
-
-    def onRelease(self,frame):
-        #################################################################
-        # onRelease(self, frame)
-        # disable the dragMode when user releases the bar on the slider.
-        #################################################################
-        self.dragMode = False
-        return
-
-    def onPress(self,frame):
-        #################################################################
-        # onPress(self, frame)
-        # enable the dragMode when user press the bar on the slider.
-        #################################################################
-        self.dragMode = True
-        return
-    
-    def resetAllToZero(self):
-        #################################################################
-        # resetAllToZero(self)
-        # reset the global timer to zero and also move the slider to zero.
-        # This will also reset the actor to the zero frame of current animation
-        #################################################################
-        self.currTime = 0.0
-        self.gotoT(0)
-        return
-
-    def resetAllToEnd(self):
-        #################################################################
-        # resetAllToEnd(self)
-        # set the global timer to the end of current animation and
-        # also move the slider to the end.
-        #################################################################
-        self.currTime = self.maxSeconds
-        self.gotoT(self.duration)
-        return
-
-    def onDestroy(self, event):
-        if taskMgr.hasTaskNamed(self.id + '_UpdateTask'):
-            taskMgr.remove(self.id + '_UpdateTask')
-        self.ignore('DataH_loadFinish')
-        messenger.send('AW_close',[self.nodeName])
-        '''
-        If you have open any thing, please rewrite here!
-        '''
-        pass
-
-class LoadAnimPanel(AppShell):
-    #################################################################
-    # LoadAnimPanel(AppShell)
-    # This class will open a dialog to ask user to input names and
-    # file paths of animations
-    #################################################################
-    # Override class variables
-    appname = 'Load Animation'
-    frameWidth  = 575
-    frameHeight = 200
-    usecommandarea = 0
-    usestatusarea  = 0
-    index = 0
-    ## Anim name : File Path
-
-    def __init__(self, aNode =  None, parent = None, **kw):
-        INITOPT = Pmw.INITOPT
-        self.id = 'Load Animation '+ aNode.getName()
-        self.appname = self.id
-        self.animDic = {}
-        self.animList = []
-        optiondefs = (
-            ('title',               self.appname,       None),
-            )
-        self.defineoptions(kw, optiondefs)
-
-        self.frameHeight = 300
-        self.nodeName = aNode.getName()
-        self.Actor = aNode
-        # Initialize the superclass
-        AppShell.__init__(self)
-
-        # Execute option callbacks
-        self.initialiseoptions(LoadAnimPanel)
-
-    def createInterface(self):
-        self.menuBar.destroy()
-        interior = self.interior()
-        mainFrame = Frame(interior)
-        self.inputZone = Pmw.Group(mainFrame, tag_text='File Setting')
-        self.inputZone.pack(fill='both',expand=1)
-        settingFrame = self.inputZone.interior()
-        Label(settingFrame,text='Anim Name').place(anchor=NW,x=60,y=5)
-        Label(settingFrame,text='File Path').place(anchor=NW,x=205,y=5)
-        self.AnimName_1 = self.createcomponent(
-            'Anim Name List', (), None,
-            Pmw.ComboBox, (settingFrame,),label_text='Anim   :',
-            labelpos = W, entry_width = 10, selectioncommand = self.selectAnim,
-            scrolledlist_items = self.animList)
-        self.AnimFile_1 = Pmw.EntryField(settingFrame,value='')
-        self.AnimFile_1.component('entry').config(width=20)
-        self.AnimName_1.place(anchor=NW,x=10,y=25)
-        self.AnimFile_1.place(anchor=NW,x=140,y=25)
-        self.Browse_1 = self.createcomponent(
-            'File Browser1', (), None,
-            Button, (mainFrame,),
-            text = 'Browse...',
-            command = self.Browse_1)
-        self.Browse_1.place(anchor=NW,x=270,y=38)
-
-        self.addIntoButton = self.createcomponent(
-            'Load Add', (), None,
-            Button, (mainFrame,),
-            text = 'Add to Load',
-            command = self.addIntoList)
-        self.addIntoButton.place(anchor=NW,x=345,y=38)
-
-        att_label = Label(mainFrame, font=('MSSansSerif', 10),
-                          text= "Attention! Animations won't be loaded in before you press the 'OK' button below!")
-        att_label.place(anchor=NW,x=10,y=80)
-
-        self.button_ok = Button(mainFrame, text="OK", command=self.ok_press,width=10)
-        self.button_ok.pack(fill=BOTH,expand=0,side=RIGHT)
-
-        mainFrame.pack(expand = 1, fill = BOTH)
-
-        
-        
-    def onDestroy(self, event):
-        messenger.send('AWL_close',[self.nodeName])
-        '''
-        If you have open any thing, please rewrite here!
-        '''
-        pass
-
-    def selectAnim(self,name):
-        #################################################################
-        # selectAnim(self, name)
-        # This function will be called if user select an animation on the list.
-        #################################################################
-        if name in self.animDic:
-            self.AnimFile_1.setvalue = self.animDic[name]
-        return
-
-    def Browse_1(self):
-        #################################################################
-        # Browse_1(self)
-        # when the browse button pused, this function will be called.
-        # Do nothing but open a file dialog for user to set the path to target file
-        # Then, set the path back to the entry on the panel.
-        #################################################################
-        AnimFilename = askopenfilename(
-            defaultextension = '.egg',
-            filetypes = (('Egg Files', '*.egg'),
-                         ('Bam Files', '*.bam'),
-                         ('All files', '*')),
-            initialdir = '.',
-            title = 'File Path for Anim 1',
-            parent = self.parent)
-        if AnimFilename:
-            self.AnimFile_1.setvalue(AnimFilename)
-        return
-
-    def addIntoList(self):
-        #################################################################
-        # addIntoList(self)
-        # This function will be called each time when user click on the
-        # "Add to Load" button. This function will read the current data
-        # on the panel into a dictionary. then reset the list of the animation
-        # name list on this panel.(not the one in the animation panel...)
-        #
-        # This function won't load any animation....
-        #
-        #################################################################
-        name = self.AnimName_1.get()
-        self.animDic[name] = Filename.fromOsSpecific(self.AnimFile_1.getvalue()).getFullpath()
-        if name in self.animList:
-            pass
-        else:
-            self.animList.append(name)
-        self.AnimName_1.setlist(self.animList)
-        print self.animDic
-        return
-
-    def ok_press(self):
-        #################################################################
-        # ok_press(Self)
-        # This functiion will be called when user click on the "OK"
-        # button. This function will send a message along with the animation
-        # file we wish to load for this actor.
-        # Then, it will close the panel itself.
-        #################################################################
-        messenger.send('AW_AnimationLoad',[self.Actor,self.animDic])
-        #print self.animDic
-        self.quit()
-        return

+ 0 - 666
doc/SceneEditor/seBlendAnimPanel.py

@@ -1,666 +0,0 @@
-#################################################################
-# collisionWindow.py
-# Written by Yi-Hong Lin, [email protected], 2004
-#################################################################
-# Import Tkinter, Pmw, and the floater code from this directory tree.
-from direct.tkwidgets.AppShell import *
-from direct.showbase.TkGlobal import *
-from tkSimpleDialog import askfloat
-import string
-import math
-import types
-from direct.task import Task
-
-FRAMES = 0
-SECONDS = 1
-
-
-#####################################################################################
-# BlendAnimPanel(AppShell)
-# This Panel will allow user to blend tow animations
-# that have already been loaded for this actor.
-# user can play and manipulate this blended animation
-# just like in the animation panel. And, they can save this blended animation.
-#####################################################################################
-class BlendAnimPanel(AppShell):
-    # Override class variables
-    appname = 'Blend Anim Panel'
-    frameWidth  = 575
-    frameHeight = 450
-    usecommandarea = 0
-    usestatusarea  = 0
-    index = 0
-    dragMode = False
-    blendRatio = 0
-    rateList= ['1/24.0', '0.1', '0.5', '1.0', '2.0', '5.0' , '10.0']
-    enableBlend = False
-    currentBlendName = None
-
-    
-    def __init__(self, aNode =  None, blendDict={}, parent = None, **kw):
-        INITOPT = Pmw.INITOPT
-        self.id = 'BlendAnimPanel '+ aNode.getName()
-        self.appname = self.id
-        self.actorNode = aNode
-        self.blendDict = blendDict.copy()
-        if len(blendDict)>0:
-            self.blendList = blendDict.keys()
-        else:
-            self.blendList = []
-        optiondefs = (
-            ('title',               self.appname,       None),
-            ('actor',               aNode,              None),
-            ('animList',            [],                 None),
-            ('blendAnimList',       self.blendList,          None),
-            )
-        self.defineoptions(kw, optiondefs)
-
-        self.id = 'Blend AnimPanel '+ aNode.getName()
-        self.nodeName = aNode.getName()
-        # Initialize the superclass
-        AppShell.__init__(self)
-
-        # Execute option callbacks
-        self.initialiseoptions(BlendAnimPanel)
-
-        self.currTime = 0.0
-        self.animNameA = None
-        self.animNameB = None
-
-        self.parent.resizable(False,False) ## Disable the ability to resize for this Window.
-
-    def createInterface(self):
-        # Handle to the toplevels interior
-        interior = self.interior()
-        self.menuBar.destroy()
-
-        # show the actor's name
-        actorFrame = Frame(interior)
-        name_label = Label(actorFrame, text= self.nodeName,font=('MSSansSerif', 14),
-                           relief = SUNKEN, borderwidth=3)
-        name_label.pack(side = TOP, expand = False)
-        actorFrame.pack(side = TOP, expand = False, fill = X)
-
-        # Create a frame to show is there any ore-blended animation and save, edit, rename button.
-        group = Pmw.Group(interior, tag_pyclass=None)
-        actorFrame = group.interior()
-        group.pack(side = TOP, expand = False, fill = X)
-
-        Label(actorFrame, text= "Blended:", font=('MSSansSerif', 10)).pack(side=LEFT)
-        self.blendAnimEntry = self.createcomponent(
-            'Blended Animation', (), None,
-            Pmw.ComboBox, (actorFrame,),
-            labelpos = W, entry_width = 20, selectioncommand = self.setBlendAnim,
-            scrolledlist_items = self['blendAnimList'])
-        self.blendAnimEntry.pack(side=LEFT)
-
-        Label(actorFrame, text= "   ", font=('MSSansSerif', 10)).pack(side=LEFT)
-        
-        button = Button(actorFrame, text="Save", font=('MSSansSerif', 10),width = 12,
-                        command = self.saveButtonPushed).pack(side=LEFT)
-        button = Button(actorFrame, text="Remove", font=('MSSansSerif', 10),width = 12,
-                        command = self.removeButtonPushed).pack(side=LEFT)
-        button = Button(actorFrame, text="Rename", font=('MSSansSerif', 10),width = 12,
-                        command = self.renameButtonPushed).pack(side=LEFT)
-
-        actorFrame.pack(side = TOP, expand = False, fill = X)
-
-        # Create a frame to hold all the animation setting
-        group = Pmw.Group(interior, tag_pyclass=None)
-        actorFrame = group.interior()
-        group.pack(side = TOP, expand = False, fill = X)
-        Label(actorFrame, text= "Animation A:", font=('MSSansSerif', 10)).pack(side=LEFT)
-        self['animList'] = self['actor'].getAnimNames()
-        self.AnimEntryA = self.createcomponent(
-            'AnimationMenuA', (), None,
-            Pmw.ComboBox, (actorFrame,),
-            labelpos = W, entry_width = 20, entry_state = DISABLED,
-            selectioncommand = lambda name, a = 'a' : self.setAnimation(name, AB=a),
-            scrolledlist_items = self['animList'])
-        self.AnimEntryA.pack(side=LEFT)
-
-        Label(actorFrame, text= "   ", font=('MSSansSerif', 10)).pack(side=LEFT,)
-        Label(actorFrame, text= "Animation B:", font=('MSSansSerif', 10)).pack(side=LEFT)
-        self['animList'] = self['actor'].getAnimNames()
-        self.AnimEntryB = self.createcomponent(
-            'AnimationMenuB', (), None,
-            Pmw.ComboBox, (actorFrame,),
-            labelpos = W, entry_width = 20, entry_state = DISABLED,
-            selectioncommand = lambda name, a = 'b' : self.setAnimation(name, AB=a),
-            scrolledlist_items = self['animList'])
-        self.AnimEntryB.pack(side=LEFT)
-        actorFrame.pack(side = TOP, expand = False, fill = X)
-        
-        ### Blend Enable checkbox
-        actorFrame = Frame(interior, relief = SUNKEN, bd = 1)
-        Label(actorFrame, text= "Enable Blending:", font=('MSSansSerif', 10)).pack(side=LEFT,)
-        self.blendVar = IntVar()
-        self.blendVar.set(0)
-        self.blendButton = self.createcomponent(
-            'blendButton', (), None,
-            Checkbutton, (actorFrame,),
-            variable = self.blendVar,
-            command = self.toggleBlend)
-        self.blendButton.pack(side=LEFT)
-        actorFrame.pack(side = TOP, expand = False, fill = X)
-
-        ## Ratio control
-        actorFrame = Frame(interior)
-        frameFrame = Frame(actorFrame, relief = SUNKEN, bd = 1)
-        minRatioLabel = self.createcomponent(
-            'minRatioLabel', (), 'sLabel',
-            Label, (frameFrame,),
-            text = 0.00)
-        minRatioLabel.pack(side = LEFT)
-
-        self.ratioControl = self.createcomponent(
-            'ratio', (), None,
-            Scale, (frameFrame,),
-            from_ = 0.0, to = 1.0, resolution = 0.01,
-            command = self.setRatio, length = 500,
-            orient = HORIZONTAL, showvalue = 1)
-        self.ratioControl.pack(side = LEFT, expand = 1)
-        self.ratioControl.set(1.0)
-
-        self.maxRatioLabel = self.createcomponent(
-            'maxRatioLabel', (), 'sLabel',
-            Label, (frameFrame,),
-            text = 1.00)
-        self.maxRatioLabel.pack(side = LEFT)
-        frameFrame.pack(side = LEFT, expand = 1, fill = X)
-        actorFrame.pack(side = TOP, expand = True, fill = X)
-
-        ###################################################################################
-        ###################################################################################
-        actorFrame = Frame(interior)
-        Label(actorFrame, text= "Play Rate:", font=('MSSansSerif', 10)).pack(side=LEFT)
-        self.playRateEntry = self.createcomponent(
-            'playRateMenu', (), None,
-            Pmw.ComboBox, (actorFrame,),
-            labelpos = W, entry_width = 20, selectioncommand = self.setPlayRate,
-            scrolledlist_items = self.rateList)
-        self.playRateEntry.pack(side=LEFT)
-        self.playRateEntry.selectitem('1.0')
-
-        ### Loop checkbox        
-        Label(actorFrame, text= "   ", font=('MSSansSerif', 10)).pack(side=LEFT,)
-        Label(actorFrame, text= "Loop:", font=('MSSansSerif', 10)).pack(side=LEFT,)
-
-        self.loopVar = IntVar()
-        self.loopVar.set(0)
-        self.loopButton = self.createcomponent(
-            'loopButton', (), None,
-            Checkbutton, (actorFrame,),
-            variable = self.loopVar)
-        self.loopButton.pack(side=LEFT)
-        
-        actorFrame.pack(side = TOP, expand = True, fill = X)
-
-        
-        
-        ### Display Frames/Seconds
-        actorFrame = Frame(interior)
-        
-        Label(actorFrame, text= "Frame/Second:", font=('MSSansSerif', 10)).pack(side=LEFT)
-
-        self.unitsVar = IntVar()
-        self.unitsVar.set(FRAMES)
-        self.displayButton = self.createcomponent(
-            'displayButton', (), None,
-            Checkbutton, (actorFrame,),
-            command = self.updateDisplay,
-            variable = self.unitsVar)
-        self.displayButton.pack(side=LEFT)
-
-        actorFrame.pack(side = TOP, expand = True, fill = X)
-        
-        ## scale control
-        actorFrame = Frame(interior)
-        frameFrame = Frame(actorFrame, relief = SUNKEN, bd = 1)
-        self.minLabel = self.createcomponent(
-            'minLabel', (), 'sLabel',
-            Label, (frameFrame,),
-            text = 0)
-        self.minLabel.pack(side = LEFT)
-
-        self.frameControl = self.createcomponent(
-            'scale', (), None,
-            Scale, (frameFrame,),
-            from_ = 0, to = 24, resolution = 1.0,
-            command = self.goTo, length = 500,
-            orient = HORIZONTAL, showvalue = 1)
-        self.frameControl.pack(side = LEFT, expand = 1)
-        self.frameControl.bind('<Button-1>', self.onPress)
-        self.frameControl.bind('<ButtonRelease-1>', self.onRelease)
-
-        self.maxLabel = self.createcomponent(
-            'maxLabel', (), 'sLabel',
-            Label, (frameFrame,),
-            text = 24)
-        self.maxLabel.pack(side = LEFT)
-        frameFrame.pack(side = LEFT, expand = 1, fill = X)
-        actorFrame.pack(side = TOP, expand = True, fill = X)
-        
-        ## button contorl
-        actorFrame = Frame(interior)
-        ButtomFrame = Frame(actorFrame, relief = SUNKEN, bd = 1,borderwidth=5)
-        self.toStartButton = self.createcomponent(
-            'toStart', (), None,
-            Button, (ButtomFrame,),
-            text = '<<',
-            width = 8,
-            command = self.resetAllToZero)
-        self.toStartButton.pack(side = LEFT, expand = 1, fill = X)
-        
-        self.playButton = self.createcomponent(
-            'playButton', (), None,
-            Button, (ButtomFrame,),
-            text = 'Play', width = 8,
-            command = self.play)
-        self.playButton.pack(side = LEFT, expand = 1, fill = X)
-
-        self.stopButton = self.createcomponent(
-            'stopButton', (), None,
-            Button, (ButtomFrame,),
-            text = 'Stop', width = 8, state=DISABLED,
-            command = self.stop)
-        self.stopButton.pack(side = LEFT, expand = 1, fill = X)
-
-        self.toEndButton = self.createcomponent(
-            'toEnd', (), None,
-            Button, (ButtomFrame,),
-            text = '>>',
-            width = 8,
-            command = self.resetAllToEnd)
-        self.toEndButton.pack(side = LEFT, expand = 1, fill = X)
-
-        ButtomFrame.pack(side = TOP, expand = True, fill = X)
-        actorFrame.pack(expand = 1, fill = BOTH)
-
-    def updateList(self):
-        #################################################################
-        # updateList(self)
-        # This will reset the list of all animations that this actor has
-        # to the animation entry A and B.
-        #################################################################
-        self['animList'] = self['actor'].getAnimNames()
-        animL = self['actor'].getAnimNames()
-        self.AnimEntryA.setlist(animL)
-        self.AnimEntryB.setlist(animL)
-            
-    def play(self):
-        #################################################################
-        # play(self)
-        # It works pretty much like what we have in the Animation Panel.
-        # The only different now is that we set two "pose" here.
-        # When you do the blending animation by setPose, you don't have
-        # to set them simultaneously.
-        #################################################################
-        self.animNameA = self.AnimEntryA.get()
-        self.animNameB = self.AnimEntryB.get()
-        if (self.animNameA in self['animList'])and(self.animNameB in self['animList']):
-            self.playButton.config(state=DISABLED)
-            self.lastT = globalClock.getFrameTime()
-            taskMgr.add(self.playTask, self.id + '_UpdateTask')
-            self.stopButton.config(state=NORMAL)
-        else:
-            print '----Illegal Animaion name!!', self.animNameA +  ',  '+ self.animNameB
-        return
-
-    def playTask(self, task):
-        #################################################################
-        # playTask(self, task)
-        # see play(self)
-        #################################################################
-        fLoop = self.loopVar.get()
-        currT = globalClock.getFrameTime()
-        deltaT = currT - self.lastT
-        self.lastT = currT
-        if self.dragMode:
-            return Task.cont
-        self.currTime = self.currTime + deltaT
-        if (self.currTime > self.maxSeconds):
-            if fLoop:
-                self.currTime = self.currTime%self.duration
-                self.gotoT(self.currTime)
-            else:
-                self.currTime = 0.0
-                self.gotoT(0.0)
-                self.playButton.config(state=NORMAL)
-                self.stopButton.config(state=DISABLED)
-                return Task.done
-        else:
-            self.gotoT(self.currTime)    
-        return Task.cont
-
-    def stop(self):
-        #################################################################
-        # stop(self)
-        # see play(self)
-        #################################################################
-        taskMgr.remove(self.id + '_UpdateTask')
-        self.playButton.config(state=NORMAL)
-        self.stopButton.config(state=DISABLED)
-        return
-
-    def setAnimation(self, animation, AB = 'a'):
-        #################################################################
-        # setAnimation(self, animation, AB = 'a')
-        # see play(self)
-        #################################################################
-        print 'OK!!!'
-        if AB == 'a':
-            if self.animNameA != None:
-                self['actor'].setControlEffect(self.animNameA, 1.0, 'modelRoot','lodRoot')
-            self.animNameA = self.AnimEntryA.get()
-        else:
-            if self.animNameB != None:
-                self['actor'].setControlEffect(self.animNameB, 1.0, 'modelRoot','lodRoot')
-            self.animNameB = self.AnimEntryB.get()
-        self.currTime = 0.0
-        self.frameControl.set(0)
-        self.updateDisplay()
-        self.setRatio(self.blendRatio)
-        return
-
-    def setPlayRate(self,rate):
-        #################################################################
-        # setPlayRate(self,rate)
-        # see play(self)
-        #################################################################
-        self.animNameA = self.AnimEntryA.get()
-        if self.animNameA in self['animList']:
-            self['actor'].setPlayRate(eval(rate), self.animNameA)
-            self.updateDisplay()
-        if self.animNameB in self['animList']:
-            self['actor'].setPlayRate(eval(rate), self.animNameB)
-            self.updateDisplay()
-        return
-
-    def updateDisplay(self):
-        #################################################################
-        # updateDisplay(self)
-        # see play(self)
-        #################################################################
-        if not (self.animNameA in self['animList']):
-            return
-        self.fps = self['actor'].getFrameRate(self.animNameA)
-        self.duration = self['actor'].getDuration(self.animNameA)
-        self.maxFrame = self['actor'].getNumFrames(self.animNameA) - 1
-        if not (self.animNameB in self['animList']):
-            return
-        if self.duration > self['actor'].getDuration(self.animNameB):
-            self.duration = self['actor'].getDuration(self.animNameB)
-        if self.maxFrame > self['actor'].getNumFrames(self.animNameB) - 1:
-            self.maxFrame = self['actor'].getNumFrames(self.animNameB) - 1
-        self.maxSeconds = self.duration
-        if self.unitsVar.get() == FRAMES:
-            fromFrame = 0
-            toFrame = self.maxFrame
-            self.minLabel['text'] = fromFrame
-            self.maxLabel['text'] = toFrame
-            self.frameControl.configure(from_ = fromFrame,
-                                        to = toFrame,
-                                        resolution = 1.0)
-        else:
-            self.minLabel['text'] = '0.0'
-            self.maxLabel['text'] = "%.2f" % self.duration
-            self.frameControl.configure(from_ = 0.0, 
-                                        to = self.duration,
-                                        resolution = 0.01)
-
-    def gotoT(self,time):
-        #################################################################
-        # gotoT(self,time)
-        # see play(self)
-        #################################################################
-        if self.unitsVar.get() == FRAMES:
-            self.frameControl.set(time * self.fps)
-        else:
-            self.frameControl.set(time)
-        return
-
-    def goTo(self,frame):
-        #################################################################
-        # goTo(self,frame)
-        # see play(self)
-        #################################################################
-        if (self.animNameA in self['animList'])and(self.animNameB in self['animList']):
-            # Convert scale value to float
-            frame = string.atof(frame)
-            # Now convert t to seconds for offset calculations
-            if self.unitsVar.get() == FRAMES:
-                frame = frame / self.fps
-            if self.dragMode:
-                self.currTime = frame
-            self['actor'].pose(self.animNameA,
-                            min(self.maxFrame, int(frame * self.fps)))
-            self['actor'].pose(self.animNameB,
-                            min(self.maxFrame, int(frame * self.fps)))
-        return
-
-    def onRelease(self,frame):
-        #################################################################
-        # onRelease(self,frame)
-        # see play(self)
-        #################################################################
-        self.dragMode = False
-        return
-
-    def onPress(self,frame):
-        #################################################################
-        # onPress(self,frame)
-        # see play(self)
-        #################################################################
-        self.dragMode = True
-        return
-    
-    def resetAllToZero(self):
-        #################################################################
-        # resetAllToZero(self)
-        # see play(self)
-        #################################################################
-        self.currTime = 0.0
-        self.gotoT(0)
-        return
-
-    def resetAllToEnd(self):
-        #################################################################
-        # resetAllToEnd(self)
-        # see play(self)
-        #################################################################
-        self.currTime = self.maxSeconds
-        self.gotoT(self.duration)
-        return
-
-    def toggleBlend(self):
-        #################################################################
-        # toggleBlend(self)
-        # This function will enable the blending option for the actor.
-        # and call set ratio function to set the blending animation mixing in
-        # current ratio.
-        #
-        # This blending enable will not be keep when you close the window!
-        #
-        #################################################################
-        if self.blendVar.get():
-            self.enableBlend = True
-            self['actor'].enableBlend()
-            self.setRatio(self.blendRatio)
-        else:
-            self.enableBlend = False
-            self['actor'].disableBlend()
-        return
-
-    def setRatio(self, ratio):
-        #################################################################
-        # setRatio(self, ratio)
-        # callback funtion
-        # This one will be called each time when user drag the blend ratio
-        # slider on the panel. This will set the blening ratio to both animation.
-        # (Which is "setControlEffect")
-        #################################################################
-        self.blendRatio = float(ratio)
-        if self.enableBlend:
-            if self.animNameA in self['animList']:
-                self['actor'].setControlEffect(self.animNameA, self.blendRatio, 'modelRoot','lodRoot')
-            if self.animNameB in self['animList']:
-                self['actor'].setControlEffect(self.animNameB, 1-self.blendRatio, 'modelRoot','lodRoot')
-            return
-
-    def setBlendAnim(self, name):
-        #################################################################
-        # setBlendAnim(self, name)
-        # This function will be called each time when user try to select
-        # a existing blending animation from the comboBox on the panel
-        # This function will re-set every varaibles on the panel to what
-        # it should be. For example, when user choose blending anim "R,"
-        # which was blended by anim "a" and "b" with ratio "c,"
-        # then this function will set Animation A to "a" and animation B
-        # to "b" and set the ratio slider to "c" position.
-        #################################################################
-        if self.blendDict.has_key(name):
-            self.currentBlendName = name
-            animA = self.blendDict[name][0]
-            animB = self.blendDict[name][1]
-            ratio = self.blendDict[name][2]
-            self.AnimEntryA.selectitem(animA)
-            self.AnimEntryB.selectitem(animB)
-            self.setAnimation(animA, AB = 'a')
-            self.setAnimation(animB, AB = 'b')
-            self.ratioControl.set(ratio)
-        return
-
-    def setBlendAnimList(self, dict, select=False):
-        #################################################################
-        # setBlendAnimList(self, dict, select=False)
-        # This function will be called when we need to reset the dropdown list
-        # of "Blend Anim."
-        # About "selec" option, this now is mainly used when we remove
-        # a blended animation from the actor. When it has been specified to True,
-        # the function will not only reset the list, but will also automatically
-        # select one from the top of list, if it is not empty.
-        #################################################################
-        self.blendDict.clear()
-        del self.blendDict
-        self.blendDict = dict.copy()
-        print self.blendDict
-        if len(self.blendDict)>0:
-            self.blendList = self.blendDict.keys()
-        else:
-            self.blendList = []
-        self.blendAnimEntry.setlist(self.blendList)
-        if select:
-            if len(self.blendList)>0:
-                self.blendAnimEntry.selectitem(self.blendList[0])
-                self.setBlendAnim(self.blendList[0])
-                self.currentBlendName = self.blendList[0]
-            else:
-                self.blendAnimEntry.clear()
-                self.currentBlendName = None
-        return
-    
-    def saveButtonPushed(self):
-        #################################################################
-        # saveButtonPushed(self)
-        # This function will be called when user clicked on the "Save" button
-        # This functiont will collect all data on the panel and send them with
-        # a message to sceneEditor to save the current blending animation
-        # into the dataHolder.
-        #################################################################
-        name = self.blendAnimEntry.get()
-        if name=='':
-            Pmw.MessageDialog(None, title='Caution!',
-                              message_text = 'You have to give the blending animation a name first!',
-                              iconpos='s',
-                              defaultbutton = 'Close'
-                              )
-            return
-        elif (not(self.animNameA in self['animList']))or(not(self.animNameB in self['animList'])):
-            Pmw.MessageDialog(None, title='Caution!',
-                              message_text = 'The Animations you have selected are not exist!',
-                              iconpos='s',
-                              defaultbutton = 'Close'
-                              )
-            return
-        else:
-            messenger.send('BAW_saveBlendAnim', [self['actor'].getName(),
-                                                 name,
-                                                 self.animNameA,
-                                                 self.animNameB,
-                                                 self.blendRatio])
-            self.currentBlendName = name
-        return
-
-    def removeButtonPushed(self):
-        #################################################################
-        # removeButtonPushed(self)
-        # remove the current seleted blended animation from the actor.
-        # This will send out a message to sceneEditor to delete the data inside
-        # the dataHolder and then reset the list of here.
-        #################################################################
-        name = self.blendAnimEntry.get()
-        messenger.send('BAW_removeBlendAnim', [self['actor'].getName(),name])
-        return
-
-    def renameButtonPushed(self):
-        #################################################################
-        # renameButtonPushed(self)
-        # this function will be called when user click on the "Rename" button.
-        # This function will collect all data on the panel and send them out
-        # with a message to sceneEditor to rename and re-save all setting about
-        # current animation.
-        #################################################################
-        oName = self.currentBlendName
-        name = self.blendAnimEntry.get()
-        if self.currentBlendName == None:
-            Pmw.MessageDialog(None, title='Caution!',
-                              message_text = "You haven't select any blended animation!!",
-                              iconpos='s',
-                              defaultbutton = 'Close'
-                              )
-            return
-        elif name=='':
-            Pmw.MessageDialog(None, title='Caution!',
-                              message_text = 'You have to give the blending animation a name first!',
-                              iconpos='s',
-                              defaultbutton = 'Close'
-                              )
-            return
-        elif (not(self.animNameA in self['animList']))or(not(self.animNameB in self['animList'])):
-            Pmw.MessageDialog(None, title='Caution!',
-                              message_text = 'The Animations you have selected are not exist!',
-                              iconpos='s',
-                              defaultbutton = 'Close'
-                              )
-            return
-        else:
-            messenger.send('BAW_renameBlendAnim', [self['actor'].getName(),
-                                                   name,
-                                                   oName,
-                                                   self.animNameA,
-                                                   self.animNameB,
-                                                   self.blendRatio]
-                           )
-            self.currentBlendName = name
-        return
-
-    def onDestroy(self, event):
-        #################################################################
-        # onDestroy(self, event)
-        # This function will be call when user try to close the window.
-        # In here we will stop all tasks we have opend and disable the
-        # blend setting of actor.
-        # If we didn't disable the blend option, the next time you play
-        # the animation via animation panel will cause some error.
-        #################################################################
-        if taskMgr.hasTaskNamed(self.id + '_UpdateTask'):
-            taskMgr.remove(self.id + '_UpdateTask')
-        messenger.send('BAW_close',[self.nodeName])
-        self.actorNode.setControlEffect(self.animNameA, 1.0, 'modelRoot','lodRoot')
-        self.actorNode.setControlEffect(self.animNameB, 1.0, 'modelRoot','lodRoot')
-        self.actorNode.disableBlend()
-        '''
-        If you have open any thing, please rewrite here!
-        '''
-        pass

+ 0 - 670
doc/SceneEditor/seCameraControl.py

@@ -1,670 +0,0 @@
-#################################################################
-# seCameraControl.py
-# Originally from DirectCameraControl.py
-# Altered by Yi-Hong Lin, [email protected], 2004
-#
-# We didn't change anything essential.
-# Just because we customized the seSession from DirectSession,
-# So we need related files can follow the change.
-# However, we don't want to change anything inside the original directool
-# to let them can work with our scene editor.
-# (If we do change original directools, it will force user has to install the latest version of OUR Panda)
-#
-#################################################################
-from direct.showbase.DirectObject import DirectObject
-from direct.directtools.DirectUtil import *
-from seGeometry import *
-from direct.directtools.DirectGlobals import *
-from direct.task import Task
-
-CAM_MOVE_DURATION = 1.2
-COA_MARKER_SF = 0.0075
-Y_AXIS = Vec3(0,1,0)
-
-class DirectCameraControl(DirectObject):
-    def __init__(self):
-        # Create the grid
-        self.startT = 0.0
-        self.startF = 0
-        self.orthoViewRoll = 0.0
-        self.lastView = 0
-        self.coa = Point3(0,100,0)
-        self.coaMarker = loader.loadModel('models/misc/sphere')
-        self.coaMarker.setName('DirectCameraCOAMarker')
-        self.coaMarker.setTransparency(1)
-        self.coaMarker.setColor(1,0,0,0)
-        self.coaMarker.setPos(0,100,0)
-        useDirectRenderStyle(self.coaMarker)
-        self.coaMarkerPos = Point3(0)
-        self.fLockCOA = 0
-        self.nullHitPointCount = 0
-        self.cqEntries = []
-        self.coaMarkerRef = SEditor.group.attachNewNode('coaMarkerRef')
-        self.camManipRef = SEditor.group.attachNewNode('camManipRef')
-        t = CAM_MOVE_DURATION
-        self.actionEvents = [
-            ['DIRECT-mouse2', self.mouseFlyStart],
-            ['DIRECT-mouse2Up', self.mouseFlyStop],
-            ]
-        self.keyEvents = [
-            ['c', self.centerCamIn, 0.5],
-            ['f', self.fitOnWidget],
-            ['h', self.homeCam],
-            ['shift-v', self.toggleMarkerVis],
-            ['m', self.moveToFit],
-            ['n', self.pickNextCOA],
-            ['u', self.orbitUprightCam],
-            ['shift-u', self.uprightCam],
-            [`1`, self.spawnMoveToView, 1],
-            [`2`, self.spawnMoveToView, 2],
-            [`3`, self.spawnMoveToView, 3],
-            [`4`, self.spawnMoveToView, 4],
-            [`5`, self.spawnMoveToView, 5],
-            [`6`, self.spawnMoveToView, 6],
-            [`7`, self.spawnMoveToView, 7],
-            [`8`, self.spawnMoveToView, 8],
-            ['9', self.swingCamAboutWidget, -90.0, t],
-            ['0', self.swingCamAboutWidget,  90.0, t],
-            ['`', self.removeManipulateCameraTask],
-            ['=', self.zoomCam, 0.5, t],
-            ['+', self.zoomCam, 0.5, t],
-            ['-', self.zoomCam, -2.0, t],
-            ['_', self.zoomCam, -2.0, t],
-            ]
-
-    def toggleMarkerVis(self):
-        if SEditor.cameraControl.coaMarker.isHidden():
-            SEditor.cameraControl.coaMarker.show()
-        else:
-            SEditor.cameraControl.coaMarker.hide()
-
-    def mouseFlyStart(self, modifiers):
-        # Record undo point
-        SEditor.pushUndo([SEditor.camera])
-        # Where are we in the display region?
-        if ((abs(SEditor.dr.mouseX) < 0.9) and (abs(SEditor.dr.mouseY) < 0.9)):
-            # MOUSE IS IN CENTRAL REGION
-            # Hide the marker for this kind of motion
-            self.coaMarker.hide()
-            # Record time of start of mouse interaction
-            self.startT= globalClock.getFrameTime()
-            self.startF = globalClock.getFrameCount()
-            # Start manipulation
-            self.spawnXZTranslateOrHPanYZoom()
-            # END MOUSE IN CENTRAL REGION
-        else:
-            if ((abs(SEditor.dr.mouseX) > 0.9) and
-                (abs(SEditor.dr.mouseY) > 0.9)):
-                # Mouse is in corners, spawn roll task
-                self.spawnMouseRollTask()
-            else:
-                # Mouse is in outer frame, spawn mouseRotateTask
-                self.spawnMouseRotateTask()
-
-    def mouseFlyStop(self):
-        taskMgr.remove('manipulateCamera')
-        stopT = globalClock.getFrameTime()
-        deltaT = stopT - self.startT
-        stopF = globalClock.getFrameCount()
-        deltaF = stopF - self.startF
-        if (deltaT <= 0.25) or (deltaF <= 1):
-            # Check for a hit point based on
-            # current mouse position
-            # Allow intersection with unpickable objects
-            # And then spawn task to determine mouse mode
-            # Don't intersect with hidden or backfacing objects
-            skipFlags = SKIP_HIDDEN | SKIP_BACKFACE
-            # Skip camera (and its children), unless control key is pressed
-            skipFlags |= SKIP_CAMERA * (1 - base.getControl())
-            self.computeCOA(SEditor.iRay.pickGeom(skipFlags = skipFlags))
-            # Record reference point
-            self.coaMarkerRef.iPosHprScale(base.cam)
-            # Record entries
-            self.cqEntries = []
-            for i in range(SEditor.iRay.getNumEntries()):
-                self.cqEntries.append(SEditor.iRay.getEntry(i))
-        # Show the marker
-        self.coaMarker.show()
-        # Resize it
-        self.updateCoaMarkerSize()
-
-    def spawnXZTranslateOrHPanYZoom(self):
-        # Kill any existing tasks
-        taskMgr.remove('manipulateCamera')
-        # Spawn the new task
-        t = Task.Task(self.XZTranslateOrHPanYZoomTask)
-        # For HPanYZoom
-        t.zoomSF = Vec3(self.coaMarker.getPos(SEditor.camera)).length()
-        taskMgr.add(t, 'manipulateCamera')
-
-    def spawnXZTranslateOrHPPan(self):
-        # Kill any existing tasks
-        taskMgr.remove('manipulateCamera')
-        # Spawn new task
-        taskMgr.add(self.XZTranslateOrHPPanTask,
-                    'manipulateCamera')
-
-    def spawnXZTranslate(self):
-        # Kill any existing tasks
-        taskMgr.remove('manipulateCamera')
-        # Spawn new task
-        taskMgr.add(self.XZTranslateTask, 'manipulateCamera')
-
-    def spawnHPanYZoom(self):
-        # Kill any existing tasks
-        taskMgr.remove('manipulateCamera')
-        # Spawn new task
-        t = Task.Task(self.HPanYZoomTask)
-        t.zoomSF = Vec3(self.coaMarker.getPos(SEditor.camera)).length()
-        taskMgr.add(t, 'manipulateCamera')
-
-    def spawnHPPan(self):
-        # Kill any existing tasks
-        taskMgr.remove('manipulateCamera')
-        # Spawn new task
-        taskMgr.add(self.HPPanTask, 'manipulateCamera')
-
-    def XZTranslateOrHPanYZoomTask(self, state):
-        if SEditor.fShift:
-            return self.XZTranslateTask(state)
-        else:
-            return self.HPanYZoomTask(state)
-
-    def XZTranslateOrHPPanTask(self, state):
-        if SEditor.fShift:
-            # Panning action
-            return self.HPPanTask(state)
-        else:
-            # Translation action
-            return self.XZTranslateTask(state)
-
-    def XZTranslateTask(self,state):
-        coaDist = Vec3(self.coaMarker.getPos(SEditor.camera)).length()
-        xlateSF = (coaDist / SEditor.dr.near)
-        SEditor.camera.setPos(SEditor.camera,
-                             (-0.5 * SEditor.dr.mouseDeltaX *
-                              SEditor.dr.nearWidth *
-                              xlateSF),
-                             0.0,
-                             (-0.5 * SEditor.dr.mouseDeltaY *
-                              SEditor.dr.nearHeight *
-                              xlateSF))
-        return Task.cont
-
-    def HPanYZoomTask(self,state):
-        if SEditor.fControl:
-            moveDir = Vec3(self.coaMarker.getPos(SEditor.camera))
-            # If marker is behind camera invert vector
-            if moveDir[1] < 0.0:
-                moveDir.assign(moveDir * -1)
-            moveDir.normalize()
-        else:
-            moveDir = Vec3(Y_AXIS)
-        moveDir.assign(moveDir * (-1.0 * SEditor.dr.mouseDeltaY *
-                                        state.zoomSF))
-        if SEditor.dr.mouseDeltaY > 0.0:
-            moveDir.setY(moveDir[1] * 1.0)
-        SEditor.camera.setPosHpr(SEditor.camera,
-                                moveDir[0],
-                                moveDir[1],
-                                moveDir[2],
-                                (0.5 * SEditor.dr.mouseDeltaX *
-                                 SEditor.dr.fovH),
-                                0.0, 0.0)
-        return Task.cont
-
-    def HPPanTask(self, state):
-        SEditor.camera.setHpr(SEditor.camera,
-                             (0.5 * SEditor.dr.mouseDeltaX *
-                              SEditor.dr.fovH),
-                             (-0.5 * SEditor.dr.mouseDeltaY *
-                              SEditor.dr.fovV),
-                             0.0)
-        return Task.cont
-
-    def spawnMouseRotateTask(self):
-        # Kill any existing tasks
-        taskMgr.remove('manipulateCamera')
-        # Set at markers position in render coordinates
-        self.camManipRef.setPos(self.coaMarkerPos)
-        self.camManipRef.setHpr(SEditor.camera, ZERO_POINT)
-        t = Task.Task(self.mouseRotateTask)
-        if abs(SEditor.dr.mouseX) > 0.9:
-            t.constrainedDir = 'y'
-        else:
-            t.constrainedDir = 'x'
-        taskMgr.add(t, 'manipulateCamera')
-
-    def mouseRotateTask(self, state):
-        # If moving outside of center, ignore motion perpendicular to edge
-        if ((state.constrainedDir == 'y') and (abs(SEditor.dr.mouseX) > 0.9)):
-            deltaX = 0
-            deltaY = SEditor.dr.mouseDeltaY
-        elif ((state.constrainedDir == 'x') and (abs(SEditor.dr.mouseY) > 0.9)):
-            deltaX = SEditor.dr.mouseDeltaX
-            deltaY = 0
-        else:
-            deltaX = SEditor.dr.mouseDeltaX
-            deltaY = SEditor.dr.mouseDeltaY
-        if SEditor.fShift:
-            SEditor.camera.setHpr(SEditor.camera,
-                                 (deltaX * SEditor.dr.fovH),
-                                 (-deltaY * SEditor.dr.fovV),
-                                 0.0)
-            self.camManipRef.setPos(self.coaMarkerPos)
-            self.camManipRef.setHpr(SEditor.camera, ZERO_POINT)
-        else:
-            wrt = SEditor.camera.getTransform( self.camManipRef )
-            self.camManipRef.setHpr(self.camManipRef,
-                                    (-1 * deltaX * 180.0),
-                                    (deltaY * 180.0),
-                                    0.0)
-            SEditor.camera.setTransform(self.camManipRef, wrt)
-        return Task.cont
-
-    def spawnMouseRollTask(self):
-        # Kill any existing tasks
-        taskMgr.remove('manipulateCamera')
-        # Set at markers position in render coordinates
-        self.camManipRef.setPos(self.coaMarkerPos)
-        self.camManipRef.setHpr(SEditor.camera, ZERO_POINT)
-        t = Task.Task(self.mouseRollTask)
-        t.coaCenter = getScreenXY(self.coaMarker)
-        t.lastAngle = getCrankAngle(t.coaCenter)
-        # Store the camera/manipRef offset transform
-        t.wrt = SEditor.camera.getTransform( self.camManipRef )
-        taskMgr.add(t, 'manipulateCamera')
-
-    def mouseRollTask(self, state):
-        wrt = state.wrt
-        angle = getCrankAngle(state.coaCenter)
-        deltaAngle = angle - state.lastAngle
-        state.lastAngle = angle
-        if base.config.GetBool('temp-hpr-fix',0):
-            self.camManipRef.setHpr(self.camManipRef, 0, 0, deltaAngle)
-        else:
-            self.camManipRef.setHpr(self.camManipRef, 0, 0, -deltaAngle)
-        SEditor.camera.setTransform(self.camManipRef, wrt)
-        return Task.cont
-
-    def lockCOA(self):
-        self.fLockCOA = 1
-        SEditor.message('COA Lock On')
-            
-    def unlockCOA(self):
-        self.fLockCOA = 0
-        SEditor.message('COA Lock Off')
-
-    def toggleCOALock(self):
-        self.fLockCOA = 1 - self.fLockCOA
-        if self.fLockCOA:
-            SEditor.message('COA Lock On')
-        else:
-            SEditor.message('COA Lock Off')
-
-    def pickNextCOA(self):
-        """ Cycle through collision handler entries """
-        if self.cqEntries:
-            # Get next entry and rotate entries
-            entry = self.cqEntries[0]
-            self.cqEntries = self.cqEntries[1:] + self.cqEntries[:1]
-            # Filter out object's under camera
-            nodePath = entry.getIntoNodePath()
-            if SEditor.camera not in nodePath.getAncestors():
-                # Compute new hit point
-                hitPt = entry.getSurfacePoint(entry.getFromNodePath())
-                # Move coa marker to new point
-                self.updateCoa(hitPt, ref = self.coaMarkerRef)
-            else:
-                # Remove offending entry
-                self.cqEntries = self.cqEntries[:-1]
-                self.pickNextCOA()
-
-    def computeCOA(self, entry):
-        coa = Point3(0)
-        dr = SEditor.drList.getCurrentDr()
-        if self.fLockCOA:
-            # COA is locked, use existing point
-            # Use existing point
-            coa.assign(self.coaMarker.getPos(SEditor.camera))
-            # Reset hit point count
-            self.nullHitPointCount = 0
-        elif entry:
-            # Got a hit point (hit point is in camera coordinates)
-            # Set center of action
-            hitPt = entry.getSurfacePoint(entry.getFromNodePath())
-            hitPtDist = Vec3(hitPt).length()
-            coa.assign(hitPt)
-            # Handle case of bad coa point (too close or too far)
-            if ((hitPtDist < (1.1 * dr.near)) or
-                (hitPtDist > dr.far)):
-                # Just use existing point
-                coa.assign(self.coaMarker.getPos(SEditor.camera))
-            # Reset hit point count
-            self.nullHitPointCount = 0
-        else:
-            # Increment null hit point count
-            self.nullHitPointCount = (self.nullHitPointCount + 1) % 7
-            # No COA lock and no intersection point
-            # Use a point out in front of camera
-            # Distance to point increases on multiple null hit points
-            # MRM: Would be nice to be able to control this
-            # At least display it
-            dist = pow(10.0, self.nullHitPointCount)
-            SEditor.message('COA Distance: ' + `dist`)
-            coa.set(0,dist,0)
-        # Compute COA Dist
-        coaDist = Vec3(coa - ZERO_POINT).length()
-        if coaDist < (1.1 * dr.near):
-            coa.set(0,100,0)
-            coaDist = 100
-        # Update coa and marker
-        self.updateCoa(coa, coaDist = coaDist)
-
-    def updateCoa(self, ref2point, coaDist = None, ref = None):
-        self.coa.set(ref2point[0], ref2point[1], ref2point[2])
-        if not coaDist:
-            coaDist = Vec3(self.coa - ZERO_POINT).length()
-        # Place the marker in render space
-        if ref == None:
-            # KEH: use the current display region
-            # ref = base.cam
-            ref = SEditor.drList.getCurrentDr().cam
-        self.coaMarker.setPos(ref, self.coa)
-        pos = self.coaMarker.getPos()
-        self.coaMarker.setPosHprScale(pos, Vec3(0), Vec3(1))
-        # Resize it
-        self.updateCoaMarkerSize(coaDist)
-        # Record marker pos in render space
-        self.coaMarkerPos.assign(self.coaMarker.getPos())
-
-    def updateCoaMarkerSizeOnDeath(self, state):
-        # Needed because tasks pass in state as first arg
-        self.updateCoaMarkerSize()
-
-    def updateCoaMarkerSize(self, coaDist = None):
-        if not coaDist:
-            coaDist = Vec3(self.coaMarker.getPos( SEditor.camera )).length()
-        # KEH: use current display region for fov
-        # sf = COA_MARKER_SF * coaDist * math.tan(deg2Rad(SEditor.dr.fovV))
-        sf = COA_MARKER_SF * coaDist * math.tan(deg2Rad(SEditor.drList.getCurrentDr().fovV))
-        if sf == 0.0:
-            sf = 0.1
-        self.coaMarker.setScale(sf)
-        # Lerp color to fade out
-        self.coaMarker.lerpColor(VBase4(1,0,0,1), VBase4(1,0,0,0), 3.0,
-                                 task = 'fadeAway')
-
-    def homeCam(self):
-        # Record undo point
-        SEditor.pushUndo([SEditor.camera])
-        SEditor.camera.reparentTo(render)
-        SEditor.camera.clearMat()
-        # Resize coa marker
-        self.updateCoaMarkerSize()
-
-    def uprightCam(self):
-        taskMgr.remove('manipulateCamera')
-        # Record undo point
-        SEditor.pushUndo([SEditor.camera])
-        # Pitch camera till upright
-        currH = SEditor.camera.getH()
-        SEditor.camera.lerpHpr(currH, 0, 0,
-                              CAM_MOVE_DURATION,
-                              other = render,
-                              blendType = 'easeInOut',
-                              task = 'manipulateCamera')
-
-    def orbitUprightCam(self):
-        taskMgr.remove('manipulateCamera')
-        # Record undo point
-        SEditor.pushUndo([SEditor.camera])
-        # Transform camera z axis to render space
-        mCam2Render = Mat4()
-        mCam2Render.assign(SEditor.camera.getMat(render))
-        zAxis = Vec3(mCam2Render.xformVec(Z_AXIS))
-        zAxis.normalize()
-        # Compute rotation angle needed to upright cam
-        orbitAngle = rad2Deg(math.acos(CLAMP(zAxis.dot(Z_AXIS),-1,1)))
-        # Check angle
-        if orbitAngle < 0.1:
-            # Already upright
-            return
-        # Compute orthogonal axis of rotation
-        rotAxis = Vec3(zAxis.cross(Z_AXIS))
-        rotAxis.normalize()
-        # Find angle between rot Axis and render X_AXIS
-        rotAngle = rad2Deg(math.acos(CLAMP(rotAxis.dot(X_AXIS),-1,1)))
-        # Determine sign or rotation angle
-        if rotAxis[1] < 0:
-            rotAngle *= -1
-        # Position ref CS at coa marker with xaxis aligned with rot axis
-        self.camManipRef.setPos(self.coaMarker, Vec3(0))
-        self.camManipRef.setHpr(render, rotAngle, 0, 0)
-        # Reparent Cam to ref Coordinate system
-        parent = SEditor.camera.getParent()
-        SEditor.camera.wrtReparentTo(self.camManipRef)
-        # Rotate ref CS to final orientation
-        t = self.camManipRef.lerpHpr(rotAngle, orbitAngle, 0,
-                                     CAM_MOVE_DURATION,
-                                     other = render,
-                                     blendType = 'easeInOut',
-                                     task = 'manipulateCamera')
-        # Upon death, reparent Cam to parent
-        t.parent = parent
-        t.uponDeath = self.reparentCam
-
-    def centerCam(self):
-        self.centerCamIn(1.0)
-        
-    def centerCamNow(self):
-        self.centerCamIn(0.)
-
-    def centerCamIn(self, t):
-        taskMgr.remove('manipulateCamera')
-        # Record undo point
-        SEditor.pushUndo([SEditor.camera])
-        # Determine marker location
-        markerToCam = self.coaMarker.getPos( SEditor.camera )
-        dist = Vec3(markerToCam - ZERO_POINT).length()
-        scaledCenterVec = Y_AXIS * dist
-        delta = markerToCam - scaledCenterVec
-        self.camManipRef.setPosHpr(SEditor.camera, Point3(0), Point3(0))
-        t = SEditor.camera.lerpPos(Point3(delta),
-                                  CAM_MOVE_DURATION,
-                                  other = self.camManipRef,
-                                  blendType = 'easeInOut',
-                                  task = 'manipulateCamera')
-        t.uponDeath = self.updateCoaMarkerSizeOnDeath
-
-    def zoomCam(self, zoomFactor, t):
-        taskMgr.remove('manipulateCamera')
-        # Record undo point
-        SEditor.pushUndo([SEditor.camera])
-        # Find a point zoom factor times the current separation
-        # of the widget and cam
-        zoomPtToCam = self.coaMarker.getPos(SEditor.camera) * zoomFactor
-        # Put a target nodePath there
-        self.camManipRef.setPos(SEditor.camera, zoomPtToCam)
-        # Move to that point
-        t = SEditor.camera.lerpPos(ZERO_POINT,
-                                  CAM_MOVE_DURATION,
-                                  other = self.camManipRef,
-                                  blendType = 'easeInOut',
-                                  task = 'manipulateCamera')
-        t.uponDeath = self.updateCoaMarkerSizeOnDeath
-        
-    def spawnMoveToView(self, view):
-        # Kill any existing tasks
-        taskMgr.remove('manipulateCamera')
-        # Record undo point
-        SEditor.pushUndo([SEditor.camera])
-        # Calc hprOffset
-        hprOffset = VBase3()
-        if view == 8:
-            # Try the next roll angle
-            self.orthoViewRoll = (self.orthoViewRoll + 90.0) % 360.0
-            # but use the last view
-            view = self.lastView
-        else:
-            self.orthoViewRoll = 0.0
-        # Adjust offset based on specified view
-        if view == 1:
-            hprOffset.set(180., 0., 0.)
-        elif view == 2:
-            hprOffset.set(0., 0., 0.)
-        elif view == 3:
-            hprOffset.set(90., 0., 0.)
-        elif view == 4:
-            hprOffset.set(-90., 0., 0.)
-        elif view == 5:
-            hprOffset.set(0., -90., 0.)
-        elif view == 6:
-            hprOffset.set(0., 90., 0.)
-        elif view == 7:
-            hprOffset.set(135., -35.264, 0.)
-        # Position target
-        self.camManipRef.setPosHpr(self.coaMarker, ZERO_VEC,
-                                   hprOffset)
-        # Scale center vec by current distance to target
-        offsetDistance = Vec3(SEditor.camera.getPos(self.camManipRef) - 
-                              ZERO_POINT).length()
-        scaledCenterVec = Y_AXIS * (-1.0 * offsetDistance)
-        # Now put the camManipRef at that point
-        self.camManipRef.setPosHpr(self.camManipRef,
-                                   scaledCenterVec,
-                                   ZERO_VEC)
-        # Record view for next time around
-        self.lastView = view
-        t = SEditor.camera.lerpPosHpr(ZERO_POINT,
-                                     VBase3(0,0,self.orthoViewRoll),
-                                     CAM_MOVE_DURATION,
-                                     other = self.camManipRef,
-                                     blendType = 'easeInOut',
-                                     task = 'manipulateCamera')
-        t.uponDeath = self.updateCoaMarkerSizeOnDeath
-        
-        
-    def swingCamAboutWidget(self, degrees, t):
-        # Remove existing camera manipulation task
-        taskMgr.remove('manipulateCamera')
-
-        # Record undo point
-        SEditor.pushUndo([SEditor.camera])
-        
-        # Coincident with widget
-        self.camManipRef.setPos(self.coaMarker, ZERO_POINT)
-        # But aligned with render space
-        self.camManipRef.setHpr(ZERO_POINT)
-
-        parent = SEditor.camera.getParent()
-        SEditor.camera.wrtReparentTo(self.camManipRef)
-
-        manipTask = self.camManipRef.lerpHpr(VBase3(degrees,0,0),
-                                             CAM_MOVE_DURATION,
-                                             blendType = 'easeInOut',
-                                             task = 'manipulateCamera')
-        # Upon death, reparent Cam to parent
-        manipTask.parent = parent
-        manipTask.uponDeath = self.reparentCam
-
-    def reparentCam(self, state):
-        SEditor.camera.wrtReparentTo(state.parent)
-        self.updateCoaMarkerSize()
-
-    def fitOnWidget(self, nodePath = 'None Given'):
-        # Fit the node on the screen
-        # stop any ongoing tasks
-        taskMgr.remove('manipulateCamera')
-        # How big is the node?
-        nodeScale = SEditor.widget.scalingNode.getScale(render)
-        maxScale = max(nodeScale[0],nodeScale[1],nodeScale[2])
-        maxDim = min(SEditor.dr.nearWidth, SEditor.dr.nearHeight)
-
-        # At what distance does the object fill 30% of the screen?
-        # Assuming radius of 1 on widget
-        camY = SEditor.dr.near * (2.0 * maxScale)/(0.3 * maxDim)
-    
-        # What is the vector through the center of the screen?
-        centerVec = Y_AXIS * camY
-    
-        # Where is the node relative to the viewpoint
-        vWidget2Camera = SEditor.widget.getPos(SEditor.camera)
-    
-        # How far do you move the camera to be this distance from the node?
-        deltaMove = vWidget2Camera - centerVec
-    
-        # Move a target there
-        self.camManipRef.setPos(SEditor.camera, deltaMove)
-
-        parent = SEditor.camera.getParent()
-        SEditor.camera.wrtReparentTo(self.camManipRef)
-        fitTask = SEditor.camera.lerpPos(Point3(0,0,0),
-                                        CAM_MOVE_DURATION,
-                                        blendType = 'easeInOut',
-                                        task = 'manipulateCamera')
-        # Upon death, reparent Cam to parent
-        fitTask.parent = parent
-        fitTask.uponDeath = self.reparentCam                                
-
-    def moveToFit(self):
-        # How bit is the active widget?
-        widgetScale = SEditor.widget.scalingNode.getScale(render)
-        maxScale = max(widgetScale[0], widgetScale[1], widgetScale[2])
-        # At what distance does the widget fill 50% of the screen?
-        camY = ((2 * SEditor.dr.near * (1.5 * maxScale)) /
-                min(SEditor.dr.nearWidth, SEditor.dr.nearHeight))
-        # Find a point this distance along the Y axis
-        # MRM: This needs to be generalized to support non uniform frusta
-        centerVec = Y_AXIS * camY
-        # Before moving, record the relationship between the selected nodes
-        # and the widget, so that this can be maintained
-        SEditor.selected.getWrtAll()
-        # Push state onto undo stack
-        SEditor.pushUndo(SEditor.selected)
-        # Remove the task to keep the widget attached to the object
-        taskMgr.remove('followSelectedNodePath')
-        # Spawn a task to keep the selected objects with the widget
-        taskMgr.add(self.stickToWidgetTask, 'stickToWidget')
-        # Spawn a task to move the widget
-        t = SEditor.widget.lerpPos(Point3(centerVec),
-                                  CAM_MOVE_DURATION,
-                                  other = SEditor.camera, 
-                                  blendType = 'easeInOut',
-                                  task = 'moveToFitTask')
-        t.uponDeath = lambda state: taskMgr.remove('stickToWidget')
-
-    def stickToWidgetTask(self, state):
-        # Move the objects with the widget
-        SEditor.selected.moveWrtWidgetAll()
-        # Continue
-        return Task.cont
-
-    def enableMouseFly(self, fKeyEvents = 1):
-        # disable C++ fly interface
-        base.disableMouse()
-        # Enable events
-        for event in self.actionEvents:
-            self.accept(event[0], event[1], extraArgs = event[2:])
-        if fKeyEvents:
-            for event in self.keyEvents:
-                self.accept(event[0], event[1], extraArgs = event[2:])
-        # Show marker
-        self.coaMarker.reparentTo(SEditor.group)
-
-    def disableMouseFly(self):
-        # Hide the marker
-        self.coaMarker.reparentTo(hidden)
-        # Ignore events
-        for event in self.actionEvents:
-            self.ignore(event[0])
-        for event in self.keyEvents:
-            self.ignore(event[0])
-        # Kill tasks
-        self.removeManipulateCameraTask()
-        taskMgr.remove('stickToWidget')
-        base.enableMouse()
-
-    def removeManipulateCameraTask(self):
-        taskMgr.remove('manipulateCamera')
-

+ 0 - 49
doc/SceneEditor/seColorEntry.py

@@ -1,49 +0,0 @@
-#################################################################
-# seColorEntry.py
-# Originally from VectorWidgets.py
-# Altered by Yi-Hong Lin, [email protected], 2004
-#
-# Here we need some widget to handle some color input.
-# There is some colorEntry in the VectorWidgets.py, but they didn't
-# work as we need (we don't need alpha here. so the dim option should be set to 3).
-# So we make one from them.
-#
-#################################################################
-from direct.tkwidgets import Valuator
-from direct.tkwidgets import Floater
-from direct.tkwidgets import Slider
-import string, Pmw, Tkinter, tkColorChooser
-from direct.tkwidgets.VectorWidgets import VectorEntry
-
-class seColorEntry(VectorEntry):
-    def __init__(self, parent = None, **kw):
-        # Initialize options for the class (overriding some superclass options)
-        optiondefs = (
-            ('dim',                     3,                  Pmw.INITOPT),
-            ('type',                    'slider',           Pmw.INITOPT),
-            ('fGroup_labels',           ('R','G','B'),      None),
-            ('min',                     0.0,                None),
-            ('max',                     255.0,              None),
-            ('nuDigits',                0,                  None),
-            ('valuator_resolution',     1.0,                None),
-            )
-        self.defineoptions(kw, optiondefs)
-
-        # Initialize the superclass, make sure dim makes it to superclass
-        VectorEntry.__init__(self, parent, dim = self['dim'])
-        # Add menu item to popup color picker
-        self.addMenuItem(
-            'Popup color picker',
-            command = lambda s = self: s.popupColorPicker())
-        # Needed because this method checks if self.__class__ is myClass
-        # where myClass is the argument passed into inialiseoptions
-        self.initialiseoptions(seColorEntry)
-
-    def popupColorPicker(self):
-        # Can pass in current color with: color = (255, 0, 0)
-        color = tkColorChooser.askcolor(
-            parent = self.interior(),
-            # Initialize it to current color
-            initialcolor = tuple(self.get()[:3]))[0]
-        if color:
-            self.set((color[0], color[1], color[2]))

+ 0 - 915
doc/SceneEditor/seFileSaver.py

@@ -1,915 +0,0 @@
-####################################################################################################################################################    
-# File Saving 
-# This code saves the scene out as python code... the scene is stored in the various dictionaries in "dataHolder.py" ...the class "AllScene"
-# 
-####################################################################################################################################################
-from pandac.PandaModules import *
-
-from direct.showbase.ShowBaseGlobal import *
-import os
-import shutil
-import string
-
-####################################################################################################################################################
-#### These modules are modified versions of Disney's equivalent modules
-#### We need to figure out a way to inherit their modules and overwrite what we need changed
-import seParticlePanel
-import seParticles
-import seParticleEffect
-import seForceGroup
-####################################################################################################################################################
-
-class FileSaver:
-
-    ####################################################################################################################################################    
-    # This class saves out the scene built with the scene editor as python code
-    # There are dictionaries saved out to save the state of the scene for reloading it with the editor
-    # Currently saving is supported for Models, Animations, Lights, Dummy Nodes
-    # Attributes like parenting are also saved out
-    # This class is actually instantiated in sceneEditor.py in the saveScene() method 
-    ####################################################################################################################################################
-
-    def __init(self):
-        pass
-
-    def SaveFile(self,AllScene,filename,dirname,reSaveFlag=0):
-
-      ################################################################################################################################################  
-        # This function takes the "dataHolder" instance "AllScene" which has dictionaries containing scene information
-        # The filename is where the scene will be written to
-        ################################################################################################################################################
-        
-        i1="    " # indentation
-        i2=i1+i1  # double indentation
-        out_file = open(filename,"w")
-        print "dirname:" + dirname
-        if( not os.path.isdir(dirname)):
-            os.mkdir(dirname)
-        savepathname=Filename(filename)
-        self.savepath=savepathname.getBasenameWoExtension()
-        out_file.write("##########################################################################################################\n")
-        out_file.write("# Auto Generated Code by Scene Editor\n")
-        out_file.write("# Edit with caution\n")
-        out_file.write("# Using this file in your code:\n")
-        out_file.write("# For example, if you have named this file as \"myscene.py\"\n")
-        out_file.write("# Do the following:\n")
-        out_file.write("# from myscene import * \n")
-        out_file.write("# theScene=SavedScene() #instantiate the class\n")
-        out_file.write("# IMPORTANT: All the documentation below refers to \"theScene\" as the instance of SavedScene()\n")
-        out_file.write("##########################################################################################################\n\n")
-        
-        out_file.write("##########################################################################################################\n")
-        out_file.write("# Import Panda Modules\n")
-        out_file.write("##########################################################################################################\n")
-        out_file.write("from direct.directbase.DirectStart import * # Core functionality for running the \"show\"\n")
-        out_file.write("from direct.actor import Actor # Importing models with animations\n")
-        out_file.write("from direct.directutil import Mopath # Motion Paths\n")
-        out_file.write("from direct.interval import MopathInterval # Motion Paths\n")
-        out_file.write("from direct.interval.IntervalGlobal import * # Intervals for interpolation, sequencing and parallelization\n")
-        out_file.write("from direct.particles import ParticleEffect # Particle Systems\n")
-        out_file.write("from direct.particles import ForceGroup # Forces acting on Particles\n")
-        out_file.write("from direct.particles import Particles\n\n")
-        out_file.write("##########################################################################################################\n")
-        out_file.write("# This class stores the entire scene\n")
-        out_file.write("##########################################################################################################\n\n")
-        out_file.write("class SavedScene(DirectObject): # We inherit from DirectObject so that we can use self.accept method to catch messages\n")
-        out_file.write("\n")
-        out_file.write(i1+"# These dictionaries are required for re-loading a scene in the editor\n")
-        out_file.write(i1+"# They can be used to access the objects as well\n\n")
-        out_file.write(i1+"ModelDic={}# Stores all the models and static geometry\n")
-        out_file.write(i1+"ModelRefDic={}# Stores the paths to the models\n")
-        out_file.write("\n")
-        out_file.write(i1+"ActorDic={}# Stores all the actors\n")
-        out_file.write(i1+"ActorRefDic={}# Stores the paths to the actors\n")
-        out_file.write(i1+"ActorAnimsDic={}# Stores the animations for each actor\n")
-        out_file.write(i1+"blendAnimDict={}# Stores all the blended animations\n")
-        out_file.write("\n")
-        out_file.write(i1+"LightDict={}# Stores all the lights\n")
-        out_file.write(i1+"LightTypes={}# Stores types for the lights\n")
-        out_file.write(i1+"LightNodes={}# Stores the actual nodes for the lights\n")
-        out_file.write("\n")
-        out_file.write(i1+"dummyDict={}# Stores dummies\n")
-        out_file.write("\n")
-        out_file.write(i1+"collisionDict={}# Stores Collision information\n")
-        out_file.write("\n")
-        out_file.write(i1+"curveDict={}# Stores Mopath information\n")
-        out_file.write(i1+"curveIntervals=[]# Stores list of mopath intervals\n")
-        out_file.write(i1+"curveRefColl=[]# Stores paths to mopaths\n")
-        out_file.write(i1+"curveIntervalsDict={}# Stores mopath intervals\n")
-        out_file.write("\n")
-        out_file.write(i1+"particleDict={}# Stores particles\n")
-        out_file.write(i1+"particleNodes={}# Stores particle nodes\n")
-        out_file.write("\n")
-        out_file.write(i1+"#Light Count\n")
-        out_file.write(i1+"ambientCount=0\n")
-        out_file.write(i1+"directionalCount=0\n")
-        out_file.write(i1+"pointCount=0\n")
-        out_file.write(i1+"spotCount=0\n")
-        out_file.write("\n")
-        out_file.write(i1+"#Lighting Attribute\n")
-        out_file.write(i1+"lightAttrib = LightAttrib.makeAllOff()# Initialize lighting\n")
-        out_file.write("\n")
-        out_file.write(i1+"CollisionHandler=CollisionHandlerEvent()# Setup a Collision Handler\n")
-
-        out_file.write(i1+"##########################################################################################################\n")
-        out_file.write(i1+"# Constructor: this is run first when you instantiate the SavedScene class\n")
-        out_file.write(i1+"##########################################################################################################\n")
-        out_file.write(i1+"def __init__(self,loadmode=1,seParticleEffect=None,seParticles=None,executionpath=None):# loadmode 0 specifies that this file is being loaded by the scene editor and it passes its own versions of the particle fx modules\n")
-        out_file.write("\n")
-        out_file.write(i2+"self.loadmode=loadmode\n")
-        out_file.write(i2+"self.seParticleEffect=seParticleEffect\n")
-        out_file.write(i2+"self.seParticles=seParticles\n")
-        out_file.write(i2+"self.executionpath=executionpath\n")
-        out_file.write("\n")
-        out_file.write(i2+"base.enableParticles()# Enable Particle effects\n")
-        out_file.write("\n")
-        out_file.write(i2+"self.cTrav = CollisionTraverser() # Setup a traverser for collisions\n")
-        out_file.write(i2+"base.cTrav = self.cTrav\n")
-        out_file.write(i2+"self.CollisionHandler.setInPattern(\"enter%in\")# The message to be raised when something enters a collision node\n")
-        out_file.write(i2+"self.CollisionHandler.setOutPattern(\"exit%in\")# The message to be raised when something exits a collision node\n")
-        out_file.write("\n")
-        ####################################################################################################################################################
-        # Save Models
-        ####################################################################################################################################################
-
-        out_file.write(i2+"##########################################################################################################\n")
-        out_file.write(i2+"# Code for all the models\n")
-        out_file.write(i2+"# To access these models:\n")
-        out_file.write(i2+"# theScene.ModelDic[\"'Model_Name\"']\n")
-        out_file.write(i2+"# where theScene is the SavedScene class instance\n")
-        out_file.write(i2+"# Properties saved include:\n")
-        out_file.write(i2+"# Transformations\n")
-        out_file.write(i2+"# Alpha and color\n")
-        out_file.write(i2+"# Parent and child information\n")
-        out_file.write(i2+"##########################################################################################################\n")
-
-        for model in AllScene.ModelDic:
-            out_file.write("\n")
-            modelS=str(model)
-            
-            if(1): # This is kept for now... perhaps later some sort of check might have to be enforced based on loadMode
-                #Loading Code
-                out_file.write(i2+"# Loading model's egg file\n")
-                #out_file.write(i2+ "self."+ modelS + "=loader.loadModel(\'" + AllScene.ModelRefDic[model].getFullpath() + "\')\n")#Absolute Paths
-
-                newpath = dirname + "/" + AllScene.ModelRefDic[model].getBasename()
-                newpathF=Filename(newpath)
-                newpathSpecific=newpathF.toOsSpecific()
-
-                # Copy all the textures referenced by this file over to the relative directory
-                fnamelist=[]
-                modelData=EggData()
-                modelData.read(AllScene.ModelRefDic[model])
-                textures=EggTextureCollection()
-                textures.findUsedTextures(modelData)
-                for index in range(textures.getNumTextures()):
-                    texture=textures.getTexture(index)
-                    texfilename=texture.getFilename()
-                    fnamelist.append(texfilename.getFullpath())   
-                    oldFilename=Filename(Filename(AllScene.ModelRefDic[model].getDirname()),texfilename)
-                    if(not oldFilename.isRegularFile()):
-                        if(texfilename.resolveFilename(getTexturePath(),"")):
-                            oldFilename=texfilename
-                    oldtexpath=oldFilename.toOsSpecific()
-                
-                    newtexpath=dirname + "/" + texfilename.getBasename()
-                    newtexpathF=Filename(newtexpath)
-                    newtexpathSpecific=newtexpathF.toOsSpecific()
-                    
-                    print "TEXTURE SAVER:: copying" + oldtexpath + " to " + newtexpathSpecific
-                    if(oldtexpath != newtexpathSpecific):
-                        shutil.copyfile(oldtexpath,newtexpathSpecific)
-
-                    
-                
-                    
-
-                
-                # Copy the file over to the relative directory
-                oldModelpath=AllScene.ModelRefDic[model].toOsSpecific()
-                print "FILESAVER:: copying from " + AllScene.ModelRefDic[model].toOsSpecific() + "to" + newpathSpecific 
-                if(oldModelpath!=newpathSpecific):
-                    shutil.copyfile(oldModelpath,newpathSpecific)
-
-                
-                e=EggData()
-                e.read(AllScene.ModelRefDic[model])
-                etc=EggTextureCollection()
-                etc.extractTextures(e)
-                for index in range(len(fnamelist)):
-                    print fnamelist[index]
-                    tex=etc.findFilename(Filename(fnamelist[index]))
-                    fn=Filename(tex.getFilename())
-                    fn.setDirname("")
-                    tex.setFilename(fn)
-                    e.writeEgg(Filename.fromOsSpecific(newpathSpecific))
-                
-
-
-                out_file.write(i2+"if(self.loadmode==1):\n")    
-                out_file.write(i2+i1+ "self."+ modelS + "=loader.loadModel(\'" + self.savepath + "/" +  AllScene.ModelRefDic[model].getBasename() + "')\n")#Relative Path
-                out_file.write(i2+"else:\n")
-                out_file.write(i2+i1+ "self."+ modelS + "=loader.loadModel(self.executionpath + \'/" +  AllScene.ModelRefDic[model].getBasename() + "')\n")#Relative Path with execution point specified by the invoking-level-editor
-
-                #Transformation Code
-                out_file.write("\n")
-                out_file.write(i2+"# Transforming the model\n")
-                out_file.write(i2+ "self."+ modelS + ".setPosHprScale(%.3f,%.3f,%.3f,%.3f,%.3f,%.3f,%.3f,%.3f,%.3f)\n"% (AllScene.ModelDic[model].getX(),AllScene.ModelDic[model].getY(),AllScene.ModelDic[model].getZ(),AllScene.ModelDic[model].getH(),AllScene.ModelDic[model].getP(),AllScene.ModelDic[model].getR(),AllScene.ModelDic[model].getSx(),AllScene.ModelDic[model].getSy(),AllScene.ModelDic[model].getSz()))
-
-                if(AllScene.ModelDic[model].hasTransparency()):
-                    out_file.write("\n")
-                    out_file.write(i2+"# Alpha\n")
-                    out_file.write(i2+ "self."+ modelS + ".setTransparency(1)\n")
-                    clr=AllScene.ModelDic[model].getColor()
-                    out_file.write(i2+ "self."+ modelS + ".setColor(%.4f,%.4f,%.4f,%.4f)\n"%(clr.getX(),clr.getY(),clr.getZ(),clr.getW()))                  
-
-                out_file.write("\n")
-                out_file.write(i2+ "# Reparent To Render for now and later we update all the parentings\n")
-                out_file.write(i2+ "self."+ modelS + ".reparentTo(render)\n")
-                out_file.write("\n")
-                out_file.write(i2+ "# Save Metadata...can be retrieved by doing theScene.ModelDic[\"Model_Name\"].getTag(\"Metadata\")\n")
-                out_file.write(i2+ "self."+ modelS + ".setTag(\"Metadata\",\"" + AllScene.ModelDic[model].getTag("Metadata") + "\")\n")
-                out_file.write("\n")
-                out_file.write(i2+ "# Fill in the dictionaries which are used by level Ed to reload state\n")
-                out_file.write(i2+ "self.ModelDic[\'" + modelS + "\']=self." + AllScene.ModelDic[model].getName()+"\n")
-                #out_file.write(i2+ "self.ModelRefDic[\'" + modelS + "\']=Filename(\'"+ AllScene.ModelRefDic[model].getFullpath() +"\')\n")# The old Absolute Path way
-                out_file.write(i2+ "self.ModelRefDic[\'" + modelS + "\']=\'"+ AllScene.ModelRefDic[model].getBasename() +"\'\n")# Relative paths
-                out_file.write(i2+ "self.ModelDic[\'"+ modelS + "\'].setName(\'"+ modelS +"\')\n")              
-                out_file.write("\n")
-
-        ####################################################################################################################################################
-        # Save Dummies
-        ####################################################################################################################################################
-        out_file.write(i2+"##########################################################################################################\n")
-        out_file.write(i2+"# Code for all the Dummy Objects\n")
-        out_file.write(i2+"# To access the dummies\n")
-        out_file.write(i2+"# theScene.dummyDict['Dummy_Name']\n")
-        out_file.write(i2+"##########################################################################################################\n")
-        for dummy in AllScene.dummyDict:
-            out_file.write("\n")
-            dummyS=str(dummy)
-            
-            if(1): # This is kept for now... perhaps later some sort of check might have to be enforced based on loadMode
-                out_file.write(i2+ "self."+ dummyS + "=loader.loadModel(\"models/misc/sphere\")\n")
-                #Transformation Code
-                out_file.write(i2+"# Transforming the Dummy\n")
-                out_file.write(i2+ "self."+ dummyS + ".setPosHprScale(%.3f,%.3f,%.3f,%.3f,%.3f,%.3f,%.3f,%.3f,%.3f)\n"% (AllScene.dummyDict[dummy].getX(),AllScene.dummyDict[dummy].getY(),AllScene.dummyDict[dummy].getZ(),AllScene.dummyDict[dummy].getH(),AllScene.dummyDict[dummy].getP(),AllScene.dummyDict[dummy].getR(),AllScene.dummyDict[dummy].getSx(),AllScene.dummyDict[dummy].getSy(),AllScene.dummyDict[dummy].getSz()))
-                out_file.write("\n")
-                out_file.write(i2+ "# Fill in the dictionaries which are used by level Ed to reload state\n")
-                out_file.write(i2+ "self.dummyDict[\'" + dummyS + "\']=self." + AllScene.dummyDict[dummy].getName()+"\n")
-                out_file.write(i2+ "self.dummyDict[\'"+ dummyS + "\'].setName(\'"+ dummyS +"\')\n")
-                out_file.write("\n")
-                out_file.write(i2+ "# Save Metadata...can be retrieved by doing theScene.dummyDict[\"Dummy_Name\"].getTag(\"Metadata\")\n")             
-                out_file.write(i2+ "self."+ dummyS + ".setTag(\"Metadata\",\"" + AllScene.dummyDict[dummy].getTag("Metadata") + "\")\n")
-                out_file.write("\n")
-
-        ####################################################################################################################################################
-        # Saving Actors and their animations
-        ####################################################################################################################################################                    
-        out_file.write(i2+"##########################################################################################################\n")
-        out_file.write(i2+"# Code for all the Actors and animations\n")
-        out_file.write(i2+"# To access the Actors\n")
-        out_file.write(i2+"# theScene.ActorDic[\'Actor_Name\']\n")
-        out_file.write(i2+"# theScene.ActorDic[\'Actor_Name\'].play(\'Animation_Name\')\n")
-        out_file.write(i2+"##########################################################################################################\n")
-        for actor in AllScene.ActorDic:
-            out_file.write("\n")
-            actorS=str(actor)
-            
-            if(1): # This is kept for now... perhaps later some sort of check might have to be enforced based on loadMode
-                #out_file.write(i2+ "self."+ actorS + "=Actor.Actor(\'"+ AllScene.ActorRefDic[actor].getFullpath() + "\')\n")# The old way with absolute paths
-
-
-                newpath = dirname + "/" + AllScene.ActorRefDic[actor].getBasename()
-                newpathF=Filename(newpath)
-                newpathSpecific=newpathF.toOsSpecific()
-
-                # Copy all the textures referenced by this file over to the relative directory
-                actorfnamelist=[]
-                actorData=EggData()
-                actorData.read(AllScene.ActorRefDic[actor])
-                textures=EggTextureCollection()
-                textures.findUsedTextures(actorData)
-                for index in range(textures.getNumTextures()):
-                    texture=textures.getTexture(index)
-                    texfilename=texture.getFilename()
-                    actorfnamelist.append(texfilename.getFullpath()) 
-
-                    oldFilename=Filename(Filename(AllScene.ActorRefDic[actor].getDirname()),texfilename)
-                    if(not oldFilename.isRegularFile()):
-                        if(texfilename.resolveFilename(getTexturePath(),"")):
-                            oldFilename=texfilename
-                    oldtexpath=oldFilename.toOsSpecific()
-
-
-                    newtexpath=dirname + "/" + texfilename.getBasename()
-                    newtexpathF=Filename(newtexpath)
-                    newtexpathSpecific=newtexpathF.toOsSpecific()
-                    print "TEXTURE SAVER:: copying" + oldtexpath + " to " + newtexpathSpecific
-                    if(oldtexpath != newtexpathSpecific):
-                        shutil.copyfile(oldtexpath,newtexpathSpecific)
-
-
-                # Copy the file over to the relative directory
-                oldActorpath=AllScene.ActorRefDic[actor].toOsSpecific()
-                print "FILESAVER:: copying from " + AllScene.ActorRefDic[actor].toOsSpecific() + "to" + newpathSpecific 
-                if(oldActorpath!=newpathSpecific):
-                    shutil.copyfile(oldActorpath,newpathSpecific)
-                
-
-                e=EggData()
-                e.read(AllScene.ActorRefDic[actor])
-                etc=EggTextureCollection()
-                etc.extractTextures(e)
-                for index in range(len(actorfnamelist)):
-                    print actorfnamelist[index]
-                    tex=etc.findFilename(Filename(actorfnamelist[index]))
-                    fn=Filename(tex.getFilename())
-                    fn.setDirname("")
-                    tex.setFilename(fn)
-                    e.writeEgg(Filename.fromOsSpecific(newpathSpecific))
-                
-
-
-                out_file.write(i2+"if(self.loadmode==1):\n")    
-                out_file.write(i2+i1+ "self."+ actorS + "=Actor.Actor(\'" + self.savepath + "/" +  AllScene.ActorRefDic[actor].getBasename() + "')\n")#Relative Path
-                out_file.write(i2+"else:\n")
-                out_file.write(i2+i1+ "self."+ actorS + "=Actor.Actor(self.executionpath + \'/" +  AllScene.ActorRefDic[actor].getBasename() + "')\n")#Relative Path with execution point specified by the invoking-level-editor
-
-                #Transformation Code
-                out_file.write(i2+"# Transforming the Actor\n")
-                out_file.write(i2+ "self."+ actorS + ".setPosHprScale(%.3f,%.3f,%.3f,%.3f,%.3f,%.3f,%.3f,%.3f,%.3f)\n"% (AllScene.ActorDic[actor].getX(),AllScene.ActorDic[actor].getY(),AllScene.ActorDic[actor].getZ(),AllScene.ActorDic[actor].getH(),AllScene.ActorDic[actor].getP(),AllScene.ActorDic[actor].getR(),AllScene.ActorDic[actor].getSx(),AllScene.ActorDic[actor].getSy(),AllScene.ActorDic[actor].getSz()))
-
-                if(AllScene.ActorDic[actor].hasTransparency()):
-                    out_file.write(i2+"# Alpha\n")
-                    out_file.write(i2+ "self."+ actorS + ".setTransparency(1)\n")
-                    clr=AllScene.ActorDic[actor].getColor()
-                    out_file.write(i2+ "self."+ actorS + ".setColor(%.4f,%.4f,%.4f,%.4f)\n"%(clr.getX(),clr.getY(),clr.getZ(),clr.getW()))
-
-                out_file.write(i2+ "self."+ actorS + ".reparentTo(render)\n")
-                
-                out_file.write("\n")
-                out_file.write(i2+ "# Save Metadata...can be retrieved by doing theScene.ActorDic[\"Actor_Name\"].getTag(\"Metadata\")\n")
-                out_file.write(i2+ "self."+ actorS + ".setTag(\"Metadata\",\"" + AllScene.ActorDic[actor].getTag("Metadata") + "\")\n")
-
-                out_file.write("\n")
-                out_file.write(i2+ "# Fill in the dictionaries which are used by level Ed to reload state\n")
-                ActorAnimations=AllScene.getAnimationDictFromActor(actor)
-                ActorAnimationsInvoke={}
-
-                if(ActorAnimations!={}):  #Check if a dictionary of animations exists for this actor
-                    for animation in ActorAnimations:
-                        #out_file.write(i2+ "self."+ actorS + ".loadAnims(" + str(ActorAnimations) +")\n") # Old way with absolute paths
-                        #Manakel 2/12/2004: solve the not empty but not defined animation case
-                        if not animation is None:
-                            print "ACTOR ANIMATIONS:" + ActorAnimations[animation]   
-                            oldAnimPath=Filename(ActorAnimations[animation])
-                            oldAnim=oldAnimPath.toOsSpecific()
-                            dirOS=Filename(dirname)
-                            newAnim=dirOS.toOsSpecific() + "\\" + oldAnimPath.getBasename()
-                            print "ACTOR ANIM SAVER:: Comparing" + oldAnim +"and" + newAnim
-                            if(oldAnim!=newAnim):
-                                shutil.copyfile(oldAnim,newAnim)
-                            newAnimF=Filename.fromOsSpecific(newAnim)
-                            ActorAnimationsInvoke[animation]="self.executionpath +" + "/" +newAnimF.getBasename()
-                            ActorAnimations[animation]= self.savepath + "/" + newAnimF.getBasename()
-
-
-                out_file.write(i2+"if(self.loadmode==1):\n")
-                out_file.write(i2+ i1+"self."+ actorS + ".loadAnims(" + str(ActorAnimations) +")\n") # Now with new relative paths
-                out_file.write(i2+"else:\n")
-                theloadAnimString=str(ActorAnimationsInvoke)# We hack the "self.executionpath" part into the dictionary as a variable using string replace
-                print "LOAD ANIM STRING BEFORE" + theloadAnimString
-                theloadAnimString=theloadAnimString.replace('\'self.executionpath +','self.executionpath + \'')         
-                print "LOAD ANIM STRING AFTER" + theloadAnimString
-                out_file.write(i2+ i1+"self."+ actorS + ".loadAnims(" + theloadAnimString +")\n") # Now with new relative paths based on editor invocation
-
-                out_file.write(i2+ "self.ActorDic[\'" + actorS + "\']=self." + AllScene.ActorDic[actor].getName()+"\n")
-                #out_file.write(i2+ "self.ActorRefDic[\'" + actorS + "\']=Filename(\'"+AllScene.ActorRefDic[actor].getFullpath() +"\')\n") # Old way with absolute paths
-                out_file.write(i2+ "self.ActorRefDic[\'" + actorS + "\']=\'"+ AllScene.ActorRefDic[actor].getBasename() +"\'\n")# Relative paths
-                out_file.write(i2+ "self.ActorDic[\'"+ actorS + "\'].setName(\'"+ actorS +"\')\n")              
-                if(AllScene.blendAnimDict.has_key(actor)): # Check if a dictionary of blended animations exists
-                    out_file.write(i2+ "self.blendAnimDict[\"" + actorS +"\"]=" + str(AllScene.blendAnimDict[actor]) + "\n")
-                
-                
-                out_file.write("\n")
-        
-        ####################################################################################################################################################
-        # Collsion Node Saving
-        ####################################################################################################################################################
-        
-        out_file.write(i2+"##########################################################################################################\n")
-        out_file.write(i2+"# Code for setting up Collision Nodes\n")
-        out_file.write(i2+"# To use collision detection:\n")
-        out_file.write(i2+"# You must set up your own bitmasking and event handlers, the traverser \"cTrav\" is created for you at the top\n")
-        out_file.write(i2+"# The collision nodes are stored in collisionDict\n")
-        out_file.write(i2+"##########################################################################################################\n\n")
-        for collnode in AllScene.collisionDict:
-            collnodeS=str(collnode)
-            solid=AllScene.collisionDict[collnode].node().getSolid(0)
-            nodetype=solid.getType().getName()
-
-            if(nodetype=="CollisionSphere"): #Save Collison Sphere
-                out_file.write(i2+"collSolid=CollisionSphere(%.3f,%.3f,%.3f,%.3f)\n"%(solid.getCenter().getX(),solid.getCenter().getY(),solid.getCenter().getZ(),solid.getRadius()))            
-                pass
-            elif(nodetype=="CollisionPolygon"): #Save Collison Polygon
-
-                ax=AllScene.collisionDict[collnode].getTag("A_X")
-                ay=AllScene.collisionDict[collnode].getTag("A_Y")
-                az=AllScene.collisionDict[collnode].getTag("A_Z")
-
-                bx=AllScene.collisionDict[collnode].getTag("B_X")
-                by=AllScene.collisionDict[collnode].getTag("B_Y")
-                bz=AllScene.collisionDict[collnode].getTag("B_Z")
-
-                cx=AllScene.collisionDict[collnode].getTag("C_X")
-                cy=AllScene.collisionDict[collnode].getTag("C_Y")
-                cz=AllScene.collisionDict[collnode].getTag("C_Z")
-
-                out_file.write(i2+"pointA =  Point3(" + ax + "," + ay + "," + az + ")\n")
-                out_file.write(i2+"pointB =  Point3(" + bx + "," + by + "," + bz + ")\n")
-                out_file.write(i2+"pointC =  Point3(" + cx + "," + cy + "," + cz + ")\n")
-                out_file.write(i2+"collSolid=CollisionPolygon(pointA, pointB, pointC)\n")
-                
-                pass
-
-            elif(nodetype=="CollisionSegment"): #Save Collison Segment
-                A=AllScene.collisionDict[collnode].node().getSolid(0).getPointA()
-                B=AllScene.collisionDict[collnode].node().getSolid(0).getPointB()
-                
-                out_file.write(i2+"pointA =  Point3(%.3f,%.3f,%.3f)\n"%(A.getX(),A.getY(),A.getZ()))
-                out_file.write(i2+"pointB =  Point3(%.3f,%.3f,%.3f)\n"%(B.getX(),B.getY(),B.getZ()))
-                out_file.write(i2+"collSolid=CollisionSegment()\n")
-                out_file.write(i2+"collSolid.setPointA(pointA)\n")
-                out_file.write(i2+"collSolid.setFromLens(base.cam.node(),Point2(-1,1))\n")
-                out_file.write(i2+"collSolid.setPointB(pointB)\n")
-
-                pass
-
-            elif(nodetype=="CollisionRay"): #Save Collison Ray
-                P =  AllScene.collisionDict[collnode].node().getSolid(0).getOrigin()
-                V =  AllScene.collisionDict[collnode].node().getSolid(0).getDirection()
-
-                out_file.write(i2+"point=Point3(%.3f,%.3f,%.3f)\n"%(P.getX(),P.getY(),P.getZ()))
-                out_file.write(i2+"vector=Vec3(%.3f,%.3f,%.3f)\n"%(V.getX(),V.getY(),V.getZ()))
-                out_file.write(i2+"collSolid=CollisionRay()\n")
-                out_file.write(i2+"collSolid.setOrigin(point)\n")
-                out_file.write(i2+"collSolid.setDirection(vector)\n")
-            
-                pass
-            else:
-                 print "Invalid Collision Node: " + nodetype
-            out_file.write("\n")
-
-
-            out_file.write(i2+"self." + collnodeS + "_Node" + "=CollisionNode(\""+collnodeS+"\")\n")
-            out_file.write(i2+"self." + collnodeS + "_Node" + ".addSolid(collSolid)\n")
-            out_file.write(i2+"base.cTrav.addCollider(self." + collnodeS + "_Node,self.CollisionHandler)\n")
-            out_file.write("\n")
-           
-
-
-
-        ####################################################################################################################################################
-        # Light Saving
-        ####################################################################################################################################################
-        out_file.write(i2+"##########################################################################################################\n")
-        out_file.write(i2+"# Code for Lighting\n")
-        out_file.write(i2+"# To manipulated lights:\n")
-        out_file.write(i2+"# Manipulate the light node in theScene.LightNodes[\'Light_Name\']\n")
-        out_file.write(i2+"##########################################################################################################\n\n")
-
-        LightList=AllScene.lightManager.getLightNodeList()
-        for light in LightList:
-                 type = light.getType()
-                 if type == 'ambient':
-                     out_file.write(i2+"# Ambient Light\n")
-                     out_file.write (i2+ "self.ambientCount += 1\n")
-                     out_file.write (i2+ "alight = AmbientLight(\'"+ light.getName() +"\')\n")
-                     out_file.write (i2+ "alight.setColor(VBase4("+ str(light.getLightColor().getX())+ "," + str(light.getLightColor().getY())+ "," + str(light.getLightColor().getZ()) + "," + str(light.getLightColor().getW()) + "))\n")
-                     out_file.write (i2+ "self.lightAttrib=self.lightAttrib.addLight(alight)\n")
-                     out_file.write (i2+ "self."+light.getName()+"= render.attachNewNode(alight.upcastToPandaNode())\n") 
-                     out_file.write (i2+ "self."+light.getName()+".setTag(\"Metadata\",\"" + light.getTag("Metadata") + "\")\n")        
-                     out_file.write (i2+ "self.LightDict[\'" + light.getName() + "\']=alight\n")
-                     out_file.write (i2+ "self.LightTypes[\'" + light.getName() + "\']=\'" + type + "\'\n")
-                     out_file.write (i2+ "self.LightNodes[\'" + light.getName() + "\']=self." + light.getName() + "\n")
-                     out_file.write ("\n")
-                 elif type == 'directional':
-                     out_file.write(i2+"# Directional Light\n")
-                     out_file.write (i2+ "self.directionalCount += 1\n")
-                     out_file.write (i2+ "alight = DirectionalLight(\'"+ light.getName() + "\')\n")
-                     out_file.write (i2+ "alight.setColor(VBase4("+ str(light.getLightColor().getX())+ "," + str(light.getLightColor().getY())+ "," + str(light.getLightColor().getZ()) + "," + str(light.getLightColor().getW()) + "))\n")
-                     #out_file.write (i2+ "alight.setDirection(Vec3("+ str(light.getH())+ "," + str(light.getP())+ "," + str(light.getR()) + "))\n")
-                     #out_file.write (i2+ "alight.setPoint(Point3(" + str(light.getX()) + "," + str(light.getY()) + "," + str(light.getZ()) + "))\n")
-                     out_file.write (i2+ "alight.setSpecularColor(Vec4(" + str(light.getSpecColor().getX()) + "," + str(light.getSpecColor().getY()) + "," + str(light.getSpecColor().getZ()) + "," + str(light.getSpecColor().getW()) + "))\n")
-                     out_file.write (i2+ "self.lightAttrib=self.lightAttrib.addLight(alight)\n")
-                     out_file.write (i2+ "self."+light.getName()+ "= render.attachNewNode(alight.upcastToPandaNode())\n") 
-                     out_file.write (i2+ "self."+light.getName()+ ".setPos(Point3(" + str(light.getX()) + "," + str(light.getY()) + "," + str(light.getZ()) + "))\n")
-                     out_file.write (i2+ "self."+light.getName()+ ".setHpr(Vec3("+ str(light.getH())+ "," + str(light.getP())+ "," + str(light.getR()) + "))\n")
-                     out_file.write (i2+ "self."+light.getName()+ ".setTag(\"Metadata\",\"" + light.getTag("Metadata") + "\")\n")       
-                     #out_file.write (i2+ "alight.setPos
-                     out_file.write (i2+ "self.LightDict[\'" + light.getName() + "\']=alight\n")
-                     out_file.write (i2+ "self.LightTypes[\'" + light.getName() + "\']=\'" + type + "\'\n")
-                     out_file.write (i2+ "self.LightNodes[\'" + light.getName() + "\']=self." + light.getName()  + "\n")
-                     out_file.write ("\n")
-                 elif type == 'point':
-                     out_file.write(i2+"# Point Light\n")
-                     out_file.write (i2+ "self.pointCount += 1\n")
-                     out_file.write (i2+ "alight = PointLight(\'"+ light.getName() +"\')\n")
-                     out_file.write (i2+ "alight.setColor(VBase4("+ str(light.getLightColor().getX())+ "," + str(light.getLightColor().getY())+ "," + str(light.getLightColor().getZ()) + "," + str(light.getLightColor().getW()) + "))\n")
-                     #out_file.write (i2+ "alight.setPoint(Point3(" + str(light.getX()) + "," + str(light.getY()) + "," + str(light.getZ()) + "))\n")
-                     out_file.write (i2+ "alight.setSpecularColor(Vec4(" + str(light.getSpecColor().getX()) + "," + str(light.getSpecColor().getY()) + "," + str(light.getSpecColor().getZ()) + "," + str(light.getSpecColor().getW()) + "))\n")
-                     out_file.write (i2+ "alight.setAttenuation(Vec3("+ str(light.getAttenuation().getX()) + "," + str(light.getAttenuation().getY()) + "," + str(light.getAttenuation().getZ()) + "))\n")
-                     out_file.write (i2+ "self.lightAttrib=self.lightAttrib.addLight(alight)\n")
-                     out_file.write (i2+ "self."+light.getName()+ "= render.attachNewNode(alight.upcastToPandaNode())\n") 
-                     out_file.write (i2+ "self."+light.getName()+ ".setTag(\"Metadata\",\"" + light.getTag("Metadata") + "\")\n")       
-                     out_file.write (i2+ "self."+light.getName()+ ".setPos(Point3(" + str(light.getX()) + "," + str(light.getY()) + "," + str(light.getZ()) + "))\n")
-                     out_file.write (i2+ "self.LightDict[\'" + light.getName() + "\']=alight\n")
-                     out_file.write (i2+ "self.LightTypes[\'" + light.getName() + "\']=\'" + type + "\'\n")
-                     out_file.write (i2+ "self.LightNodes[\'" + light.getName() + "\']=self." + light.getName() +  "\n")
-                     out_file.write ("\n")
-                 elif type == 'spot':
-                     out_file.write(i2+"# Spot Light\n")
-                     out_file.write (i2+ "self.spotCount += 1\n")
-                     out_file.write (i2+ "alight = Spotlight(\'"+ light.getName() + "\')\n")
-                     out_file.write (i2+ "alight.setColor(VBase4("+ str(light.getLightColor().getX())+ "," + str(light.getLightColor().getY())+ "," + str(light.getLightColor().getZ()) + "," + str(light.getLightColor().getW()) + "))\n")
-                     out_file.write (i2+ "alens = PerspectiveLens()\n")
-                     out_file.write (i2+ "alight.setLens(alens)\n")
-                     out_file.write (i2+ "alight.setSpecularColor(Vec4(" + str(light.getSpecColor().getX()) + "," + str(light.getSpecColor().getY()) + "," + str(light.getSpecColor().getZ()) + "," + str(light.getSpecColor().getW()) + "))\n")
-                     out_file.write (i2+ "alight.setAttenuation(Vec3("+ str(light.getAttenuation().getX()) + "," + str(light.getAttenuation().getY()) + "," + str(light.getAttenuation().getZ()) + "))\n")
-                     out_file.write (i2+ "alight.setExponent(" +str(light.getExponent()) +")\n")
-                     out_file.write (i2+ "self.lightAttrib=self.lightAttrib.addLight(alight)\n")
-                     out_file.write (i2+ "self."+light.getName()+ "= render.attachNewNode(alight.upcastToLensNode())\n") 
-                     out_file.write (i2+ "self."+light.getName()+ ".setTag(\"Metadata\",\"" + light.getTag("Metadata") + "\")\n")       
-                     out_file.write (i2+ "self."+light.getName()+ ".setPos(Point3(" + str(light.getX()) + "," + str(light.getY()) + "," + str(light.getZ()) + "))\n")
-                     out_file.write (i2+ "self."+light.getName()+ ".setHpr(Vec3("+ str(light.getH())+ "," + str(light.getP())+ "," + str(light.getR()) + "))\n")
-                     out_file.write (i2+ "self.LightDict[\'" + light.getName() + "\']=alight\n")
-                     out_file.write (i2+ "self.LightTypes[\'" + light.getName() + "\']=\'" + type + "\'\n")
-                     out_file.write (i2+ "self.LightNodes[\'" + light.getName() + "\']=self." + light.getName() + "\n")
-                     out_file.write ("\n")
-                 else:
-                     out_file.write (i2+ "print \'Invalid light type\'")
-                     out_file.write (i2+ "return None")
-                 out_file.write("\n")
-
-        
-
-        ####################################################################################################################################################
-        # Enable Lighting
-        ####################################################################################################################################################
-
-        out_file.write(i2+ "# Enable Ligthing\n")
-        out_file.write(i2+ "render.node().setAttrib(self.lightAttrib)\n")
-        out_file.write("\n")
-
-
-
-        ####################################################################################################################################################
-        # Initialize Particles for non scene editor mode
-        ####################################################################################################################################################
-
-        out_file.write(i2+"# Load Particle Effects. The parameters to this function are to allow us to use our modified versions of the Particle Effects modules when loading this file with the level editor\n")
-        out_file.write(i2+"self.starteffects(self.loadmode,self.seParticleEffect,self.seParticles)\n")
-        out_file.write("\n")
-                
-        ####################################################################################################################################################
-        # Save Camera Settings
-        ####################################################################################################################################################
-
-        out_file.write("\n")
-        out_file.write(i2+ "# Save Camera Settings\n")
-        out_file.write(i2+ "camera.setX(" + str(camera.getX()) + ")\n")         
-        out_file.write(i2+ "camera.setY(" + str(camera.getY()) + ")\n")         
-        out_file.write(i2+ "camera.setZ(" + str(camera.getZ()) + ")\n")         
-        out_file.write(i2+ "camera.setH(" + str(camera.getH()) + ")\n")         
-        out_file.write(i2+ "camera.setP(" + str(camera.getP()) + ")\n")         
-        out_file.write(i2+ "camera.setR(" + str(camera.getR()) + ")\n") 
-        out_file.write(i2+ "camera.getChild(0).node().getLens().setNear(" + str(camera.getChild(0).node().getLens().getNear()) + ")\n") 
-        out_file.write(i2+ "camera.getChild(0).node().getLens().setFar(" + str(camera.getChild(0).node().getLens().getFar()) + ")\n") 
-        out_file.write(i2+ "camera.getChild(0).node().getLens().setFov(VBase2(%.5f,%.5f))\n"% (camera.getChild(0).node().getLens().getHfov(),camera.getChild(0).node().getLens().getVfov())) 
-        FilmSize=camera.getChild(0).node().getLens().getFilmSize()
-        out_file.write(i2+ "camera.getChild(0).node().getLens().setFilmSize(%.3f,%.3f)\n"%(FilmSize.getX(),FilmSize.getY())) 
-        out_file.write(i2+ "camera.getChild(0).node().getLens().setFocalLength(" + str(camera.getChild(0).node().getLens().getFocalLength()) + ")\n") 
-        out_file.write(i2+ "camera.setTag(\"Metadata\",\"" + camera.getTag("Metadata") + "\")\n")       
-        out_file.write(i2+ "camera.reparentTo(render)\n")
-        out_file.write(i2+ "base.disableMouse()\n")
-        self.bgColor=base.getBackgroundColor()
-        out_file.write(i2+ "base.setBackgroundColor(%.3f,%.3f,%.3f)\n"%(self.bgColor.getX(),self.bgColor.getY(),self.bgColor.getZ()))
-        out_file.write("\n")
-        
-
-        ####################################################################################################################################################
-        # Mopath Saving
-        ####################################################################################################################################################
-
-        out_file.write(i2+"##########################################################################################################\n")
-        out_file.write(i2+"# Motion Paths\n")
-        out_file.write(i2+"# Using Mopaths:\n")
-        out_file.write(i2+"# theScene.curveIntervals[0].start() or .loop() will play curve with index 0\n")
-        out_file.write(i2+"##########################################################################################################\n\n")
-
-        for node in AllScene.curveDict:
-            curveCollection=AllScene.curveDict[node]
-            curvenumber=0
-            for curve in curveCollection:
-                filestring=dirname+ "\\" + str(node)+"_curve_"+str(curvenumber)+".egg"
-                f=Filename.fromOsSpecific(filestring)
-                #filestring=f.getFullpath()# The old absolute path way
-                filestring=f.getBasename() # The new relative path way
-                curve.writeEgg(f)
-                out_file.write(i2+"m=Mopath.Mopath()\n")
-
-                out_file.write(i2+"if(self.loadmode==1):\n")
-                out_file.write(i2+i1+"m.loadFile(\"" + self.savepath +"/"+ filestring + "\")\n") # If just normally executed
-                out_file.write(i2+"else:\n")
-                out_file.write(i2+i1+"m.loadFile(self.executionpath + \"/"+ filestring + "\")\n") # If being invoked by level Ed
-
-                out_file.write(i2+"mp=MopathInterval(m,self." + str(node) + ")\n")
-                out_file.write(i2+"self.curveIntervals.append(mp)\n")
-                
-                out_file.write(i2+"if(self.loadmode==1):\n")
-                out_file.write(i2+i1+"self.curveRefColl.append(\"" + self.savepath +"/"+ filestring +"\")\n")
-                out_file.write(i2+"else:\n")
-                out_file.write(i2+i1+"self.curveRefColl.append(self.executionpath + \"/"+ filestring +"\")\n")
-
-                curvenumber=curvenumber+1
-            out_file.write(i2+"self.curveIntervalsDict[\"" + str(node) + "\"]=self.curveIntervals\n")        
-            out_file.write(i2+"self.curveDict[\"" + str(node) + "\"]=self.curveRefColl\n")
-
-    
-        ####################################################################################################################################################
-        # Lets do all the reparenting here so as to make sure everything that needed to load was loaded
-        ####################################################################################################################################################
-
-
-        out_file.write(i2+"##########################################################################################################\n")
-        out_file.write(i2+"# Reparenting\n")
-        out_file.write(i2+"# A final pass is done on setting all the scenegraph hierarchy after all objects are laoded\n")
-        out_file.write(i2+"##########################################################################################################\n\n")
-
-        for model in AllScene.ModelDic:
-            modelS=str(model)
-            parent=AllScene.ModelDic[model].getParent().getName()
-            if(parent=="render" or parent=="camera"):
-                out_file.write(i2+ "self."+ modelS + ".reparentTo(" + parent + ")\n")
-            else:
-                if(AllScene.particleDict.has_key(parent)):
-                    out_file.write(i2+ "self."+ modelS + ".reparentTo(self." + parent + ".getEffect())\n")
-                else:
-                    out_file.write(i2+ "self."+ modelS + ".reparentTo(self." + parent + ")\n")
-            out_file.write(i2+ "self.ModelDic[\'" + modelS + "\']=self." + AllScene.ModelDic[model].getName()+"\n")
-            out_file.write(i2+"\n")
-
-        for dummy in AllScene.dummyDict:
-            dummyS=str(dummy)
-            parent=AllScene.dummyDict[dummy].getParent().getName()
-            if(parent=="render" or parent=="camera"):
-                out_file.write(i2+ "self."+ dummyS + ".reparentTo(" + parent + ")\n")
-            else:  
-                if(AllScene.particleDict.has_key(parent)):
-                    out_file.write(i2+ "self."+ dummyS + ".reparentTo(self." + parent + ".getEffect())\n")
-                else:
-                    out_file.write(i2+ "self."+ dummyS + ".reparentTo(self." + parent + ")\n")
-
-            out_file.write(i2+ "self.dummyDict[\'" + dummyS + "\']=self." + AllScene.dummyDict[dummy].getName()+"\n")
-            out_file.write(i2+"\n")
-
-        for actor in AllScene.ActorDic:
-            actorS=str(actor)   
-            parent=AllScene.ActorDic[actor].getParent().getName()
-            if(parent=="render" or parent=="camera"):
-                out_file.write(i2+ "self."+ actorS + ".reparentTo(" + parent + ")\n")
-            else:
-                if(AllScene.particleDict.has_key(parent)):
-                    out_file.write(i2+ "self."+ actorS + ".reparentTo(self." + parent + ".getEffect())\n")
-                else:
-                    out_file.write(i2+ "self."+ actorS + ".reparentTo(self." + parent + ")\n")
-
-            out_file.write(i2+ "self.ActorDic[\'" + actorS + "\']=self." + AllScene.ActorDic[actor].getName()+"\n")
-            out_file.write(i2+"\n")
-        
-
-        for collnode in AllScene.collisionDict:
-            collnodeS=str(collnode)
-            solid=AllScene.collisionDict[collnode].node().getSolid(0)
-            nodetype=solid.getType().getName()
-            parentname=AllScene.collisionDict[collnode].getParent().getName()
-            if(parentname=="render" or parentname =="camera"):
-                out_file.write(i2+"self.collisionDict[\"" + collnodeS + "\"]="+ parentname + ".attachNewNode(self." + collnodeS + "_Node)\n")
-            else:
-                #Manakel 2/12/2005: parent replaced by parent Name but why Parent name in partice and parent for other objects?
-                if(AllScene.particleDict.has_key(parentname)):
-                    out_file.write(i2+"self.collisionDict[\"" + collnodeS + "\"]=self."+ parentname + "getEffect().attachNewNode(self." + collnodeS + "_Node)\n")
-                else:
-                    out_file.write(i2+"self.collisionDict[\"" + collnodeS + "\"]=self."+ parentname + ".attachNewNode(self." + collnodeS + "_Node)\n")
-            dictelem=AllScene.collisionDict[collnode]
-            out_file.write(i2+"self.collisionDict[\"" + collnodeS + "\"].setPosHprScale(%.3f,%.3f,%.3f,%.3f,%.3f,%.3f,%.3f,%.3f,%.3f)\n"%(dictelem.getX(),dictelem.getY(),dictelem.getZ(),dictelem.getH(),dictelem.getP(),dictelem.getR(),dictelem.getSx(),dictelem.getSy(),dictelem.getSz()))
-            out_file.write(i2+"self.collisionDict[\"" + collnodeS + "\"].setTag(\"Metadata\",\"" + AllScene.collisionDict[collnode].getTag("Metadata") + "\")\n")
-            out_file.write(i2+"self.collisionDict[\"" + collnodeS + "\"].show()\n")
-            if(nodetype=="CollisionPolygon"): #Save Collison Polygon... the reason we need to use setTag here is because there is no inbuilt way of saving transforms for collision polys
-
-                ax=float(AllScene.collisionDict[collnode].getTag("A_X"))
-                ay=float(AllScene.collisionDict[collnode].getTag("A_Y"))
-                az=float(AllScene.collisionDict[collnode].getTag("A_Z"))
-
-                bx=float(AllScene.collisionDict[collnode].getTag("B_X"))
-                by=float(AllScene.collisionDict[collnode].getTag("B_Y"))
-                bz=float(AllScene.collisionDict[collnode].getTag("B_Z"))
-
-                cx=float(AllScene.collisionDict[collnode].getTag("C_X"))
-                cy=float(AllScene.collisionDict[collnode].getTag("C_Y"))
-                cz=float(AllScene.collisionDict[collnode].getTag("C_Z"))
-
-                out_file.write(i2+"pointA=Point3(%.3f,%.3f,%.3f)\n"%(ax,ay,az))
-                out_file.write(i2+"pointB=Point3(%.3f,%.3f,%.3f)\n"%(bx,by,bz))
-                out_file.write(i2+"pointC=Point3(%.3f,%.3f,%.3f)\n"%(cx,cy,cz))
-
-                out_file.write(i2+"self.collisionDict[\"" + collnodeS + "\"].setTag('A_X','%f'%pointA.getX())\n")
-                out_file.write(i2+"self.collisionDict[\"" + collnodeS + "\"].setTag('A_Y','%f'%pointA.getY())\n")
-                out_file.write(i2+"self.collisionDict[\"" + collnodeS + "\"].setTag('A_Z','%f'%pointA.getZ())\n")
-
-                out_file.write(i2+"self.collisionDict[\"" + collnodeS + "\"].setTag('B_X','%f'%pointB.getX())\n")
-                out_file.write(i2+"self.collisionDict[\"" + collnodeS + "\"].setTag('B_Y','%f'%pointB.getY())\n")
-                out_file.write(i2+"self.collisionDict[\"" + collnodeS + "\"].setTag('B_Z','%f'%pointB.getZ())\n")
-
-                out_file.write(i2+"self.collisionDict[\"" + collnodeS + "\"].setTag('C_X','%f'%pointC.getX())\n")
-                out_file.write(i2+"self.collisionDict[\"" + collnodeS + "\"].setTag('C_Y','%f'%pointC.getY())\n")
-                out_file.write(i2+"self.collisionDict[\"" + collnodeS + "\"].setTag('C_Z','%f'%pointC.getZ())\n")
-            out_file.write(i2+"\n")
-
-
-        for effect in AllScene.particleDict:
-            parent=AllScene.particleNodes[effect].getParent().getName()
-            if(parent=="render" or parent=="camera"):
-                out_file.write(i2+"self.particleDict[\""+ str(effect) +"\"].reparentTo("  + parent + ")\n")             
-            else:
-                out_file.write(i2+"self.particleDict[\""+ str(effect) +"\"].reparentTo(self."  + parent + ")\n")
-            out_file.write(i2+"\n")
-
-
-        ####################################################################################################################################################
-        # Particle Saving
-        ####################################################################################################################################################
-        out_file.write("\n")
-        out_file.write(i2+"##########################################################################################################\n")
-        out_file.write(i2+"# Particle Effects\n")
-        out_file.write(i2+"# Using Particles:\n")
-        out_file.write(i2+"# theScene.enableeffect(\"Effect_Name\")\n")
-        out_file.write(i2+"##########################################################################################################\n\n")
-        out_file.write(i1+"def starteffects(self,mode,seParticleEffect=None,seParticles=None):\n")
-        for effect in AllScene.particleDict:
-            effectS=str(effect)
-            out_file.write(i2+ "self." + effectS + "=" + effectS + "(mode,seParticleEffect,seParticles)\n")
-            out_file.write(i2+ "effect=self."+ effectS + ".getEffect()\n")
-            out_file.write(i2+ "self.particleDict[\"" + effectS + "\"]=effect\n")
-            out_file.write(i2+ "effect.reparentTo(render)\n")
-            thenode=AllScene.particleNodes[effect]
-            out_file.write(i2+ "self.particleDict[\"" + effectS + "\"].setPosHprScale(%.2f,%.2f,%.2f,%.2f,%.2f,%.2f,%.2f,%.2f,%.2f)\n"%(thenode.getX(),thenode.getY(),thenode.getZ(),thenode.getH(),thenode.getP(),thenode.getR(),thenode.getSx(),thenode.getSy(),thenode.getSz()))
-            out_file.write("\n")
-        out_file.write(i2+"return\n")
-        out_file.write("\n")
-        out_file.write(i1+"def enableeffect(self,effect_name):\n")
-        out_file.write(i2+"self.particleDict[effect_name].enable()\n")
-        out_file.write(i2+"return\n")
-        out_file.write("\n")
-        out_file.write(i1+"def disableeffect(self,effect_name):\n")
-        out_file.write(i2+"self.particleDict[effect_name].disable()\n")
-        out_file.write(i2+"return\n")
-        out_file.write("\n")
-
-
-        ####################################################################################################################################################
-        # Animation Blending Methods
-        ####################################################################################################################################################
-        out_file.write("\n")
-        out_file.write(i2+"##########################################################################################################\n")
-        out_file.write(i2+"# Animation Blending\n")
-        out_file.write(i2+"# Using blending:\n")
-        out_file.write(i2+"# theScene.playBlendAnim(actor,blendname)\n")
-        out_file.write(i2+"# theScene.stopBlendAnim(actor,blendname)\n")
-        out_file.write(i2+"# theScene.changeBlendAnim(actor,blendname,blend_amount)\n")
-        out_file.write(i2+"##########################################################################################################\n\n")
-        out_file.write(i1+"def playBlendAnim(self,actor,blendName,loop=0):\n")
-        out_file.write(i2+"actor.enableBlend()\n")
-        out_file.write(i2+"blendDicts=self.blendAnimDict[actor.getName()]\n")
-        out_file.write(i2+"blendList=blendDicts[blendName]\n")
-        out_file.write(i2+"actor.setControlEffect(blendList[0],blendList[2])\n")
-        out_file.write(i2+"actor.setControlEffect(blendList[1],1.0-blendList[2])\n")
-        out_file.write(i2+"if(loop):\n")
-        out_file.write(i2+i1+"actor.loop(blendList[0])\n")
-        out_file.write(i2+i1+"actor.loop(blendList[1])\n")
-        out_file.write(i2+"else:\n")
-        out_file.write(i2+i1+"actor.start(blendList[0])\n")
-        out_file.write(i2+i1+"actor.start(blendList[1])\n")
-        out_file.write("\n")
-
-
-        out_file.write(i1+"def stopBlendAnim(self,actor,blendName):\n")
-        out_file.write(i2+"blendDicts=self.blendAnimDict[actor.getName()]\n")
-        out_file.write(i2+"blendList=blendDicts[blendName]\n")
-        out_file.write(i2+"actor.stop(blendList[0])\n")
-        out_file.write(i2+"actor.stop(blendList[1])\n")
-        out_file.write("\n")    
-
-        out_file.write(i1+"def changeBlending(self,actor,blendName,blending):\n")
-        out_file.write(i2+"blendDicts=self.blendAnimDict[actor.getName()]\n")
-        out_file.write(i2+"blendList=blendDicts[blendName]\n")  
-        out_file.write(i2+"blendList[2]=blending\n")
-        out_file.write(i2+"self.blendAnimDict[actor.getName()]={blendName:[blendList[0],blendList[1],blending]}\n")
-        out_file.write("\n")
-
-
-
-        ####################################################################################################################################################
-        # Hide and Show Methods
-        ####################################################################################################################################################
-     
-        out_file.write("\n")
-        out_file.write(i2+"##########################################################################################################\n")
-        out_file.write(i2+"# Hide and Show Methods\n")
-        out_file.write(i2+"# These will help you hide/show dummies, collision solids, effect nodes etc.\n")
-        out_file.write(i2+"##########################################################################################################\n\n")
-  
-     
-        out_file.write("\n")
-        out_file.write(i1+"def hideDummies(self):\n")
-        out_file.write("\n")
-        out_file.write(i2+"for dummy in self.dummyDict:\n")
-        out_file.write(i2+i1+"self.dummyDict[dummy].reparentTo(hidden)\n")
-        
-       
-        out_file.write("\n")
-        out_file.write(i1+"def hideCollSolids(self):\n")
-        out_file.write("\n")
-        out_file.write(i2+"for collSolid in self.collisionDict:\n")
-        out_file.write(i2+i1+"self.collisionDict[collSolid].hide()\n")
-
-
-        out_file.write("\n")
-        out_file.write(i1+"def hideEffectNodes(self):\n")
-        out_file.write("\n")
-        out_file.write(i2+"for effectnode in self.particleNodes:\n")
-        out_file.write(i2+i1+"self.particleNodes[effectnode].hide()\n")
-
-
-        out_file.write("\n")
-        out_file.write(i1+"def showDummies(self):\n")
-        out_file.write("\n")
-        out_file.write(i2+"for dummy in self.dummyDict:\n")
-        out_file.write(i2+i1+"self.dummyDict[dummy].reparentTo(hidden)\n")
-        
-       
-        out_file.write("\n")
-        out_file.write(i1+"def showCollSolids(self):\n")
-        out_file.write("\n")
-        out_file.write(i2+"for collSolid in self.collisionDict:\n")
-        out_file.write(i2+i1+"self.collisionDict[collSolid].show()\n")
-
-
-        out_file.write("\n")
-        out_file.write(i1+"def showEffectNodes(self):\n")
-        out_file.write("\n")
-        out_file.write(i2+"for effectnode in self.particleNodes:\n")
-        out_file.write(i2+i1+"self.particleNodes[effectnode].show()\n\n")
-
-
-        ##########################################################################################################
-        # Saving Particle Parameters as a Class
-        ##########################################################################################################
-
-        out_file.write("\n")
-        out_file.write(i2+"##########################################################################################################\n")
-        out_file.write(i2+"# Particle Effects\n")
-        out_file.write(i2+"# This is where effect parameters are saved in a class\n")
-        out_file.write(i2+"# The class is then instantiated in the starteffects method and appended to the dictionaries\n")
-        out_file.write(i2+"##########################################################################################################\n\n")
-
-        for effect in AllScene.particleDict:
-        
-            out_file.write("\n\n")
-            out_file.write("class " + str(effect) + ":\n")
-            out_file.write(i1+"def __init__(self,mode=1,seParticleEffect=None,seParticles=None):\n")
-            out_file.write(i2+"if(mode==0):\n")
-            out_file.write(i2+i1+"self.effect=seParticleEffect.ParticleEffect()\n")
-            out_file.write(i2+"else:\n")
-            out_file.write(i2+i1+"self.effect=ParticleEffect.ParticleEffect()\n")
-            AllScene.particleDict[effect].AppendConfig(out_file)
-            #out_file.write(i2+"return self.effect\n")
-            out_file.write("\n\n")
-            out_file.write(i1+"def starteffect(self):\n")
-            out_file.write(i2+"pass\n")
-            out_file.write("\n\n")
-            out_file.write(i1+"def stopeffect(self):\n")
-            out_file.write(i2+"pass\n\n")
-            out_file.write(i1+"def getEffect(self):\n")
-            out_file.write(i2+"return self.effect\n\n")
-
-
-
-        #Un-comment the lines below to make this a stand-alone file
-        #out_file.write("Scene=SavedScene()\n")
-        #out_file.write("run()\n")
-
-        out_file.close()
-                
-                

+ 0 - 134
doc/SceneEditor/seForceGroup.py

@@ -1,134 +0,0 @@
-from pandac.PandaModules import *
-from direct.showbase.DirectObject import DirectObject
-from direct.showbase.PhysicsManagerGlobal import *
-#Manakel 2/12/2005: replace from pandac import by from pandac.PandaModules import
-from pandac.PandaModules import ForceNode
-from direct.directnotify import DirectNotifyGlobal
-import sys
-
-class ForceGroup(DirectObject):
-
-    notify = DirectNotifyGlobal.directNotify.newCategory('ForceGroup')
-    id = 1
-
-    def __init__(self, name=None):
-        """__init__(self)"""
-
-        if (name == None):
-            self.name = 'ForceGroup-%d' % ForceGroup.id 
-            ForceGroup.id += 1
-        else:
-            self.name = name
-
-        self.node = ForceNode.ForceNode(self.name)
-        self.nodePath = NodePath(self.node)
-        self.fEnabled = 0
-
-        self.particleEffect = None
-
-    def cleanup(self):
-        self.node.clear()
-        self.nodePath.removeNode()
-        del self.nodePath
-        del self.node
-        del self.particleEffect
-
-    def enable(self):
-        """
-        Convenience function to enable all forces in force group
-        """
-        for i in range(self.node.getNumForces()):
-            f = self.node.getForce(i)
-            f.setActive(1)
-        self.fEnabled = 1
-
-    def disable(self):
-        """
-        Convenience function to disable all forces in force group
-        """
-        for i in range(self.node.getNumForces()):
-            f = self.node.getForce(i)
-            f.setActive(0)
-        self.fEnabled = 0
-
-    def isEnabled(self):
-        return self.fEnabled
-
-    def addForce(self, force):
-        """addForce(self, force)"""
-        self.node.addForce(force)
-        if (self.particleEffect):
-            self.particleEffect.addForce(force)
-
-    def removeForce(self, force):
-        """removeForce(self, force)"""
-        self.node.removeForce(force)
-        if (self.particleEffect != None):
-            self.particleEffect.removeForce(force)
-
-    # Get/set
-    def getName(self):
-        return self.name
-    def getNode(self):
-        return self.node
-    def getNodePath(self):
-        return self.nodePath
-
-    # Utility functions 
-    def __getitem__(self, index):
-        numForces = self.node.getNumForces()
-        if ((index < 0) or (index >= numForces)):
-            raise IndexError
-        return self.node.getForce(index)
-
-    def __len__(self):
-        return self.node.getNumForces()
-
-    def asList(self):
-        l = []
-        for i in range(self.node.getNumForces()):
-            l.append(self.node.getForce(i))
-        return l
-
-    def printParams(self, file = sys.stdout, targ = 'self'):
-        i1="    "
-        i2=i1+i1
-        file.write(i2+'# Force parameters\n')
-        for i in range(self.node.getNumForces()):
-            f = self.node.getForce(i)
-            fname = 'force%d' % i
-            if isinstance(f, LinearForce):
-                amplitude = f.getAmplitude()
-                massDependent = f.getMassDependent()
-                if isinstance(f, LinearCylinderVortexForce):
-                    file.write(i2+fname + ' = LinearCylinderVortexForce(%.4f, %.4f, %.4f, %.4f, %d)\n' % (f.getRadius(), f.getLength(), f.getCoef(), amplitude, massDependent))
-                elif isinstance(f, LinearDistanceForce):
-                    radius = f.getRadius()
-                    falloffType = f.getFalloffType()
-                    ftype = 'FTONEOVERR'
-                    if (falloffType == LinearDistanceForce.FTONEOVERR):
-                        ftype = 'FTONEOVERR'
-                    elif (falloffType == LinearDistanceForce.FTONEOVERRSQUARED):
-                        ftype = 'FTONEOVERRSQUARED'
-                    elif (falloffType == LinearDistanceForce.FTONEOVERRCUBED):
-                        ftype = 'FTONEOVERRCUBED'
-                    forceCenter = f.getForceCenter()
-                    if isinstance(f, LinearSinkForce):
-                        file.write(i2+fname + ' = LinearSinkForce(Point3(%.4f, %.4f, %.4f), LinearDistanceForce.%s, %.4f, %.4f, %d)\n' % (forceCenter[0], forceCenter[1], forceCenter[2], ftype, radius, amplitude, massDependent))
-                    elif isinstance(f, LinearSourceForce):
-                        file.write(i2+fname + ' = LinearSourceForce(Point3(%.4f, %.4f, %.4f), LinearDistanceForce.%s, %.4f, %.4f, %d)\n' % (forceCenter[0], forceCenter[1], forceCenter[2], ftype, radius, amplitude, massDependent))
-                elif isinstance(f, LinearFrictionForce):
-                    file.write(i2+fname + ' = LinearFrictionForce(%.4f, %.4f, %d)\n' % (f.getCoef(), amplitude, massDependent))
-                elif isinstance(f, LinearJitterForce):
-                    file.write(i2+fname + ' = LinearJitterForce(%.4f, %d)\n' % (amplitude, massDependent))
-                elif isinstance(f, LinearNoiseForce):
-                    file.write(i2+fname + ' = LinearNoiseForce(%.4f, %d)\n' % (amplitude, massDependent))
-                elif isinstance(f, LinearVectorForce):
-                    vec = f.getLocalVector()
-                    file.write(i2+fname + ' = LinearVectorForce(Vec3(%.4f, %.4f, %.4f), %.4f, %d)\n' % (vec[0], vec[1], vec[2], amplitude, massDependent))
-            elif isinstance(f, AngularForce):
-                if isinstance(f, AngularVectorForce):
-                    vec = f.getQuat()
-                    file.write(i2+fname + ' = AngularVectorForce(Quat(%.4f, %.4f, %.4f))\n' % (vec[0], vec[1], vec[2], vec[3]))
-            file.write(i2+fname + '.setActive(%d)\n' % f.getActive())
-            file.write(i2+targ + '.addForce(%s)\n' % fname)

+ 0 - 256
doc/SceneEditor/seGeometry.py

@@ -1,256 +0,0 @@
-#################################################################
-# seGeometry.py
-# Originally from DirectGeometry.py
-# Altered by Yi-Hong Lin, [email protected], 2004
-#
-# We didn't change anything essential.
-# Just because we customized the seSession from DirectSession,
-# So we need related files can follow the change.
-# However, we don't want to change anything inside the original directool
-# to let them can work with our scene editor.
-# (If we do change original directools, it will force user has to install the latest version of OUR Panda)
-#
-#################################################################
-
-from pandac.PandaModules import *
-from direct.directtools.DirectGlobals import *
-from direct.directtools.DirectUtil import *
-import math
-
-class LineNodePath(NodePath):
-    def __init__(self, parent = None, name = None,
-                 thickness = 1.0, colorVec = VBase4(1)):
-
-        # Initialize the superclass
-        NodePath.__init__(self)
-
-        if parent is None:
-            parent = hidden
-
-        # Attach a geomNode to the parent and set self to be
-        # the resulting node path
-        self.lineNode = GeomNode("lineNode")
-        self.assign(parent.attachNewNode( self.lineNode ))
-        if name:
-            self.setName(name)
-
-        # Create a lineSegs object to hold the line
-        ls = self.lineSegs = LineSegs()
-        # Initialize the lineSegs parameters
-        ls.setThickness(thickness)
-        ls.setColor(colorVec)
-
-    def moveTo( self, *_args ):
-        apply( self.lineSegs.moveTo, _args )
-
-    def drawTo( self, *_args ):
-        apply( self.lineSegs.drawTo, _args )
-
-    def create( self, frameAccurate = 0 ):
-        self.lineSegs.create( self.lineNode, frameAccurate )
-
-    def reset( self ):
-        self.lineSegs.reset()
-        self.lineNode.removeAllGeoms()
-
-    def isEmpty( self ):
-        return self.lineSegs.isEmpty()
-
-    def setThickness( self, thickness ):
-        self.lineSegs.setThickness( thickness )
-
-    def setColor( self, *_args ):
-        apply( self.lineSegs.setColor, _args )
-
-    def setVertex( self, *_args):
-        apply( self.lineSegs.setVertex, _args )
-
-    def setVertexColor( self, vertex, *_args ):
-        apply( self.lineSegs.setVertexColor, (vertex,) + _args )
-
-    def getCurrentPosition( self ):
-        return self.lineSegs.getCurrentPosition()
-
-    def getNumVertices( self ):
-        return self.lineSegs.getNumVertices()
-
-    def getVertex( self, index ):
-        return self.lineSegs.getVertex(index)
-
-    def getVertexColor( self ):
-        return self.lineSegs.getVertexColor()
-    
-    def drawArrow(self, sv, ev, arrowAngle, arrowLength):
-        """
-        Do the work of moving the cursor around to draw an arrow from
-        sv to ev. Hack: the arrows take the z value of the end point
-        """
-        self.moveTo(sv)
-        self.drawTo(ev)
-        v = sv - ev
-        # Find the angle of the line
-        angle = math.atan2(v[1], v[0])
-        # Get the arrow angles
-        a1 = angle + deg2Rad(arrowAngle)
-        a2 = angle - deg2Rad(arrowAngle)
-        # Get the arrow points
-        a1x = arrowLength * math.cos(a1)
-        a1y = arrowLength * math.sin(a1)
-        a2x = arrowLength * math.cos(a2)
-        a2y = arrowLength * math.sin(a2)
-        z = ev[2]
-        self.moveTo(ev)
-        self.drawTo(Point3(ev + Point3(a1x, a1y, z)))
-        self.moveTo(ev)
-        self.drawTo(Point3(ev + Point3(a2x, a2y, z)))
-
-    def drawArrow2d(self, sv, ev, arrowAngle, arrowLength):
-        """
-        Do the work of moving the cursor around to draw an arrow from
-        sv to ev. Hack: the arrows take the z value of the end point
-        """
-        self.moveTo(sv)
-        self.drawTo(ev)
-        v = sv - ev
-        # Find the angle of the line
-        angle = math.atan2(v[2], v[0])
-        # Get the arrow angles
-        a1 = angle + deg2Rad(arrowAngle)
-        a2 = angle - deg2Rad(arrowAngle)
-        # Get the arrow points
-        a1x = arrowLength * math.cos(a1)
-        a1y = arrowLength * math.sin(a1)
-        a2x = arrowLength * math.cos(a2)
-        a2y = arrowLength * math.sin(a2)
-        self.moveTo(ev)
-        self.drawTo(Point3(ev + Point3(a1x, 0.0, a1y)))
-        self.moveTo(ev)
-        self.drawTo(Point3(ev + Point3(a2x, 0.0, a2y)))
-
-    def drawLines(self, lineList):
-        """
-        Given a list of lists of points, draw a separate line for each list
-        """
-        for pointList in lineList:
-            apply(self.moveTo, pointList[0])
-            for point in pointList[1:]:
-                apply(self.drawTo, point)
-
-##
-## Given a point in space, and a direction, find the point of intersection
-## of that ray with a plane at the specified origin, with the specified normal
-def planeIntersect (lineOrigin, lineDir, planeOrigin, normal):
-    t = 0
-    offset = planeOrigin - lineOrigin
-    t = offset.dot(normal) / lineDir.dot(normal)
-    hitPt = lineDir * t
-    return hitPt + lineOrigin
-
-def getNearProjectionPoint(nodePath):
-    # Find the position of the projection of the specified node path
-    # on the near plane
-    origin = nodePath.getPos(SEditor.camera)
-    # project this onto near plane
-    if origin[1] != 0.0:
-        return origin * (SEditor.dr.near / origin[1])
-    else:
-        # Object is coplaner with camera, just return something reasonable
-        return Point3(0, SEditor.dr.near, 0)
-
-def getScreenXY(nodePath):
-    # Where does the node path's projection fall on the near plane
-    nearVec = getNearProjectionPoint(nodePath)
-    # Clamp these coordinates to visible screen
-    nearX = CLAMP(nearVec[0], SEditor.dr.left, SEditor.dr.right)
-    nearY = CLAMP(nearVec[2], SEditor.dr.bottom, SEditor.dr.top)
-    # What percentage of the distance across the screen is this?
-    percentX = (nearX - SEditor.dr.left)/SEditor.dr.nearWidth
-    percentY = (nearY - SEditor.dr.bottom)/SEditor.dr.nearHeight
-    # Map this percentage to the same -1 to 1 space as the mouse
-    screenXY = Vec3((2 * percentX) - 1.0,nearVec[1],(2 * percentY) - 1.0)
-    # Return the resulting value
-    return screenXY
-
-def getCrankAngle(center):
-    # Used to compute current angle of mouse (relative to the coa's
-    # origin) in screen space
-    x = SEditor.dr.mouseX - center[0]
-    y = SEditor.dr.mouseY - center[2]
-    return (180 + rad2Deg(math.atan2(y,x)))
-
-def relHpr(nodePath, base, h, p, r):
-    # Compute nodePath2newNodePath relative to base coordinate system
-    # nodePath2base
-    mNodePath2Base = nodePath.getMat(base)
-    # delta scale, orientation, and position matrix
-    mBase2NewBase = Mat4()
-    composeMatrix(mBase2NewBase, UNIT_VEC, VBase3(h,p,r), ZERO_VEC,
-                  CSDefault)
-    # base2nodePath
-    mBase2NodePath = base.getMat(nodePath)
-    # nodePath2 Parent
-    mNodePath2Parent = nodePath.getMat()
-    # Compose the result
-    resultMat = mNodePath2Base * mBase2NewBase
-    resultMat = resultMat * mBase2NodePath
-    resultMat = resultMat * mNodePath2Parent
-    # Extract and apply the hpr
-    hpr = Vec3(0)
-    decomposeMatrix(resultMat, VBase3(), hpr, VBase3(),
-                    CSDefault)
-    nodePath.setHpr(hpr)
-
-# Quaternion interpolation
-def qSlerp(startQuat, endQuat, t):
-    startQ = Quat(startQuat)
-    destQuat = Quat.identQuat()
-    # Calc dot product
-    cosOmega = (startQ.getI() * endQuat.getI() +
-                startQ.getJ() * endQuat.getJ() + 
-                startQ.getK() * endQuat.getK() +
-                startQ.getR() * endQuat.getR())
-    # If the above dot product is negative, it would be better to
-    # go between the negative of the initial and the final, so that
-    # we take the shorter path.  
-    if ( cosOmega < 0.0 ):
-        cosOmega *= -1
-        startQ.setI(-1 * startQ.getI())
-        startQ.setJ(-1 * startQ.getJ())
-        startQ.setK(-1 * startQ.getK())
-        startQ.setR(-1 * startQ.getR())
-    if ((1.0 + cosOmega) > Q_EPSILON):
-        # usual case
-        if ((1.0 - cosOmega) > Q_EPSILON):
-            # usual case
-            omega = math.acos(cosOmega)
-            sinOmega = math.sin(omega)
-            startScale = math.sin((1.0 - t) * omega)/sinOmega
-            endScale = math.sin(t * omega)/sinOmega
-        else:
-            # ends very close 
-            startScale = 1.0 - t
-            endScale = t
-        destQuat.setI(startScale * startQ.getI() +
-                      endScale * endQuat.getI())
-        destQuat.setJ(startScale * startQ.getJ() +
-                      endScale * endQuat.getJ())
-        destQuat.setK(startScale * startQ.getK() +
-                      endScale * endQuat.getK())
-        destQuat.setR(startScale * startQ.getR() +
-                      endScale * endQuat.getR())
-    else:
-        # ends nearly opposite
-        destQuat.setI(-startQ.getJ())
-        destQuat.setJ(startQ.getI())
-        destQuat.setK(-startQ.getR())
-        destQuat.setR(startQ.getK())
-        startScale = math.sin((0.5 - t) * math.pi)
-        endScale = math.sin(t * math.pi)
-        destQuat.setI(startScale * startQ.getI() +
-                      endScale * endQuat.getI())
-        destQuat.setJ(startScale * startQ.getJ() +
-                      endScale * endQuat.getJ())
-        destQuat.setK(startScale * startQ.getK() +
-                      endScale * endQuat.getK())
-    return destQuat
-

+ 0 - 170
doc/SceneEditor/seGrid.py

@@ -1,170 +0,0 @@
-#################################################################
-# seGrid.py
-# Originally from DirectGrid.py
-# Altered by Yi-Hong Lin, [email protected], 2004
-#
-# We didn't change anything essential.
-# Just because we customized the seSession from DirectSession,
-# So we need related files can follow the change.
-# However, we don't want to change anything inside the original directool
-# to let them can work with our scene editor.
-# (If we do change original directools, it will force user has to install the latest version of OUR Panda)
-#
-#################################################################
-from direct.showbase.DirectObject import *
-from direct.directtools.DirectUtil import *
-from seGeometry import *
-
-class DirectGrid(NodePath,DirectObject):
-    def __init__(self):
-        # Initialize superclass
-        NodePath.__init__(self)
-        self.assign(hidden.attachNewNode('DirectGrid'))
-        # Don't wireframe or light
-        useDirectRenderStyle(self)
-
-        # Load up grid parts to initialize grid object
-        # Polygon used to mark grid plane
-        self.gridBack = loader.loadModel('models/misc/gridBack')
-        self.gridBack.reparentTo(self)
-        self.gridBack.setColor(0.5,0.5,0.5,0.5)
-
-        # Grid Lines
-        self.lines = self.attachNewNode('gridLines')
-        self.minorLines = LineNodePath(self.lines)
-        self.minorLines.lineNode.setName('minorLines')
-        self.minorLines.setColor(VBase4(0.3,0.55,1,1))
-        self.minorLines.setThickness(1)
-
-        self.majorLines = LineNodePath(self.lines)
-        self.majorLines.lineNode.setName('majorLines')
-        self.majorLines.setColor(VBase4(0.3,0.55,1,1))
-        self.majorLines.setThickness(5)
-
-        self.centerLines = LineNodePath(self.lines)
-        self.centerLines.lineNode.setName('centerLines')
-        self.centerLines.setColor(VBase4(1,0,0,0))
-        self.centerLines.setThickness(3)
-
-        # Small marker to hilight snap-to-grid point
-        self.snapMarker = loader.loadModel('models/misc/sphere')
-        self.snapMarker.node().setName('gridSnapMarker')
-        self.snapMarker.reparentTo(self)
-        self.snapMarker.setColor(1,0,0,1)
-        self.snapMarker.setScale(0.3)
-        self.snapPos = Point3(0)
-
-        # Initialize Grid characteristics
-        self.fXyzSnap = 1
-        self.fHprSnap = 1
-        self.gridSize = 100.0
-        self.gridSpacing = 5.0
-        self.snapAngle = 15.0
-        self.enable()
-
-    def enable(self):
-        self.reparentTo(SEditor.group)
-        self.updateGrid()
-        self.fEnabled = 1
-
-    def disable(self):
-        self.reparentTo(hidden)
-        self.fEnabled = 0
-
-    def toggleGrid(self):
-        if self.fEnabled:
-            self.disable()
-        else:
-            self.enable()
-
-    def isEnabled(self):
-        return self.fEnabled
-
-    def updateGrid(self):
-        # Update grid lines based upon current grid spacing and grid size
-        # First reset existing grid lines
-        self.minorLines.reset()
-        self.majorLines.reset()
-        self.centerLines.reset()
-
-        # Now redraw lines
-        numLines = int(math.ceil(self.gridSize/self.gridSpacing))
-        scaledSize = numLines * self.gridSpacing
- 
-        center = self.centerLines
-        minor = self.minorLines
-        major = self.majorLines
-        for i in range(-numLines,numLines + 1):
-            if i == 0:
-                center.moveTo(i * self.gridSpacing, -scaledSize, 0)
-                center.drawTo(i * self.gridSpacing, scaledSize, 0)
-                center.moveTo(-scaledSize, i * self.gridSpacing, 0)
-                center.drawTo(scaledSize, i * self.gridSpacing, 0)
-            else:
-                if (i % 5) == 0:
-                    major.moveTo(i * self.gridSpacing, -scaledSize, 0)
-                    major.drawTo(i * self.gridSpacing, scaledSize, 0)
-                    major.moveTo(-scaledSize, i * self.gridSpacing, 0)
-                    major.drawTo(scaledSize, i * self.gridSpacing, 0)
-                else:
-                    minor.moveTo(i * self.gridSpacing, -scaledSize, 0)
-                    minor.drawTo(i * self.gridSpacing, scaledSize, 0)
-                    minor.moveTo(-scaledSize, i * self.gridSpacing, 0)
-                    minor.drawTo(scaledSize, i * self.gridSpacing, 0)
-
-        center.create()
-        minor.create()
-        major.create()
-        self.gridBack.setScale(scaledSize)
-        
-    def setXyzSnap(self, fSnap):
-        self.fXyzSnap = fSnap
-
-    def getXyzSnap(self):
-        return self.fXyzSnap
-
-    def setHprSnap(self, fSnap):
-        self.fHprSnap = fSnap
-
-    def getHprSnap(self):
-        return self.fHprSnap
-
-    def computeSnapPoint(self, point):
-        # Start of with current point
-        self.snapPos.assign(point)
-        # Snap if necessary
-        if self.fXyzSnap:
-            self.snapPos.set(
-                ROUND_TO(self.snapPos[0], self.gridSpacing),
-                ROUND_TO(self.snapPos[1], self.gridSpacing),
-                ROUND_TO(self.snapPos[2], self.gridSpacing))
-            
-        # Move snap marker to this point
-        self.snapMarker.setPos(self.snapPos)
-
-        # Return the hit point
-        return self.snapPos
-
-    def computeSnapAngle(self, angle):
-        return ROUND_TO(angle, self.snapAngle)
-
-    def setSnapAngle(self, angle):
-        self.snapAngle = angle
-
-    def getSnapAngle(self):
-        return self.snapAngle
-
-    def setGridSpacing(self, spacing):
-        self.gridSpacing = spacing
-        self.updateGrid()
-        
-    def getGridSpacing(self):
-        return self.gridSpacing
-
-    def setGridSize(self, size):
-        # Set size of grid back and redraw lines
-        self.gridSize = size
-        self.updateGrid()
-
-    def getGridSize(self):
-        return self.gridSize

+ 0 - 633
doc/SceneEditor/seLights.py

@@ -1,633 +0,0 @@
-#################################################################
-# seLights.py
-# Written by Yi-Hong Lin, [email protected], 2004
-#################################################################
-from direct.showbase.DirectObject import *
-from string import lower
-from direct.directtools import DirectUtil
-from pandac.PandaModules import *
-import string
-
-
-class seLight(NodePath):
-    #################################################################
-    # seLight(NodePath)
-    # This is an object for keeping light data and let we can manipulate
-    # lights as otherNopaths.
-    # This idea basically is from directLight.
-    # But the way directLight object worked is not we want in our
-    # sceneEditor. So, we wrote one by ourself.
-    #################################################################
-    def __init__(self, light, parent, type,
-                 lightcolor=VBase4(0.3,0.3,0.3,1),
-                 specularColor = VBase4(1),
-                 position = Point3(0,0,0),
-                 orientation = Vec3(1,0,0),
-                 constant = 1.0,
-                 linear = 0.0,
-                 quadratic = 0.0,
-                 exponent = 0.0,
-                 tag="",
-                 lence = None):
-        #################################################################
-        # __init__(self, light, parent, type,
-        #          lightcolor=VBase4(0.3,0.3,0.3,1),
-        #          specularColor = VBase4(1),
-        #          position = Point3(0,0,0),
-        #          orientation = Vec3(1,0,0),
-        #          constant = 1.0,
-        #          linear = 0.0,
-        #          quadratic = 0.0,
-        #          exponent = 0.0,
-        #          tag="",
-        #          lence = None):
-        # This constructor will create a light node inside it and upcast
-        # this light node to itself as a nodePath.
-        # Also, it will load a model as a reference to itself on the secene so that
-        # user can easily recognize where is the light and can easily manipulate
-        # by mouse picking and widget control.
-        #################################################################
-        # Initialize the super class
-        NodePath.__init__(self)
-        # Initialize and save values
-        self.light = light
-        self.type = type
-        self.lightcolor=lightcolor
-        self.specularColor = specularColor
-        self.position = position
-        self.orientation = orientation
-        self.constant = constant
-        self.linear = linear
-        self.quadratic = quadratic
-        self.exponent = exponent
-        self.lence = lence
-        self.active = True
-           
-        if isinstance(light, Spotlight):
-            node = light.upcastToLensNode()
-        else:
-            node = light.upcastToPandaNode()
-
-        # Attach node to self
-        self.LightNode=parent.attachNewNode(node)
-        self.LightNode.setTag("Metadata",tag)
-        if(self.type=='spot'):
-            self.LightNode.setHpr(self.orientation)
-            self.LightNode.setPos(self.position)
-        else:
-            self.LightNode.setHpr(self.orientation)     
-            self.LightNode.setPos(self.position)
-            
-        
-        self.assign(self.LightNode)
-        if(self.type=='spot'):
-            self.helpModel = loader.loadModel( "models/misc/Spotlight" )
-        elif(self.type=='point'):
-            self.helpModel = loader.loadModel( "models/misc/Pointlight" )
-        elif(self.type=='directional'):
-            self.helpModel = loader.loadModel( "models/misc/Dirlight" )
-        else:
-            self.helpModel = loader.loadModel( "models/misc/sphere" )
-        self.helpModel.setColor(self.lightcolor)
-        self.helpModel.reparentTo(self)
-        DirectUtil.useDirectRenderStyle(self.helpModel)
-        if not ((self.type == 'directional')or(self.type == 'point')or(self.type == 'spot')):
-            self.helpModel.hide()
-
-    def getLight(self):
-        #################################################################
-        # getLight(self)
-        # This function will return the light object it contains.
-        #################################################################
-        
-        return self.light
-
-    def getLightColor(self):
-        #################################################################
-        # getLightColor(self)
-        # This function will return the color of the light color of this light node.
-        #################################################################
-        return self.lightcolor
-    
-    def getName(self):
-        #################################################################
-        # getName(self)
-        # This function will return the name of this light.
-        #################################################################
-        return self.light.getName()
-    
-    def rename(self,name):
-        #################################################################
-        # rename(self, name)
-        # User should specify a string object, name, as the new name of this
-        # light node. This function will rename itself and light object
-        # to this new name.
-        #################################################################
-        self.light.setName(name)
-        self.setName(name)
-
-    def getType(self):
-        #################################################################
-        # getType(self)
-        # This function will return a string which is the type of this
-        # light node. (We only have four types of light)
-        #################################################################
-        return self.type
-
-    def setColor(self,color):
-        #################################################################
-        # setColor(self, color)
-        # This function takes one input parameter, color, which is a
-        # VBase4 object. This function will simply set this object into
-        # light node it has to change the property of light.
-        # Also, if the light type is either "directional" or "point", which
-        # means it has a reference model with it, this function will also
-        # change the reference model's color to input value.
-        #################################################################
-        self.light.setColor(color)
-        self.lightcolor = color
-        if (self.type == 'directional')or(self.type == 'point'):
-            self.helpModel.setColor(self.lightcolor)
-        return
-
-    def getSpecColor(self):
-        #################################################################
-        # getSpecColor(self)
-        # This function will return the specular color of the light.
-        # Although you can call this function for all kinds of light,
-        # it will only meanful if this light is not a ambient light.
-        #################################################################
-        return self.specularColor
-
-    def setSpecColor(self,color):
-        #################################################################
-        # setSpecColor(self, color)
-        # This function can be used to set the specular color of the light.
-        # Although you can call this function for all kinds of light,
-        # it will only meanful if the light type is not "ambient"
-        #################################################################
-        self.light.setSpecularColor(color)
-        self.specularcolor = color
-        return
-
-    def getPosition(self):
-        #################################################################
-        # getPosition(self)
-        # getPosition(self)
-        # This functioln will return a Point3 object which contains
-        # the x, y, z position data of this light node.
-        # It only has meaning for "point Light" and "Directional light"
-        #################################################################
-        self.position = self.LightNode.getPos()
-        return self.position
-
-    def setPosition(self, pos):
-        #################################################################
-        # setPosition(self, pos)
-        # This function will take a Point3 object as a input.
-        # Then, this function will set the itself andd light node to the
-        # target point.
-        #################################################################
-        self.LightNode.setPos(pos)
-        self.position = pos
-        return
-
-    def getOrientation(self):
-        #################################################################
-        # getOrientation(self)
-        # This function will return a Vec3-type object which contains the
-        # orientation data of this light node
-        #
-        # This function will only have meaning for point light and directional light.
-        #
-        #################################################################
-        self.orientation = self.LightNode.getHpr()
-        return self.orientation
-        
-    def setOrientation(self,orient):
-        #################################################################
-        # setOrientation(self, orient)
-        # This funtction will take a Vec3-type object as an input.
-        # Then this function will set itself nad light node to face
-        # the target orientation.
-        #
-        # This function only has meaning for point light and directional light
-        # type of lights.
-        #
-        #################################################################
-        self.LightNode.setHpr(orient)
-        self.orientation = orient
-        return
-
-    def getAttenuation(self):
-        #################################################################
-        # getAttenuation(self)
-        # This function will return a Vec3 type of object which contains
-        # the constant, linear and quadratic attenuation for this light node.
-        #
-        # This function will only have meaning for point light and spot light
-        # tyoe of lights.
-        #
-        #################################################################
-        return Vec3(self.constant,self.linear,self.quadratic)
-
-    def setConstantAttenuation(self, value):
-        #################################################################
-        # setConstantAttenuation(self, value)
-        # This function will take a float number as an input.
-        # Then, this function will set the Constant Atenuation value
-        # to this number.
-        #################################################################
-        self.light.setAttenuation(Vec3(value, self.linear, self.quadratic))
-        self.constant = value
-        return
-    
-    def setLinearAttenuation(self, value):
-        #################################################################
-        # setLinearAttenuation(self, value)
-        # This function will take a float number as an input.
-        # Then, this function will set the Linear Atenuation value
-        # to this number.
-        #################################################################
-        self.light.setAttenuation(Vec3(self.constant, value, self.quadratic))
-        self.linear = value
-        return
-    
-    def setQuadraticAttenuation(self, value):
-        #################################################################
-        # setQuadraticAttenuation(self, value)
-        # This function will take a float number as an input.
-        # Then, this function will set the Quadratic Atenuation value
-        # to this number.
-        #################################################################
-        self.light.setAttenuation(Vec3(self.constant, self.linear, value))
-        self.quadratic = value
-        return
-
-    def getExponent(self):
-        #################################################################
-        # getExponent(self)
-        # This function will return the value of the Exponent Attenuation
-        # of this light node. (float)
-        #################################################################
-        return self.exponent    
-
-    def setExponent(self, value):
-        #################################################################
-        # setExponent(self, value)
-        # This function will take a float number as an input.
-        # Then, this function will set the Exponent Atenuation value
-        # to this number.
-        #################################################################
-        self.light.setExponent(value)
-        self.exponent = value
-        return
-        
-class seLightManager(NodePath):
-    #################################################################
-    # seLightManager(NodePath)
-    # This is the class we used to control al lightings in our sceneEditor.
-    #################################################################
-    def __init__(self):
-        # Initialize the superclass
-        NodePath.__init__(self)
-        # Create a node for the lights
-        self.lnode=render.attachNewNode('Lights')
-        self.assign(self.lnode)
-        # Create a light attrib
-        self.lightAttrib = LightAttrib.makeAllOff()
-        self.lightDict = {}
-        self.ambientCount = 0
-        self.directionalCount = 0
-        self.pointCount = 0
-        self.spotCount = 0
-        # Originally, we don't do this load model thing.
-        # But the problem is, if we don't, then it will cause some
-        # Bounding calculation error...
-        self.helpModel = loader.loadModel( "models/misc/sphere" )
-        self.helpModel.reparentTo(self)
-        self.helpModel.hide()
-   
-
-
-
-    def create(self, type = 'ambient',
-                 lightcolor=VBase4(0.3,0.3,0.3,1),
-                 specularColor = VBase4(1),
-                 position = Point3(0,0,0),
-                 orientation = Vec3(1,0,0),
-                 constant = 1.0,
-                 linear = 0.0,
-                 quadratic = 0.0,
-                 exponent = 0.0,
-                 tag= "",
-                 name='DEFAULT_NAME'):
-        #################################################################
-        # create(self, type = 'ambient',
-        #        lightcolor=VBase4(0.3,0.3,0.3,1),
-        #        specularColor = VBase4(1),
-        #        position = Point3(0,0,0),
-        #        orientation = Vec3(1,0,0),
-        #        constant = 1.0,
-        #        linear = 0.0,
-        #        quadratic = 0.0,
-        #        exponent = 0.0,
-        #        tag= "",
-        #        name='DEFAULT_NAME')
-        # As you can see, once user call this function and specify those
-        # variables, this function will create a seLight node.
-        # In the default, the light which just has been created will be
-        # set to off.
-        #################################################################
-        ### create the light
-
-        lence = None
-        
-        if type == 'ambient':
-            self.ambientCount += 1
-            if(name=='DEFAULT_NAME'):
-                light = AmbientLight('ambient_' + `self.ambientCount`)
-            else:
-                light = AmbientLight(name)
-
-            light.setColor(lightcolor)
-
-        elif type == 'directional':
-            self.directionalCount += 1
-            if(name=='DEFAULT_NAME'):
-                light = DirectionalLight('directional_' + `self.directionalCount`)
-            else:
-                light = DirectionalLight(name)
-
-            light.setColor(lightcolor)
-            light.setSpecularColor(specularColor)
-
-        elif type == 'point':
-            self.pointCount += 1
-            if(name=='DEFAULT_NAME'):
-                light = PointLight('point_' + `self.pointCount`)
-            else:
-                light = PointLight(name)
-            
-            light.setColor(lightcolor)
-            light.setSpecularColor(specularColor)
-            light.setAttenuation(Vec3(constant, linear, quadratic))
-
-        elif type == 'spot':
-            self.spotCount += 1
-            if(name=='DEFAULT_NAME'):
-                light = Spotlight('spot_' + `self.spotCount`)
-            else:
-                light = Spotlight(name)
-
-            light.setColor(lightcolor)
-            lence = PerspectiveLens()
-            light.setLens(lence)
-            light.setSpecularColor(specularColor)
-            light.setAttenuation(Vec3(constant, linear, quadratic))
-            light.setExponent(exponent)
-        else:
-            print 'Invalid light type'
-            return None
-
-        # Create the seLight objects and put the light object we just created into it.
-        lightNode = seLight(light,self,type,
-                            lightcolor=lightcolor,
-                            specularColor = specularColor,
-                            position = position,
-                            orientation = orientation,
-                            constant = constant,
-                            linear = linear,
-                            quadratic = quadratic,
-                            exponent = exponent,
-                            tag=tag,
-                            lence = lence
-                                )
-        self.lightDict[light.getName()] = lightNode
-        self.setOn(lightNode)
-
-        
-        return self.lightDict.keys(),lightNode
-
-    def addLight(self, light):
-        #################################################################
-        # addLight(self, light)
-        # This function will put light in and save its properties in to a seLight Node
-        # Attention!!
-        # only Spotlight obj nneds to be specified a lens node first. i.e. setLens() first!
-        #################################################################
-        type = lower(light.getType().getName())
-
-        light.upcastToNamable()
-
-        specularColor = VBase4(1)
-        position = Point3(0,0,0)
-        orientation = Vec3(1,0,0)
-        constant = 1.0
-        linear = 0.0
-        quadratic = 0.0
-        exponent = 0.0
-        lence = None
-
-        lightcolor = light.getColor()
-        if type == 'ambientlight':
-            type = 'ambient'
-            self.ambientCount += 1
-        elif type == 'directionallight':
-            type = 'directional'
-            self.directionalCount += 1
-            orientation = light.getDirection()
-            position = light.getPoint()
-            specularColor = light.getSpecularColor()
-        elif type == 'pointlight':
-            type = 'point'
-            self.pointCount += 1
-            position = light.getPoint()
-            specularColor = light.getSpecularColor()
-            Attenuation = light.getAttenuation()
-            constant = Attenuation.getX()
-            linear = Attenuation.getY()
-            quadratic = Attenuation.getZ()
-        elif type == 'spotlight':
-            type = 'spot'
-            self.spotCount += 1
-            specularColor = light.getSpecularColor()
-            Attenuation = light.getAttenuation()
-            constant = Attenuation.getX()
-            linear = Attenuation.getY()
-            quadratic = Attenuation.getZ()
-            exponent = light.getExponent()
-        else:
-            print 'Invalid light type'
-            return None
-
-        lightNode = seLight(light,self,type,
-                            lightcolor=lightcolor,
-                            specularColor = specularColor,
-                            position = position,
-                            orientation = orientation,
-                            constant = constant,
-                            linear = linear,
-                            quadratic = quadratic,
-                            exponent = exponent,
-                            lence = lence)
-        self.lightDict[light.getName()] = lightNode
-        self.setOn(lightNode)
-
-        return self.lightDict.keys(),lightNode
-
-    def delete(self, name, removeEntry = True):
-        #################################################################
-        # delete(self, name, removeEntry = True)
-        # This function will remove light node had the same name with user input.
-        # Also, you can specify the removeEntry to decide to remove the entry from the lightDict or not.
-        # Normaly, you alway want to remove the entry from the dictionary. Thsi is only used for "deleteAll" function.
-        #################################################################
-        type = self.lightDict[name].getType()
-        if type == 'ambient':
-            self.ambientCount -= 1
-        elif type == 'directional':
-            self.directionalCount -= 1
-        elif type == 'point':
-            self.pointCount -= 1
-        elif type == 'spot':
-            self.spotCount -= 1
-        self.setOff(self.lightDict[name])
-        self.lightDict[name].removeChildren()
-        self.lightDict[name].removeNode()
-        if removeEntry:
-            del self.lightDict[name]
-        return self.lightDict.keys()
-
-    def deleteAll(self):
-        #################################################################
-        # deleteAll(self)
-        # This function will keep calling delete and put exist lights in
-        # until all lights have been eliminated.
-        #################################################################
-        for name in self.lightDict:
-            self.delete(name, removeEntry = False)
-        
-        self.lightDict.clear()
-
-    def isLight(self,name):
-        #################################################################
-        # isLight(self.name)
-        # Use a string as a index to check if there existing a light named "name"
-        #################################################################
-        return self.lightDict.has_key(name)
-
-    def rename(self,oName,nName):
-        #################################################################
-        # rename(self, oName, nName)
-        # This function will reanem the light named "oName(String)" to
-        # nName(String)
-        #################################################################
-        if self.isLight(oName):
-            lightNode = self.lightDict[oName]
-            self.lightDict[nName] = lightNode
-            lightNode.rename(nName)
-            del self.lightDict[oName]
-            return self.lightDict.keys(),lightNode
-        else:
-            print '----Light Mnager: No such Light!'
-            
-    def getLightNodeList(self):
-        #################################################################
-        # getLightNodeList(self)
-        # Return a list which contains all seLight nodes
-        #################################################################
-        list = []
-        for name in self.lightDict:
-            list.append(self.lightDict[name])
-        return list
-
-    def getLightNodeDict(self):
-        #################################################################
-        # getLightNodeDict(self)
-        # Return the light dictionary itself.
-        #
-        # Attention!
-        # Because it doesn't make a copy when you return a dictionary, it
-        # means when you can change the value from outside and that change
-        # will directly reflect back to here.
-        #
-        #################################################################
-        return self.lightDict
-
-    def getLightList(self):
-        #################################################################
-        # getLightList(self)
-        # Return a list which contains names of all lights.
-        #################################################################
-        list = []
-        for name in self.lightDict:
-            list.append(name)
-        return list
-
-    def getLightNode(self,lightName):
-        #################################################################
-        # getLightNode(self, lightName)
-        # This function will return a seLight Node using a string, lightName. as a index.
-        #################################################################
-        if lightName in self.lightDict:
-            return self.lightDict[lightName]
-
-    def allOn(self):
-        #################################################################
-        # allOb(self)
-        # Enable the lighting system.
-        #################################################################
-        # Turn on all lighting
-        render.node().setAttrib(self.lightAttrib)
-        # Make sure there is a default material
-        render.setMaterial(Material())
-
-    def allOff(self):
-        #################################################################
-        # allOff(self)
-        # Disable whole lighting system
-        #################################################################
-        # Turn off all lighting
-        render.node().clearAttrib(LightAttrib.getClassType())
-
-    def toggle(self):
-        #################################################################
-        # toggle(self)
-        # Toggles light attribute, but doesn't toggle individual lights
-        #################################################################
-        if render.node().hasAttrib(LightAttrib.getClassType()):
-            self.allOff()
-        else:
-            self.allOn()
-
-    def setOn(self, lightNode):
-        #################################################################
-        # setOn(lightNode)
-        # This function will enable the input seLight node.
-        # If the light system itself is down, activate it.
-        #################################################################
-        self.lightAttrib = self.lightAttrib.addLight(lightNode.getLight())
-        lightNode.active = True
-        if render.node().hasAttrib(LightAttrib.getClassType()):
-            render.node().setAttrib(self.lightAttrib)
-
-            
-    def setOff(self, lightNode):
-        #################################################################
-        # setOff(self, lightNode)
-        # This function will disable the input seLight node
-        # If the light system itself is down, activate it.
-        #################################################################
-        lightNode.active = False
-        self.lightAttrib = self.lightAttrib.removeLight(lightNode.getLight())
-        if render.node().hasAttrib(LightAttrib.getClassType()):
-            render.node().setAttrib(self.lightAttrib)
-
-    def getList(self):
-        #################################################################
-        # getList(self)
-        # This function actually has the same functionality with getLightList(),
-        # but this one should be more efficient.
-        #################################################################
-        return self.lightDict.keys()

+ 0 - 956
doc/SceneEditor/seManipulation.py

@@ -1,956 +0,0 @@
-#################################################################
-# seManipulation.py
-# Originally from DirectManipulation.py
-# Altered by Yi-Hong Lin, [email protected], 2004
-#
-# We didn't change anything essential.
-# Just because we customized the seSession from DirectSession,
-# So we need related files can follow the change.
-# However, we don't want to change anything inside the original directool
-# to let them can work with our scene editor.
-# (If we do change original directools, it will force user has to install the latest version of OUR Panda)
-#
-#################################################################
-
-from direct.showbase.DirectObject import *
-from direct.directtools.DirectGlobals import *
-from direct.directtools.DirectUtil import *
-from seGeometry import *
-from direct.task import Task
-
-class DirectManipulationControl(DirectObject):
-    def __init__(self):
-        # Create the grid
-        self.objectHandles = ObjectHandles()
-        self.hitPt = Point3(0)
-        self.prevHit = Vec3(0)
-        self.rotationCenter = Point3(0)
-        self.initScaleMag = 1
-        self.manipRef = SEditor.group.attachNewNode('manipRef')
-        self.hitPtDist = 0
-        self.constraint = None
-        self.rotateAxis = 'x'
-        self.lastCrankAngle = 0
-        self.fSetCoa = 0
-        self.fHitInit = 1
-        self.fScaleInit = 1
-        self.fWidgetTop = 0
-        self.fFreeManip = 1
-        self.fScaling = 0
-        self.mode = None
-        self.actionEvents = [
-            ['DIRECT-mouse1', self.manipulationStart],
-            ['DIRECT-mouse1Up', self.manipulationStop],
-            ['tab', self.toggleObjectHandlesMode],
-            ['.', self.objectHandles.multiplyScalingFactorBy, 2.0],
-            ['>', self.objectHandles.multiplyScalingFactorBy, 2.0],
-            [',', self.objectHandles.multiplyScalingFactorBy, 0.5],
-            ['<', self.objectHandles.multiplyScalingFactorBy, 0.5],
-            ['shift-f', self.objectHandles.growToFit],
-            ['i', self.plantSelectedNodePath],
-            ]
-
-    def manipulationStart(self, modifiers):
-        # Start out in select mode
-        self.mode = 'select'
-        # Check for a widget hit point
-        entry = SEditor.iRay.pickWidget()
-        # Did we hit a widget?
-        if entry:
-            # Yes!
-            self.hitPt.assign(entry.getSurfacePoint(entry.getFromNodePath()))
-            self.hitPtDist = Vec3(self.hitPt).length()
-            # Constraint determined by nodes name
-            self.constraint = entry.getIntoNodePath().getName()
-        else:
-            # Nope, off the widget, no constraint
-            self.constraint = None
-        # Check to see if we are moving the object
-        # We are moving the object if we either wait long enough
-        taskMgr.doMethodLater(MANIPULATION_MOVE_DELAY,
-                              self.switchToMoveMode,
-                              'manip-move-wait')
-        # Or we move far enough
-        self.moveDir = None
-        watchMouseTask = Task.Task(self.watchMouseTask)
-        watchMouseTask.initX = SEditor.dr.mouseX
-        watchMouseTask.initY = SEditor.dr.mouseY
-        taskMgr.add(watchMouseTask, 'manip-watch-mouse')
-
-    def switchToMoveMode(self, state):
-        taskMgr.remove('manip-watch-mouse')
-        self.mode = 'move'
-        self.manipulateObject()
-        return Task.done
-
-    def watchMouseTask(self, state):
-        if (((abs (state.initX - SEditor.dr.mouseX)) > 0.01) or
-            ((abs (state.initY - SEditor.dr.mouseY)) > 0.01)):
-            taskMgr.remove('manip-move-wait')
-            self.mode = 'move'
-            self.manipulateObject()
-            return Task.done
-        else:
-            return Task.cont
-
-    def manipulationStop(self,xy=[]):
-        taskMgr.remove('manipulateObject')
-        taskMgr.remove('manip-move-wait')
-        taskMgr.remove('manip-watch-mouse')
-        # depending on flag.....
-        if self.mode == 'select':
-            # Check for object under mouse
-            # Don't intersect with hidden or backfacing objects
-            skipFlags = SKIP_HIDDEN | SKIP_BACKFACE
-            # Skip camera (and its children), unless control key is pressed
-            skipFlags |= SKIP_CAMERA * (1 - base.getControl())
-            entry = SEditor.iRay.pickGeom(skipFlags = skipFlags)
-            if entry:
-                # Record hit point information
-                self.hitPt.assign(entry.getSurfacePoint(entry.getFromNodePath()))
-                self.hitPtDist = Vec3(self.hitPt).length()
-                # Select it
-                SEditor.select(entry.getIntoNodePath(), SEditor.fShift)
-            else:
-                SEditor.deselectAll()
-        else:
-            self.manipulateObjectCleanup()
-
-    def manipulateObjectCleanup(self):
-        if self.fScaling:
-            # We had been scaling, need to reset object handles
-            self.objectHandles.transferObjectHandlesScale()
-            self.fScaling = 0
-        SEditor.selected.highlightAll()
-        self.objectHandles.showAllHandles()
-        self.objectHandles.hideGuides()
-        # Restart followSelectedNodePath task
-        self.spawnFollowSelectedNodePathTask()
-        messenger.send('DIRECT_manipulateObjectCleanup')
-
-    def spawnFollowSelectedNodePathTask(self):
-        # If nothing selected, just return
-        if not SEditor.selected.last:
-            return
-        # Clear out old task to make sure
-        taskMgr.remove('followSelectedNodePath')
-        # Where are the object handles relative to the selected object
-        pos = VBase3(0)
-        hpr = VBase3(0)
-        decomposeMatrix(SEditor.selected.last.mCoa2Dnp,
-                        VBase3(0), hpr, pos, CSDefault)
-        # Create the task
-        t = Task.Task(self.followSelectedNodePathTask)
-        # Update state variables
-        t.pos = pos
-        t.hpr = hpr
-        t.base = SEditor.selected.last
-        # Spawn the task
-        taskMgr.add(t, 'followSelectedNodePath')
-
-    def followSelectedNodePathTask(self, state):
-        SEditor.widget.setPosHpr(state.base, state.pos, state.hpr)
-        return Task.cont
-
-    def enableManipulation(self):
-        # Accept events
-        for event in self.actionEvents:
-            self.accept(event[0], event[1], extraArgs = event[2:])
-
-    def disableManipulation(self):
-        # Ignore events
-        for event in self.actionEvents:
-            self.ignore(event[0])
-        self.removeManipulateObjectTask()
-        taskMgr.remove('manipulateObject')
-        taskMgr.remove('manip-move-wait')
-        taskMgr.remove('manip-watch-mouse')
-        taskMgr.remove('highlightWidgetTask')
-        taskMgr.remove('resizeObjectHandles')
-
-    def toggleObjectHandlesMode(self):
-        self.fSetCoa = 1 - self.fSetCoa
-        if self.fSetCoa:
-            self.objectHandles.coaModeColor()
-        else:
-            self.objectHandles.manipModeColor()
-
-    def removeManipulateObjectTask(self):
-        taskMgr.remove('manipulateObject')
-
-    def manipulateObject(self):
-        # Only do this if something is selected
-        if SEditor.selected:
-            # Remove the task to keep the widget attached to the object
-            taskMgr.remove('followSelectedNodePath')
-            # and the task to highlight the widget
-            taskMgr.remove('highlightWidgetTask')
-            # Set manipulation flag
-            self.fManip = 1
-            # Record undo point
-            SEditor.pushUndo(SEditor.selected)
-            # Update object handles visibility
-            self.objectHandles.showGuides()
-            self.objectHandles.hideAllHandles()
-            self.objectHandles.showHandle(self.constraint)
-            # Record relationship between selected nodes and widget
-            SEditor.selected.getWrtAll()
-            # hide the bbox of the selected objects during interaction
-            SEditor.selected.dehighlightAll()
-            # Send event to signal start of manipulation
-            messenger.send('DIRECT_manipulateObjectStart')
-            # Manipulate the real object with the constraint
-            # The constraint is passed as the name of the node 
-            self.spawnManipulateObjectTask()
-
-    def spawnManipulateObjectTask(self):
-        # reset hit-pt flag
-        self.fHitInit = 1
-        self.fScaleInit = 1
-        # record initial offset between widget and camera
-        t = Task.Task(self.manipulateObjectTask)
-        t.fMouseX = abs(SEditor.dr.mouseX) > 0.9
-        t.fMouseY = abs(SEditor.dr.mouseY) > 0.9
-        if t.fMouseX:
-            t.constrainedDir = 'y'
-        else:
-            t.constrainedDir = 'x'
-        # Compute widget's xy coords in screen space
-        t.coaCenter = getScreenXY(SEditor.widget)
-        # These are used to rotate about view vector
-        if t.fMouseX and t.fMouseY:
-            t.lastAngle = getCrankAngle(t.coaCenter)
-        taskMgr.add(t, 'manipulateObject')
-
-    def manipulateObjectTask(self, state):
-        # Widget takes precedence
-        if self.constraint:
-            type = self.constraint[2:]
-            if type == 'post':
-                self.xlate1D(state)
-            elif type == 'disc':
-                self.xlate2D(state)
-            elif type == 'ring':
-                self.rotate1D(state)
-        # No widget interaction, determine free manip mode
-        elif self.fFreeManip:
-            # If we've been scaling and changed modes, reset object handles
-            if 0 and self.fScaling and (not SEditor.fAlt):
-                self.objectHandles.transferObjectHandlesScale()
-                self.fScaling = 0
-            # Alt key switches to a scaling mode
-            if SEditor.fControl:
-                self.fScaling = 1
-                self.scale3D(state)
-            # Otherwise, manip mode depends on where you started
-            elif state.fMouseX and state.fMouseY:
-                # In the corner, spin around camera's axis
-                self.rotateAboutViewVector(state)
-            elif state.fMouseX or state.fMouseY:
-                # Mouse started elsewhere in the outer frame, rotate
-                self.rotate2D(state)
-            else:
-                # Mouse started in central region, xlate
-                # Mode depends on shift key
-                if SEditor.fShift or SEditor.fControl:
-                    self.xlateCamXY(state)
-                else:
-                    self.xlateCamXZ(state)
-        if self.fSetCoa:
-            # Update coa based on current widget position
-            SEditor.selected.last.mCoa2Dnp.assign(
-                SEditor.widget.getMat(SEditor.selected.last))
-        else:
-            # Move the objects with the widget
-            SEditor.selected.moveWrtWidgetAll()
-        # Continue
-        return Task.cont
-
-    ### WIDGET MANIPULATION METHODS ###
-    def xlate1D(self, state):
-        # Constrained 1D Translation along widget axis
-        # Compute nearest hit point along axis and try to keep
-        # that point as close to the current mouse position as possible
-        # what point on the axis is the mouse pointing at?
-        self.hitPt.assign(self.objectHandles.getAxisIntersectPt(
-            self.constraint[:1]))
-        # use it to see how far to move the widget
-        if self.fHitInit:
-            # First time through, just record that point
-            self.fHitInit = 0
-            self.prevHit.assign(self.hitPt)
-        else:
-            # Move widget to keep hit point as close to mouse as possible
-            offset = self.hitPt - self.prevHit
-            SEditor.widget.setPos(SEditor.widget, offset)
-
-    def xlate2D(self, state):
-        # Constrained 2D (planar) translation
-        # Compute point of intersection of ray from eyepoint through cursor
-        # to one of the three orthogonal planes on the widget.
-        # This point tracks all subsequent mouse movements
-        self.hitPt.assign(self.objectHandles.getWidgetIntersectPt(
-            SEditor.widget, self.constraint[:1]))
-        # use it to see how far to move the widget
-        if self.fHitInit:
-            # First time through just record hit point
-            self.fHitInit = 0
-            self.prevHit.assign(self.hitPt)
-        else:
-            offset = self.hitPt - self.prevHit
-            SEditor.widget.setPos(SEditor.widget, offset)
-
-    def rotate1D(self, state):
-        # Constrained 1D rotation about the widget's main axis (X,Y, or Z)
-        # Rotation depends upon circular motion of the mouse about the
-        # projection of the widget's origin on the image plane
-        # A complete circle about the widget results in a change in
-        # orientation of 360 degrees.
-
-        # First initialize hit point/rotation angle
-        if self.fHitInit:
-            self.fHitInit = 0
-            self.rotateAxis = self.constraint[:1]
-            self.fWidgetTop = self.widgetCheck('top?')
-            self.rotationCenter = getScreenXY(SEditor.widget)
-            self.lastCrankAngle = getCrankAngle(self.rotationCenter)
-            
-        # Rotate widget based on how far cursor has swung around origin
-        newAngle = getCrankAngle(self.rotationCenter)
-        deltaAngle = self.lastCrankAngle - newAngle
-        if self.fWidgetTop:
-            deltaAngle = -1 * deltaAngle
-        if self.rotateAxis == 'x':
-            SEditor.widget.setP(SEditor.widget, deltaAngle)
-        elif self.rotateAxis == 'y':
-            if base.config.GetBool('temp-hpr-fix',0):
-                SEditor.widget.setR(SEditor.widget, deltaAngle)
-            else:
-                SEditor.widget.setR(SEditor.widget, -deltaAngle)
-        elif self.rotateAxis == 'z':
-            SEditor.widget.setH(SEditor.widget, deltaAngle)
-        # Record crank angle for next time around
-        self.lastCrankAngle = newAngle
-
-    def widgetCheck(self,type):
-        # Utility to see if we are looking at the top or bottom of
-        # a 2D planar widget or if we are looking at a 2D planar widget
-        # edge on
-        # Based upon angle between view vector from eye through the
-        # widget's origin and one of the three principle axes
-        axis = self.constraint[:1]
-        # First compute vector from eye through widget origin
-        mWidget2Cam = SEditor.widget.getMat(SEditor.camera)
-        # And determine where the viewpoint is relative to widget
-        pos = VBase3(0)
-        decomposeMatrix(mWidget2Cam, VBase3(0), VBase3(0), pos,
-                        CSDefault)
-        widgetDir = Vec3(pos)
-        widgetDir.normalize()
-        # Convert specified widget axis to view space
-        if axis == 'x':
-            widgetAxis = Vec3(mWidget2Cam.xformVec(X_AXIS))
-        elif axis == 'y':
-            widgetAxis = Vec3(mWidget2Cam.xformVec(Y_AXIS))
-        elif axis == 'z':
-            widgetAxis = Vec3(mWidget2Cam.xformVec(Z_AXIS))
-        widgetAxis.normalize()
-        if type == 'top?':
-            # Check sign of angle between two vectors
-            return (widgetDir.dot(widgetAxis) < 0.)
-        elif type == 'edge?':
-            # Checking to see if we are viewing edge-on
-            # Check angle between two vectors
-            return(abs(widgetDir.dot(widgetAxis)) < .2)
-
-    ### FREE MANIPULATION METHODS ###
-    def xlateCamXZ(self, state):
-        """Constrained 2D motion parallel to the camera's image plane
-        This moves the object in the camera's XZ plane"""
-        # reset fHitInit in case we later switch to manip mode
-        self.fHitInit = 1
-        # Reset scaling init flag
-        self.fScaleInit = 1
-        # Where is the widget relative to current camera view
-        vWidget2Camera = SEditor.widget.getPos(SEditor.camera)
-        x = vWidget2Camera[0]
-        y = vWidget2Camera[1]
-        z = vWidget2Camera[2]
-        # Move widget (and objects) based upon mouse motion
-        # Scaled up accordingly based upon widget distance
-        dr = SEditor.dr
-        SEditor.widget.setX(
-            SEditor.camera,
-            x + 0.5 * dr.mouseDeltaX * dr.nearWidth * (y/dr.near))
-        SEditor.widget.setZ(
-            SEditor.camera,
-            z + 0.5 * dr.mouseDeltaY * dr.nearHeight * (y/dr.near))
-
-    def xlateCamXY(self, state):
-        """Constrained 2D motion perpendicular to camera's image plane
-        This moves the object in the camera's XY plane if shift is held
-        Moves object toward camera if control is held
-        """
-        # Reset scaling init flag
-        self.fScaleInit = 1
-        # Now, where is the widget relative to current camera view
-        vWidget2Camera = SEditor.widget.getPos(SEditor.camera)
-        # If this is first time around, record initial y distance
-        if self.fHitInit:
-            self.fHitInit = 0
-            # Use distance to widget to scale motion along Y
-            self.xlateSF = Vec3(vWidget2Camera).length()
-            # Get widget's current xy coords in screen space
-            coaCenter = getNearProjectionPoint(SEditor.widget)
-            self.deltaNearX = coaCenter[0] - SEditor.dr.nearVec[0]
-        # Which way do we move the object?
-        if SEditor.fControl:
-            moveDir = Vec3(vWidget2Camera)
-            # If widget is behind camera invert vector
-            if moveDir[1] < 0.0:
-                moveDir.assign(moveDir * -1)
-            moveDir.normalize()
-        else:
-            moveDir = Vec3(Y_AXIS)
-        # Move selected objects
-        dr = SEditor.dr
-        # Scale move dir
-        moveDir.assign(moveDir * (2.0 * dr.mouseDeltaY * self.xlateSF))
-        # Add it to current widget offset
-        vWidget2Camera += moveDir
-        # The object, however, stays at the same relative point to mouse in X
-        vWidget2Camera.setX((dr.nearVec[0] + self.deltaNearX) *
-                            (vWidget2Camera[1]/dr.near))
-        # Move widget
-        SEditor.widget.setPos(SEditor.camera, vWidget2Camera)
-
-    def rotate2D(self, state):
-        """ Virtual trackball rotation of widget """
-        # Reset init flag in case we switch to another mode
-        self.fHitInit = 1
-        # Reset scaling init flag
-        self.fScaleInit = 1
-        tumbleRate = 360
-        # If moving outside of center, ignore motion perpendicular to edge
-        if ((state.constrainedDir == 'y') and (abs(SEditor.dr.mouseX) > 0.9)):
-            deltaX = 0
-            deltaY = SEditor.dr.mouseDeltaY
-        elif ((state.constrainedDir == 'x') and (abs(SEditor.dr.mouseY) > 0.9)):
-            deltaX = SEditor.dr.mouseDeltaX
-            deltaY = 0
-        else:
-            deltaX = SEditor.dr.mouseDeltaX
-            deltaY = SEditor.dr.mouseDeltaY
-        # Mouse motion edge to edge of display region results in one full turn
-        relHpr(SEditor.widget, SEditor.camera, deltaX * tumbleRate,
-               -deltaY * tumbleRate, 0)
-
-    def rotateAboutViewVector(self, state):
-        # Reset init flag in case we switch to another mode
-        self.fHitInit = 1
-        # Reset scaling init flag
-        self.fScaleInit = 1
-        # Compute current angle
-        angle = getCrankAngle(state.coaCenter)
-        deltaAngle = angle - state.lastAngle
-        state.lastAngle = angle
-        # Mouse motion edge to edge of display region results in one full turn
-        if base.config.GetBool('temp-hpr-fix',0):
-            relHpr(SEditor.widget, SEditor.camera, 0, 0, -deltaAngle)
-        else:
-            relHpr(SEditor.widget, SEditor.camera, 0, 0, deltaAngle)
-
-    def scale3D(self, state):
-        # Scale the selected node based upon up down mouse motion
-        # Mouse motion from edge to edge results in a factor of 4 scaling
-        # From midpoint to edge doubles or halves objects scale
-        if self.fScaleInit:
-            self.fScaleInit = 0
-            self.manipRef.setPos(SEditor.widget, 0, 0, 0)
-            self.manipRef.setHpr(SEditor.camera, 0, 0, 0)
-            self.initScaleMag = Vec3(
-                self.objectHandles.getWidgetIntersectPt(
-                self.manipRef, 'y')).length()
-            # record initial scale
-            self.initScale = SEditor.widget.getScale()
-        # Reset fHitInitFlag
-        self.fHitInit = 1
-        # Begin
-        # Scale factor is ratio current mag with init mag
-        currScale = (
-            self.initScale *
-            (self.objectHandles.getWidgetIntersectPt(
-            self.manipRef, 'y').length() /
-             self.initScaleMag)
-            )
-        SEditor.widget.setScale(currScale)
-
-    ## Utility functions ##
-    def plantSelectedNodePath(self):
-        """ Move selected object to intersection point of cursor on scene """
-        # Check for intersection
-        entry = SEditor.iRay.pickGeom(
-            skipFlags = SKIP_HIDDEN | SKIP_BACKFACE | SKIP_CAMERA)
-        # MRM: Need to handle moving COA
-        if (entry != None) and (SEditor.selected.last != None):
-            # Record undo point
-            SEditor.pushUndo(SEditor.selected)
-            # Record wrt matrix
-            SEditor.selected.getWrtAll()
-            # Move selected
-            SEditor.widget.setPos(
-                SEditor.camera,entry.getSurfacePoint(entry.getFromNodePath()))
-            # Move all the selected objects with widget
-            # Move the objects with the widget
-            SEditor.selected.moveWrtWidgetAll()
-            # Let everyone know that something was moved
-            messenger.send('DIRECT_manipulateObjectCleanup')
-
-class ObjectHandles(NodePath,DirectObject):
-    def __init__(self):
-        # Initialize the superclass
-        NodePath.__init__(self)
-
-        # Load up object handles model and assign it to self
-        self.assign(loader.loadModel('models/misc/objectHandles'))
-        self.setName('objectHandles')
-        self.scalingNode = self.getChild(0)
-        self.scalingNode.setName('ohScalingNode')
-        self.ohScalingFactor = 1.0
-        # To avoid recreating a vec every frame
-        self.hitPt = Vec3(0)
-        # Get a handle on the components
-        self.xHandles = self.find('**/X')
-        self.xPostGroup = self.xHandles.find('**/x-post-group')
-        self.xPostCollision = self.xHandles.find('**/x-post')
-        self.xRingGroup = self.xHandles.find('**/x-ring-group')
-        self.xRingCollision = self.xHandles.find('**/x-ring')
-        self.xDiscGroup = self.xHandles.find('**/x-disc-group')
-        self.xDisc = self.xHandles.find('**/x-disc-visible')
-        self.xDiscCollision = self.xHandles.find('**/x-disc')
-        
-        self.yHandles = self.find('**/Y')
-        self.yPostGroup = self.yHandles.find('**/y-post-group')
-        self.yPostCollision = self.yHandles.find('**/y-post')
-        self.yRingGroup = self.yHandles.find('**/y-ring-group')
-        self.yRingCollision = self.yHandles.find('**/y-ring')
-        self.yDiscGroup = self.yHandles.find('**/y-disc-group')
-        self.yDisc = self.yHandles.find('**/y-disc-visible')
-        self.yDiscCollision = self.yHandles.find('**/y-disc')
-        
-        self.zHandles = self.find('**/Z')
-        self.zPostGroup = self.zHandles.find('**/z-post-group')
-        self.zPostCollision = self.zHandles.find('**/z-post')
-        self.zRingGroup = self.zHandles.find('**/z-ring-group')
-        self.zRingCollision = self.zHandles.find('**/z-ring')
-        self.zDiscGroup = self.zHandles.find('**/z-disc-group')
-        self.zDisc = self.zHandles.find('**/z-disc-visible')
-        self.zDiscCollision = self.zHandles.find('**/z-disc')
-
-        # Adjust visiblity, colors, and transparency
-        self.xPostCollision.hide()
-        self.xRingCollision.hide()
-        self.xDisc.setColor(1,0,0,.2)
-        self.yPostCollision.hide()
-        self.yRingCollision.hide()
-        self.yDisc.setColor(0,1,0,.2)
-        self.zPostCollision.hide()
-        self.zRingCollision.hide()
-        self.zDisc.setColor(0,0,1,.2)
-        # Augment geometry with lines
-        self.createObjectHandleLines()
-        # Create long markers to help line up in world
-        self.createGuideLines()
-        self.hideGuides()
-
-        # Start with widget handles hidden
-        self.fActive = 1
-        self.toggleWidget()
-
-        # Make sure object handles are never lit or drawn in wireframe
-        useDirectRenderStyle(self)
-
-    def coaModeColor(self):
-        self.setColor(.5,.5,.5,1)
-
-    def manipModeColor(self):
-        self.clearColor()
-
-    def toggleWidget(self):
-        if self.fActive:
-            self.deactivate()
-        else:
-            self.activate()
-
-    def activate(self):
-        self.scalingNode.reparentTo(self)
-        self.fActive = 1
-
-    def deactivate(self):
-        self.scalingNode.reparentTo(hidden)
-        self.fActive = 0
-
-    def showWidgetIfActive(self):
-        if self.fActive:
-            self.reparentTo(SEditor.group)
-
-    def showWidget(self):
-        self.reparentTo(SEditor.group)
-
-    def hideWidget(self):
-        self.reparentTo(hidden)
-
-    def enableHandles(self, handles):
-        if type(handles) == types.ListType:
-            for handle in handles:
-                self.enableHandle(handle)
-        elif handles == 'x':
-            self.enableHandles(['x-post','x-ring','x-disc'])
-        elif handles == 'y':
-            self.enableHandles(['y-post','y-ring','y-disc'])
-        elif handles == 'z':
-            self.enableHandles(['z-post','z-ring','z-disc'])
-        elif handles == 'post':
-            self.enableHandles(['x-post','y-post','z-post'])
-        elif handles == 'ring':
-            self.enableHandles(['x-ring','y-ring','z-ring'])
-        elif handles == 'disc':
-            self.enableHandles(['x-disc','y-disc','z-disc'])
-        elif handles == 'all':
-            self.enableHandles(['x-post','x-ring','x-disc',
-                                'y-post','y-ring','y-disc',
-                                'z-post','z-ring','z-disc'])
-
-    def enableHandle(self, handle):
-        if handle == 'x-post':
-            self.xPostGroup.reparentTo(self.xHandles)
-        elif handle == 'x-ring':
-            self.xRingGroup.reparentTo(self.xHandles)
-        elif handle == 'x-disc':
-            self.xDiscGroup.reparentTo(self.xHandles)
-        if handle == 'y-post':
-            self.yPostGroup.reparentTo(self.yHandles)
-        elif handle == 'y-ring':
-            self.yRingGroup.reparentTo(self.yHandles)
-        elif handle == 'y-disc':
-            self.yDiscGroup.reparentTo(self.yHandles)
-        if handle == 'z-post':
-            self.zPostGroup.reparentTo(self.zHandles)
-        elif handle == 'z-ring':
-            self.zRingGroup.reparentTo(self.zHandles)
-        elif handle == 'z-disc':
-            self.zDiscGroup.reparentTo(self.zHandles)
-
-    def disableHandles(self, handles):
-        if type(handles) == types.ListType:
-            for handle in handles:
-                self.disableHandle(handle)
-        elif handles == 'x':
-            self.disableHandles(['x-post','x-ring','x-disc'])
-        elif handles == 'y':
-            self.disableHandles(['y-post','y-ring','y-disc'])
-        elif handles == 'z':
-            self.disableHandles(['z-post','z-ring','z-disc'])
-        elif handles == 'post':
-            self.disableHandles(['x-post','y-post','z-post'])
-        elif handles == 'ring':
-            self.disableHandles(['x-ring','y-ring','z-ring'])
-        elif handles == 'disc':
-            self.disableHandles(['x-disc','y-disc','z-disc'])
-        elif handles == 'all':
-            self.disableHandles(['x-post','x-ring','x-disc',
-                                 'y-post','y-ring','y-disc',
-                                 'z-post','z-ring','z-disc'])
-
-    def disableHandle(self, handle):
-        if handle == 'x-post':
-            self.xPostGroup.reparentTo(hidden)
-        elif handle == 'x-ring':
-            self.xRingGroup.reparentTo(hidden)
-        elif handle == 'x-disc':
-            self.xDiscGroup.reparentTo(hidden)
-        if handle == 'y-post':
-            self.yPostGroup.reparentTo(hidden)
-        elif handle == 'y-ring':
-            self.yRingGroup.reparentTo(hidden)
-        elif handle == 'y-disc':
-            self.yDiscGroup.reparentTo(hidden)
-        if handle == 'z-post':
-            self.zPostGroup.reparentTo(hidden)
-        elif handle == 'z-ring':
-            self.zRingGroup.reparentTo(hidden)
-        elif handle == 'z-disc':
-            self.zDiscGroup.reparentTo(hidden)
-
-    def showAllHandles(self):
-        self.xPost.show()
-        self.xRing.show()
-        self.xDisc.show()
-        self.yPost.show()
-        self.yRing.show()
-        self.yDisc.show()
-        self.zPost.show()
-        self.zRing.show()
-        self.zDisc.show()
-
-    def hideAllHandles(self):
-        self.xPost.hide()
-        self.xRing.hide()
-        self.xDisc.hide()
-        self.yPost.hide()
-        self.yRing.hide()
-        self.yDisc.hide()
-        self.zPost.hide()
-        self.zRing.hide()
-        self.zDisc.hide()
-
-    def showHandle(self, handle):
-        if handle == 'x-post':
-            self.xPost.show()
-        elif handle == 'x-ring':
-            self.xRing.show()
-        elif handle == 'x-disc':
-            self.xDisc.show()
-        elif handle == 'y-post':
-            self.yPost.show()
-        elif handle == 'y-ring':
-            self.yRing.show()
-        elif handle == 'y-disc':
-            self.yDisc.show()
-        elif handle == 'z-post':
-            self.zPost.show()
-        elif handle == 'z-ring':
-            self.zRing.show()
-        elif handle == 'z-disc':
-            self.zDisc.show()
-
-    def showGuides(self):
-        self.guideLines.show()
-
-    def hideGuides(self):
-        self.guideLines.hide()
-
-    def setScalingFactor(self, scaleFactor):
-        self.ohScalingFactor = scaleFactor
-        self.scalingNode.setScale(self.ohScalingFactor)
-
-    def getScalingFactor(self):
-        return self.scalingNode.getScale()
-
-    def transferObjectHandlesScale(self):
-        # see how much object handles have been scaled
-        ohs = self.getScale()
-        sns = self.scalingNode.getScale()
-        # Transfer this to the scaling node
-        self.scalingNode.setScale(
-            ohs[0] * sns[0],
-            ohs[1] * sns[1],
-            ohs[2] * sns[2])
-        self.setScale(1)
-
-    def multiplyScalingFactorBy(self, factor):
-        taskMgr.remove('resizeObjectHandles')
-        sf = self.ohScalingFactor = self.ohScalingFactor * factor
-        self.scalingNode.lerpScale(sf,sf,sf, 0.5,
-                                   blendType = 'easeInOut',
-                                   task = 'resizeObjectHandles')
-
-    def growToFit(self):
-        taskMgr.remove('resizeObjectHandles')
-        # Increase handles scale until they cover 80% of the min dimension
-        # Originally, here is "cover 30% of the min dimension", we changed.
-        pos = SEditor.widget.getPos(SEditor.camera)
-        minDim = min(SEditor.dr.nearWidth, SEditor.dr.nearHeight)
-        sf = 0.4 * minDim * (pos[1]/SEditor.dr.near)
-        self.ohScalingFactor = sf
-        self.scalingNode.lerpScale(sf,sf,sf, 0.5,
-                                   blendType = 'easeInOut',
-                                   task = 'resizeObjectHandles')
-
-    def createObjectHandleLines(self):
-        # X post
-        self.xPost = self.xPostGroup.attachNewNode('x-post-visible')
-        lines = LineNodePath(self.xPost)
-        lines.setColor(VBase4(1,0,0,1))
-        lines.setThickness(5)
-        lines.moveTo(0,0,0)
-        lines.drawTo(1.5,0,0)
-        lines.create()
-        lines = LineNodePath(self.xPost)
-        lines.setColor(VBase4(1,0,0,1))
-        lines.setThickness(1.5)
-        lines.moveTo(0,0,0)
-        lines.drawTo(-1.5,0,0)
-        lines.create()
-        
-        # X ring
-        self.xRing = self.xRingGroup.attachNewNode('x-ring-visible')
-        lines = LineNodePath(self.xRing)
-        lines.setColor(VBase4(1,0,0,1))
-        lines.setThickness(3)
-        lines.moveTo(0,1,0)
-        for ang in range(15, 370, 15):
-            lines.drawTo(0,
-                          math.cos(deg2Rad(ang)),
-                          math.sin(deg2Rad(ang)))
-        lines.create()
-        
-        # Y post
-        self.yPost = self.yPostGroup.attachNewNode('y-post-visible')
-        lines = LineNodePath(self.yPost)
-        lines.setColor(VBase4(0,1,0,1))
-        lines.setThickness(5)
-        lines.moveTo(0,0,0)
-        lines.drawTo(0,1.5,0)
-        lines.create()
-        lines = LineNodePath(self.yPost)
-        lines.setColor(VBase4(0,1,0,1))
-        lines.setThickness(1.5)
-        lines.moveTo(0,0,0)
-        lines.drawTo(0,-1.5,0)
-        lines.create()
-        
-        # Y ring
-        self.yRing = self.yRingGroup.attachNewNode('y-ring-visible')
-        lines = LineNodePath(self.yRing)
-        lines.setColor(VBase4(0,1,0,1))
-        lines.setThickness(3)
-        lines.moveTo(1,0,0)
-        for ang in range(15, 370, 15):
-            lines.drawTo(math.cos(deg2Rad(ang)),
-                          0,
-                          math.sin(deg2Rad(ang)))
-        lines.create()
-
-        # Z post
-        self.zPost = self.zPostGroup.attachNewNode('z-post-visible')
-        lines = LineNodePath(self.zPost)
-        lines.setColor(VBase4(0,0,1,1))
-        lines.setThickness(5)
-        lines.moveTo(0,0,0)
-        lines.drawTo(0,0,1.5)
-        lines.create()
-        lines = LineNodePath(self.zPost)
-        lines.setColor(VBase4(0,0,1,1))
-        lines.setThickness(1.5)
-        lines.moveTo(0,0,0)
-        lines.drawTo(0,0,-1.5)
-        lines.create()
-        
-        # Z ring
-        self.zRing = self.zRingGroup.attachNewNode('z-ring-visible')
-        lines = LineNodePath(self.zRing)
-        lines.setColor(VBase4(0,0,1,1))
-        lines.setThickness(3)
-        lines.moveTo(1,0,0)
-        for ang in range(15, 370, 15):
-            lines.drawTo(math.cos(deg2Rad(ang)),
-                          math.sin(deg2Rad(ang)),
-                          0)
-        lines.create()
-
-    def createGuideLines(self):
-        self.guideLines = self.attachNewNode('guideLines')
-        # X guide lines
-        lines = LineNodePath(self.guideLines)
-        lines.setColor(VBase4(1,0,0,1))
-        lines.setThickness(0.5)
-        lines.moveTo(-500,0,0)
-        lines.drawTo(500,0,0)
-        lines.create()
-        lines.setName('x-guide')
-
-        # Y guide lines
-        lines = LineNodePath(self.guideLines)
-        lines.setColor(VBase4(0,1,0,1))
-        lines.setThickness(0.5)
-        lines.moveTo(0,-500,0)
-        lines.drawTo(0,500,0)
-        lines.create()
-        lines.setName('y-guide')
-
-        # Z guide lines
-        lines = LineNodePath(self.guideLines)
-        lines.setColor(VBase4(0,0,1,1))
-        lines.setThickness(0.5)
-        lines.moveTo(0,0,-500)
-        lines.drawTo(0,0,500)
-        lines.create()
-        lines.setName('z-guide')
-
-    def getAxisIntersectPt(self, axis):
-        # Calc the xfrom from camera to widget
-        mCam2Widget = SEditor.camera.getMat(SEditor.widget)
-        lineDir = Vec3(mCam2Widget.xformVec(SEditor.dr.nearVec))
-        lineDir.normalize()
-        # And determine where the viewpoint is relative to widget
-        lineOrigin = VBase3(0)
-        decomposeMatrix(mCam2Widget, VBase3(0), VBase3(0), lineOrigin,
-                        CSDefault)
-        # Now see where this hits the plane containing the 1D motion axis.
-        # Pick the intersection plane most normal to the intersection ray
-        # by comparing lineDir with plane normals.  The plane with the
-        # largest dotProduct is most "normal"
-        if axis == 'x':
-            if (abs(lineDir.dot(Y_AXIS)) > abs(lineDir.dot(Z_AXIS))):
-                self.hitPt.assign(
-                    planeIntersect(lineOrigin, lineDir, ORIGIN, Y_AXIS))
-            else:
-                self.hitPt.assign(
-                    planeIntersect(lineOrigin, lineDir, ORIGIN, Z_AXIS))
-            # We really only care about the nearest point on the axis
-            self.hitPt.setY(0)
-            self.hitPt.setZ(0)
-        elif axis == 'y':
-            if (abs(lineDir.dot(X_AXIS)) > abs(lineDir.dot(Z_AXIS))):
-                self.hitPt.assign(
-                    planeIntersect(lineOrigin, lineDir, ORIGIN, X_AXIS))
-            else:
-                self.hitPt.assign(
-                    planeIntersect(lineOrigin, lineDir, ORIGIN, Z_AXIS))
-            # We really only care about the nearest point on the axis
-            self.hitPt.setX(0)
-            self.hitPt.setZ(0)
-        elif axis == 'z':
-            if (abs(lineDir.dot(X_AXIS)) > abs(lineDir.dot(Y_AXIS))):
-                self.hitPt.assign(
-                    planeIntersect(lineOrigin, lineDir, ORIGIN, X_AXIS))
-            else:
-                self.hitPt.assign(
-                    planeIntersect(lineOrigin, lineDir, ORIGIN, Y_AXIS))
-            # We really only care about the nearest point on the axis
-            self.hitPt.setX(0)
-            self.hitPt.setY(0)
-        return self.hitPt
-
-    def getWidgetIntersectPt(self, nodePath, plane):
-        # Find out the point of interection of the ray passing though the mouse
-        # with the plane containing the 2D xlation or 1D rotation widgets
-
-        # Calc the xfrom from camera to the nodePath
-        mCam2NodePath = SEditor.camera.getMat(nodePath)
-    
-        # And determine where the viewpoint is relative to widget
-        lineOrigin = VBase3(0)
-        decomposeMatrix(mCam2NodePath, VBase3(0), VBase3(0), lineOrigin,
-                        CSDefault)
-        
-        # Next we find the vector from viewpoint to the widget through
-        # the mouse's position on near plane.
-        # This defines the intersection ray
-        lineDir = Vec3(mCam2NodePath.xformVec(SEditor.dr.nearVec))
-        lineDir.normalize()
-        # Find the hit point
-        if plane == 'x':
-            self.hitPt.assign(planeIntersect(
-                lineOrigin, lineDir, ORIGIN, X_AXIS))
-        elif plane == 'y':
-            self.hitPt.assign(planeIntersect(
-                lineOrigin, lineDir, ORIGIN, Y_AXIS))
-        elif plane == 'z':
-            self.hitPt.assign(planeIntersect(
-                lineOrigin, lineDir, ORIGIN, Z_AXIS))
-        return self.hitPt
-
-
-

+ 0 - 2073
doc/SceneEditor/seMopathRecorder.py

@@ -1,2073 +0,0 @@
-#################################################################
-# seMopathRecorder.py
-# Originally from MopathRecorder.py
-# Altered by Yi-Hong Lin, [email protected], 2004
-#
-# We have to change something about data flow and UI
-# so the curves data can be saved into our dataHolder.
-# Other things we have changed here is that we have added a copy model
-# of target nodePath under the render when the recording begins.
-# And, of course, we have removed it right after the recording ends.
-# You can find it in toggleRecord function.
-#
-#################################################################
-
-from direct.showbase.DirectObject import DirectObject
-from direct.tkwidgets.AppShell import AppShell
-#from direct.directtools.DirectGlobals import *
-#from direct.directtools.DirectUtil import *
-from seGeometry import *
-from seSelection import *
-from direct.task.Task import Task
-from direct.tkwidgets.Dial import AngleDial
-from direct.tkwidgets.Floater import Floater
-from direct.tkwidgets.Slider import Slider
-from direct.tkwidgets.EntryScale import EntryScale
-from direct.tkwidgets.VectorWidgets import Vector2Entry, Vector3Entry
-from direct.tkwidgets.VectorWidgets import ColorEntry
-from Tkinter import Button, Frame, Radiobutton, Checkbutton, Label
-from Tkinter import StringVar, BooleanVar, Entry, Scale
-import os, string, Tkinter, Pmw
-import __builtin__
-
-PRF_UTILITIES = [
-    'lambda: camera.lookAt(render)',
-    'lambda: camera.setZ(render, 0.0)',
-    'lambda s = self: s.playbackMarker.lookAt(render)',
-    'lambda s = self: s.playbackMarker.setZ(render, 0.0)',
-    'lambda s = self: s.followTerrain(10.0)']
-
-class MopathRecorder(AppShell, DirectObject):
-    # Override class variables here
-    appname = 'Mopath Recorder Panel'
-    frameWidth      = 450
-    frameHeight     = 550
-    usecommandarea = 0
-    usestatusarea  = 0
-    count = 0
-
-    def __init__(self, parent = None, **kw):
-        INITOPT = Pmw.INITOPT
-        name = 'recorder-%d' % MopathRecorder.count
-        MopathRecorder.count += 1
-        optiondefs = (
-            ('title',       self.appname,         None),
-            ('nodePath',    None,                 None),
-            ('name',        name,                 None)
-            )
-        self.defineoptions(kw, optiondefs)
-
-        # Call superclass initialization function
-        AppShell.__init__(self)
-        
-        self.initialiseoptions(MopathRecorder)
-
-        self.selectNodePathNamed('camera')
-
-        self.parent.resizable(False,False) ## Disable the ability to resize for this Window.
-
-    def appInit(self):
-        self.mopathRecorderNode = render.attachNewNode("MopathRecorder")
-        self.name = self['name']
-        # Dictionary of widgets
-        self.widgetDict = {}
-        self.variableDict = {}
-        # Initialize state
-        # The active node path
-        self.nodePath = self['nodePath']
-        self.playbackNodePath = self.nodePath
-        # The active node path's parent
-        self.nodePathParent = render
-        # Top level node path
-        self.recorderNodePath = self.mopathRecorderNode.attachNewNode(self.name)
-        # Temp CS for use in refinement/path extension
-        self.tempCS = self.recorderNodePath.attachNewNode(
-            'mopathRecorderTempCS')
-        # Marker for use in playback
-        self.playbackMarker = loader.loadModel('models/misc/sphere')  ###
-        self.playbackMarker.setName('Playback Marker')
-        self.playbackMarker.reparentTo(self.recorderNodePath)
-        self.playbackMarkerIds = self.getChildIds(
-            self.playbackMarker.getChild(0))
-        self.playbackMarker.hide()
-        # Tangent marker
-        self.tangentGroup = self.playbackMarker.attachNewNode('Tangent Group')
-        self.tangentGroup.hide()
-        self.tangentMarker = loader.loadModel('models/misc/sphere')
-        self.tangentMarker.reparentTo(self.tangentGroup)
-        self.tangentMarker.setScale(0.5)
-        self.tangentMarker.setColor(1,0,1,1)
-        self.tangentMarker.setName('Tangent Marker')
-        self.tangentMarkerIds = self.getChildIds(
-            self.tangentMarker.getChild(0))
-        self.tangentLines = LineNodePath(self.tangentGroup)
-        self.tangentLines.setColor(VBase4(1,0,1,1))
-        self.tangentLines.setThickness(1)
-        self.tangentLines.moveTo(0,0,0)
-        self.tangentLines.drawTo(0,0,0)
-        self.tangentLines.create()
-        # Active node path dictionary
-        self.nodePathDict = {}
-        self.nodePathDict['marker'] = self.playbackMarker
-        self.nodePathDict['camera'] = camera
-        self.nodePathDict['widget'] = SEditor.widget
-        self.nodePathDict['mopathRecorderTempCS'] = self.tempCS
-        self.nodePathNames = ['marker', 'camera', 'selected']
-        # ID of selected object
-        self.manipulandumId = None
-        self.trace = LineNodePath(self.recorderNodePath)
-        self.oldPlaybackNodePath = None
-        # Count of point sets recorded
-        self.pointSet = []
-        self.prePoints = []
-        self.postPoints = []
-        self.pointSetDict = {}
-        self.pointSetCount = 0
-        self.pointSetName = self.name + '-ps-' + `self.pointSetCount`
-        # User callback to call before recording point
-        self.samplingMode = 'Continuous'
-        self.preRecordFunc = None
-        # Hook to start/stop recording
-        self.startStopHook = 'f6'
-        self.keyframeHook = 'f10'
-        # Curve fitter object
-        self.lastPos = Point3(0)
-        self.curveFitter = CurveFitter()
-        # Curve variables
-        # Number of ticks per parametric unit
-        self.numTicks = 1
-        # Number of segments to represent each parametric unit
-        # This just affects the visual appearance of the curve
-        self.numSegs = 40
-        # The nurbs curves
-        self.curveCollection = None
-        # Curve drawers
-        self.nurbsCurveDrawer = NurbsCurveDrawer()
-        self.nurbsCurveDrawer.setCurves(ParametricCurveCollection())
-        self.nurbsCurveDrawer.setNumSegs(self.numSegs)
-        self.nurbsCurveDrawer.setShowHull(0)
-        self.nurbsCurveDrawer.setShowCvs(0)
-        self.nurbsCurveDrawer.setNumTicks(0)
-        self.nurbsCurveDrawer.setTickScale(5.0)
-        self.curveNodePath = self.recorderNodePath.attachNewNode(
-            self.nurbsCurveDrawer.getGeomNode())
-        useDirectRenderStyle(self.curveNodePath)
-        # Playback variables
-        self.maxT = 0.0
-        self.playbackTime = 0.0
-        self.loopPlayback = 1
-        self.playbackSF = 1.0
-        # Sample variables
-        self.desampleFrequency = 1
-        self.numSamples = 100
-        self.recordStart = 0.0
-        self.deltaTime = 0.0
-        self.controlStart = 0.0
-        self.controlStop = 0.0
-        self.recordStop = 0.0
-        self.cropFrom = 0.0
-        self.cropTo = 0.0
-        self.fAdjustingValues = 0
-        # For terrain following
-        self.iRayCS = self.recorderNodePath.attachNewNode(
-            'mopathRecorderIRayCS')
-        self.iRay = SelectionRay(self.iRayCS)
-        # Set up event hooks
-        self.actionEvents = [
-            ('DIRECT_undo', self.undoHook),
-            ('DIRECT_pushUndo', self.pushUndoHook),
-            ('DIRECT_undoListEmpty', self.undoListEmptyHook),
-            ('DIRECT_redo', self.redoHook),
-            ('DIRECT_pushRedo', self.pushRedoHook),
-            ('DIRECT_redoListEmpty', self.redoListEmptyHook),
-            ('DIRECT_selectedNodePath', self.selectedNodePathHook),
-            ('DIRECT_deselectedNodePath', self.deselectedNodePathHook),
-            ('DIRECT_manipulateObjectStart', self.manipulateObjectStartHook),
-            ('DIRECT_manipulateObjectCleanup',
-             self.manipulateObjectCleanupHook),
-            ]
-        for event, method in self.actionEvents:
-            self.accept(event, method)
-
-    def createInterface(self):
-        interior = self.interior()
-        # FILE MENU
-        # Get a handle on the file menu so commands can be inserted
-        # before quit item
-        fileMenu = self.menuBar.component('File-menu')
-        fileMenu.insert_command(
-            fileMenu.index('Quit'),
-            label = 'Load Curve',
-            command = self.loadCurveFromFile)
-        fileMenu.insert_command(
-            fileMenu.index('Quit'),
-            label = 'Save Curve',
-            command = self.saveCurveToFile)
-
-        # Add mopath recorder commands to menubar
-        self.menuBar.addmenu('Recorder', 'Mopath Recorder Panel Operations')
-        self.menuBar.addmenuitem(
-            'Recorder', 'command',
-            'Save current curve as a new point set',
-            label = 'Save Point Set',
-            command = self.extractPointSetFromCurveCollection)
-        self.menuBar.addmenuitem(
-            'Recorder', 'command',
-            'Toggle widget visability',
-            label = 'Toggle Widget Vis',
-            command = self.toggleWidgetVis)
-        self.menuBar.addmenuitem(
-            'Recorder', 'command',
-            'Toggle widget manipulation mode',
-            label = 'Toggle Widget Mode',
-            command = SEditor.manipulationControl.toggleObjectHandlesMode)
-
-        self.historyWidget = self.createComboBox(self.menuFrame, 'Mopath', 'Path:',
-                                                 'Select input points to fit curve to', '',
-                                                 self.selectPointSetNamed, expand = 1)
-
-
-        self.undoButton = Button(self.menuFrame, text = 'Undo',
-                                 command = SEditor.undo)
-        if SEditor.undoList:
-            self.undoButton['state'] = 'normal'
-        else:
-            self.undoButton['state'] = 'disabled'
-        self.undoButton.pack(side = Tkinter.LEFT, expand = 0)
-        self.bind(self.undoButton, 'Undo last operation')
-
-        self.redoButton = Button(self.menuFrame, text = 'Redo',
-                                 command = SEditor.redo)
-        if SEditor.redoList:
-            self.redoButton['state'] = 'normal'
-        else:
-            self.redoButton['state'] = 'disabled'
-        self.redoButton.pack(side = Tkinter.LEFT, expand = 0)
-        self.bind(self.redoButton, 'Redo last operation')
-
-        # Record button
-        mainFrame = Frame(interior, relief = Tkinter.SUNKEN, borderwidth = 2)
-        frame = Frame(mainFrame)
-        # Active node path
-        # Button to select active node path
-        widget = self.createButton(frame, 'Recording', 'Node Path:',
-                                   'Select Active Mopath Node Path',
-                                   lambda s = self: SEditor.select(s.nodePath),
-                                   side = Tkinter.LEFT, expand = 0)
-        widget['relief'] = Tkinter.FLAT
-        self.nodePathMenu = Pmw.ComboBox(
-            frame, entry_width = 20,
-            selectioncommand = self.selectNodePathNamed,
-            scrolledlist_items = self.nodePathNames)
-        self.nodePathMenu.selectitem('camera')
-        self.nodePathMenuEntry = (
-            self.nodePathMenu.component('entryfield_entry'))
-        self.nodePathMenuBG = (
-            self.nodePathMenuEntry.configure('background')[3])
-        self.nodePathMenu.pack(side = Tkinter.LEFT, fill = Tkinter.X, expand = 1)
-        self.bind(self.nodePathMenu,
-                  'Select active node path used for recording and playback')
-        # Recording type
-        self.recordingType = StringVar()
-        self.recordingType.set('New Curve')
-        widget = self.createRadiobutton(
-            frame, 'left',
-            'Recording', 'New Curve',
-            ('Next record session records a new path'),
-            self.recordingType, 'New Curve',expand = 0)
-        widget = self.createRadiobutton(
-            frame, 'left',
-            'Recording', 'Refine',
-            ('Next record session refines existing path'),
-            self.recordingType, 'Refine', expand = 0)
-        widget = self.createRadiobutton(
-            frame, 'left',
-            'Recording', 'Extend',
-            ('Next record session extends existing path'),
-            self.recordingType, 'Extend', expand = 0)
-        frame.pack(fill = Tkinter.X, expand = 1)
-
-        frame = Frame(mainFrame)
-        widget = self.createCheckbutton(
-            frame, 'Recording', 'Record',
-            'On: path is being recorded', self.toggleRecord, 0,
-            side = Tkinter.LEFT, fill = Tkinter.BOTH, expand = 1)
-        widget.configure(foreground = 'Red', relief = Tkinter.RAISED, borderwidth = 2,
-                         anchor = Tkinter.CENTER, width = 16)
-        widget = self.createButton(frame, 'Recording', 'Add Keyframe',
-                                   'Add Keyframe To Current Path',
-                                   self.addKeyframe,
-                                   side = Tkinter.LEFT, expand = 1)
-
-        widget = self.createButton(frame, 'Recording', 'Bind Path to Node',
-                                   'Bind Motion Path to selected Object',
-                                   self.bindMotionPathToNode,
-                                   side = Tkinter.LEFT, expand = 1)
-
-
-        frame.pack(fill = Tkinter.X, expand = 1)
-        
-        mainFrame.pack(expand = 1, fill = Tkinter.X, pady = 3)
-        
-        # Playback controls
-        playbackFrame = Frame(interior, relief = Tkinter.SUNKEN,
-                              borderwidth = 2)
-        Label(playbackFrame, text = 'PLAYBACK CONTROLS',
-              font=('MSSansSerif', 12, 'bold')).pack(fill = Tkinter.X)
-        # Main playback control slider
-        widget = self.createEntryScale(
-            playbackFrame, 'Playback', 'Time', 'Set current playback time',
-            resolution = 0.01, command = self.playbackGoTo, side = Tkinter.TOP)
-        widget.component('hull')['relief'] = Tkinter.RIDGE
-        # Kill playback task if drag slider
-        widget['preCallback'] = self.stopPlayback
-        # Jam duration entry into entry scale
-        self.createLabeledEntry(widget.labelFrame, 'Resample', 'Path Duration',
-                                'Set total curve duration',
-                                command = self.setPathDuration,
-                                side = Tkinter.LEFT, expand = 0)
-        # Start stop buttons
-        frame = Frame(playbackFrame)
-        widget = self.createButton(frame, 'Playback', '<<',
-                                   'Jump to start of playback',
-                                   self.jumpToStartOfPlayback,
-                                   side = Tkinter.LEFT, expand = 1)
-        widget['font'] = (('MSSansSerif', 12, 'bold'))
-        widget = self.createCheckbutton(frame, 'Playback', 'Play',
-                                        'Start/Stop playback',
-                                        self.startStopPlayback, 0,
-                                        side = Tkinter.LEFT, fill = Tkinter.BOTH, expand = 1)
-        widget.configure(anchor = 'center', justify = 'center',
-                         relief = Tkinter.RAISED, font = ('MSSansSerif', 12, 'bold'))
-        widget = self.createButton(frame, 'Playback', '>>',
-                                   'Jump to end of playback',
-                                   self.jumpToEndOfPlayback,
-                                   side = Tkinter.LEFT, expand = 1)
-        widget['font'] = (('MSSansSerif', 12, 'bold'))
-        self.createCheckbutton(frame, 'Playback', 'Loop',
-                               'On: loop playback',
-                               self.setLoopPlayback, self.loopPlayback,
-                               side = Tkinter.LEFT, fill = Tkinter.BOTH, expand = 0)
-        frame.pack(fill = Tkinter.X, expand = 1)
-
-        # Speed control
-        frame = Frame(playbackFrame)
-        widget = Button(frame, text = 'PB Speed Vernier', relief = Tkinter.FLAT,
-                        command = lambda s = self: s.setSpeedScale(1.0))
-        widget.pack(side = Tkinter.LEFT, expand = 0)
-        self.speedScale = Scale(frame, from_ = -1, to = 1,
-                                resolution = 0.01, showvalue = 0,
-                                width = 10, orient = 'horizontal',
-                                command = self.setPlaybackSF)
-        self.speedScale.pack(side = Tkinter.LEFT, fill = Tkinter.X, expand = 1)
-        self.speedVar = StringVar()
-        self.speedVar.set("0.00")
-        self.speedEntry = Entry(frame, textvariable = self.speedVar,
-                                width = 8)
-        self.speedEntry.bind(
-            '<Return>',
-            lambda e = None, s = self: s.setSpeedScale(
-            string.atof(s.speedVar.get())))
-        self.speedEntry.pack(side = Tkinter.LEFT, expand = 0)
-        frame.pack(fill = Tkinter.X, expand = 1)
-        
-        playbackFrame.pack(fill = Tkinter.X, pady = 2)
-
-        # Create notebook pages
-        self.mainNotebook = Pmw.NoteBook(interior)
-        self.mainNotebook.pack(fill = Tkinter.BOTH, expand = 1)
-        self.resamplePage = self.mainNotebook.add('Resample')
-        self.refinePage = self.mainNotebook.add('Refine')
-        self.extendPage = self.mainNotebook.add('Extend')
-        self.cropPage = self.mainNotebook.add('Crop')
-        self.drawPage = self.mainNotebook.add('Draw')
-        self.optionsPage = self.mainNotebook.add('Options')
-
-        ## RESAMPLE PAGE
-        label = Label(self.resamplePage, text = 'RESAMPLE CURVE',
-                      font=('MSSansSerif', 12, 'bold'))
-        label.pack(fill = Tkinter.X)
-        
-        # Resample
-        resampleFrame = Frame(
-            self.resamplePage, relief = Tkinter.SUNKEN, borderwidth = 2)
-        label = Label(resampleFrame, text = 'RESAMPLE CURVE',
-                      font=('MSSansSerif', 12, 'bold')).pack()
-        widget = self.createSlider(
-            resampleFrame, 'Resample', 'Num. Samples',
-            'Number of samples in resampled curve',
-            resolution = 1, min = 2, max = 1000, command = self.setNumSamples)
-        widget.component('hull')['relief'] = Tkinter.RIDGE
-        widget['postCallback'] = self.sampleCurve
-
-        frame = Frame(resampleFrame)
-        self.createButton(
-            frame, 'Resample', 'Make Even',
-            'Apply timewarp so resulting path has constant velocity',
-            self.makeEven, side = Tkinter.LEFT, fill = Tkinter.X, expand = 1)
-        self.createButton(
-            frame, 'Resample', 'Face Forward',
-            'Compute HPR so resulting hpr curve faces along xyz tangent',
-            self.faceForward, side = Tkinter.LEFT, fill = Tkinter.X, expand = 1)
-        frame.pack(fill = Tkinter.X, expand = 0)
-        resampleFrame.pack(fill = Tkinter.X, expand = 0, pady = 2)
-        
-        # Desample
-        desampleFrame = Frame(
-            self.resamplePage, relief = Tkinter.SUNKEN, borderwidth = 2)
-        Label(desampleFrame, text = 'DESAMPLE CURVE',
-              font=('MSSansSerif', 12, 'bold')).pack()
-        widget = self.createSlider(
-            desampleFrame, 'Resample', 'Points Between Samples',
-            'Specify number of points to skip between samples',
-            min = 1, max = 100, resolution = 1,
-            command = self.setDesampleFrequency)
-        widget.component('hull')['relief'] = Tkinter.RIDGE
-        widget['postCallback'] = self.desampleCurve
-        desampleFrame.pack(fill = Tkinter.X, expand = 0, pady = 2)
-
-        ## REFINE PAGE ##
-        refineFrame = Frame(self.refinePage, relief = Tkinter.SUNKEN,
-                            borderwidth = 2)
-        label = Label(refineFrame, text = 'REFINE CURVE',
-                      font=('MSSansSerif', 12, 'bold'))
-        label.pack(fill = Tkinter.X)
-
-        widget = self.createSlider(refineFrame,
-                                       'Refine Page', 'Refine From',
-                                       'Begin time of refine pass',
-                                       resolution = 0.01,
-                                       command = self.setRecordStart)
-        widget['preCallback'] = self.setRefineMode
-        widget['postCallback'] = lambda s = self: s.getPrePoints('Refine')
-        widget = self.createSlider(
-            refineFrame, 'Refine Page',
-            'Control Start',
-            'Time when full control of node path is given during refine pass',
-            resolution = 0.01,
-            command = self.setControlStart)
-        widget['preCallback'] = self.setRefineMode
-        widget = self.createSlider(
-            refineFrame, 'Refine Page',
-            'Control Stop',
-            'Time when node path begins transition back to original curve',
-            resolution = 0.01,
-            command = self.setControlStop)
-        widget['preCallback'] = self.setRefineMode
-        widget = self.createSlider(refineFrame, 'Refine Page', 'Refine To',
-                                       'Stop time of refine pass',
-                                       resolution = 0.01,
-                                       command = self.setRefineStop)
-        widget['preCallback'] = self.setRefineMode
-        widget['postCallback'] = self.getPostPoints
-        refineFrame.pack(fill = Tkinter.X)
-
-        ## EXTEND PAGE ##
-        extendFrame = Frame(self.extendPage, relief = Tkinter.SUNKEN,
-                            borderwidth = 2)
-        label = Label(extendFrame, text = 'EXTEND CURVE',
-                      font=('MSSansSerif', 12, 'bold'))
-        label.pack(fill = Tkinter.X)
-
-        widget = self.createSlider(extendFrame,
-                                       'Extend Page', 'Extend From',
-                                       'Begin time of extend pass',
-                                       resolution = 0.01,
-                                       command = self.setRecordStart)
-        widget['preCallback'] = self.setExtendMode
-        widget['postCallback'] = lambda s = self: s.getPrePoints('Extend')
-        widget = self.createSlider(
-            extendFrame, 'Extend Page',
-            'Control Start',
-            'Time when full control of node path is given during extend pass',
-            resolution = 0.01,
-            command = self.setControlStart)
-        widget['preCallback'] = self.setExtendMode
-        extendFrame.pack(fill = Tkinter.X)
-
-        ## CROP PAGE ##
-        cropFrame = Frame(self.cropPage, relief = Tkinter.SUNKEN,
-                            borderwidth = 2)
-        label = Label(cropFrame, text = 'CROP CURVE',
-                      font=('MSSansSerif', 12, 'bold'))
-        label.pack(fill = Tkinter.X)
-
-        widget = self.createSlider(
-            cropFrame,
-            'Crop Page', 'Crop From',
-            'Delete all curve points before this time',
-            resolution = 0.01,
-            command = self.setCropFrom)
-
-        widget = self.createSlider(
-            cropFrame,
-            'Crop Page', 'Crop To',
-            'Delete all curve points after this time',
-            resolution = 0.01,
-            command = self.setCropTo)
-
-        self.createButton(cropFrame, 'Crop Page', 'Crop Curve',
-                          'Crop curve to specified from to times',
-                          self.cropCurve, fill = Tkinter.NONE)
-        cropFrame.pack(fill = Tkinter.X)
-
-        ## DRAW PAGE ##
-        drawFrame = Frame(self.drawPage, relief = Tkinter.SUNKEN,
-                           borderwidth = 2)
-
-        self.sf = Pmw.ScrolledFrame(self.drawPage, horizflex = 'elastic')
-        self.sf.pack(fill = 'both', expand = 1)
-        sfFrame = self.sf.interior()
-
-        label = Label(sfFrame, text = 'CURVE RENDERING STYLE',
-                      font=('MSSansSerif', 12, 'bold'))
-        label.pack(fill = Tkinter.X)
-
-        frame = Frame(sfFrame)
-        Label(frame, text = 'SHOW:').pack(side = Tkinter.LEFT, expand = 0)
-        widget = self.createCheckbutton(
-            frame, 'Style', 'Path',
-            'On: path is visible', self.setPathVis, 1,
-            side = Tkinter.LEFT, fill = Tkinter.X, expand = 1)
-        widget = self.createCheckbutton(
-            frame, 'Style', 'Knots',
-            'On: path knots are visible', self.setKnotVis, 1,
-            side = Tkinter.LEFT, fill = Tkinter.X, expand = 1)
-        widget = self.createCheckbutton(
-            frame, 'Style', 'CVs',
-            'On: path CVs are visible', self.setCvVis, 0,
-            side = Tkinter.LEFT, fill = Tkinter.X, expand = 1)
-        widget = self.createCheckbutton(
-            frame, 'Style', 'Hull',
-            'On: path hull is visible', self.setHullVis, 0,
-            side = Tkinter.LEFT, fill = Tkinter.X, expand = 1)
-        widget = self.createCheckbutton(
-            frame, 'Style', 'Trace',
-            'On: record is visible', self.setTraceVis, 0,
-            side = Tkinter.LEFT, fill = Tkinter.X, expand = 1)
-        widget = self.createCheckbutton(
-            frame, 'Style', 'Marker',
-            'On: playback marker is visible', self.setMarkerVis, 0,
-            side = Tkinter.LEFT, fill = Tkinter.X, expand = 1)
-        frame.pack(fill = Tkinter.X, expand = 1)
-        # Sliders
-        widget = self.createSlider(
-            sfFrame, 'Style', 'Num Segs',
-            'Set number of segments used to approximate each parametric unit',
-            min = 1.0, max = 400, resolution = 1.0,
-            value = 40, 
-            command = self.setNumSegs, side = Tkinter.TOP)
-        widget.component('hull')['relief'] = Tkinter.RIDGE
-        widget = self.createSlider(
-            sfFrame, 'Style', 'Num Ticks',
-            'Set number of tick marks drawn for each unit of time',
-            min = 0.0, max = 10.0, resolution = 1.0,
-            value = 0.0,
-            command = self.setNumTicks, side = Tkinter.TOP)
-        widget.component('hull')['relief'] = Tkinter.RIDGE
-        widget = self.createSlider(
-            sfFrame, 'Style', 'Tick Scale',
-            'Set visible size of time tick marks',
-            min = 0.01, max = 100.0, resolution = 0.01,
-            value = 5.0,
-            command = self.setTickScale, side = Tkinter.TOP)
-        widget.component('hull')['relief'] = Tkinter.RIDGE
-        self.createColorEntry(
-            sfFrame, 'Style', 'Path Color',
-            'Color of curve',
-            command = self.setPathColor,
-            value = [255.0,255.0,255.0,255.0])
-        self.createColorEntry(
-            sfFrame, 'Style', 'Knot Color',
-            'Color of knots',
-            command = self.setKnotColor,
-            value = [0,0,255.0,255.0])
-        self.createColorEntry(
-            sfFrame, 'Style', 'CV Color',
-            'Color of CVs',
-            command = self.setCvColor,
-            value = [255.0,0,0,255.0])
-        self.createColorEntry(
-            sfFrame, 'Style', 'Tick Color',
-            'Color of Ticks',
-            command = self.setTickColor,
-            value = [255.0,0,0,255.0])
-        self.createColorEntry(
-            sfFrame, 'Style', 'Hull Color',
-            'Color of Hull',
-            command = self.setHullColor,
-            value = [255.0,128.0,128.0,255.0])
-
-        #drawFrame.pack(fill = Tkinter.X)
-
-        ## OPTIONS PAGE ##
-        optionsFrame = Frame(self.optionsPage, relief = Tkinter.SUNKEN,
-                            borderwidth = 2)
-        label = Label(optionsFrame, text = 'RECORDING OPTIONS',
-                      font=('MSSansSerif', 12, 'bold'))
-        label.pack(fill = Tkinter.X)
-        # Hooks
-        frame = Frame(optionsFrame)
-        widget = self.createLabeledEntry(
-            frame, 'Recording', 'Record Hook',
-            'Hook used to start/stop recording',
-            value = self.startStopHook,
-            command = self.setStartStopHook)[0]
-        label = self.getWidget('Recording', 'Record Hook-Label')
-        label.configure(width = 16, anchor = Tkinter.W)
-        self.setStartStopHook()
-        widget = self.createLabeledEntry(
-            frame, 'Recording', 'Keyframe Hook',
-            'Hook used to add a new keyframe',
-            value = self.keyframeHook,
-            command = self.setKeyframeHook)[0]
-        label = self.getWidget('Recording', 'Keyframe Hook-Label')
-        label.configure(width = 16, anchor = Tkinter.W)
-        self.setKeyframeHook()
-        frame.pack(expand = 1, fill = Tkinter.X)
-        # PreRecordFunc
-        frame = Frame(optionsFrame)
-        widget = self.createComboBox(
-            frame, 'Recording', 'Pre-Record Func',
-            'Function called before sampling each point',
-            PRF_UTILITIES, self.setPreRecordFunc,
-            history = 1, expand = 1)
-        widget.configure(label_width = 16, label_anchor = Tkinter.W)
-        widget.configure(entryfield_entry_state = 'normal')
-        # Initialize preRecordFunc
-        self.preRecordFunc = eval(PRF_UTILITIES[0])
-        self.createCheckbutton(frame, 'Recording', 'PRF Active',
-                               'On: Pre Record Func enabled',
-                               None, 0,
-                               side = Tkinter.LEFT, fill = Tkinter.BOTH, expand = 0)
-        frame.pack(expand = 1, fill = Tkinter.X)
-        # Pack record frame
-        optionsFrame.pack(fill = Tkinter.X, pady = 2)
-
-        self.mainNotebook.setnaturalsize()        
-        
-    def pushUndo(self, fResetRedo = 1):
-        SEditor.pushUndo([self.nodePath])
-
-    def undoHook(self):
-        # Reflect new changes
-        pass
-
-    def pushUndoHook(self):
-        # Make sure button is reactivated
-        self.undoButton.configure(state = 'normal')
-
-    def undoListEmptyHook(self):
-        # Make sure button is deactivated
-        self.undoButton.configure(state = 'disabled')
-
-    def pushRedo(self):
-        SEditor.pushRedo([self.nodePath])
-        
-    def redoHook(self):
-        # Reflect new changes
-        pass
-
-    def pushRedoHook(self):
-        # Make sure button is reactivated
-        self.redoButton.configure(state = 'normal')
-
-    def redoListEmptyHook(self):
-        # Make sure button is deactivated
-        self.redoButton.configure(state = 'disabled')
-        
-    def selectedNodePathHook(self, nodePath):
-        """
-        Hook called upon selection of a node path used to select playback
-        marker if subnode selected
-        """
-        taskMgr.remove(self.name + '-curveEditTask')
-        print nodePath.id()
-        if nodePath.id() in self.playbackMarkerIds:
-            SEditor.select(self.playbackMarker)
-        elif nodePath.id() in self.tangentMarkerIds:
-            SEditor.select(self.tangentMarker)
-        elif nodePath.id() == self.playbackMarker.id():
-            self.tangentGroup.show()
-            taskMgr.add(self.curveEditTask,
-                                     self.name + '-curveEditTask')
-        elif nodePath.id() == self.tangentMarker.id():
-            self.tangentGroup.show()
-            taskMgr.add(self.curveEditTask,
-                                     self.name + '-curveEditTask')
-        else:
-            self.tangentGroup.hide()
-
-    def getChildIds(self, nodePath):
-        ids = [nodePath.id()]
-        kids = nodePath.getChildren()
-        for kid in kids:
-            ids += self.getChildIds(kid)
-        return ids
-
-    def deselectedNodePathHook(self, nodePath):
-        """
-        Hook called upon deselection of a node path used to select playback
-        marker if subnode selected
-        """
-        if ((nodePath.id() == self.playbackMarker.id()) or
-            (nodePath.id() == self.tangentMarker.id())):
-            self.tangentGroup.hide()
-
-    def curveEditTask(self,state):
-        if self.curveCollection != None:
-            # Update curve position
-            if self.manipulandumId == self.playbackMarker.id():
-                # Show playback marker
-                self.playbackMarker.getChild(0).show()
-                pos = Point3(0)
-                hpr = Point3(0)
-                pos = self.playbackMarker.getPos(self.nodePathParent)
-                hpr = self.playbackMarker.getHpr(self.nodePathParent)
-                self.curveCollection.adjustXyz(
-                    self.playbackTime, VBase3(pos[0], pos[1], pos[2]))
-                self.curveCollection.adjustHpr(
-                    self.playbackTime, VBase3(hpr[0], hpr[1], hpr[2]))
-                # Note: this calls recompute on the curves
-                self.nurbsCurveDrawer.draw()
-            # Update tangent
-            if self.manipulandumId == self.tangentMarker.id():
-                # If manipulating marker, update tangent
-                # Hide playback marker
-                self.playbackMarker.getChild(0).hide()
-                # Where is tangent marker relative to playback marker
-                tan = self.tangentMarker.getPos()
-                # Transform this vector to curve space
-                tan2Curve = Vec3(
-                    self.playbackMarker.getMat(
-                    self.nodePathParent).xformVec(tan))
-                # Update nurbs curve
-                self.curveCollection.getXyzCurve().adjustTangent(
-                    self.playbackTime,
-                    tan2Curve[0], tan2Curve[1], tan2Curve[2])
-                # Note: this calls recompute on the curves
-                self.nurbsCurveDrawer.draw()
-            else:
-                # Show playback marker
-                self.playbackMarker.getChild(0).show()
-                # Update tangent marker line
-                tan = Point3(0)
-                self.curveCollection.getXyzCurve().getTangent(
-                    self.playbackTime, tan)
-                # Transform this point to playback marker space
-                tan.assign(
-                    self.nodePathParent.getMat(
-                    self.playbackMarker).xformVec(tan))
-                self.tangentMarker.setPos(tan)
-            # In either case update tangent line
-            self.tangentLines.setVertex(1, tan[0], tan[1], tan[2])
-        return Task.cont
-
-    def manipulateObjectStartHook(self):
-        self.manipulandumId = None
-        if SEditor.selected.last:
-            if SEditor.selected.last.id() == self.playbackMarker.id():
-                self.manipulandumId = self.playbackMarker.id()
-            elif SEditor.selected.last.id() == self.tangentMarker.id():
-                self.manipulandumId = self.tangentMarker.id()
-              
-    def manipulateObjectCleanupHook(self):
-        # Clear flag
-        self.manipulandumId = None
-            
-    def onDestroy(self, event):
-        # Remove hooks
-        for event, method in self.actionEvents:
-            self.ignore(event)
-        # remove start stop hook
-        self.ignore(self.startStopHook)
-        self.ignore(self.keyframeHook)
-        self.curveNodePath.reparentTo(self.recorderNodePath)
-        self.trace.reparentTo(self.recorderNodePath)
-        self.recorderNodePath.removeNode()
-        # Make sure markers are deselected
-        SEditor.deselect(self.playbackMarker)
-        SEditor.deselect(self.tangentMarker)
-        # Remove tasks
-        taskMgr.remove(self.name + '-recordTask')
-        taskMgr.remove(self.name + '-playbackTask')
-        taskMgr.remove(self.name + '-curveEditTask')
-        self.mopathRecorderNode.removeChildren()
-        self.mopathRecorderNode.removeNode()
-        messenger.send('mPath_close')
-        messenger.send('SGE_Update Explorer',[render])
-
-    def createNewPointSet(self, curveName = None):
-        if curveName == None:
-            self.pointSetName = self.name + '-ps-' + `self.pointSetCount`
-        else:
-            self.pointSetName = curveName
-        # Update dictionary and record pointer to new point set
-        self.pointSet = self.pointSetDict[self.pointSetName] = []
-        # Update combo box
-        comboBox = self.getWidget('Mopath', 'Path:')
-        scrolledList = comboBox.component('scrolledlist')
-        listbox = scrolledList.component('listbox')
-        names = list(listbox.get(0,'end'))
-        names.append(self.pointSetName)
-        scrolledList.setlist(names)
-        comboBox.selectitem(self.pointSetName)
-        # Update count
-        self.pointSetCount += 1
-
-    def extractPointSetFromCurveFitter(self, curveName = None):
-        # Get new point set based on newly created curve
-        self.createNewPointSet(curveName)
-        for i in range(self.curveFitter.getNumSamples()):
-            time = self.curveFitter.getSampleT(i)
-            pos = Point3(self.curveFitter.getSampleXyz(i))
-            hpr = Point3(self.curveFitter.getSampleHpr(i))
-            self.pointSet.append([time, pos, hpr])
-
-    def extractPointSetFromCurveCollection(self, curveName=None):
-        # Use curve to compute new point set
-        # Record maxT
-        self.maxT = self.curveCollection.getMaxT()
-        # Determine num samples
-        # Limit point set to 1000 points and samples per second to 30
-        samplesPerSegment = min(30.0, 1000.0/self.curveCollection.getMaxT())
-        self.setNumSamples(self.maxT * samplesPerSegment)
-        # Sample the curve but don't create a new curve collection
-        self.sampleCurve(fCompute = 0, curveName = curveName)
-        # Update widgets based on new data
-        self.updateWidgets()
-
-    def selectPointSetNamed(self, name):
-        self.pointSet = self.pointSetDict.get(name, None)
-        # Reload points into curve fitter
-        # Reset curve fitters
-        self.curveFitter.reset()
-        for time, pos, hpr in self.pointSet:
-            # Add it to the curve fitters
-            self.curveFitter.addXyzHpr(time, pos, hpr)
-        # Compute curve
-        self.computeCurves()
-
-    def setPathVis(self):
-        if self.getVariable('Style', 'Path').get():
-            self.curveNodePath.show()
-        else:
-            self.curveNodePath.hide()
-        
-    def setKnotVis(self):
-        self.nurbsCurveDrawer.setShowKnots(
-            self.getVariable('Style', 'Knots').get())
-
-    def setCvVis(self):
-        self.nurbsCurveDrawer.setShowCvs(
-            self.getVariable('Style', 'CVs').get())
-        
-    def setHullVis(self):
-        self.nurbsCurveDrawer.setShowHull(
-            self.getVariable('Style', 'Hull').get())
-        
-    def setTraceVis(self):
-        if self.getVariable('Style', 'Trace').get():
-            self.trace.show()
-        else:
-            self.trace.hide()
-
-    def setMarkerVis(self):
-        if self.getVariable('Style', 'Marker').get():
-            self.playbackMarker.reparentTo(self.recorderNodePath)
-        else:
-            self.playbackMarker.reparentTo(hidden)
-
-    def setNumSegs(self, value):
-        self.numSegs = int(value)
-        self.nurbsCurveDrawer.setNumSegs(self.numSegs)
-        
-    def setNumTicks(self, value):
-        self.nurbsCurveDrawer.setNumTicks(float(value))
-        
-    def setTickScale(self, value):
-        self.nurbsCurveDrawer.setTickScale(float(value))
-
-    def setPathColor(self, color):
-        self.nurbsCurveDrawer.setColor(
-            color[0]/255.0,color[1]/255.0,color[2]/255.0)
-        self.nurbsCurveDrawer.draw()
-
-    def setKnotColor(self, color):
-        self.nurbsCurveDrawer.setKnotColor(
-            color[0]/255.0,color[1]/255.0,color[2]/255.0)
-
-    def setCvColor(self, color):
-        self.nurbsCurveDrawer.setCvColor(
-            color[0]/255.0,color[1]/255.0,color[2]/255.0)
-
-    def setTickColor(self, color):
-        self.nurbsCurveDrawer.setTickColor(
-            color[0]/255.0,color[1]/255.0,color[2]/255.0)
-
-    def setHullColor(self, color):
-        self.nurbsCurveDrawer.setHullColor(
-            color[0]/255.0,color[1]/255.0,color[2]/255.0)
-
-    def setStartStopHook(self, event = None):
-        # Clear out old hook
-        self.ignore(self.startStopHook)
-        # Record new one
-        hook = self.getVariable('Recording', 'Record Hook').get()
-        self.startStopHook = hook
-        # Add new one
-        self.accept(self.startStopHook, self.toggleRecordVar)
-
-    def setKeyframeHook(self, event = None):
-        # Clear out old hook
-        self.ignore(self.keyframeHook)
-        # Record new one
-        hook = self.getVariable('Recording', 'Keyframe Hook').get()
-        self.keyframeHook = hook
-        # Add new one
-        self.accept(self.keyframeHook, self.addKeyframe)
-
-    def reset(self):
-        self.pointSet = []
-        self.hasPoints = 0
-        self.curveCollection = None
-        self.curveFitter.reset()
-        self.nurbsCurveDrawer.hide()
-        
-    def setSamplingMode(self, mode):
-        self.samplingMode = mode
-
-    def disableKeyframeButton(self):
-        self.getWidget('Recording', 'Add Keyframe')['state'] = 'disabled'
-    def enableKeyframeButton(self):
-        self.getWidget('Recording', 'Add Keyframe')['state'] = 'normal'
-
-    def setRecordingType(self, type):
-        self.recordingType.set(type)
-
-    def setNewCurveMode(self):
-        self.setRecordingType('New Curve')
-
-    def setRefineMode(self):
-        self.setRecordingType('Refine')
-        
-    def setExtendMode(self):
-        self.setRecordingType('Extend')
-
-    def toggleRecordVar(self):
-        # Get recording variable
-        v = self.getVariable('Recording', 'Record')
-        # Toggle it
-        v.set(1 - v.get())
-        # Call the command
-        self.toggleRecord()
-
-    def toggleRecord(self):
-        if self.getVariable('Recording', 'Record').get():
-            # Reparent a Marker to target nodePath to show where the recording start
-            self.markingNode = self.nodePath.getParent().attachNewNode('MopthMarkerNode')
-            self.nodePath.copyTo(self.markingNode)
-            self.markingNode.wrtReparentTo(render)
-            # Kill old tasks
-            taskMgr.remove(self.name + '-recordTask')
-            taskMgr.remove(self.name + '-curveEditTask')
-            # Remove old curve
-            self.nurbsCurveDrawer.hide()
-            # Reset curve fitters
-            self.curveFitter.reset()
-            # Update sampling mode button if necessary
-            if self.samplingMode == 'Continuous':
-                self.disableKeyframeButton()
-            # Create a new point set to hold raw data
-            self.createNewPointSet()
-            # Clear out old trace, get ready to draw new
-            self.initTrace()
-            # Keyframe mode?
-            if (self.samplingMode == 'Keyframe'):
-                # Record first point
-                self.lastPos.assign(Point3(
-                    self.nodePath.getPos(self.nodePathParent)))
-                # Init delta time
-                self.deltaTime = 0.0
-                # Record first point
-                self.recordPoint(self.recordStart)
-            # Everything else
-            else:
-                if ((self.recordingType.get() == 'Refine') or
-                    (self.recordingType.get() == 'Extend')):
-                    # Turn off looping playback
-                    self.loopPlayback = 0
-                    # Update widget to reflect new value
-                    self.getVariable('Playback', 'Loop').set(0)
-                    # Select tempCS as playback nodepath
-                    self.oldPlaybackNodePath = self.playbackNodePath
-                    self.setPlaybackNodePath(self.tempCS)
-                    # Parent record node path to temp
-                    self.nodePath.reparentTo(self.playbackNodePath)
-                    # Align with temp
-                    self.nodePath.setPosHpr(0,0,0,0,0,0)
-                    # Set playback start to self.recordStart
-                    self.playbackGoTo(self.recordStart)
-                    # start flying nodePath along path
-                    self.startPlayback()
-                # Start new task
-                t = taskMgr.add(
-                    self.recordTask, self.name + '-recordTask')
-                t.startTime = globalClock.getFrameTime()
-        else:
-            self.markingNode.removeNode() # Hide the marker in the end of recording 
-            if self.samplingMode == 'Continuous':
-                # Kill old task
-                taskMgr.remove(self.name + '-recordTask')
-                if ((self.recordingType.get() == 'Refine') or
-                    (self.recordingType.get() == 'Extend')):
-                    # Reparent node path back to parent
-                    self.nodePath.wrtReparentTo(self.nodePathParent)
-                    # Restore playback Node Path
-                    self.setPlaybackNodePath(self.oldPlaybackNodePath)
-            else:
-                # Add last point
-                self.addKeyframe(0)
-            # Reset sampling mode
-            self.setSamplingMode('Continuous')
-            self.enableKeyframeButton()
-            # Clean up after refine or extend
-            if ((self.recordingType.get() == 'Refine') or
-                (self.recordingType.get() == 'Extend')):
-                # Merge prePoints, pointSet, postPoints
-                self.mergePoints()
-                # Clear out pre and post list
-                self.prePoints = []
-                self.postPoints = []
-                # Reset recording mode
-                self.setNewCurveMode()
-            # Compute curve
-            self.computeCurves()
-            
-    def recordTask(self, state):
-        # Record raw data point
-        time = self.recordStart + (
-            globalClock.getFrameTime() - state.startTime)
-        self.recordPoint(time)
-        return Task.cont
-
-    def addKeyframe(self, fToggleRecord = 1):
-        # Make sure we're in a recording mode!
-        if (fToggleRecord and
-            (not self.getVariable('Recording', 'Record').get())):
-            # Set sampling mode
-            self.setSamplingMode('Keyframe')
-            # This will automatically add the first point
-            self.toggleRecordVar()
-        else:
-            # Use distance as a time
-            pos = self.nodePath.getPos(self.nodePathParent)
-            deltaPos = Vec3(pos - self.lastPos).length()
-            if deltaPos != 0:
-                # If we've moved at all, use delta Pos as time
-                self.deltaTime = self.deltaTime + deltaPos
-            else:
-                # Otherwise add one second
-                self.deltaTime = self.deltaTime + 1.0
-            # Record point at new time
-            self.recordPoint(self.recordStart + self.deltaTime)
-            # Update last pos
-            self.lastPos.assign(pos)
-
-    def easeInOut(self, t):
-        x = t * t
-        return (3 * x) - (2 * t * x)
-
-    def setPreRecordFunc(self, func):
-        # Note: If func is one defined at command prompt, need to set
-        # __builtins__.func = func at command line
-        self.preRecordFunc = eval(func)
-        # Update widget to reflect new value
-        self.getVariable('Recording', 'PRF Active').set(1)
-
-    def recordPoint(self, time):
-        # Call user define callback before recording point
-        if (self.getVariable('Recording', 'PRF Active').get() and
-            (self.preRecordFunc != None)):
-            self.preRecordFunc()
-        # Get point
-        pos = self.nodePath.getPos(self.nodePathParent)
-        hpr = self.nodePath.getHpr(self.nodePathParent)
-        qNP = Quat()
-        qNP.setHpr(hpr)
-        # Blend between recordNodePath and self.nodePath
-        if ((self.recordingType.get() == 'Refine') or
-            (self.recordingType.get() == 'Extend')):
-            if ((time < self.controlStart) and
-                ((self.controlStart - self.recordStart) != 0.0)):
-                rPos = self.playbackNodePath.getPos(self.nodePathParent)
-                rHpr = self.playbackNodePath.getHpr(self.nodePathParent)
-                qR = Quat()
-                qR.setHpr(rHpr)
-                t = self.easeInOut(((time - self.recordStart)/
-                                    (self.controlStart - self.recordStart)))
-                # Transition between the recorded node path and the driven one
-                pos = (rPos * (1 - t)) + (pos * t)
-                q = qSlerp(qR, qNP, t)
-                hpr.assign(q.getHpr())
-            elif ((self.recordingType.get() == 'Refine') and
-                  (time > self.controlStop) and
-                  ((self.recordStop - self.controlStop) != 0.0)):
-                rPos = self.playbackNodePath.getPos(self.nodePathParent)
-                rHpr = self.playbackNodePath.getHpr(self.nodePathParent)
-                qR = Quat()
-                qR.setHpr(rHpr)
-                t = self.easeInOut(((time - self.controlStop)/
-                                    (self.recordStop - self.controlStop)))
-                # Transition between the recorded node path and the driven one
-                pos = (pos * (1 - t)) + (rPos * t)
-                q = qSlerp(qNP, qR, t)
-                hpr.assign(q.getHpr())
-        # Add it to the point set
-        self.pointSet.append([time, pos, hpr])
-        # Add it to the curve fitters
-        self.curveFitter.addXyzHpr(time, pos, hpr)
-        # Update trace now if recording keyframes
-        if (self.samplingMode == 'Keyframe'):
-            self.trace.reset()
-            for t, p, h in self.pointSet:
-                self.trace.drawTo(p[0], p[1], p[2])
-            self.trace.create()
-
-    def computeCurves(self):
-        # Check to make sure curve fitters have points
-        if (self.curveFitter.getNumSamples() == 0):
-            print 'MopathRecorder.computeCurves: Must define curve first'
-            return
-        # Create curves
-        # XYZ
-        self.curveFitter.sortPoints()
-        self.curveFitter.wrapHpr()
-        self.curveFitter.computeTangents(1)
-        # This is really a collection
-        self.curveCollection = self.curveFitter.makeNurbs()
-        self.nurbsCurveDrawer.setCurves(self.curveCollection)
-        self.nurbsCurveDrawer.draw()
-        # Update widget based on new curve
-        self.updateWidgets()
-
-    def initTrace(self):
-        self.trace.reset()
-        # Put trace line segs under node path's parent
-        self.trace.reparentTo(self.nodePathParent)
-        # Show it
-        self.trace.show()
-
-    def updateWidgets(self):
-        if not self.curveCollection:
-            return
-        self.fAdjustingValues = 1
-        # Widgets depending on max T
-        maxT = self.curveCollection.getMaxT()
-        maxT_text = '%0.2f' % maxT
-        # Playback controls
-        self.getWidget('Playback', 'Time').configure(max = maxT_text)
-        self.getVariable('Resample', 'Path Duration').set(maxT_text)
-        # Refine widgets
-        widget = self.getWidget('Refine Page', 'Refine From')
-        widget.configure(max = maxT)
-        widget.set(0.0)
-        widget = self.getWidget('Refine Page', 'Control Start')
-        widget.configure(max = maxT)
-        widget.set(0.0)
-        widget = self.getWidget('Refine Page', 'Control Stop')
-        widget.configure(max = maxT)
-        widget.set(float(maxT))
-        widget = self.getWidget('Refine Page', 'Refine To')
-        widget.configure(max = maxT)
-        widget.set(float(maxT))
-        # Extend widgets
-        widget = self.getWidget('Extend Page', 'Extend From')
-        widget.configure(max = maxT)
-        widget.set(float(0.0))
-        widget = self.getWidget('Extend Page', 'Control Start')
-        widget.configure(max = maxT)
-        widget.set(float(0.0))
-        # Crop widgets
-        widget = self.getWidget('Crop Page', 'Crop From')
-        widget.configure(max = maxT)
-        widget.set(float(0.0))
-        widget = self.getWidget('Crop Page', 'Crop To')
-        widget.configure(max = maxT)
-        widget.set(float(maxT))
-        self.maxT = float(maxT)
-        # Widgets depending on number of samples
-        numSamples = self.curveFitter.getNumSamples()
-        widget = self.getWidget('Resample', 'Points Between Samples')
-        widget.configure(max=numSamples)
-        widget = self.getWidget('Resample', 'Num. Samples')
-        widget.configure(max = 4 * numSamples)
-        widget.set(numSamples, 0)
-        self.fAdjustingValues = 0
-
-    def selectNodePathNamed(self, name):
-        nodePath = None
-        if name == 'init':
-            nodePath = self.nodePath
-            # Add Combo box entry for the initial node path
-            self.addNodePath(nodePath)
-        elif name == 'selected':
-            nodePath = SEditor.selected.last
-            # Add Combo box entry for this selected object
-            self.addNodePath(nodePath)
-        else:
-            nodePath = self.nodePathDict.get(name, None)
-            if (nodePath == None):
-                # See if this evaluates into a node path
-                try:
-                    nodePath = eval(name)
-                    if isinstance(nodePath, NodePath):
-                        self.addNodePath(nodePath)
-                    else:
-                        # Good eval but not a node path, give up
-                        nodePath = None
-                except:
-                    # Bogus eval
-                    nodePath = None
-                    # Clear bogus entry from listbox
-                    listbox = self.nodePathMenu.component('scrolledlist')
-                    listbox.setlist(self.nodePathNames)
-            else:
-                if name == 'widget':
-                    # Record relationship between selected nodes and widget
-                    SEditor.selected.getWrtAll()
-                if name == 'marker':
-                    self.playbackMarker.show()
-                    # Initialize tangent marker position
-                    tan = Point3(0)
-                    if self.curveCollection != None:
-                        self.curveCollection.getXyzCurve().getTangent(
-                            self.playbackTime, tan)
-                    self.tangentMarker.setPos(tan)
-                else:
-                    self.playbackMarker.hide()
-        # Update active node path
-        self.setNodePath(nodePath)
-        messenger.send('mPath_requestCurveList',[nodePath,self.name])
-        self.accept('curveListFor'+self.name, self.addCurvesFromNodepath)
-
-
-    def setNodePath(self, nodePath):
-        self.playbackNodePath = self.nodePath = nodePath
-        if self.nodePath:
-            # Record nopath's parent
-            self.nodePathParent = self.nodePath.getParent()
-            # Put curve drawer under record node path's parent
-            self.curveNodePath.reparentTo(self.nodePathParent)
-            # Set entry color
-            self.nodePathMenuEntry.configure(
-                background = self.nodePathMenuBG)
-        else:
-            # Flash entry
-            self.nodePathMenuEntry.configure(background = 'Pink')
-
-    def setPlaybackNodePath(self, nodePath):
-        self.playbackNodePath = nodePath
-
-    def addNodePath(self, nodePath):
-        self.addNodePathToDict(nodePath, self.nodePathNames,
-                               self.nodePathMenu, self.nodePathDict)
-
-    def addNodePathToDict(self, nodePath, names, menu, dict):
-        if not nodePath:
-            return
-        # Get node path's name
-        name = nodePath.getName()
-        if name in ['mopathRecorderTempCS', 'widget', 'camera', 'marker']:
-            dictName = name
-        else:
-            # Generate a unique name for the dict
-            dictName = name # + '-' + `nodePath.id()`
-        if not dict.has_key(dictName):
-            # Update combo box to include new item
-            names.append(dictName)
-            listbox = menu.component('scrolledlist')
-            listbox.setlist(names)
-            # Add new item to dictionary
-            dict[dictName] = nodePath
-        menu.selectitem(dictName)
-
-    def setLoopPlayback(self):
-        self.loopPlayback = self.getVariable('Playback', 'Loop').get()
-
-    def playbackGoTo(self, time):
-        if self.curveCollection == None:
-            return
-        self.playbackTime = CLAMP(time, 0.0, self.maxT)
-        if self.curveCollection != None:
-            pos = Point3(0)
-            hpr = Point3(0)
-            self.curveCollection.evaluate(self.playbackTime, pos, hpr)
-            self.playbackNodePath.setPosHpr(self.nodePathParent, pos, hpr)
-
-    def startPlayback(self):
-        if self.curveCollection == None:
-            return
-        # Kill any existing tasks
-        self.stopPlayback()
-        # Make sure checkbutton is set
-        self.getVariable('Playback', 'Play').set(1)
-        # Start new playback task
-        t = taskMgr.add(
-            self.playbackTask, self.name + '-playbackTask')
-        t.currentTime = self.playbackTime
-        t.lastTime = globalClock.getFrameTime()
-
-    def setSpeedScale(self, value):
-        self.speedScale.set(math.log10(value))
-
-    def setPlaybackSF(self, value):
-        self.playbackSF = pow(10.0, float(value))
-        self.speedVar.set('%0.2f' % self.playbackSF)
-        
-    def playbackTask(self, state):
-        time = globalClock.getFrameTime()
-        dTime = self.playbackSF * (time - state.lastTime)
-        state.lastTime = time
-        if self.loopPlayback:
-            cTime = (state.currentTime + dTime) % self.maxT
-        else:
-            cTime = state.currentTime + dTime
-        # Stop task if not looping and at end of curve
-        # Or if refining curve and past recordStop
-        if ((self.recordingType.get() == 'Refine') and
-              (cTime > self.recordStop)):
-            # Go to recordStop
-            self.getWidget('Playback', 'Time').set(self.recordStop)
-            # Then stop playback
-            self.stopPlayback()
-            # Also kill record task
-            self.toggleRecordVar()
-            return Task.done
-        elif ((self.loopPlayback == 0) and (cTime > self.maxT)):
-            # Go to maxT
-            self.getWidget('Playback', 'Time').set(self.maxT)
-            # Then stop playback
-            self.stopPlayback()
-            return Task.done
-        elif ((self.recordingType.get() == 'Extend') and
-              (cTime > self.controlStart)):
-            # Go to final point
-            self.getWidget('Playback', 'Time').set(self.controlStart)
-            # Stop playback
-            self.stopPlayback()
-            return Task.done
-        # Otherwise go to specified time and continue
-        self.getWidget('Playback', 'Time').set(cTime)
-        state.currentTime = cTime
-        return Task.cont
-
-    def stopPlayback(self):
-        self.getVariable('Playback', 'Play').set(0)
-        taskMgr.remove(self.name + '-playbackTask')
-
-    def jumpToStartOfPlayback(self):
-        self.stopPlayback()
-        self.getWidget('Playback', 'Time').set(0.0)
-
-    def jumpToEndOfPlayback(self):
-        self.stopPlayback()
-        if self.curveCollection != None:
-            self.getWidget('Playback', 'Time').set(self.maxT)
-
-    def startStopPlayback(self):
-        if self.getVariable('Playback', 'Play').get():
-            self.startPlayback()
-        else:
-            self.stopPlayback()
-
-    def setDesampleFrequency(self, frequency):
-        self.desampleFrequency = frequency
-        
-    def desampleCurve(self):
-        if (self.curveFitter.getNumSamples() == 0):
-            print 'MopathRecorder.desampleCurve: Must define curve first'
-            return
-        # NOTE: This is destructive, points will be deleted from curve fitter
-        self.curveFitter.desample(self.desampleFrequency)
-        # Compute new curve based on desampled data
-        self.computeCurves()
-        # Get point set from the curve fitter
-        self.extractPointSetFromCurveFitter()
-
-    def setNumSamples(self, numSamples):
-        self.numSamples = int(numSamples)
-        
-    def sampleCurve(self, fCompute = 1, curveName = None):
-        if self.curveCollection == None:
-            print 'MopathRecorder.sampleCurve: Must define curve first'
-            return
-        # Reset curve fitters
-        self.curveFitter.reset()
-        # Sample curve using specified number of samples
-        self.curveFitter.sample(self.curveCollection, self.numSamples)
-        if fCompute:
-            # Now recompute curves
-            self.computeCurves()
-        # Get point set from the curve fitter
-        self.extractPointSetFromCurveFitter(curveName)
-
-
-
-    def makeEven(self):
-        # Note: segments_per_unit = 2 seems to give a good fit
-        self.curveCollection.makeEven(self.maxT, 2)
-        # Get point set from curve
-        self.extractPointSetFromCurveCollection()
-
-    def faceForward(self):
-        # Note: segments_per_unit = 2 seems to give a good fit
-        self.curveCollection.faceForward(2)
-        # Get point set from curve
-        self.extractPointSetFromCurveCollection()
-
-    def setPathDuration(self, event):
-        newMaxT = float(self.getWidget('Resample', 'Path Duration').get())
-        self.setPathDurationTo(newMaxT)
-        
-    def setPathDurationTo(self, newMaxT):
-        # Compute scale factor
-        sf = newMaxT/self.maxT
-        # Scale curve collection
-        self.curveCollection.resetMaxT(newMaxT)
-        # Scale point set
-        # Save handle to old point set
-        oldPointSet = self.pointSet
-        # Create new point set
-        self.createNewPointSet()
-        # Reset curve fitters
-        self.curveFitter.reset()
-        # Now scale values
-        for time, pos, hpr in oldPointSet:
-            newTime = time * sf
-            # Update point set
-            self.pointSet.append([newTime, Point3(pos), Point3(hpr)])
-            # Add it to the curve fitters
-            self.curveFitter.addXyzHpr(newTime, pos, hpr)
-        # Update widgets
-        self.updateWidgets()
-        # Compute curve
-        #self.computeCurves()
-
-    def setRecordStart(self,value):
-        self.recordStart = value
-        # Someone else is adjusting values, let them take care of it
-        if self.fAdjustingValues:
-            return
-        self.fAdjustingValues = 1
-        # Adjust refine widgets
-        # Make sure we're in sync
-        self.getWidget('Refine Page', 'Refine From').set(
-            self.recordStart)
-        self.getWidget('Extend Page', 'Extend From').set(
-            self.recordStart)
-        # Check bounds
-        if self.recordStart > self.controlStart:
-            self.getWidget('Refine Page', 'Control Start').set(
-                self.recordStart)
-            self.getWidget('Extend Page', 'Control Start').set(
-                self.recordStart)
-        if self.recordStart > self.controlStop:
-            self.getWidget('Refine Page', 'Control Stop').set(
-                self.recordStart)
-        if self.recordStart > self.recordStop:
-            self.getWidget('Refine Page', 'Refine To').set(self.recordStart)
-        # Move playback node path to specified time
-        self.getWidget('Playback', 'Time').set(value)
-        self.fAdjustingValues = 0
-
-    def getPrePoints(self, type = 'Refine'):
-        # Switch to appropriate recording type
-        self.setRecordingType(type)
-        # Reset prePoints
-        self.prePoints = []
-        # See if we need to save any points before recordStart
-        for i in range(len(self.pointSet)):
-            # Have we passed recordStart?
-            if self.recordStart < self.pointSet[i][0]:
-                # Get a copy of the points prior to recordStart
-                self.prePoints = self.pointSet[:i-1]
-                break
-
-    def setControlStart(self, value):
-        self.controlStart = value
-        # Someone else is adjusting values, let them take care of it
-        if self.fAdjustingValues:
-            return
-        self.fAdjustingValues = 1
-        # Adjust refine widgets
-        # Make sure both pages are in sync
-        self.getWidget('Refine Page', 'Control Start').set(
-            self.controlStart)
-        self.getWidget('Extend Page', 'Control Start').set(
-            self.controlStart)
-        # Check bounds on other widgets
-        if self.controlStart < self.recordStart:
-            self.getWidget('Refine Page', 'Refine From').set(
-                self.controlStart)
-            self.getWidget('Extend Page', 'Extend From').set(
-                self.controlStart)
-        if self.controlStart > self.controlStop:
-            self.getWidget('Refine Page', 'Control Stop').set(
-                self.controlStart)
-        if self.controlStart > self.recordStop:
-            self.getWidget('Refine Page', 'Refine To').set(
-                self.controlStart)
-        # Move playback node path to specified time
-        self.getWidget('Playback', 'Time').set(value)
-        self.fAdjustingValues = 0
-
-    def setControlStop(self, value):
-        self.controlStop = value
-        # Someone else is adjusting values, let them take care of it
-        if self.fAdjustingValues:
-            return
-        self.fAdjustingValues = 1
-        if self.controlStop < self.recordStart:
-            self.getWidget('Refine Page', 'Refine From').set(
-                self.controlStop)
-        if self.controlStop < self.controlStart:
-            self.getWidget('Refine Page', 'Control Start').set(
-                self.controlStop)
-        if self.controlStop > self.recordStop:
-            self.getWidget('Refine Page', 'Refine To').set(
-                self.controlStop)
-        # Move playback node path to specified time
-        self.getWidget('Playback', 'Time').set(value)
-        self.fAdjustingValues = 0
-
-    def setRefineStop(self, value):
-        self.recordStop = value
-        # Someone else is adjusting values, let them take care of it
-        if self.fAdjustingValues:
-            return
-        self.fAdjustingValues = 1
-        if self.recordStop < self.recordStart:
-            self.getWidget('Refine Page', 'Refine From').set(
-                self.recordStop)
-        if self.recordStop < self.controlStart:
-            self.getWidget('Refine Page', 'Control Start').set(
-                self.recordStop)
-        if self.recordStop < self.controlStop:
-            self.getWidget('Refine Page', 'Control Stop').set(
-                self.recordStop)
-        # Move playback node path to specified time
-        self.getWidget('Playback', 'Time').set(value)
-        self.fAdjustingValues = 0
-
-    def getPostPoints(self):
-        # Set flag so we know to do a refine pass
-        self.setRefineMode()
-        # Reset postPoints
-        self.postPoints = []
-        # See if we need to save any points after recordStop
-        for i in range(len(self.pointSet)):
-            # Have we reached recordStop?
-            if self.recordStop < self.pointSet[i][0]:
-                # Get a copy of the points after recordStop
-                self.postPoints = self.pointSet[i:]
-                break
-
-    def mergePoints(self):
-        # prepend pre points
-        self.pointSet[0:0] = self.prePoints
-        for time, pos, hpr in self.prePoints:
-            # Add it to the curve fitters
-            self.curveFitter.addXyzHpr(time, pos, hpr)
-        # And post points
-        # What is end time of pointSet?
-        endTime = self.pointSet[-1][0]
-        for time, pos, hpr in self.postPoints:
-            adjustedTime = endTime + (time - self.recordStop)
-            # Add it to point set
-            self.pointSet.append([adjustedTime, pos, hpr])
-            # Add it to the curve fitters
-            self.curveFitter.addXyzHpr(adjustedTime, pos, hpr)
-
-    def setCropFrom(self,value):
-        self.cropFrom = value
-        # Someone else is adjusting values, let them take care of it
-        if self.fAdjustingValues:
-            return
-        self.fAdjustingValues = 1
-        if self.cropFrom > self.cropTo:
-            self.getWidget('Crop Page', 'Crop To').set(
-                self.cropFrom)
-        # Move playback node path to specified time
-        self.getWidget('Playback', 'Time').set(value)
-        self.fAdjustingValues = 0
-
-    def setCropTo(self,value):
-        self.cropTo = value
-        # Someone else is adjusting values, let them take care of it
-        if self.fAdjustingValues:
-            return
-        self.fAdjustingValues = 1
-        if self.cropTo < self.cropFrom:
-            self.getWidget('Crop Page', 'Crop From').set(
-                self.cropTo)
-        # Move playback node path to specified time
-        self.getWidget('Playback', 'Time').set(value)
-        self.fAdjustingValues = 0
-
-    def cropCurve(self):
-        if self.pointSet == None:
-            print 'Empty Point Set'
-            return
-        # Keep handle on old points
-        oldPoints = self.pointSet
-        # Create new point set
-        self.createNewPointSet()
-        # Copy over points between from/to
-        # Reset curve fitters
-        self.curveFitter.reset()
-        # Add start point
-        pos = Point3(0)
-        hpr = Point3(0)
-        self.curveCollection.evaluate(self.cropFrom, pos, hpr)
-        self.curveFitter.addXyzHpr(0.0, pos, hpr)
-        # Get points within bounds
-        for time, pos, hpr in oldPoints:
-            # Is it within the time?
-            if ((time > self.cropFrom) and
-                (time < self.cropTo)):
-                # Add it to the curve fitters
-                t = time - self.cropFrom
-                self.curveFitter.addXyzHpr(t, pos, hpr)
-                # And the point set
-                self.pointSet.append([t, pos, hpr])
-        # Add last point
-        pos = Vec3(0)
-        hpr = Vec3(0)
-        self.curveCollection.evaluate(self.cropTo, pos, hpr)
-        self.curveFitter.addXyzHpr(self.cropTo - self.cropFrom, pos, hpr)
-        # Compute curve
-        self.computeCurves()
-
-    def loadCurveFromFile(self):
-        # Use first directory in model path
-        mPath = getModelPath()
-        if mPath.getNumDirectories() > 0:
-            if `mPath.getDirectory(0)` == '.':
-                path = '.'
-            else:
-                path = mPath.getDirectory(0).toOsSpecific()
-        else:
-            path = '.'
-        if not os.path.isdir(path):
-            print 'MopathRecorder Info: Empty Model Path!'
-            print 'Using current directory'
-            path = '.'
-        mopathFilename = askopenfilename(
-            defaultextension = '.egg',
-            filetypes = (('Egg Files', '*.egg'),
-                         ('Bam Files', '*.bam'),
-                         ('All files', '*')),
-            initialdir = path,
-            title = 'Load Nurbs Curve',
-            parent = self.parent)
-        if mopathFilename:
-            self.reset()
-            nodePath = loader.loadModel(
-                Filename.fromOsSpecific(mopathFilename))
-            self.curveCollection = ParametricCurveCollection()
-            # MRM: Add error check
-            self.curveCollection.addCurves(nodePath.node())
-            nodePath.removeNode()
-            if self.curveCollection:
-                # Draw the curve
-                self.nurbsCurveDrawer.setCurves(self.curveCollection)
-                self.nurbsCurveDrawer.draw()
-                # Save a pointset for this curve
-                self.extractPointSetFromCurveCollection()
-            else:
-                self.reset()
-
-    def saveCurveToFile(self):
-        # Use first directory in model path
-        mPath = getModelPath()
-        if mPath.getNumDirectories() > 0:
-            if `mPath.getDirectory(0)` == '.':
-                path = '.'
-            else:
-                path = mPath.getDirectory(0).toOsSpecific()
-        else:
-            path = '.'
-        if not os.path.isdir(path):
-            print 'MopathRecorder Info: Empty Model Path!'
-            print 'Using current directory'
-            path = '.'
-        mopathFilename = asksaveasfilename(
-            defaultextension = '.egg',
-            filetypes = (('Egg Files', '*.egg'),
-                         ('Bam Files', '*.bam'),
-                         ('All files', '*')),
-            initialdir = path,
-            title = 'Save Nurbs Curve as',
-            parent = self.parent)
-        if mopathFilename:
-            self.curveCollection.writeEgg(Filename(mopathFilename))
-
-    def followTerrain(self, height = 1.0):
-        self.iRay.rayCollisionNodePath.reparentTo(self.nodePath)
-        entry = self.iRay.pickGeom3D()
-        if entry:
-            fromNodePath = entry.getFromNodePath()
-            hitPtDist = Vec3(entry.getSurfacePoint(fromNodePath))
-            self.nodePath.setZ(self.nodePath, height - hitPtDist)
-        self.iRay.rayCollisionNodePath.reparentTo(self.recorderNodePath)
-
-    ## WIDGET UTILITY FUNCTIONS ##
-    def addWidget(self, widget, category, text):
-        self.widgetDict[category + '-' + text] = widget
-        
-    def getWidget(self, category, text):
-        return self.widgetDict[category + '-' + text]
-
-    def getVariable(self, category, text):
-        return self.variableDict[category + '-' + text]
-
-    def createLabeledEntry(self, parent, category, text, balloonHelp,
-                           value = '', command = None,
-                           relief = 'sunken', side = Tkinter.LEFT,
-                           expand = 1, width = 12):
-        frame = Frame(parent)
-        variable = StringVar()
-        variable.set(value)
-        label = Label(frame, text = text)
-        label.pack(side = Tkinter.LEFT, fill = Tkinter.X)
-        self.bind(label, balloonHelp)
-        self.widgetDict[category + '-' + text + '-Label'] = label
-        entry = Entry(frame, width = width, relief = relief,
-                      textvariable = variable)
-        entry.pack(side = Tkinter.LEFT, fill = Tkinter.X, expand = expand)
-        self.bind(entry, balloonHelp)
-        self.widgetDict[category + '-' + text] = entry
-        self.variableDict[category + '-' + text] = variable
-        if command:
-            entry.bind('<Return>', command)
-        frame.pack(side = side, fill = Tkinter.X, expand = expand)
-        return (frame, label, entry)
-
-    def createButton(self, parent, category, text, balloonHelp, command,
-                     side = 'top', expand = 0, fill = Tkinter.X):
-        widget = Button(parent, text = text)
-        # Do this after the widget so command isn't called on creation
-        widget['command'] = command
-        widget.pack(side = side, fill = fill, expand = expand)
-        self.bind(widget, balloonHelp)
-        self.widgetDict[category + '-' + text] = widget
-        return widget
-        
-    def createCheckbutton(self, parent, category, text,
-                          balloonHelp, command, initialState,
-                          side = 'top', fill = Tkinter.X, expand = 0):
-        bool = BooleanVar()
-        bool.set(initialState)
-        widget = Checkbutton(parent, text = text, anchor = Tkinter.W,
-                         variable = bool)
-        # Do this after the widget so command isn't called on creation
-        widget['command'] = command
-        widget.pack(side = side, fill = fill, expand = expand)
-        self.bind(widget, balloonHelp)
-        self.widgetDict[category + '-' + text] = widget
-        self.variableDict[category + '-' + text] = bool
-        return widget
-        
-    def createRadiobutton(self, parent, side, category, text,
-                          balloonHelp, variable, value,
-                          command = None, fill = Tkinter.X, expand = 0):
-        widget = Radiobutton(parent, text = text, anchor = Tkinter.W,
-                             variable = variable, value = value)
-        # Do this after the widget so command isn't called on creation
-        widget['command'] = command
-        widget.pack(side = side, fill = fill, expand = expand)
-        self.bind(widget, balloonHelp)
-        self.widgetDict[category + '-' + text] = widget
-        return widget
-        
-    def createFloater(self, parent, category, text, balloonHelp,
-                      command = None, min = 0.0, resolution = None,
-                      maxVelocity = 10.0, **kw):
-        kw['text'] = text
-        kw['min'] = min
-        kw['maxVelocity'] = maxVelocity
-        kw['resolution'] = resolution
-        widget = apply(Floater, (parent,), kw)
-        # Do this after the widget so command isn't called on creation
-        widget['command'] = command
-        widget.pack(fill = Tkinter.X)
-        self.bind(widget, balloonHelp)
-        self.widgetDict[category + '-' + text] = widget
-        return widget
-
-    def createAngleDial(self, parent, category, text, balloonHelp,
-                        command = None, **kw):
-        kw['text'] = text
-        widget = apply(AngleDial,(parent,), kw)
-        # Do this after the widget so command isn't called on creation
-        widget['command'] = command
-        widget.pack(fill = Tkinter.X)
-        self.bind(widget, balloonHelp)
-        self.widgetDict[category + '-' + text] = widget
-        return widget
-
-    def createSlider(self, parent, category, text, balloonHelp,
-                         command = None, min = 0.0, max = 1.0,
-                         resolution = None,
-                         side = Tkinter.TOP, fill = Tkinter.X, expand = 1, **kw):
-        kw['text'] = text
-        kw['min'] = min
-        kw['max'] = max
-        kw['resolution'] = resolution
-        #widget = apply(EntryScale, (parent,), kw)
-        widget = apply(Slider, (parent,), kw)
-        # Do this after the widget so command isn't called on creation
-        widget['command'] = command
-        widget.pack(side = side, fill = fill, expand = expand)
-        self.bind(widget, balloonHelp)
-        self.widgetDict[category + '-' + text] = widget
-        return widget
-
-    def createEntryScale(self, parent, category, text, balloonHelp,
-                         command = None, min = 0.0, max = 1.0,
-                         resolution = None,
-                         side = Tkinter.TOP, fill = Tkinter.X, expand = 1, **kw):
-        kw['text'] = text
-        kw['min'] = min
-        kw['max'] = max
-        kw['resolution'] = resolution
-        widget = apply(EntryScale, (parent,), kw)
-        # Do this after the widget so command isn't called on creation
-        widget['command'] = command
-        widget.pack(side = side, fill = fill, expand = expand)
-        self.bind(widget, balloonHelp)
-        self.widgetDict[category + '-' + text] = widget
-        return widget
-
-    def createVector2Entry(self, parent, category, text, balloonHelp,
-                           command = None, **kw):
-        # Set label's text
-        kw['text'] = text
-        widget = apply(Vector2Entry, (parent,), kw)
-        # Do this after the widget so command isn't called on creation
-        widget['command'] = command
-        widget.pack(fill = Tkinter.X)
-        self.bind(widget, balloonHelp)
-        self.widgetDict[category + '-' + text] = widget
-        return widget
-
-    def createVector3Entry(self, parent, category, text, balloonHelp,
-                           command = None, **kw):
-        # Set label's text
-        kw['text'] = text
-        widget = apply(Vector3Entry, (parent,), kw)
-        # Do this after the widget so command isn't called on creation
-        widget['command'] = command
-        widget.pack(fill = Tkinter.X)
-        self.bind(widget, balloonHelp)
-        self.widgetDict[category + '-' + text] = widget
-        return widget
-
-    def createColorEntry(self, parent, category, text, balloonHelp,
-                         command = None, **kw):
-        # Set label's text
-        kw['text'] = text
-        widget = apply(ColorEntry, (parent,) ,kw)
-        # Do this after the widget so command isn't called on creation
-        widget['command'] = command
-        widget.pack(fill = Tkinter.X)
-        self.bind(widget, balloonHelp)
-        self.widgetDict[category + '-' + text] = widget
-        return widget
-
-    def createOptionMenu(self, parent, category, text, balloonHelp,
-                         items, command):
-        optionVar = StringVar()
-        if len(items) > 0:
-            optionVar.set(items[0])
-        widget = Pmw.OptionMenu(parent, labelpos = Tkinter.W, label_text = text,
-                                label_width = 12, menu_tearoff = 1,
-                                menubutton_textvariable = optionVar,
-                                items = items)
-        # Do this after the widget so command isn't called on creation
-        widget['command'] = command
-        widget.pack(fill = Tkinter.X)
-        self.bind(widget.component('menubutton'), balloonHelp)
-        self.widgetDict[category + '-' + text] = widget
-        self.variableDict[category + '-' + text] = optionVar
-        return optionVar
-
-    def createComboBox(self, parent, category, text, balloonHelp,
-                       items, command, history = 0,
-                       side = Tkinter.LEFT, expand = 0, fill = Tkinter.X):
-        widget = Pmw.ComboBox(parent,
-                              labelpos = Tkinter.W,
-                              label_text = text,
-                              label_anchor = 'e',
-                              label_width = 12,
-                              entry_width = 16,
-                              history = history,
-                              scrolledlist_items = items)
-        # Don't allow user to edit entryfield
-        widget.configure(entryfield_entry_state = 'disabled')
-        # Select first item if it exists
-        if len(items) > 0:
-            widget.selectitem(items[0])
-        # Bind selection command
-        widget['selectioncommand'] = command
-        widget.pack(side = side, fill = fill, expand = expand)
-        # Bind help
-        self.bind(widget, balloonHelp)
-        # Record widget
-        self.widgetDict[category + '-' + text] = widget
-        return widget
-
-    def makeCameraWindow(self):
-        # First, we need to make a new layer on the window.
-        chan = base.win.getChannel(0)
-        self.cLayer = chan.makeLayer(1)
-        self.layerIndex = 1
-        self.cDr = self.cLayer.makeDisplayRegion(0.6, 1.0, 0, 0.4)
-        self.cDr.setClearDepthActive(1)
-        self.cDr.setClearColorActive(1)
-        self.cDr.setClearColor(Vec4(0))
-
-        # It gets its own camera
-        self.cCamera = render.attachNewNode('cCamera')
-        self.cCamNode = Camera('cCam')
-        self.cLens = PerspectiveLens()
-        self.cLens.setFov(40,40)
-        self.cLens.setNear(0.1)
-        self.cLens.setFar(100.0)
-        self.cCamNode.setLens(self.cLens)
-        self.cCamNode.setScene(render)
-        self.cCam = self.cCamera.attachNewNode(self.cCamNode)
-        
-        self.cDr.setCamera(self.cCam)
-
-    def toggleWidgetVis(self):
-        ## In order to make sure everything is going on right way...
-        messenger.send('SEditor-ToggleWidgetVis')
-        SEditor.toggleWidgetVis()
-
-
-    def bindMotionPathToNode(self):
-        if self.curveCollection == None:
-            print '----Error: you need to select or create a curve first!'
-            return
-        self.accept('MP_checkName', self.bindMotionPath)
-        self.askName = namePathPanel(MopathRecorder.count)
-        return
-
-    def bindMotionPath(self,name=None,test=None):
-        print test
-        self.ignore('MP_checkName')
-        del self.askName
-        self.curveCollection.getCurve(0).setName(name)
-        comboBox = self.getWidget('Mopath', 'Path:')
-        oldName = comboBox.get()
-        self.pointSetDict[name] = self.pointSetDict[oldName]
-        del self.pointSetDict[oldName]
-        scrolledList = comboBox.component('scrolledlist')
-        listbox = scrolledList.component('listbox')
-        names = list(listbox.get(0,'end'))
-        num = names.index(oldName)
-        names.pop(num)
-        names.append(name)
-        scrolledList.setlist(names)
-        comboBox.selectitem(name)
-        messenger.send('mPath_bindPathToNode',[self.playbackNodePath, self.curveCollection])
-        return
-        
-        
-
-    def addCurvesFromNodepath(self,curveList):
-        '''addCurvesFromNodepath(self,curveList)
-        This function will take a curveCollection list as a input.
-        If the list is not None, it will put the vurve back into the curve list.
-        else, do nothing.
-        '''
-        print curveList
-        self.ignore('curveListFor'+self.name)
-        if curveList != None:
-            for collection in curveList:
-                self.curveCollection = collection
-                self.extractPointSetFromCurveCollection(curveName=self.curveCollection.getCurve(0).getName())
-        else:
-            pass
-        return
-
-
-class namePathPanel(AppShell):
-    # Override class variables
-    appname = 'Name the Path'
-    frameWidth  = 575
-    frameHeight = 200
-    usecommandarea = 0
-    usestatusarea  = 0
-    index = 0
-
-    def __init__(self, count, parent = None, **kw):
-        INITOPT = Pmw.INITOPT
-        self.id = 'Name the Path'
-        self.appname = self.id
-        optiondefs = (
-            ('title',               self.appname,       None),
-            )
-        self.defineoptions(kw, optiondefs)
-
-        # Initialize the superclass
-        AppShell.__init__(self)
-
-        self.parent.resizable(False,False)
-
-        # Execute option callbacks
-        self.initialiseoptions(namePathPanel)
-
-    def createInterface(self):
-        self.menuBar.destroy()
-        interior = self.interior()
-        mainFrame = Frame(interior)
-
-        dataFrame = Frame(mainFrame)
-        label = Label(dataFrame, text='This name will be used as a reference for this Path.',font=('MSSansSerif', 10))
-        label.pack(side = Tkinter.TOP, expand = 0, fill = Tkinter.X)
-        dataFrame.pack(side = Tkinter.TOP, expand = 0, fill = Tkinter.X, padx=5, pady=10)
-        
-        dataFrame = Frame(mainFrame)
-        self.inputZone = Pmw.EntryField(dataFrame, labelpos='w', label_text = 'Name Selected Path: ',
-                                        entry_font=('MSSansSerif', 10),
-                                        label_font=('MSSansSerif', 10),
-                                        validate = None,
-                                        entry_width = 20)
-        self.inputZone.pack(side = Tkinter.LEFT, fill=Tkinter.X,expand=0)
-
-        self.button_ok = Button(dataFrame, text="OK", command=self.ok_press,width=10)
-        self.button_ok.pack(fill=Tkinter.X,expand=0,side=Tkinter.LEFT, padx = 3)
-
-        dataFrame.pack(side = Tkinter.TOP, expand = 0, fill = Tkinter.X, padx=10, pady=10)
-
-        mainFrame.pack(expand = 1, fill = Tkinter.BOTH)
-
-        
-        
-    def onDestroy(self, event):
-        '''
-        If you have open any thing, please rewrite here!
-        '''
-        pass
-
-    
-    def ok_press(self):
-        name = self.inputZone.getvalue()
-        messenger.send('MP_checkName',[name])
-        self.quit()
-        return
-
-

+ 0 - 267
doc/SceneEditor/seParticleEffect.py

@@ -1,267 +0,0 @@
-from pandac.PandaModules import *
-import seParticles
-import seForceGroup
-from direct.directnotify import DirectNotifyGlobal
-
-class ParticleEffect(NodePath):
-
-    notify = DirectNotifyGlobal.directNotify.newCategory('ParticleEffect')
-    pid = 1 
-
-    def __init__(self, name=None, particles=None):
-        """__init__()"""
-        if (name == None):
-            name = 'particle-effect-%d' % ParticleEffect.pid
-            ParticleEffect.pid += 1
-        NodePath.__init__(self, name)
-        # Record particle effect name
-        self.name = name
-        # Enabled flag
-        self.fEnabled = 0
-        # Dictionary of particles and forceGroups
-        self.particlesDict = {}
-        self.forceGroupDict = {}
-        # The effect's particle system
-        if (particles != None):
-            self.addParticles(particles)
-        self.renderParent = None
-
-    def start(self, parent=None, renderParent=None):
-        assert(self.notify.debug('start() - name: %s' % self.name))
-        self.renderParent = renderParent
-        self.enable()
-        if (parent != None):
-            self.reparentTo(parent)
-
-    def cleanup(self):
-        self.removeNode()
-        self.disable()
-        for f in self.forceGroupDict.values():
-            f.cleanup()
-        for p in self.particlesDict.values():
-            p.cleanup()
-        del self.renderParent
-        del self.particlesDict
-        del self.forceGroupDict
-
-    def reset(self):
-        self.removeAllForces()
-        self.removeAllParticles()
-        self.forceGroupDict = {}
-        self.particlesDict = {}
-
-    def enable(self):
-        """enable()"""
-        if (self.renderParent != None):
-            for p in self.particlesDict.values():
-                p.setRenderParent(self.renderParent.node())
-        for f in self.forceGroupDict.values():
-            f.enable()
-        for p in self.particlesDict.values():
-            p.enable()
-        self.fEnabled = 1
-
-    def disable(self):
-        """disable()"""
-        self.detachNode()
-        for p in self.particlesDict.values():
-            p.setRenderParent(p.node)
-        for f in self.forceGroupDict.values():
-            f.disable()
-        for p in self.particlesDict.values():
-            p.disable()
-        self.fEnabled = 0
-
-    def isEnabled(self):
-        """
-        isEnabled()
-        Note: this may be misleading if enable(),disable() not used
-        """
-        return self.fEnabled
-
-    def addForceGroup(self, forceGroup):
-        """addForceGroup(forceGroup)"""
-        forceGroup.nodePath.reparentTo(self)
-        forceGroup.particleEffect = self
-        self.forceGroupDict[forceGroup.getName()] = forceGroup
-
-        # Associate the force group with all particles
-        for i in range(len(forceGroup)):
-            self.addForce(forceGroup[i])
-
-    def addForce(self, force):
-        """addForce(force)"""
-        for p in self.particlesDict.values():
-            p.addForce(force)
-
-    def removeForceGroup(self, forceGroup):
-        """removeForceGroup(forceGroup)"""
-        # Remove forces from all particles
-        for i in range(len(forceGroup)):
-            self.removeForce(forceGroup[i])
-
-        forceGroup.nodePath.removeNode()
-        forceGroup.particleEffect = None
-        del self.forceGroupDict[forceGroup.getName()]
-
-    def removeForce(self, force):
-        """removeForce(force)"""
-        for p in self.particlesDict.values():
-            p.removeForce(force)
-
-    def removeAllForces(self):
-        for fg in self.forceGroupDict.values():
-            self.removeForceGroup(fg)
-
-    def addParticles(self, particles):
-        """addParticles(particles)"""
-        particles.nodePath.reparentTo(self)
-        self.particlesDict[particles.getName()] = particles
-
-        # Associate all forces in all force groups with the particles
-        for fg in self.forceGroupDict.values():
-            for i in range(len(fg)):
-                particles.addForce(fg[i])
-
-    def removeParticles(self, particles):
-        """removeParticles(particles)"""
-        if (particles == None):
-            self.notify.warning('removeParticles() - particles == None!')
-            return
-        particles.nodePath.detachNode()
-        del self.particlesDict[particles.getName()]
-
-        # Remove all forces from the particles
-        for fg in self.forceGroupDict.values():
-            for f in fg.asList():
-                particles.removeForce(f)
-
-    def removeAllParticles(self):
-        for p in self.particlesDict.values():
-            self.removeParticles(p)
-
-    def getParticlesList(self):
-        """getParticles()"""
-        return self.particlesDict.values()
-    
-    def getParticlesNamed(self, name):
-        """getParticlesNamed(name)"""
-        return self.particlesDict.get(name, None)
-
-    def getParticlesDict(self):
-        """getParticlesDict()"""
-        return self.particlesDict
-
-    def getForceGroupList(self):
-        """getForceGroup()"""
-        return self.forceGroupDict.values()
-
-    def getForceGroupNamed(self, name):
-        """getForceGroupNamed(name)"""
-        return self.forceGroupDict.get(name, None)
-
-    def getForceGroupDict(self):
-        """getForceGroup()"""
-        return self.forceGroupDict
-
-    def saveConfig(self, filename):
-        """saveFileData(filename)"""
-        f = open(filename.toOsSpecific(), 'wb')
-        # Add a blank line
-        f.write('\n')
-
-        # Make sure we start with a clean slate
-        f.write('self.reset()\n')
-
-        pos = self.getPos()
-        hpr = self.getHpr()
-        scale = self.getScale()
-        f.write('self.setPos(%0.3f, %0.3f, %0.3f)\n' %
-                (pos[0], pos[1], pos[2]))
-        f.write('self.setHpr(%0.3f, %0.3f, %0.3f)\n' %
-                (hpr[0], hpr[1], hpr[2]))
-        f.write('self.setScale(%0.3f, %0.3f, %0.3f)\n' %
-                (scale[0], scale[1], scale[2]))
-
-        # Save all the particles to file
-        num = 0
-        for p in self.particlesDict.values():
-            target = 'p%d' % num 
-            num = num + 1
-            f.write(target + ' = Particles.Particles(\'%s\')\n' % p.getName())
-            p.printParams(f, target)
-            f.write('self.addParticles(%s)\n' % target)
-
-        # Save all the forces to file
-        num = 0
-        for fg in self.forceGroupDict.values():
-            target = 'f%d' % num
-            num = num + 1
-            f.write(target + ' = ForceGroup.ForceGroup(\'%s\')\n' % \
-                                                fg.getName())
-            fg.printParams(f, target)
-            f.write('self.addForceGroup(%s)\n' % target)
-
-        # Close the file
-        f.close()
-
-    def loadConfig(self, filename):
-        """loadConfig(filename)"""
-        #try:
-        #    if vfs:
-        print vfs.readFile(filename)
-        exec vfs.readFile(filename)
-        print "Particle Effect Reading using VFS"
-        #    else:
-        #       execfile(filename.toOsSpecific())
-        #       print "Shouldnt be wrong"
-        #except:
-        #    self.notify.error('loadConfig: failed to load particle file: '+ repr(filename))
-
-
-
-    def AppendConfig(self, f):
-        f.write('\n')
-        i1="    "
-        i2=i1+i1
-        # Make sure we start with a clean slate
-        f.write(i2+'self.effect.reset()\n')
-
-        pos = self.getPos()
-        hpr = self.getHpr()
-        scale = self.getScale()
-        f.write(i2+'self.effect.setPos(%0.3f, %0.3f, %0.3f)\n' %
-                (pos[0], pos[1], pos[2]))
-        f.write(i2+'self.effect.setHpr(%0.3f, %0.3f, %0.3f)\n' %
-                (hpr[0], hpr[1], hpr[2]))
-        f.write(i2+'self.effect.setScale(%0.3f, %0.3f, %0.3f)\n' %
-                (scale[0], scale[1], scale[2]))
-
-        # Save all the particles to file
-        num = 0
-        for p in self.particlesDict.values():
-            target = 'p%d' % num 
-            num = num + 1
-            f.write(i2+"if(mode==0):\n")
-            f.write(i2+i1+target + ' = seParticles.Particles(\'%s\')\n' % p.getName())
-            f.write(i2+"else:\n")
-            f.write(i2+i1+target + ' = Particles.Particles(\'%s\')\n' % p.getName())
-            p.printParams(f, target)
-            f.write(i2+'self.effect.addParticles(%s)\n' % target)
-
-        # Save all the forces to file
-        num = 0
-        for fg in self.forceGroupDict.values():
-            target = 'f%d' % num
-            num = num + 1
-            f.write(i2+target + ' = ForceGroup.ForceGroup(\'%s\')\n' % \
-                                                fg.getName())
-            fg.printParams(f, target)
-            f.write(i2+'self.effect.addForceGroup(%s)\n' % target)
-
-
-
-
-
-
-

+ 0 - 1976
doc/SceneEditor/seParticlePanel.py

@@ -1,1976 +0,0 @@
-"""PANDA3D Particle Panel"""
-
-# Import Tkinter, Pmw, and the floater code from this directory tree.
-from direct.tkwidgets.AppShell import AppShell
-from tkFileDialog import *
-from tkSimpleDialog import askstring
-import os, Pmw, Tkinter
-from direct.tkwidgets.Dial import AngleDial
-from direct.tkwidgets.Floater import Floater
-from direct.tkwidgets.Slider import Slider
-from direct.tkwidgets.VectorWidgets import Vector2Entry, Vector3Entry
-from direct.tkwidgets.VectorWidgets import ColorEntry
-import sePlacer
-import seForceGroup
-import seParticles
-import seParticleEffect
-
-class ParticlePanel(AppShell):
-    # Override class variables
-    appname = 'Particle Panel'
-    frameWidth  = 375
-    frameHeight = 575
-    usecommandarea = 0
-    usestatusarea  = 0
-    balloonState = 'both'
-    effectsDict={}
-    def __init__(self, particleEffect = None, effectsDict={}, **kw):
-        INITOPT = Pmw.INITOPT
-        optiondefs = (
-            ('title',     self.appname,       None),
-            )
-        self.defineoptions(kw, optiondefs)
-
-        # Record particle effect
-        if particleEffect != None:
-            self.particleEffect = particleEffect
-            self.effectsDict = effectsDict
-        else:
-            # Or create a new one if none given
-            particles = seParticles.Particles()
-            particles.setBirthRate(0.02)
-            particles.setLitterSize(10)
-            particles.setLitterSpread(0)
-            particles.setFactory("PointParticleFactory")
-            particles.setRenderer("PointParticleRenderer")
-            particles.setEmitter("SphereVolumeEmitter")
-            particles.enable()
-            pe = seParticleEffect.ParticleEffect('effect1', particles)
-            self.particleEffect = pe
-            self.emitter=loader.loadModel("sphere")
-            pe.reparentTo(self.emitter) 
-            self.emitter.setName("effect1")
-            self.emitter.reparentTo(render)
-            pe.enable()
-            messenger.send('ParticlePanel_Added_Effect',['effect1',pe,self.emitter])
-            self.effectsDict[self.particleEffect.getName()]=self.particleEffect
-        
-
-        messenger.send('SGE_Update Explorer',[render])
-        
-        # Initialize application specific info
-        AppShell.__init__(self)
-
-        # Initialize panel Pmw options
-        self.initialiseoptions(ParticlePanel)
-        # Update panel values to reflect particle effect's state
-        self.selectEffectNamed(self.effectsDict.keys()[0])
-        # Make sure labels/menus reflect current state
-        self.updateMenusAndLabels()
-        # Make sure there is a page for each forceGroup objects
-        for forceGroup in self.particleEffect.getForceGroupList():
-            self.addForceGroupNotebookPage(self.particleEffect, forceGroup)
-
-    def appInit(self):
-        # Create dictionaries to keep track of panel objects
-        self.widgetDict = {}
-        self.variableDict = {}
-        self.forcePagesDict = {}
-        # Make sure particles are enabled
-        base.enableParticles()
-
-    def onDestroy(self, event):
-        messenger.send('ParticlePanle_close')
-        return
-
-    def createInterface(self):
-        # Handle to the toplevels hull
-        interior = self.interior()
-
-        # Create particle panel menu items
-
-        ## MENUBAR ENTRIES ##
-        # FILE MENU
-        # Get a handle on the file menu so commands can be inserted
-        # before quit item
-        fileMenu = self.menuBar.component('File-menu')
-        # MRM: Need to add load and save effects methods
-        fileMenu.insert_command(
-            fileMenu.index('Quit'),
-            label = 'Load Params',
-            command = self.loadParticleEffectFromFile)
-        fileMenu.insert_command(
-            fileMenu.index('Quit'),
-            label = 'Save Params',
-            command = self.saveParticleEffectToFile)
-        fileMenu.insert_command(
-            fileMenu.index('Quit'),
-            label = 'Print Params',
-            command = lambda s = self: s.particles.printParams())
-
-        # PARTICLE MANAGER MENU
-        self.menuBar.addmenu('ParticleMgr', 'ParticleMgr Operations')
-        self.particleMgrActive = IntVar()
-        self.particleMgrActive.set(base.isParticleMgrEnabled())
-        self.menuBar.addmenuitem(
-            'ParticleMgr', 'checkbutton',
-            'Enable/Disable ParticleMgr',
-            label = 'Active',
-            variable = self.particleMgrActive,
-            command = self.toggleParticleMgr)
-
-        ## MENUBUTTON LABELS ##
-        # Menubutton/label to identify the current objects being configured
-        labelFrame = Frame(interior)
-        # Current effect
-        self.effectsLabel = Menubutton(labelFrame, width = 10,
-                                       relief = RAISED,
-                                       borderwidth = 2,
-                                       font=('MSSansSerif', 12, 'bold'),
-                                       activebackground = '#909090')
-        self.effectsLabelMenu = Menu(self.effectsLabel, tearoff = 0)
-        self.effectsLabel['menu'] = self.effectsLabelMenu
-        self.effectsLabel.pack(side = LEFT, fill = 'x', expand = 1)
-        self.bind(self.effectsLabel,
-                  'Select effect to configure or create new effect')
-        self.effectsLabelMenu.add_command(label = 'Create New Effect',
-                                          command = self.createNewEffect)
-        self.effectsLabelMenu.add_command(
-            label = 'Select Particle Effect',
-            command = lambda s = self: SEditor.select(s.particleEffect))
-        self.effectsLabelMenu.add_command(
-            label = 'Place Particle Effect',
-            command = lambda s = self: sePlacer.place(s.particleEffect))
-        def togglePEVis(s = self):
-            if s.particleEffect.isHidden():
-                s.particleEffect.show()
-            else:
-                s.particleEffect.hide()
-        self.effectsLabelMenu.add_command(
-            label = 'Toggle Effect Vis',
-            command = togglePEVis)
-        self.effectsEnableMenu = Menu(self.effectsLabelMenu, tearoff = 0)
-        self.effectsLabelMenu.add_cascade(label = 'Enable/Disable',
-                                          menu = self.effectsEnableMenu)
-        self.effectsLabelMenu.add_separator()
-        # Current particles
-        self.particlesLabel = Menubutton(labelFrame, width = 10,
-                                         relief = RAISED,
-                                         borderwidth = 2,
-                                         font=('MSSansSerif', 12, 'bold'),
-                                         activebackground = '#909090')
-        self.particlesLabelMenu = Menu(self.particlesLabel, tearoff = 0)
-        self.particlesLabel['menu'] = self.particlesLabelMenu
-        self.particlesLabel.pack(side = LEFT, fill = 'x', expand = 1)
-        self.bind(self.particlesLabel,
-                  ('Select particles object to configure ' +
-                   'or add new particles object to current effect' ))
-        self.particlesLabelMenu.add_command(label = 'Create New Particles',
-                                            command = self.createNewParticles)
-        self.particlesEnableMenu = Menu(self.particlesLabelMenu, tearoff = 0)
-        self.particlesLabelMenu.add_cascade(label = 'Enable/Disable',
-                                            menu = self.particlesEnableMenu)
-        self.particlesLabelMenu.add_separator()
-        # Current force
-        self.forceGroupLabel = Menubutton(labelFrame, width = 10,
-                                      relief = RAISED,
-                                      borderwidth = 2,
-                                      font=('MSSansSerif', 12, 'bold'),
-                                      activebackground = '#909090')
-        self.forceGroupLabelMenu = Menu(self.forceGroupLabel, tearoff = 0)
-        self.forceGroupLabel['menu'] = self.forceGroupLabelMenu
-        self.forceGroupLabel.pack(side = LEFT, fill = 'x', expand = 1)
-        self.bind(self.forceGroupLabel,
-                  ('Select force group to configure ' +
-                   'or add a new force group to current effect'))
-        self.forceGroupLabelMenu.add_command(
-            label = 'Create New ForceGroup',
-            command = self.createNewForceGroup)
-        self.forceGroupEnableMenu = Menu(self.forceGroupLabelMenu, tearoff = 0)
-        self.forceGroupLabelMenu.add_cascade(label = 'Enable/Disable',
-                                             menu = self.forceGroupEnableMenu)
-        self.forceGroupLabelMenu.add_separator()
-        # Pack labels
-        labelFrame.pack(fill = 'x', expand = 0)
-
-        # Create the toplevel notebook pages
-        self.mainNotebook = Pmw.NoteBook(interior)
-        self.mainNotebook.pack(fill = BOTH, expand = 1)
-        systemPage = self.mainNotebook.add('System')
-        factoryPage = self.mainNotebook.add('Factory')
-        emitterPage = self.mainNotebook.add('Emitter')
-        rendererPage = self.mainNotebook.add('Renderer')
-        forcePage = self.mainNotebook.add('Force')
-        # Put this here so it isn't called right away
-        self.mainNotebook['raisecommand'] = self.updateInfo
-
-        ## SYSTEM PAGE WIDGETS ##
-        # Create system floaters
-        systemFloaterDefs = (
-            ('System', 'Pool Size',
-             'Max number of simultaneous particles',
-             self.setSystemPoolSize,
-             1.0, 1.0),
-            ('System', 'Birth Rate',
-             'Seconds between particle births',
-             self.setSystemBirthRate,
-             0.0, None),
-            ('System', 'Litter Size',
-             'Number of particle created at each birth',
-             self.setSystemLitterSize,
-             1.0, 1.0),
-            ('System', 'Litter Spread',
-             'Variation in litter size',
-             self.setSystemLitterSpread,
-             0.0, 1.0),
-            ('System', 'Lifespan',
-             'Age in seconds at which the system (vs. particles) should die',
-             self.setSystemLifespan,
-             0.0, None)
-            )
-        self.createFloaters(systemPage, systemFloaterDefs)
-
-        # Checkboxes
-        self.createCheckbutton(
-            systemPage, 'System', 'Render Space Velocities',
-            ('On: velocities are in render space; ' +
-             'Off: velocities are in particle local space'),
-            self.toggleSystemLocalVelocity, 0)
-        self.createCheckbutton(
-            systemPage, 'System', 'System Grows Older',
-            'On: system has a lifespan',
-            self.toggleSystemGrowsOlder, 0)
-
-        # Vector widgets
-        pos = self.createVector3Entry(systemPage, 'System', 'Pos',
-                                      'Particle system position',
-                                      command = self.setSystemPos)
-        pos.addMenuItem('Popup Placer Panel', sePlacer.Placer)
-        hpr = self.createVector3Entry(systemPage, 'System', 'Hpr',
-                                     'Particle system orientation',
-                                      fGroup_labels = ('H', 'P', 'R'),
-                                      command = self.setSystemHpr)
-        hpr.addMenuItem('Popup Placer Panel', sePlacer.Placer)
-
-        ## FACTORY PAGE WIDGETS ##
-        self.createOptionMenu(
-            factoryPage,
-            'Factory', 'Factory Type',
-            'Select type of particle factory',
-            ('PointParticleFactory', 'ZSpinParticleFactory',
-             'OrientedParticleFactory'),
-            self.selectFactoryType)
-        factoryWidgets = (
-            ('Factory', 'Life Span',
-             'Average particle lifespan in seconds',
-             self.setFactoryLifeSpan,
-             0.0, None),
-            ('Factory', 'Life Span Spread',
-             'Variation in lifespan',
-             self.setFactoryLifeSpanSpread,
-             0.0, None),
-            ('Factory', 'Mass',
-             'Average particle mass',
-             self.setFactoryParticleMass,
-             0.001, None),
-            ('Factory', 'Mass Spread',
-             'Variation in particle mass',
-             self.setFactoryParticleMassSpread,
-             0.0, None),
-            ('Factory', 'Terminal Velocity',
-             'Cap on average particle velocity',
-             self.setFactoryTerminalVelocity,
-             0.0, None),
-            ('Factory', 'Terminal Vel. Spread',
-             'Variation in terminal velocity',
-             self.setFactoryTerminalVelocitySpread,
-             0.0, None),
-        )
-        self.createFloaters(factoryPage, factoryWidgets)
-
-        self.factoryNotebook = Pmw.NoteBook(factoryPage, tabpos = None)
-        # Point page #
-        factoryPointPage = self.factoryNotebook.add('PointParticleFactory')
-        # Z spin page #
-        zSpinPage = self.factoryNotebook.add('ZSpinParticleFactory')
-
-        self.createCheckbutton(
-            zSpinPage, 'Z Spin Factory', 'Enable Angular Velocity',
-            ("On: angular velocity is used; " +
-             "Off: final angle is used"),
-            self.toggleAngularVelocity, 0, side = TOP),
-
-        self.createFloater(
-            zSpinPage, 'Z Spin Factory', 'Angular Velocity',
-             'How fast sprites rotate',
-             command = self.setFactoryZSpinAngularVelocity)
-
-        self.createFloater(
-            zSpinPage, 'Z Spin Factory', 'Angular Velocity Spread',
-             'Variation in how fast sprites rotate',
-             command = self.setFactoryZSpinAngularVelocitySpread)
-
-        self.createAngleDial(zSpinPage, 'Z Spin Factory', 'Initial Angle',
-                             'Starting angle in degrees',
-                             fRollover = 1,
-                             command = self.setFactoryZSpinInitialAngle)
-        self.createAngleDial(
-            zSpinPage, 'Z Spin Factory',
-            'Initial Angle Spread',
-            'Spread of the initial angle',
-            fRollover = 1,
-            command = self.setFactoryZSpinInitialAngleSpread)
-        self.createAngleDial(zSpinPage, 'Z Spin Factory', 'Final Angle',
-                             'Final angle in degrees',
-                             fRollover = 1,
-                             command = self.setFactoryZSpinFinalAngle)
-        self.createAngleDial(
-            zSpinPage, 'Z Spin Factory',
-            'Final Angle Spread',
-            'Spread of the final angle',
-            fRollover = 1,
-            command = self.setFactoryZSpinFinalAngleSpread)
-        # Oriented page #
-        orientedPage = self.factoryNotebook.add('OrientedParticleFactory')
-        Label(orientedPage, text = 'Not implemented').pack(expand = 1,
-                                                           fill = BOTH)
-        self.factoryNotebook.pack(expand = 1, fill = BOTH)
-
-        ## EMITTER PAGE WIDGETS ##
-        self.createOptionMenu(
-            emitterPage, 'Emitter',
-            'Emitter Type',
-            'Select type of particle emitter',
-            ('BoxEmitter', 'DiscEmitter', 'LineEmitter', 'PointEmitter',
-             'RectangleEmitter', 'RingEmitter', 'SphereVolumeEmitter',
-             'SphereSurfaceEmitter', 'TangentRingEmitter'),
-            self.selectEmitterType)
-
-        # Emitter modes
-        self.emissionType = IntVar()
-        self.emissionType.set(BaseParticleEmitter.ETRADIATE)
-        emissionFrame = Frame(emitterPage)
-        self.createRadiobutton(
-            emissionFrame, 'left',
-            'Emitter', 'Explicit Emission',
-            ('particles are all emitted in parallel, direction is based ' +
-             'on explicit velocity vector'),
-            self.emissionType, BaseParticleEmitter.ETEXPLICIT,
-            self.setEmissionType)
-        self.createRadiobutton(
-            emissionFrame, 'left',
-            'Emitter', 'Radiate Emission',
-            'particles are emitted away from a specific point',
-            self.emissionType, BaseParticleEmitter.ETRADIATE,
-            self.setEmissionType)
-        self.createRadiobutton(
-            emissionFrame, 'left',
-            'Emitter', 'Custom Emission',
-            ('particles are emitted with a velocity that ' +
-             'is determined by the particular emitter'),
-            self.emissionType, BaseParticleEmitter.ETCUSTOM,
-            self.setEmissionType)
-        emissionFrame.pack(fill = 'x', expand = 0)
-
-        self.createFloater(
-            emitterPage, 'Emitter', 'Velocity Multiplier',
-            'launch velocity multiplier (all emission modes)',
-            command = self.setEmitterAmplitude,
-            min = None)
-
-        self.createFloater(
-            emitterPage, 'Emitter', 'Velocity Multiplier Spread',
-            'spread for launch velocity multiplier (all emission modes)',
-            command = self.setEmitterAmplitudeSpread)
-
-        self.createVector3Entry(
-            emitterPage, 'Emitter', 'Offset Velocity',
-            'Velocity vector applied to all particles',
-            command = self.setEmitterOffsetForce)
-
-        self.createVector3Entry(
-            emitterPage, 'Emitter', 'Explicit Velocity',
-            'all particles launch with this velocity in Explicit mode',
-            command = self.setEmitterExplicitLaunchVector)
-
-        self.createVector3Entry(
-            emitterPage, 'Emitter', 'Radiate Origin',
-            'particles launch away from this point in Radiate mode',
-            command = self.setEmitterRadiateOrigin)
-
-        self.emitterNotebook = Pmw.NoteBook(emitterPage, tabpos = None)
-        # Box page #
-        boxPage = self.emitterNotebook.add('BoxEmitter')
-        self.createVector3Entry(boxPage, 'Box Emitter', 'Min',
-                                'Min point defining emitter box',
-                                command = self.setEmitterBoxPoint1)
-        self.createVector3Entry(boxPage, 'Box Emitter', 'Max',
-                                'Max point defining emitter box',
-                                command = self.setEmitterBoxPoint2,
-                                value = (1.0, 1.0, 1.0))
-        # Disc page #
-        discPage = self.emitterNotebook.add('DiscEmitter')
-        self.createFloater(discPage, 'Disc Emitter', 'Radius',
-                           'Radius of disc',
-                           command = self.setEmitterDiscRadius,
-                           min = 0.01)
-        customPage = self.discCustomFrame = Frame(discPage)
-        self.createAngleDial(customPage, 'Disc Emitter', 'Inner Angle',
-                             'Particle launch angle at center of disc',
-                             command = self.setEmitterDiscInnerAngle)
-        self.createFloater(customPage, 'Disc Emitter', 'Inner Velocity',
-                           'Launch velocity multiplier at center of disc',
-                           command = self.setEmitterDiscInnerVelocity)
-        self.createAngleDial(customPage, 'Disc Emitter', 'Outer Angle',
-                             'Particle launch angle at outer edge of disc',
-                             command = self.setEmitterDiscOuterAngle)
-        self.createFloater(customPage, 'Disc Emitter', 'Outer Velocity',
-                           'Launch velocity multiplier at edge of disc',
-                           command = self.setEmitterDiscOuterVelocity)
-        self.createCheckbutton(
-            customPage, 'Disc Emitter', 'Cubic Lerping',
-            'On: magnitude/angle interpolation from center',
-            self.toggleEmitterDiscCubicLerping, 0)
-        customPage.pack(fill = BOTH, expand = 1)
-
-        # Line page #
-        linePage = self.emitterNotebook.add('LineEmitter')
-        self.createVector3Entry(linePage, 'Line Emitter', 'Min',
-                                'Min point defining emitter line',
-                                command = self.setEmitterLinePoint1)
-        self.createVector3Entry(linePage, 'Line Emitter', 'Max',
-                                'Max point defining emitter line',
-                                command = self.setEmitterLinePoint2,
-                                value = (1.0, 0.0, 0.0))
-        # Point page #
-        emitterPointPage = self.emitterNotebook.add('PointEmitter')
-        self.createVector3Entry(emitterPointPage, 'Point Emitter', 'Position',
-                               'Position of emitter point',
-                                command = self.setEmitterPointPosition)
-        # Rectangle #
-        rectanglePage = self.emitterNotebook.add('RectangleEmitter')
-        self.createVector2Entry(rectanglePage,
-                                'Rectangle Emitter', 'Min',
-                               'Point defining rectangle',
-                                command = self.setEmitterRectanglePoint1)
-        self.createVector2Entry(rectanglePage,
-                                'Rectangle Emitter', 'Max',
-                               'Point defining rectangle',
-                                command = self.setEmitterRectanglePoint2)
-        # Ring #
-        ringPage = self.emitterNotebook.add('RingEmitter')
-        self.createFloater(ringPage, 'Ring Emitter', 'Radius',
-                           'Radius of ring',
-                           command = self.setEmitterRingRadius,
-                           min = 0.01)
-        self.ringCustomFrame = Frame(ringPage)
-        self.createAngleDial(self.ringCustomFrame, 'Ring Emitter', 'Angle',
-                             'Particle launch angle',
-                             command = self.setEmitterRingLaunchAngle)
-        self.ringCustomFrame.pack(fill = BOTH, expand = 1)
-
-        # Sphere volume #
-        sphereVolumePage = self.emitterNotebook.add('SphereVolumeEmitter')
-        self.createFloater(sphereVolumePage, 'Sphere Volume Emitter', 'Radius',
-                           'Radius of sphere',
-                           command = self.setEmitterSphereVolumeRadius,
-                           min = 0.01)
-        # Sphere surface #
-        sphereSurfacePage = self.emitterNotebook.add('SphereSurfaceEmitter')
-        self.createFloater(sphereSurfacePage, 'Sphere Surface Emitter',
-                           'Radius',
-                           'Radius of sphere',
-                           command = self.setEmitterSphereSurfaceRadius,
-                           min = 0.01)
-        # Tangent ring #
-        tangentRingPage = self.emitterNotebook.add('TangentRingEmitter')
-        self.createFloater(tangentRingPage, 'Tangent Ring Emitter', 'Radius',
-                           'Radius of ring',
-                           command = self.setEmitterTangentRingRadius,
-                           min = 0.01)
-        self.emitterNotebook.pack(fill = X)
-
-        ## RENDERER PAGE WIDGETS ##
-        self.createOptionMenu(
-            rendererPage, 'Renderer', 'Renderer Type',
-            'Select type of particle renderer',
-            ('LineParticleRenderer', 'GeomParticleRenderer',
-             'PointParticleRenderer', 'SparkleParticleRenderer',
-             'SpriteParticleRenderer'),
-            self.selectRendererType)
-
-        self.createOptionMenu(rendererPage,
-                              'Renderer', 'Alpha Mode',
-                              "alpha setting over particles' lifetime",
-                              ('NO_ALPHA','ALPHA_OUT','ALPHA_IN','ALPHA_USER'),
-                              self.setRendererAlphaMode)
-
-        self.createSlider(
-            rendererPage, 'Renderer', 'User Alpha',
-            'alpha value for ALPHA_USER alpha mode',
-            command = self.setRendererUserAlpha)
-
-        self.rendererNotebook = Pmw.NoteBook(rendererPage, tabpos = None)
-        # Line page #
-        linePage = self.rendererNotebook.add('LineParticleRenderer')
-        self.createColorEntry(linePage, 'Line Renderer', 'Head Color',
-                                'Head color of line',
-                                command = self.setRendererLineHeadColor)
-        self.createColorEntry(linePage, 'Line Renderer', 'Tail Color',
-                                'Tail color of line',
-                                command = self.setRendererLineTailColor)
-        # Geom page #
-        geomPage = self.rendererNotebook.add('GeomParticleRenderer')
-        f = Frame(geomPage)
-        f.pack(fill = X)
-        Label(f, width = 12, text = 'Geom Node').pack(side = LEFT)
-        self.rendererGeomNode = StringVar()
-        self.rendererGeomNodeEntry = Entry(
-            f, width = 12,
-            textvariable = self.rendererGeomNode)
-        self.rendererGeomNodeEntry.bind('<Return>', self.setRendererGeomNode)
-        self.rendererGeomNodeEntry.pack(side = LEFT, expand = 1, fill = X)
-        # Point #
-        rendererPointPage = self.rendererNotebook.add('PointParticleRenderer')
-        self.createFloater(rendererPointPage, 'Point Renderer', 'Point Size',
-                           'Width and height of points in pixels',
-                           command = self.setRendererPointSize)
-        self.createColorEntry(rendererPointPage, 'Point Renderer',
-                              'Start Color',
-                               'Starting color of point',
-                              command = self.setRendererPointStartColor)
-        self.createColorEntry(rendererPointPage, 'Point Renderer',
-                              'End Color',
-                               'Ending color of point',
-                              command = self.setRendererPointEndColor)
-        self.createOptionMenu(rendererPointPage, 'Point Renderer',
-                              'Blend Type',
-                              'Type of color blending used for particle',
-                              ('PP_ONE_COLOR', 'PP_BLEND_LIFE',
-                               'PP_BLEND_VEL'),
-                              self.rendererPointSelectBlendType)
-        self.createOptionMenu(rendererPointPage, 'Point Renderer',
-                              'Blend Method',
-                              'Interpolation method between colors',
-                              ('PP_NO_BLEND', 'PP_BLEND_LINEAR',
-                               'PP_BLEND_CUBIC'),
-                              self.rendererPointSelectBlendMethod)
-        # Sparkle #
-        sparklePage = self.rendererNotebook.add('SparkleParticleRenderer')
-        self.createColorEntry(sparklePage, 'Sparkle Renderer',
-                              'Center Color',
-                              'Color of sparkle center',
-                              command = self.setRendererSparkleCenterColor)
-        self.createColorEntry(sparklePage, 'Sparkle Renderer',
-                              'Edge Color',
-                              'Color of sparkle line endpoints',
-                              command = self.setRendererSparkleEdgeColor)
-        self.createFloater(sparklePage, 'Sparkle Renderer',
-                           'Birth Radius',
-                           'Initial sparkle radius',
-                           command = self.setRendererSparkleBirthRadius)
-        self.createFloater(sparklePage, 'Sparkle Renderer',
-                           'Death Radius',
-                           'Final sparkle radius',
-                           command = self.setRendererSparkleDeathRadius)
-        self.createOptionMenu(sparklePage,
-                              'Sparkle Renderer', 'Life Scale',
-                              'Does particle scale over its lifetime?',
-                              ('SP_NO_SCALE', 'SP_SCALE'),
-                              self.setRendererSparkleLifeScale)
-        # Sprite #
-        spritePage = self.rendererNotebook.add('SpriteParticleRenderer')
-        f = Frame(spritePage)
-        Label(f, width = 12, text = 'Texture Type:').pack(side = LEFT)
-        self.rendererSpriteSourceType = IntVar()
-        self.rendererSpriteSourceType.set(SpriteParticleRenderer.STTexture)
-        self.rendererSpriteSTTexture = self.createRadiobutton(
-            f, 'left',
-            'Sprite Renderer', 'Texture Type',
-            'Sprite particle renderer created from texture file',
-            self.rendererSpriteSourceType, SpriteParticleRenderer.STTexture,
-            self.setSpriteSourceType)
-        self.rendererSpriteSTTexture = self.createRadiobutton(
-            f, 'left',
-            'Sprite Renderer', 'NodePath Type',
-            'Sprite particle renderer created from node path',
-            self.rendererSpriteSourceType, SpriteParticleRenderer.STFromNode,
-            self.setSpriteSourceType)
-        f.pack(fill = X)
-        f = Frame(spritePage)
-        Label(f, width = 6, text = 'Texture:').pack(side = LEFT)
-        self.rendererSpriteTexture = StringVar()
-        self.rendererSpriteTexture.set(SpriteParticleRenderer.sourceTextureName)
-        self.rendererSpriteTextureEntry = Entry(
-            f, width = 12,
-            textvariable = self.rendererSpriteTexture)
-        self.rendererSpriteTextureEntry.pack(side = LEFT, expand = 1, fill = X)
-        f.pack(fill = X)
-        f = Frame(spritePage)
-        Label(f, width = 6, text = 'File:').pack(side = LEFT)
-        self.rendererSpriteFile = StringVar()
-        self.rendererSpriteFile.set(SpriteParticleRenderer.sourceFileName)
-        self.rendererSpriteFileEntry = Entry(
-            f, width = 12,
-            textvariable = self.rendererSpriteFile)
-        self.rendererSpriteFileEntry.pack(side = LEFT, expand = 1, fill = X)
-        Label(f, width = 6, text = 'Node:').pack(side = LEFT)
-        self.rendererSpriteNode = StringVar()
-        self.rendererSpriteNode.set(SpriteParticleRenderer.sourceNodeName)
-        self.rendererSpriteNodeEntry = Entry(
-            f, width = 6,
-            textvariable = self.rendererSpriteNode)
-        self.rendererSpriteNodeEntry.pack(side = LEFT, expand = 1, fill = X)
-        f.pack(fill = X)
-        # Init entries
-        self.setSpriteSourceType()
-        self.setTextureButton = Button(spritePage, text = 'Set Texture',
-                                       command = self.setRendererSpriteTexture)
-        self.setTextureButton.pack(fill = X)
-        f = Frame(spritePage)
-        self.createCheckbutton(
-            f, 'Sprite Renderer', 'X Scale',
-            ("On: x scale is interpolated over particle's life; " +
-             "Off: stays as start_X_Scale"),
-            self.toggleRendererSpriteXScale, 0, side = LEFT)
-        self.createCheckbutton(
-            f, 'Sprite Renderer', 'Y Scale',
-            ("On: y scale is interpolated over particle's life; " +
-             "Off: stays as start_Y_Scale"),
-            self.toggleRendererSpriteYScale, 0, side = LEFT)
-        self.createCheckbutton(
-            f, 'Sprite Renderer', 'Anim Angle',
-            ("On: particles that are set to spin on the Z axis will " +
-             "spin appropriately"),
-            self.toggleRendererSpriteAnimAngle, 0, side = LEFT)
-        f.pack(fill = X)
-        self.createFloater(spritePage, 'Sprite Renderer',
-                           'Initial X Scale',
-                           'Initial X scaling factor',
-                           command = self.setRendererSpriteInitialXScale)
-        self.createFloater(spritePage, 'Sprite Renderer',
-                           'Final X Scale',
-                           'Final X scaling factor, if xScale enabled',
-                           command = self.setRendererSpriteFinalXScale)
-        self.createFloater(spritePage, 'Sprite Renderer',
-                           'Initial Y Scale',
-                           'Initial Y scaling factor',
-                           command = self.setRendererSpriteInitialYScale)
-        self.createFloater(spritePage, 'Sprite Renderer',
-                           'Final Y Scale',
-                           'Final Y scaling factor, if yScale enabled',
-                           command = self.setRendererSpriteFinalYScale)
-        self.createAngleDial(spritePage, 'Sprite Renderer',
-                             'Non Animated Theta',
-                             ('If animAngle is false: counter clockwise ' +
-                              'Z rotation of all sprites'),
-                             command = self.setRendererSpriteNonAnimatedTheta)
-        self.createOptionMenu(spritePage, 'Sprite Renderer',
-                              'Blend Type',
-                              'Interpolation blend type for X and Y scaling',
-                              ('PP_NO_BLEND', 'PP_LINEAR', 'PP_CUBIC'),
-                              self.setRendererSpriteBlendMethod)
-        self.createCheckbutton(
-            spritePage, 'Sprite Renderer', 'Alpha Disable',
-            'On: alpha blending is disabled',
-            self.toggleRendererSpriteAlphaDisable, 0)
-        self.rendererNotebook.pack(fill = X)
-
-        ## FORCE PAGE WIDGETS ##
-        self.addForceButton = Menubutton(forcePage, text = 'Add Force',
-                                          relief = RAISED,
-                                          borderwidth = 2,
-                                          font=('MSSansSerif', 14, 'bold'),
-                                          activebackground = '#909090')
-        forceMenu = Menu(self.addForceButton)
-        self.addForceButton['menu'] = forceMenu
-        # DERIVED FROM LINEAR FORCE
-        # This also has: setVector
-        forceMenu.add_command(label = 'Add Linear Vector Force',
-                            command = self.addLinearVectorForce)
-        # Parameters: setAmplitude, setMassDependent, setVectorMasks
-        forceMenu.add_command(label = 'Add Linear Noise Force',
-                            command = self.addLinearNoiseForce)
-        forceMenu.add_command(label = 'Add Linear Jitter Force',
-                            command = self.addLinearJitterForce)
-        # This also has setCoef
-        forceMenu.add_command(label = 'Add Linear Friction Force',
-                            command = self.addLinearFrictionForce)
-        # This also has: setCoef, setLength, setRadius,
-        forceMenu.add_command(label = 'Add Linear Cylinder Vortex Force',
-                            command = self.addLinearCylinderVortexForce)
-
-        # DERIVED FROM LINEAR DISTANCE FORCE
-        # Parameters: setFalloffType, setForceCenter, setRadius
-        forceMenu.add_command(label = 'Add Linear Sink Force',
-                            command = self.addLinearSinkForce)
-        forceMenu.add_command(label = 'Add Linear Source Force',
-                            command = self.addLinearSourceForce)
-        """
-        # Avoid for now
-        forceMenu.add_command(label = 'Add Linear User Defined Force',
-                            command = self.addLinearUserDefinedForce)
-        """
-
-        self.addForceButton.pack(expand = 0)
-
-        # Scrolled frame to hold force widgets
-        self.sf = Pmw.ScrolledFrame(forcePage, horizflex = 'elastic')
-        self.sf.pack(fill = 'both', expand = 1)
-        self.forceFrame = self.sf.interior()
-        # Notebook to hold force widgets as the are added
-        self.forceGroupNotebook = Pmw.NoteBook(self.forceFrame, tabpos = None)
-        self.forceGroupNotebook.pack(fill = X)
-
-        self.factoryNotebook.setnaturalsize()
-        self.emitterNotebook.setnaturalsize()
-        self.rendererNotebook.setnaturalsize()
-        self.forceGroupNotebook.setnaturalsize()
-        self.mainNotebook.setnaturalsize()
-
-        # Make sure input variables processed
-        self.initialiseoptions(ParticlePanel)
-
-    ### WIDGET UTILITY FUNCTIONS ###
-    def createCheckbutton(self, parent, category, text,
-                          balloonHelp, command, initialState, side = 'top'):
-        bool = BooleanVar()
-        bool.set(initialState)
-        widget = Checkbutton(parent, text = text, anchor = W,
-                         variable = bool)
-        # Do this after the widget so command isn't called on creation
-        widget['command'] = command
-        widget.pack(fill = X, side = side)
-        self.bind(widget, balloonHelp)
-        self.widgetDict[category + '-' + text] = widget
-        self.variableDict[category + '-' + text] = bool
-        return widget
-
-    def createRadiobutton(self, parent, side, category, text,
-                          balloonHelp, variable, value,
-                          command):
-        widget = Radiobutton(parent, text = text, anchor = W,
-                             variable = variable, value = value)
-        # Do this after the widget so command isn't called on creation
-        widget['command'] = command
-        widget.pack(side = side, fill = X)
-        self.bind(widget, balloonHelp)
-        self.widgetDict[category + '-' + text] = widget
-        return widget
-
-    def createFloaters(self, parent, widgetDefinitions):
-        widgets = []
-        for category, label, balloonHelp, command, min, resolution in widgetDefinitions:
-            widgets.append(
-                self.createFloater(parent, category, label, balloonHelp,
-                                   command, min, resolution)
-                )
-        return widgets
-
-    def createFloater(self, parent, category, text, balloonHelp,
-                      command = None, min = 0.0, resolution = None,
-                      numDigits = 3, **kw):
-        kw['text'] = text
-        kw['min'] = min
-        kw['resolution'] = resolution
-        kw['numDigits'] = numDigits
-        widget = apply(Floater, (parent,), kw)
-        # Do this after the widget so command isn't called on creation
-        widget['command'] = command
-        widget.pack(fill = X)
-        self.bind(widget, balloonHelp)
-        self.widgetDict[category + '-' + text] = widget
-        return widget
-
-    def createAngleDial(self, parent, category, text, balloonHelp,
-                        command = None, **kw):
-        kw['text'] = text
-        kw['style'] = 'mini'
-        widget = apply(AngleDial,(parent,), kw)
-        # Do this after the widget so command isn't called on creation
-        widget['command'] = command
-        widget.pack(fill = X)
-        self.bind(widget, balloonHelp)
-        self.widgetDict[category + '-' + text] = widget
-        return widget
-
-    def createSlider(self, parent, category, text, balloonHelp,
-                     command = None, min = 0.0, max = 1.0,
-                     resolution = 0.001, **kw):
-        kw['text'] = text
-        kw['min'] = min
-        kw['max'] = max
-        kw['resolution'] = resolution
-        widget = apply(Slider, (parent,), kw)
-        # Do this after the widget so command isn't called on creation
-        widget['command'] = command
-        widget.pack(fill = X)
-        self.bind(widget, balloonHelp)
-        self.widgetDict[category + '-' + text] = widget
-        return widget
-
-    def createVector2Entry(self, parent, category, text, balloonHelp,
-                           command = None, **kw):
-        # Set label's text
-        kw['text'] = text
-        widget = apply(Vector2Entry, (parent,), kw)
-        # Do this after the widget so command isn't called on creation
-        widget['command'] = command
-        widget.pack(fill = X)
-        self.bind(widget, balloonHelp)
-        self.widgetDict[category + '-' + text] = widget
-        return widget
-
-    def createVector3Entry(self, parent, category, text, balloonHelp,
-                           command = None, **kw):
-        # Set label's text
-        kw['text'] = text
-        widget = apply(Vector3Entry, (parent,), kw)
-        # Do this after the widget so command isn't called on creation
-        widget['command'] = command
-        widget.pack(fill = X)
-        self.bind(widget, balloonHelp)
-        self.widgetDict[category + '-' + text] = widget
-        return widget
-
-    def createColorEntry(self, parent, category, text, balloonHelp,
-                         command = None, **kw):
-        # Set label's text
-        kw['text'] = text
-        widget = apply(ColorEntry, (parent,) ,kw)
-        # Do this after the widget so command isn't called on creation
-        widget['command'] = command
-        widget.pack(fill = X)
-        self.bind(widget, balloonHelp)
-        self.widgetDict[category + '-' + text] = widget
-        return widget
-
-    def createOptionMenu(self, parent, category, text, balloonHelp,
-                         items, command):
-        optionVar = StringVar()
-        if len(items) > 0:
-            optionVar.set(items[0])
-        widget = Pmw.OptionMenu(parent, labelpos = W, label_text = text,
-                                label_width = 12, menu_tearoff = 1,
-                                menubutton_textvariable = optionVar,
-                                items = items)
-        # Do this after the widget so command isn't called on creation
-        widget['command'] = command
-        widget.pack(fill = X)
-        self.bind(widget.component('menubutton'), balloonHelp)
-        self.widgetDict[category + '-' + text] = widget
-        self.variableDict[category + '-' + text] = optionVar
-        return optionVar
-
-    def createComboBox(self, parent, category, text, balloonHelp,
-                         items, command, history = 0):
-        widget = Pmw.ComboBox(parent,
-                              labelpos = W,
-                              label_text = text,
-                              label_anchor = 'w',
-                              label_width = 12,
-                              entry_width = 16,
-                              history = history,
-                              scrolledlist_items = items)
-        # Don't allow user to edit entryfield
-        widget.configure(entryfield_entry_state = 'disabled')
-        # Select first item if it exists
-        if len(items) > 0:
-            widget.selectitem(items[0])
-        # Bind selection command
-        widget['selectioncommand'] = command
-        widget.pack(side = 'left', expand = 0)
-        # Bind help
-        self.bind(widget, balloonHelp)
-        # Record widget
-        self.widgetDict[category + '-' + text] = widget
-        return widget
-
-    def updateMenusAndLabels(self):
-        self.updateMenus()
-        self.updateLabels()
-
-    def updateLabels(self):
-        self.effectsLabel['text'] = self.particleEffect.getName()
-        self.particlesLabel['text'] = self.particles.getName()
-        if self.forceGroup != None:
-            self.forceGroupLabel['text'] = self.forceGroup.getName()
-        else:
-            self.forceGroupLabel['text'] = 'Force Group'
-
-    def updateMenus(self):
-        self.updateEffectsMenus()
-        self.updateParticlesMenus()
-        self.updateForceGroupMenus()
-
-    def updateEffectsMenus(self):
-        # Get rid of old effects entries if any
-        self.effectsEnableMenu.delete(0, 'end')
-        self.effectsLabelMenu.delete(5, 'end')
-        self.effectsLabelMenu.add_separator()
-        # Add in a checkbutton for each effect (to toggle on/off)
-        keys = self.effectsDict.keys()
-        keys.sort()
-        for name in keys:
-            effect = self.effectsDict[name]
-            self.effectsLabelMenu.add_command(
-                label = effect.getName(),
-                command = (lambda s = self,
-                           e = effect: s.selectEffectNamed(e.getName()))
-                )
-            effectActive = IntVar()
-            effectActive.set(effect.isEnabled())
-            self.effectsEnableMenu.add_checkbutton(
-                label = effect.getName(),
-                variable = effectActive,
-                command = (lambda s = self,
-                           e = effect,
-                           v = effectActive: s.toggleEffect(e, v)))
-
-    def updateParticlesMenus(self):
-        # Get rid of old particles entries if any
-        self.particlesEnableMenu.delete(0, 'end')
-        self.particlesLabelMenu.delete(2, 'end')
-        self.particlesLabelMenu.add_separator()
-        # Add in a checkbutton for each effect (to toggle on/off)
-        particles = self.particleEffect.getParticlesList()
-        names = map(lambda x: x.getName(), particles)
-        names.sort()
-        for name in names:
-            particle = self.particleEffect.getParticlesNamed(name)
-            self.particlesLabelMenu.add_command(
-                label = name,
-                command = (lambda s = self,
-                           n = name: s.selectParticlesNamed(n))
-                )
-            particleActive = IntVar()
-            particleActive.set(particle.isEnabled())
-            self.particlesEnableMenu.add_checkbutton(
-                label = name,
-                variable = particleActive,
-                command = (lambda s = self,
-                           p = particle,
-                           v = particleActive: s.toggleParticles(p, v)))
-
-    def updateForceGroupMenus(self):
-        # Get rid of old forceGroup entries if any
-        self.forceGroupEnableMenu.delete(0, 'end')
-        self.forceGroupLabelMenu.delete(2, 'end')
-        self.forceGroupLabelMenu.add_separator()
-        # Add in a checkbutton for each effect (to toggle on/off)
-        forceGroupList = self.particleEffect.getForceGroupList()
-        names = map(lambda x: x.getName(), forceGroupList)
-        names.sort()
-        for name in names:
-            force = self.particleEffect.getForceGroupNamed(name)
-            self.forceGroupLabelMenu.add_command(
-                label = name,
-                command = (lambda s = self,
-                           n = name: s.selectForceGroupNamed(n))
-                )
-            forceActive = IntVar()
-            forceActive.set(force.isEnabled())
-            self.forceGroupEnableMenu.add_checkbutton(
-                label = name,
-                variable = forceActive,
-                command = (lambda s = self,
-                           f = force,
-                           v = forceActive: s.toggleForceGroup(f, v)))
-
-    def selectEffectNamed(self, name):
-        effect = self.effectsDict.get(name, None)
-        if effect != None:
-            self.particleEffect = effect
-            # Default to first particle in particlesDict
-            self.particles = self.particleEffect.getParticlesList()[0]
-            # See if particle effect has any forceGroup
-            forceGroupList = self.particleEffect.getForceGroupList()
-            if len(forceGroupList) > 0:
-                self.forceGroup = forceGroupList[0]
-            else:
-                self.forceGroup = None
-            self.mainNotebook.selectpage('System')
-            self.updateInfo('System')
-        else:
-            print 'ParticlePanel: No effect named ' + name
-
-    def toggleEffect(self, effect, var):
-        if var.get():
-            effect.enable()
-        else:
-            effect.disable()
-
-    def selectParticlesNamed(self, name):
-        particles = self.particleEffect.getParticlesNamed(name)
-        if particles != None:
-            self.particles = particles
-            self.updateInfo()
-
-    def toggleParticles(self, particles, var):
-        if var.get():
-            particles.enable()
-        else:
-            particles.disable()
-
-    def selectForceGroupNamed(self, name):
-        forceGroup = self.particleEffect.getForceGroupNamed(name)
-        if forceGroup != None:
-            self.forceGroup = forceGroup
-            self.updateInfo('Force')
-
-    def toggleForceGroup(self, forceGroup, var):
-        if var.get():
-            forceGroup.enable()
-        else:
-            forceGroup.disable()
-
-    def toggleForce(self, force, pageName, variableName):
-        v = self.getVariable(pageName, variableName)
-        if v.get():
-            force.setActive(1)
-        else:
-            force.setActive(0)
-
-    def getWidget(self, category, text):
-        return self.widgetDict[category + '-' + text]
-
-    def getVariable(self, category, text):
-        return self.variableDict[category + '-' + text]
-
-    def loadParticleEffectFromFile(self):
-        # Find path to particle directory
-        pPath = getParticlePath()
-        if pPath.getNumDirectories() > 0:
-            if `pPath.getDirectory(0)` == '.':
-                path = '.'
-            else:
-                path = pPath.getDirectory(0).toOsSpecific()
-        else:
-            path = '.'
-        if not os.path.isdir(path):
-            print 'ParticlePanel Warning: Invalid default DNA directory!'
-            print 'Using current directory'
-            path = '.'
-        particleFilename = askopenfilename(
-            defaultextension = '.ptf',
-            filetypes = (('Particle Files', '*.ptf'),('All files', '*')),
-            initialdir = path,
-            title = 'Load Particle Effect',
-            parent = self.parent)
-        if particleFilename:
-            # Delete existing particles and forces
-            self.particleEffect.loadConfig(
-                Filename.fromOsSpecific(particleFilename))
-            self.selectEffectNamed(self.particleEffect.getName())
-            # Enable effect
-            self.particleEffect.enable()
-        messenger.send('SGE_Update Explorer',[render])
-
-    def saveParticleEffectToFile(self):
-        # Find path to particle directory
-        pPath = getParticlePath()
-        if pPath.getNumDirectories() > 0:
-            if `pPath.getDirectory(0)` == '.':
-                path = '.'
-            else:
-                path = pPath.getDirectory(0).toOsSpecific()
-        else:
-            path = '.'
-        if not os.path.isdir(path):
-            print 'ParticlePanel Warning: Invalid default DNA directory!'
-            print 'Using current directory'
-            path = '.'
-        particleFilename = asksaveasfilename(
-            defaultextension = '.ptf',
-            filetypes = (('Particle Files', '*.ptf'),('All files', '*')),
-            initialdir = path,
-            title = 'Save Particle Effect as',
-            parent = self.parent)
-        if particleFilename:
-            self.particleEffect.saveConfig(Filename(particleFilename))
-
-    ### PARTICLE EFFECTS COMMANDS ###
-    def toggleParticleMgr(self):
-        if self.particleMgrActive.get():
-            base.enableParticles()
-        else:
-            base.disableParticles()
-
-    ### PARTICLE SYSTEM COMMANDS ###
-    def updateInfo(self, page = 'System'):
-        self.updateMenusAndLabels()
-        if page == 'System':
-            self.updateSystemWidgets()
-        elif page == 'Factory':
-            self.selectFactoryPage()
-            self.updateFactoryWidgets()
-        elif page == 'Emitter':
-            self.selectEmitterPage()
-            self.updateEmitterWidgets()
-        elif page == 'Renderer':
-            self.selectRendererPage()
-            self.updateRendererWidgets()
-        elif page == 'Force':
-            self.updateForceWidgets()
-
-    def toggleParticleEffect(self):
-        if self.getVariable('Effect', 'Active').get():
-            self.particleEffect.enable()
-        else:
-            self.particleEffect.disable()
-
-    ## SYSTEM PAGE ##
-    def updateSystemWidgets(self):
-        poolSize = self.particles.getPoolSize()
-        self.getWidget('System', 'Pool Size').set(int(poolSize), 0)
-        birthRate = self.particles.getBirthRate()
-        self.getWidget('System', 'Birth Rate').set(birthRate, 0)
-        litterSize = self.particles.getLitterSize()
-        self.getWidget('System', 'Litter Size').set(int(litterSize), 0)
-        litterSpread = self.particles.getLitterSpread()
-        self.getWidget('System', 'Litter Spread').set(litterSpread, 0)
-        systemLifespan = self.particles.getSystemLifespan()
-        self.getWidget('System', 'Lifespan').set(systemLifespan, 0)
-        pos = self.particles.nodePath.getPos()
-        self.getWidget('System', 'Pos').set([pos[0], pos[1], pos[2]], 0)
-        hpr = self.particles.nodePath.getHpr()
-        self.getWidget('System', 'Hpr').set([hpr[0], hpr[1], hpr[2]], 0)
-        self.getVariable('System', 'Render Space Velocities').set(
-            self.particles.getLocalVelocityFlag())
-        self.getVariable('System', 'System Grows Older').set(
-            self.particles.getSystemGrowsOlderFlag())
-    def setSystemPoolSize(self, value):
-        self.particles.setPoolSize(int(value))
-    def setSystemBirthRate(self, value):
-        self.particles.setBirthRate(value)
-    def setSystemLitterSize(self, value):
-        self.particles.setLitterSize(int(value))
-    def setSystemLitterSpread(self, value):
-        self.particles.setLitterSpread(int(value))
-    def setSystemLifespan(self, value):
-        self.particles.setSystemLifespan(value)
-    def toggleSystemLocalVelocity(self):
-        self.particles.setLocalVelocityFlag(
-            self.getVariable('System', 'Render Space Velocities').get())
-    def toggleSystemGrowsOlder(self):
-        self.particles.setSystemGrowsOlderFlag(
-            self.getVariable('System', 'System Grows Older').get())
-    def setSystemPos(self, pos):
-        self.particles.nodePath.setPos(Vec3(pos[0], pos[1], pos[2]))
-    def setSystemHpr(self, pos):
-        self.particles.nodePath.setHpr(Vec3(pos[0], pos[1], pos[2]))
-
-    ## FACTORY PAGE ##
-    def selectFactoryType(self, type):
-        self.factoryNotebook.selectpage(type)
-        self.particles.setFactory(type)
-        self.updateFactoryWidgets()
-
-    def selectFactoryPage(self):
-        pass
-
-    def updateFactoryWidgets(self):
-        factory = self.particles.factory
-        lifespan = factory.getLifespanBase()
-        self.getWidget('Factory', 'Life Span').set(lifespan, 0)
-        lifespanSpread = factory.getLifespanSpread()
-        self.getWidget('Factory', 'Life Span Spread').set(lifespanSpread, 0)
-        mass = factory.getMassBase()
-        self.getWidget('Factory', 'Mass').set(mass, 0)
-        massSpread = factory.getMassSpread()
-        self.getWidget('Factory', 'Mass Spread').set(massSpread, 0)
-        terminalVelocity = factory.getTerminalVelocityBase()
-        self.getWidget('Factory', 'Terminal Velocity').set(terminalVelocity, 0)
-        terminalVelocitySpread = factory.getTerminalVelocitySpread()
-        self.getWidget('Factory', 'Terminal Vel. Spread').set(
-            terminalVelocitySpread, 0)
-
-    def setFactoryLifeSpan(self, value):
-        self.particles.factory.setLifespanBase(value)
-    def setFactoryLifeSpanSpread(self, value):
-        self.particles.factory.setLifespanSpread(value)
-    def setFactoryParticleMass(self, value):
-        self.particles.factory.setMassBase(value)
-    def setFactoryParticleMassSpread(self, value):
-        self.particles.factory.setMassSpread(value)
-    def setFactoryTerminalVelocity(self, value):
-        self.particles.factory.setTerminalVelocityBase(value)
-    def setFactoryTerminalVelocitySpread(self, value):
-        self.particles.factory.setTerminalVelocitySpread(value)
-    # Point Page #
-    # Z Spin Page #
-    def setFactoryZSpinInitialAngle(self, angle):
-        self.particles.factory.setInitialAngle(angle)
-    def setFactoryZSpinInitialAngleSpread(self, spread):
-        self.particles.factory.setInitialAngleSpread(spread)
-    def setFactoryZSpinFinalAngle(self, angle):
-        self.particles.factory.setFinalAngle(angle)
-    def setFactoryZSpinFinalAngleSpread(self, spread):
-        self.particles.factory.setFinalAngleSpread(spread)
-    def setFactoryZSpinAngularVelocity(self, vel):
-        self.particles.factory.setAngularVelocity(vel)
-    def setFactoryZSpinAngularVelocitySpread(self, spread):
-        self.particles.factory.setAngularVelocitySpread(spread)
-
-    ## EMITTER PAGE ##
-    def selectEmitterType(self, type):
-        self.emitterNotebook.selectpage(type)
-        self.particles.setEmitter(type)
-        self.updateEmitterWidgets()
-
-    def selectEmitterPage(self):
-        type = self.particles.emitter.__class__.__name__
-        self.emitterNotebook.selectpage(type)
-        self.getVariable('Emitter', 'Emitter Type').set(type)
-
-    def updateEmitterWidgets(self):
-        emitter = self.particles.emitter
-        self.setEmissionType(self.particles.emitter.getEmissionType())
-        amp = emitter.getAmplitude()
-        self.getWidget('Emitter', 'Velocity Multiplier').set(amp)
-        spread = emitter.getAmplitudeSpread()
-        self.getWidget('Emitter', 'Velocity Multiplier Spread').set(spread)
-        vec = emitter.getOffsetForce()
-        self.getWidget('Emitter', 'Offset Velocity').set(
-            [vec[0], vec[1], vec[2]], 0)
-        vec = emitter.getRadiateOrigin()
-        self.getWidget('Emitter', 'Radiate Origin').set(
-            [vec[0], vec[1], vec[2]], 0)
-        vec = emitter.getExplicitLaunchVector()
-        self.getWidget('Emitter', 'Explicit Velocity').set(
-            [vec[0], vec[1], vec[2]], 0)
-        if isinstance(emitter, BoxEmitter):
-            min = emitter.getMinBound()
-            self.getWidget('Box Emitter', 'Min').set(
-                [min[0], min[1], min[2]], 0)
-            max = emitter.getMaxBound()
-            self.getWidget('Box Emitter', 'Max').set(
-                [max[0], max[1], max[2]], 0)
-        elif isinstance(emitter, DiscEmitter):
-            radius = emitter.getRadius()
-            self.getWidget('Disc Emitter', 'Radius').set(radius, 0)
-            innerAngle = emitter.getInnerAngle()
-            self.getWidget('Disc Emitter', 'Inner Angle').set(innerAngle, 0)
-            innerMagnitude = emitter.getInnerMagnitude()
-            self.getWidget('Disc Emitter', 'Inner Velocity').set(
-                innerMagnitude, 0)
-            outerAngle = emitter.getOuterAngle()
-            self.getWidget('Disc Emitter', 'Outer Angle').set(outerAngle, 0)
-            outerMagnitude = emitter.getOuterMagnitude()
-            self.getWidget('Disc Emitter', 'Inner Velocity').set(
-                outerMagnitude, 0)
-            cubicLerping = emitter.getCubicLerping()
-            self.getVariable('Disc Emitter', 'Cubic Lerping').set(cubicLerping)
-        elif isinstance(emitter, LineEmitter):
-            min = emitter.getEndpoint1()
-            self.getWidget('Line Emitter', 'Min').set(
-                [min[0], min[1], min[2]], 0)
-            max = emitter.getEndpoint2()
-            self.getWidget('Line Emitter', 'Max').set(
-                [max[0], max[1], max[2]], 0)
-        elif isinstance(emitter, PointEmitter):
-            location = emitter.getLocation()
-            self.getWidget('Point Emitter', 'Position').set(
-                [location[0], location[1], location[2]], 0)
-        elif isinstance(emitter, RectangleEmitter):
-            min = emitter.getMinBound()
-            self.getWidget('Rectangle Emitter', 'Min').set(
-                [min[0], min[1]], 0)
-            max = emitter.getMaxBound()
-            self.getWidget('Rectangle Emitter', 'Max').set(
-                [max[0], max[1]], 0)
-        elif isinstance(emitter, RingEmitter):
-            radius = emitter.getRadius()
-            self.getWidget('Ring Emitter', 'Radius').set(radius, 0)
-            angle = emitter.getAngle()
-            self.getWidget('Ring Emitter', 'Angle').set(angle, 0)
-        elif isinstance(emitter, SphereVolumeEmitter):
-            radius = emitter.getRadius()
-            self.getWidget('Sphere Volume Emitter', 'Radius').set(radius, 0)
-        elif isinstance(emitter, SphereSurfaceEmitter):
-            radius = emitter.getRadius()
-            self.getWidget('Sphere Surface Emitter', 'Radius').set(radius, 0)
-        elif isinstance(emitter, TangentRingEmitter):
-            radius = emitter.getRadius()
-            self.getWidget('Tangent Ring Emitter', 'Radius').set(radius, 0)
-    # All #
-    def setEmissionType(self, newType = None):
-        if newType:
-            type = newType
-            self.emissionType.set(type)
-        else:
-            type = self.emissionType.get()
-        self.particles.emitter.setEmissionType(type)
-        if type == BaseParticleEmitter.ETEXPLICIT:
-            self.getWidget(
-                'Emitter', 'Radiate Origin')['state'] = 'disabled'
-            self.getWidget(
-                'Emitter', 'Explicit Velocity')['state'] = 'normal'
-            # Hide custom widgets
-            if isinstance(self.particles.emitter, DiscEmitter):
-                self.discCustomFrame.pack_forget()
-            elif isinstance(self.particles.emitter, RingEmitter):
-                self.ringCustomFrame.pack_forget()
-        elif type == BaseParticleEmitter.ETRADIATE:
-            self.getWidget(
-                'Emitter', 'Radiate Origin')['state'] = 'normal'
-            self.getWidget(
-                'Emitter', 'Explicit Velocity')['state'] = 'disabled'
-            # Hide custom widgets
-            if isinstance(self.particles.emitter, DiscEmitter):
-                self.discCustomFrame.pack_forget()
-            elif isinstance(self.particles.emitter, RingEmitter):
-                self.ringCustomFrame.pack_forget()
-        elif type == BaseParticleEmitter.ETCUSTOM:
-            self.getWidget(
-                'Emitter', 'Radiate Origin')['state'] = 'disabled'
-            self.getWidget(
-                'Emitter', 'Explicit Velocity')['state'] = 'disabled'
-            # Show custom widgets
-            if isinstance(self.particles.emitter, DiscEmitter):
-                self.discCustomFrame.pack(fill = BOTH, expand = 1)
-            elif isinstance(self.particles.emitter, RingEmitter):
-                self.ringCustomFrame.pack(fill = BOTH, expand = 1)
-
-    def setEmitterAmplitude(self, value):
-        self.particles.emitter.setAmplitude(value)
-
-    def setEmitterAmplitudeSpread(self, value):
-        self.particles.emitter.setAmplitudeSpread(value)
-
-    def setEmitterOffsetForce(self, vec):
-        self.particles.emitter.setOffsetForce(
-            Vec3(vec[0], vec[1], vec[2]))
-
-    def setEmitterRadiateOrigin(self, origin):
-        self.particles.emitter.setRadiateOrigin(
-            Point3(origin[0], origin[1], origin[2]))
-
-    def setEmitterExplicitLaunchVector(self, vec):
-        self.particles.emitter.setExplicitLaunchVector(
-            Vec3(vec[0], vec[1], vec[2]))
-
-    # Box #
-    def setEmitterBoxPoint1(self, point):
-        self.particles.emitter.setMinBound(Point3(point[0],
-                                                  point[1],
-                                                  point[2]))
-    def setEmitterBoxPoint2(self, point):
-        self.particles.emitter.setMaxBound(Point3(point[0],
-                                                  point[1],
-                                                  point[2]))
-    # Disc #
-    def setEmitterDiscRadius(self, radius):
-        self.particles.emitter.setRadius(radius)
-    def setEmitterDiscInnerAngle(self, angle):
-        self.particles.emitter.setInnerAngle(angle)
-    def setEmitterDiscInnerVelocity(self, velocity):
-        self.particles.emitter.setInnerMagnitude(velocity)
-    def setEmitterDiscOuterAngle(self, angle):
-        self.particles.emitter.setOuterAngle(angle)
-    def setEmitterDiscOuterVelocity(self, velocity):
-        self.particles.emitter.setOuterMagnitude(velocity)
-    def toggleEmitterDiscCubicLerping(self):
-        self.particles.emitter.setCubicLerping(
-            self.getVariable('Disc Emitter', 'Cubic Lerping').get())
-    # Line #
-    def setEmitterLinePoint1(self, point):
-        self.particles.emitter.setEndpoint1(Point3(point[0],
-                                                   point[1],
-                                                   point[2]))
-    def setEmitterLinePoint2(self, point):
-        self.particles.emitter.setEndpoint2(Point3(point[0],
-                                                   point[1],
-                                                   point[2]))
-    # Point #
-    def setEmitterPointPosition(self, pos):
-        self.particles.emitter.setLocation(Point3(pos[0], pos[1], pos[2]))
-    # Rectangle #
-    def setEmitterRectanglePoint1(self, point):
-        self.particles.emitter.setMinBound(Point2(point[0], point[1]))
-    def setEmitterRectanglePoint2(self, point):
-        self.particles.emitter.setMaxBound(Point2(point[0], point[1]))
-    # Ring #
-    def setEmitterRingRadius(self, radius):
-        self.particles.emitter.setRadius(radius)
-    def setEmitterRingLaunchAngle(self, angle):
-        self.particles.emitter.setAngle(angle)
-    # Sphere surface #
-    def setEmitterSphereSurfaceRadius(self, radius):
-        self.particles.emitter.setRadius(radius)
-    # Sphere volume #
-    def setEmitterSphereVolumeRadius(self, radius):
-        self.particles.emitter.setRadius(radius)
-    # Tangent ring #
-    def setEmitterTangentRingRadius(self, radius):
-        self.particles.emitter.setRadius(radius)
-
-    ## RENDERER PAGE ##
-    def selectRendererType(self, type):
-        self.rendererNotebook.selectpage(type)
-        self.particles.setRenderer(type)
-        self.updateRendererWidgets()
-
-    def updateRendererWidgets(self):
-        renderer = self.particles.renderer
-        alphaMode = renderer.getAlphaMode()
-        if alphaMode == BaseParticleRenderer.PRALPHANONE:
-            aMode = 'NO_ALPHA'
-        elif alphaMode == BaseParticleRenderer.PRALPHAOUT:
-            aMode = 'ALPHA_OUT'
-        elif alphaMode == BaseParticleRenderer.PRALPHAIN:
-            aMode = 'ALPHA_IN'
-        elif alphaMode == BaseParticleRenderer.PRALPHAUSER:
-            aMode = 'ALPHA_USER'
-        self.getVariable('Renderer', 'Alpha Mode').set(aMode)
-        userAlpha = renderer.getUserAlpha()
-        self.getWidget('Renderer', 'User Alpha').set(userAlpha)
-        if isinstance(renderer, LineParticleRenderer):
-            headColor = renderer.getHeadColor() * 255.0
-            self.getWidget('Line Renderer', 'Head Color').set(
-                [headColor[0], headColor[1], headColor[2], headColor[3]])
-            tailColor = renderer.getTailColor() * 255.0
-            self.getWidget('Line Renderer', 'Tail Color').set(
-                [tailColor[0], tailColor[1], tailColor[2], tailColor[3]])
-        elif isinstance(renderer, GeomParticleRenderer):
-            pass
-        elif isinstance(renderer, PointParticleRenderer):
-            pointSize = renderer.getPointSize()
-            self.getWidget('Point Renderer', 'Point Size').set(pointSize)
-            startColor = renderer.getStartColor() * 255.0
-            self.getWidget('Point Renderer', 'Start Color').set(
-                [startColor[0], startColor[1], startColor[2], startColor[3]])
-            endColor = renderer.getEndColor() * 255.0
-            self.getWidget('Point Renderer', 'End Color').set(
-                [endColor[0], endColor[1], endColor[2], endColor[3]])
-            blendType = renderer.getBlendType()
-            if (blendType == PointParticleRenderer.PPONECOLOR):
-                bType = "PP_ONE_COLOR"
-            elif (blendType == PointParticleRenderer.PPBLENDLIFE):
-                bType = "PP_BLEND_LIFE"
-            elif (blendType == PointParticleRenderer.PPBLENDVEL):
-                bType = "PP_BLEND_VEL"
-            self.getVariable('Point Renderer', 'Blend Type').set(bType)
-            blendMethod = renderer.getBlendMethod()
-            bMethod = "PP_NO_BLEND"
-            if (blendMethod == BaseParticleRenderer.PPNOBLEND):
-                bMethod = "PP_NO_BLEND"
-            elif (blendMethod == BaseParticleRenderer.PPBLENDLINEAR):
-                bMethod = "PP_BLEND_LINEAR"
-            elif (blendMethod == BaseParticleRenderer.PPBLENDCUBIC):
-                bMethod = "PP_BLEND_CUBIC"
-            self.getVariable('Point Renderer', 'Blend Method').set(bMethod)
-        elif isinstance(renderer, SparkleParticleRenderer):
-            centerColor = renderer.getCenterColor() * 255.0
-            self.getWidget('Sparkle Renderer', 'Center Color').set(
-                [centerColor[0], centerColor[1],
-                 centerColor[2], centerColor[3]])
-            edgeColor = renderer.getEdgeColor() * 255.0
-            self.getWidget('Sparkle Renderer', 'Edge Color').set(
-                [edgeColor[0], edgeColor[1], edgeColor[2], edgeColor[3]])
-            birthRadius = renderer.getBirthRadius()
-            self.getWidget('Sparkle Renderer', 'Birth Radius').set(birthRadius)
-            deathRadius = renderer.getDeathRadius()
-            self.getWidget('Sparkle Renderer', 'Death Radius').set(deathRadius)
-            lifeScale = renderer.getLifeScale()
-            lScale = "SP_NO_SCALE"
-            if (lifeScale == SparkleParticleRenderer.SPSCALE):
-                lScale = "SP_SCALE"
-            self.getVariable('Sparkle Renderer', 'Life Scale').set(lScale)
-        elif isinstance(renderer, SpriteParticleRenderer):
-            color = renderer.getColor() * 255.0
-            # Update widgets to reflect current default values
-            # Texture
-            textureName = renderer.getSourceTextureName()
-            if textureName != None:
-                self.rendererSpriteTexture.set(textureName)
-            # File
-            fileName = renderer.getSourceFileName()
-            if fileName != None:
-                self.rendererSpriteFile.set(fileName)
-            # Node
-            nodeName = renderer.getSourceNodeName()
-            if nodeName != None:
-                self.rendererSpriteNode.set(nodeName)
-            self.getVariable('Sprite Renderer', 'X Scale').set(
-                renderer.getXScaleFlag())
-            self.getVariable('Sprite Renderer', 'Y Scale').set(
-                renderer.getYScaleFlag())
-            self.getVariable('Sprite Renderer', 'Anim Angle').set(
-                renderer.getAnimAngleFlag())
-            initialXScale = renderer.getInitialXScale()
-            self.getWidget('Sprite Renderer', 'Initial X Scale').set(
-                initialXScale)
-            initialYScale = renderer.getInitialYScale()
-            self.getWidget('Sprite Renderer', 'Initial Y Scale').set(
-                initialYScale)
-            finalXScale = renderer.getFinalXScale()
-            self.getWidget('Sprite Renderer', 'Final X Scale').set(
-                finalXScale)
-            finalYScale = renderer.getFinalYScale()
-            self.getWidget('Sprite Renderer', 'Final Y Scale').set(
-                finalYScale)
-            nonanimatedTheta = renderer.getNonanimatedTheta()
-            self.getWidget('Sprite Renderer', 'Non Animated Theta').set(
-                nonanimatedTheta)
-            blendMethod = renderer.getAlphaBlendMethod()
-            bMethod = "PP_NO_BLEND"
-            if (blendMethod == BaseParticleRenderer.PPNOBLEND):
-                bMethod = "PP_NO_BLEND"
-            elif (blendMethod == BaseParticleRenderer.PPBLENDLINEAR):
-                bMethod = "PP_BLEND_LINEAR"
-            elif (blendMethod == BaseParticleRenderer.PPBLENDCUBIC):
-                bMethod = "PP_BLEND_CUBIC"
-            self.getVariable('Sprite Renderer', 'Alpha Disable').set(
-                renderer.getAlphaDisable())
-
-    def selectRendererPage(self):
-        type = self.particles.renderer.__class__.__name__
-        self.rendererNotebook.selectpage(type)
-        self.getVariable('Renderer', 'Renderer Type').set(type)
-
-    # All #
-    def setRendererAlphaMode(self, alphaMode):
-        if alphaMode == 'NO_ALPHA':
-            aMode = BaseParticleRenderer.PRALPHANONE
-        elif alphaMode == 'ALPHA_OUT':
-            aMode = BaseParticleRenderer.PRALPHAOUT
-        elif alphaMode == 'ALPHA_IN':
-            aMode = BaseParticleRenderer.PRALPHAIN
-        elif alphaMode == 'ALPHA_USER':
-            aMode = BaseParticleRenderer.PRALPHAUSER
-        self.particles.renderer.setAlphaMode(aMode)
-
-    def setRendererUserAlpha(self, alpha):
-        self.particles.renderer.setUserAlpha(alpha)
-
-    # Line #
-    def setRendererLineHeadColor(self, color):
-        self.particles.renderer.setHeadColor(
-            Vec4(color[0]/255.0, color[1]/255.0,
-                 color[2]/255.0, color[3]/255.0))
-    def setRendererLineTailColor(self, color):
-        self.particles.renderer.setTailColor(
-            Vec4(color[0]/255.0, color[1]/255.0,
-                 color[2]/255.0, color[3]/255.0))
-    # Geom #
-    def setRendererGeomNode(self, event):
-        node = None
-        nodePath = loader.loadModel(self.rendererGeomNode.get())
-        if nodePath != None:
-            node = nodePath.node()
-        if (node != None):
-            self.particles.renderer.setGeomNode(node)
-    # Point #
-    def setRendererPointSize(self, size):
-        self.particles.renderer.setPointSize(size)
-    def setRendererPointStartColor(self, color):
-        self.particles.renderer.setStartColor(
-            Vec4(color[0]/255.0, color[1]/255.0,
-                 color[2]/255.0, color[3]/255.0))
-    def setRendererPointEndColor(self, color):
-        self.particles.renderer.setEndColor(
-            Vec4(color[0]/255.0, color[1]/255.0,
-                 color[2]/255.0, color[3]/255.0))
-    def rendererPointSelectBlendType(self, blendType):
-        if blendType == "PP_ONE_COLOR":
-            bType = PointParticleRenderer.PPONECOLOR
-        elif blendType == "PP_BLEND_LIFE":
-            bType = PointParticleRenderer.PPBLENDLIFE
-        elif blendType == "PP_BLEND_VEL":
-            bType = PointParticleRenderer.PPBLENDVEL
-        self.particles.renderer.setBlendType(bType)
-    def rendererPointSelectBlendMethod(self, blendMethod):
-        if blendMethod == "PP_NO_BLEND":
-            bMethod = BaseParticleRenderer.PPNOBLEND
-        elif blendMethod == "PP_BLEND_LINEAR":
-            bMethod = BaseParticleRenderer.PPBLENDLINEAR
-        elif blendMethod == "PP_BLEND_CUBIC":
-            bMethod = BaseParticleRenderer.PPBLENDCUBIC
-        self.particles.renderer.setBlendMethod(bMethod)
-    # Sparkle #
-    def setRendererSparkleCenterColor(self, color):
-        self.particles.renderer.setCenterColor(
-            Vec4(color[0]/255.0, color[1]/255.0,
-                 color[2]/255.0, color[3]/255.0))
-    def setRendererSparkleEdgeColor(self, color):
-        self.particles.renderer.setEdgeColor(
-            Vec4(color[0]/255.0, color[1]/255.0,
-                 color[2]/255.0, color[3]/255.0))
-    def setRendererSparkleBirthRadius(self, radius):
-        self.particles.renderer.setBirthRadius(radius)
-    def setRendererSparkleDeathRadius(self, radius):
-        self.particles.renderer.setDeathRadius(radius)
-    def setRendererSparkleLifeScale(self, lifeScaleMethod):
-        if lifeScaleMethod == 'SP_NO_SCALE':
-            lScale = SparkleParticleRenderer.SPNOSCALE
-        else:
-            lScale = SparkleParticleRenderer.SPSCALE
-        self.particles.renderer.setLifeScale(lScale)
-    # Sprite #
-    def setSpriteSourceType(self):
-        if self.rendererSpriteSourceType.get() == SpriteParticleRenderer.STTexture:
-            self.rendererSpriteTextureEntry['state'] = 'normal'
-            self.rendererSpriteFileEntry['state'] = 'disabled'
-            self.rendererSpriteNodeEntry['state'] = 'disabled'
-            self.rendererSpriteTextureEntry['background'] = '#FFFFFF'
-            self.rendererSpriteFileEntry['background'] = '#C0C0C0'
-            self.rendererSpriteNodeEntry['background'] = '#C0C0C0'
-        else:
-            self.rendererSpriteTextureEntry['state'] = 'disabled'
-            self.rendererSpriteFileEntry['state'] = 'normal'
-            self.rendererSpriteNodeEntry['state'] = 'normal'
-            self.rendererSpriteTextureEntry['background'] = '#C0C0C0'
-            self.rendererSpriteFileEntry['background'] = '#FFFFFF'
-            self.rendererSpriteNodeEntry['background'] = '#FFFFFF'
-    def setRendererSpriteTexture(self):
-        if self.rendererSpriteSourceType.get() == SpriteParticleRenderer.STTexture:
-            self.particles.renderer.setTextureFromFile(self.rendererSpriteTexture.get())
-        else:
-            self.particles.renderer.setTextureFromNode(
-                self.rendererSpriteFile.get(), self.rendererSpriteNode.get())
-    def toggleRendererSpriteXScale(self):
-        self.particles.renderer.setXScaleFlag(
-            self.getVariable('Sprite Renderer', 'X Scale').get())
-    def toggleRendererSpriteYScale(self):
-        self.particles.renderer.setYScaleFlag(
-            self.getVariable('Sprite Renderer', 'Y Scale').get())
-    def toggleRendererSpriteAnimAngle(self):
-        self.particles.renderer.setAnimAngleFlag(
-            self.getVariable('Sprite Renderer', 'Anim Angle').get())
-
-    def toggleAngularVelocity(self):
-        self.particles.factory.enableAngularVelocity(
-            self.getVariable('Z Spin Factory', 'Enable Angular Velocity').get())
-
-    def setRendererSpriteInitialXScale(self, xScale):
-        self.particles.renderer.setInitialXScale(xScale)
-    def setRendererSpriteFinalXScale(self, xScale):
-        self.particles.renderer.setFinalXScale(xScale)
-    def setRendererSpriteInitialYScale(self, yScale):
-        self.particles.renderer.setInitialYScale(yScale)
-    def setRendererSpriteFinalYScale(self, yScale):
-        self.particles.renderer.setFinalYScale(yScale)
-    def setRendererSpriteNonAnimatedTheta(self, theta):
-        self.particles.renderer.setNonanimatedTheta(theta)
-    def setRendererSpriteBlendMethod(self, blendMethod):
-        print blendMethod
-        if blendMethod == 'PP_NO_BLEND':
-            bMethod = BaseParticleRenderer.PPNOBLEND
-        elif blendMethod == 'PP_BLEND_LINEAR':
-            bMethod = BaseParticleRenderer.PPBLENDLINEAR
-        elif blendMethod == 'PP_BLEND_CUBIC':
-            bMethod = BaseParticleRenderer.PPBLENDCUBIC
-        else:
-            bMethod = BaseParticleRenderer.PPNOBLEND
-        self.particles.renderer.setAlphaBlendMethod(bMethod)
-    def toggleRendererSpriteAlphaDisable(self):
-        self.particles.renderer.setAlphaDisable(
-            self.getVariable('Sprite Renderer', 'Alpha Disable').get())
-
-    ## FORCEGROUP COMMANDS ##
-    def updateForceWidgets(self):
-        # Select appropriate notebook page
-        if self.forceGroup != None:
-            self.forceGroupNotebook.pack(fill = X)
-            self.forcePageName = (self.particleEffect.getName() + '-' +
-                                  self.forceGroup.getName())
-            self.forcePage = self.forcePagesDict.get(
-                self.forcePageName, None)
-            # Page doesn't exist, add it
-            if self.forcePage == None:
-                self.addForceGroupNotebookPage(
-                    self.particleEffect, self.forceGroup)
-            self.forceGroupNotebook.selectpage(self.forcePageName)
-        else:
-            self.forceGroupNotebook.pack_forget()
-
-    def addLinearVectorForce(self):
-        self.addForce(LinearVectorForce())
-    def addLinearFrictionForce(self):
-        self.addForce(LinearFrictionForce())
-    def addLinearJitterForce(self):
-        self.addForce(LinearJitterForce())
-    def addLinearNoiseForce(self):
-        self.addForce(LinearNoiseForce())
-    def addLinearSinkForce(self):
-        self.addForce(LinearSinkForce())
-    def addLinearSourceForce(self):
-        self.addForce(LinearSourceForce())
-    def addLinearCylinderVortexForce(self):
-        self.addForce(LinearCylinderVortexForce())
-    def addLinearUserDefinedForce(self):
-        self.addForce(LinearUserDefinedForce())
-
-    def addForce(self, f):
-        if self.forceGroup == None:
-            self.createNewForceGroup()
-        self.forceGroup.addForce(f)
-        self.addForceWidget(self.forceGroup,f)
-
-    ## SYSTEM COMMANDS ##
-    def createNewEffect(self):
-        name = askstring('Particle Panel', 'Effect Name:',
-                         parent = self.parent)
-        if name:
-            particles = seParticles.Particles()
-            particles.setBirthRate(0.02)
-            particles.setLitterSize(10)
-            particles.setLitterSpread(0)
-            particles.setFactory("PointParticleFactory")
-            particles.setRenderer("PointParticleRenderer")
-            particles.setEmitter("SphereVolumeEmitter")
-            particles.enable()
-            effect = seParticleEffect.ParticleEffect(name,particles)
-            self.effectsDict[name] = effect
-            self.updateMenusAndLabels()
-            self.selectEffectNamed(name)
-            self.emitter=loader.loadModel("sphere")
-            self.emitter.setName(name)
-            effect.reparentTo(self.emitter)
-            self.emitter.reparentTo(render)
-            effect.enable()
-            messenger.send('ParticlePanel_Added_Effect',[name,effect,self.emitter])
-            messenger.send('SGE_Update Explorer',[render])
-
-    def createNewParticles(self):
-        name = askstring('Particle Panel', 'Particles Name:',
-                         parent = self.parent)
-        if name:
-            p = seParticles.Particles(name)
-            p.setBirthRate(0.02)
-            p.setLitterSize(10)
-            p.setLitterSpread(0)
-            p.setFactory("PointParticleFactory")
-            p.setRenderer("PointParticleRenderer")
-            p.setEmitter("SphereVolumeEmitter")
-            self.particleEffect.addParticles(p)
-            self.updateParticlesMenus()
-            self.selectParticlesNamed(name)
-            p.enable()
-
-    def createNewForceGroup(self):
-        name = askstring('Particle Panel', 'ForceGroup Name:',
-                         parent = self.parent)
-        if name:
-            forceGroup = seForceGroup.ForceGroup(name)
-            self.particleEffect.addForceGroup(forceGroup)
-            self.updateForceGroupMenus()
-            self.addForceGroupNotebookPage(self.particleEffect, forceGroup)
-            self.selectForceGroupNamed(name)
-            forceGroup.enable()
-
-    def addForceGroupNotebookPage(self, particleEffect, forceGroup):
-        self.forcePageName = (particleEffect.getName() + '-' +
-                              forceGroup.getName())
-        self.forcePage = self.forceGroupNotebook.add(self.forcePageName)
-        self.forcePagesDict[self.forcePageName] = self.forcePage
-        for force in forceGroup:
-            self.addForceWidget(forceGroup, force)
-
-    def addForceWidget(self, forceGroup, force):
-        forcePage = self.forcePage
-        pageName = self.forcePageName
-        # How many forces of the same type in the force group object
-        count = 0
-        for f in forceGroup:
-            if f.getClassType().eq(force.getClassType()):
-                count += 1
-        if isinstance(force, LinearVectorForce):
-            self.createLinearVectorForceWidget(
-                forcePage, pageName, count, force)
-        elif isinstance(force, LinearNoiseForce):
-            self.createLinearRandomForceWidget(
-                forcePage, pageName, count, force, 'Noise')
-        elif isinstance(force, LinearJitterForce):
-            self.createLinearRandomForceWidget(
-                forcePage, pageName, count, force, 'Jitter')
-        elif isinstance(force, LinearFrictionForce):
-            self.createLinearFrictionForceWidget(
-                forcePage, pageName, count, force)
-        elif isinstance(force, LinearCylinderVortexForce):
-            self.createLinearCylinderVortexForceWidget(
-                forcePage, pageName, count, force)
-        elif isinstance(force, LinearSinkForce):
-            self.createLinearDistanceForceWidget(
-                forcePage, pageName, count, force, 'Sink')
-        elif isinstance(force, LinearSourceForce):
-            self.createLinearDistanceForceWidget(
-                forcePage, pageName, count, force, 'Source')
-        elif isinstance(force, LinearUserDefinedForce):
-            # Nothing
-            pass
-        self.forceGroupNotebook.setnaturalsize()
-
-    def createForceFrame(self, forcePage, forceName, force):
-        frame = Frame(forcePage, relief = RAISED, borderwidth = 2)
-        lFrame = Frame(frame, relief = FLAT)
-        def removeForce(s = self, f = force, fr = frame):
-            s.forceGroup.removeForce(f)
-            fr.pack_forget()
-        b = Button(lFrame, text = 'X',
-                   command = removeForce)
-        b.pack(side = 'right', expand = 0)
-        Label(lFrame, text = forceName,
-              foreground = 'Blue',
-              font=('MSSansSerif', 12, 'bold'),
-              ).pack(expand = 1, fill = 'x')
-        lFrame.pack(fill = 'x', expand =1)
-        frame.pack(pady = 3, fill = 'x', expand =0)
-        return frame
-
-    def createLinearForceWidgets(self, frame, pageName, forceName, force):
-        def setAmplitude(amp, f = force):
-            f.setAmplitude(amp)
-        def toggleMassDependent(s=self, f=force, p=pageName, n=forceName):
-            v = s.getVariable(p, n+' Mass Dependent')
-            f.setMassDependent(v.get())
-        def setVectorMasks(s=self, f=force, p=pageName, n=forceName):
-            xMask = s.getVariable(p, n+' Mask X').get()
-            yMask = s.getVariable(p, n+' Mask Y').get()
-            zMask = s.getVariable(p, n+' Mask Z').get()
-            f.setVectorMasks(xMask, yMask, zMask)
-        self.createFloater(frame, pageName, forceName + ' Amplitude',
-                           'Force amplitude multiplier',
-                           command = setAmplitude,
-                           value = force.getAmplitude())
-        cbf = Frame(frame, relief = FLAT)
-        self.createCheckbutton(cbf, pageName, forceName + ' Mass Dependent',
-                               ('On: force depends on mass; ' +
-                                'Off: force does not depend on mass'),
-                               toggleMassDependent,
-                               force.getMassDependent())
-        self.createCheckbutton(cbf, pageName, forceName + ' Mask X',
-                               'On: enable force along X axis',
-                               setVectorMasks, 1)
-        self.createCheckbutton(cbf, pageName, forceName + ' Mask Y',
-                               'On: enable force along X axis',
-                               setVectorMasks, 1)
-        self.createCheckbutton(cbf, pageName, forceName + ' Mask Z',
-                               'On: enable force along X axis',
-                               setVectorMasks, 1)
-        cbf.pack(fill = 'x', expand = 0)
-
-    def createForceActiveWidget(self, frame, pageName, forceName, force):
-        cbName = forceName + ' Active'
-        def toggle(s = self, f = force, p = pageName, n = cbName):
-            s.toggleForce(f, p, n)
-        self.createCheckbutton(frame, pageName, cbName,
-                               'On: force is enabled; Off: force is disabled',
-                               toggle, 1)
-
-    def createLinearVectorForceWidget(self, forcePage, pageName,
-                                      count, force):
-        def setVec(vec, f = force):
-            f.setVector(vec[0], vec[1], vec[2])
-        forceName = 'Vector Force-' + `count`
-        frame = self.createForceFrame(forcePage, forceName, force)
-        self.createLinearForceWidgets(frame, pageName, forceName, force)
-        vec = force.getLocalVector()
-        self.createVector3Entry(frame, pageName, forceName,
-                                'Set force direction and magnitude',
-                                command = setVec,
-                                value = [vec[0], vec[1], vec[2]])
-        self.createForceActiveWidget(frame, pageName, forceName, force)
-
-    def createLinearRandomForceWidget(self, forcePage, pageName, count,
-                                force, type):
-        forceName = type + ' Force-' + `count`
-        frame = self.createForceFrame(forcePage, forceName, force)
-        self.createLinearForceWidgets(frame, pageName, forceName, force)
-        self.createForceActiveWidget(frame, pageName, forceName, force)
-
-    def createLinearFrictionForceWidget(self, forcePage, pageName,
-                                        count, force):
-        def setCoef(coef, f = force):
-            f.setCoef(coef)
-        forceName = 'Friction Force-' + `count`
-        frame = self.createForceFrame(forcePage, forceName, force)
-        self.createLinearForceWidgets(frame, pageName, forceName, force)
-        self.createFloater(frame, pageName, forceName + ' Coef',
-                           'Set linear friction force',
-                           command = setCoef, min = None,
-                           value = force.getCoef())
-        self.createForceActiveWidget(frame, pageName, forceName, force)
-
-    def createLinearCylinderVortexForceWidget(self, forcePage, pageName,
-                                              count, force):
-        forceName = 'Vortex Force-' + `count`
-        def setCoef(coef, f = force):
-            f.setCoef(coef)
-        def setLength(length, f = force):
-            f.setLength(length)
-        def setRadius(radius, f = force):
-            f.setRadius(radius)
-        frame = self.createForceFrame(forcePage, forceName, force)
-        self.createLinearForceWidgets(frame, pageName, forceName, force)
-        self.createFloater(frame, pageName, forceName + ' Coef',
-                           'Set linear cylinder vortex coefficient',
-                           command = setCoef,
-                           value = force.getCoef())
-        self.createFloater(frame, pageName, forceName + ' Length',
-                           'Set linear cylinder vortex length',
-                           command = setLength,
-                           value = force.getLength())
-        self.createFloater(frame, pageName, forceName + ' Radius',
-                           'Set linear cylinder vortex radius',
-                           command = setRadius,
-                           value = force.getRadius())
-        self.createForceActiveWidget(frame, pageName, forceName, force)
-
-    def createLinearDistanceForceWidget(self, forcePage, pageName,
-                                        count, force, type):
-        def setFalloffType(type, f=force):
-            if type == 'FT_ONE_OVER_R':
-                #f.setFalloffType(LinearDistanceForce.FTONEOVERR)
-                f.setFalloffType(0)
-            if type == 'FT_ONE_OVER_R_SQUARED':
-                #f.setFalloffType(LinearDistanceForce.FTONEOVERRSQUARED)
-                f.setFalloffType(1)
-            if type == 'FT_ONE_OVER_R_CUBED':
-                #f.setFalloffType(LinearDistanceForce.FTONEOVERRCUBED)
-                f.setFalloffType(2)
-        def setForceCenter(vec, f = force):
-            f.setForceCenter(Point3(vec[0], vec[1], vec[2]))
-        def setRadius(radius, f = force):
-            f.setRadius(radius)
-        forceName = type + ' Force-' + `count`
-        frame = self.createForceFrame(forcePage, forceName, force)
-        self.createLinearForceWidgets(frame, pageName, forceName, force)
-        var = self.createOptionMenu(
-            frame, pageName, forceName + ' Falloff',
-            'Set force falloff type',
-            ('FT_ONE_OVER_R',
-             'FT_ONE_OVER_R_SQUARED',
-             'FT_ONE_OVER_R_CUBED'),
-            command = setFalloffType)
-        self.getWidget(pageName, forceName + ' Falloff').configure(
-            label_width = 16)
-        falloff = force.getFalloffType()
-        if falloff == LinearDistanceForce.FTONEOVERR:
-            var.set('FT_ONE_OVER_R')
-        elif falloff == LinearDistanceForce.FTONEOVERRSQUARED:
-            var.set('FT_ONE_OVER_R_SQUARED')
-        elif falloff == LinearDistanceForce.FTONEOVERRCUBED:
-            var.set('FT_ONE_OVER_R_CUBED')
-        vec = force.getForceCenter()
-        self.createVector3Entry(frame, pageName, forceName + ' Center',
-                                'Set center of force',
-                                command = setForceCenter,
-                                label_width = 16,
-                                value = [vec[0], vec[1], vec[2]])
-        self.createFloater(frame, pageName, forceName + ' Radius',
-                           'Set falloff radius',
-                           command = setRadius,
-                           min = 0.01,
-                           value = force.getRadius())
-        self.createForceActiveWidget(frame, pageName, forceName, force)
-
-######################################################################
-
-# Create demo in root window for testing.
-if __name__ == '__main__':
-    root = Pmw.initialise()
-    pp = ParticlePanel()
-    #ve = VectorEntry(Toplevel(), relief = GROOVE)
-    #ve.pack()

+ 0 - 449
doc/SceneEditor/seParticles.py

@@ -1,449 +0,0 @@
-from pandac.PandaModules import *
-from direct.particles.ParticleManagerGlobal import *
-from direct.showbase.PhysicsManagerGlobal import *
-#Manakel 2/12/2005: replace from pandac import by from pandac.PandaModules import
-from pandac.PandaModules import ParticleSystem
-from pandac.PandaModules import BaseParticleFactory
-from pandac.PandaModules import PointParticleFactory
-from pandac.PandaModules import ZSpinParticleFactory
-#import OrientedParticleFactory
-from pandac.PandaModules import BaseParticleRenderer
-from pandac.PandaModules import PointParticleRenderer
-from pandac.PandaModules import LineParticleRenderer
-from pandac.PandaModules import GeomParticleRenderer
-from pandac.PandaModules import SparkleParticleRenderer
-from pandac.PandaModules import SpriteParticleRenderer
-from pandac.PandaModules import BaseParticleEmitter
-from pandac.PandaModules import BoxEmitter
-from pandac.PandaModules import DiscEmitter
-from pandac.PandaModules import LineEmitter
-from pandac.PandaModules import PointEmitter
-from pandac.PandaModules import RectangleEmitter
-from pandac.PandaModules import RingEmitter
-from pandac.PandaModules import SphereSurfaceEmitter
-from pandac.PandaModules import SphereVolumeEmitter
-from pandac.PandaModules import TangentRingEmitter
-import string
-import os
-from direct.directnotify import DirectNotifyGlobal
-import sys
-
-class Particles(ParticleSystem.ParticleSystem):
-
-    notify = DirectNotifyGlobal.directNotify.newCategory('Particles')
-    id = 1
-
-    def __init__(self, name=None, poolSize=1024):
-        """__init__(name, poolSize)"""
-
-        if (name == None):
-            self.name = 'particles-%d' % Particles.id
-            Particles.id += 1
-        else:
-            self.name = name
-        ParticleSystem.ParticleSystem.__init__(self, poolSize)
-        # self.setBirthRate(0.02)
-        # self.setLitterSize(10)
-        # self.setLitterSpread(0)
-
-        # Set up a physical node
-        self.node = PhysicalNode(self.name)
-        self.nodePath = NodePath(self.node)
-        self.setRenderParent(self.node)
-        self.node.addPhysical(self)
-
-        self.factory = None
-        self.factoryType = "undefined"
-        # self.setFactory("PointParticleFactory")
-        self.renderer = None
-        self.rendererType = "undefined"
-        # self.setRenderer("PointParticleRenderer")
-        self.emitter = None
-        self.emitterType = "undefined"
-        # self.setEmitter("SphereVolumeEmitter")
-
-        # Enable particles by default
-        self.fEnabled = 0
-        #self.enable()
-
-    def cleanup(self):
-        self.disable()
-        self.clearLinearForces()
-        self.clearAngularForces()
-        self.setRenderParent(self.node)
-        self.node.removePhysical(self)
-        self.nodePath.removeNode()
-        del self.node
-        del self.nodePath
-        del self.factory
-        del self.renderer
-        del self.emitter
-
-    def enable(self):
-        """enable()"""
-        if (self.fEnabled == 0):
-            physicsMgr.attachPhysical(self)
-            particleMgr.attachParticlesystem(self)
-            self.fEnabled = 1
-
-    def disable(self):
-        """disable()"""
-        if (self.fEnabled == 1):
-            physicsMgr.removePhysical(self)
-            particleMgr.removeParticlesystem(self)
-            self.fEnabled = 0
-
-    def isEnabled(self):
-        return self.fEnabled
-
-    def getNode(self):
-        return self.node
-
-    def setFactory(self, type):
-        """setFactory(type)"""
-        if (self.factoryType == type):
-            return None
-        if (self.factory):
-            self.factory = None
-        self.factoryType = type
-        if (type == "PointParticleFactory"):
-            self.factory = PointParticleFactory.PointParticleFactory()
-        elif (type == "ZSpinParticleFactory"):
-            self.factory = ZSpinParticleFactory.ZSpinParticleFactory()
-        elif (type == "OrientedParticleFactory"):
-            self.factory = OrientedParticleFactory.OrientedParticleFactory()
-        else:
-            print "unknown factory type: %s" % type
-            return None
-        self.factory.setLifespanBase(0.5)
-        ParticleSystem.ParticleSystem.setFactory(self, self.factory)
-
-    def setRenderer(self, type):
-        """setRenderer(type)"""
-        if (self.rendererType == type):
-            return None
-        if (self.renderer):
-            self.renderer = None
-        self.rendererType = type
-        if (type == "PointParticleRenderer"):
-            self.renderer = PointParticleRenderer.PointParticleRenderer()
-            self.renderer.setPointSize(1.0)
-        elif (type == "LineParticleRenderer"):
-            self.renderer = LineParticleRenderer.LineParticleRenderer()
-        elif (type == "GeomParticleRenderer"):
-            self.renderer = GeomParticleRenderer.GeomParticleRenderer()
-            npath = NodePath('default-geom')
-            # This was moved here because we do not want to download
-            # the direct tools with toontown.
-            from direct.directtools import DirectSelection
-            bbox = DirectSelection.DirectBoundingBox(npath)
-            self.renderer.setGeomNode(bbox.lines.node())
-        elif (type == "SparkleParticleRenderer"):
-            self.renderer = SparkleParticleRenderer.SparkleParticleRenderer()
-        elif (type == "SpriteParticleRenderer"):
-            self.renderer = SpriteParticleRenderer.SpriteParticleRenderer()
-            if (self.renderer.getSourceType() ==
-                SpriteParticleRenderer.SpriteParticleRenderer.STTexture):
-                # Use current default texture 
-                # See sourceTextureName SpriteParticleRenderer-extensions.py
-                self.renderer.setTextureFromFile()
-            else:
-                # Use current default model file and node
-                # See sourceFileName and sourceNodeName in SpriteParticleRenderer-extensions.py
-                self.renderer.setTextureFromNode()
-        else:
-            print "unknown renderer type: %s" % type
-            return None
-        ParticleSystem.ParticleSystem.setRenderer(self, self.renderer)
-
-    def setEmitter(self, type):
-        """setEmitter(type)"""
-        if (self.emitterType == type):
-            return None
-        if (self.emitter):
-            self.emitter = None
-        self.emitterType = type
-        if (type == "BoxEmitter"):
-            self.emitter = BoxEmitter.BoxEmitter()
-        elif (type == "DiscEmitter"):
-            self.emitter = DiscEmitter.DiscEmitter()
-        elif (type == "LineEmitter"):
-            self.emitter = LineEmitter.LineEmitter()
-        elif (type == "PointEmitter"):
-            self.emitter = PointEmitter.PointEmitter()
-        elif (type == "RectangleEmitter"):
-            self.emitter = RectangleEmitter.RectangleEmitter()
-        elif (type == "RingEmitter"):
-            self.emitter = RingEmitter.RingEmitter()
-        elif (type == "SphereSurfaceEmitter"):
-            self.emitter = SphereSurfaceEmitter.SphereSurfaceEmitter()
-        elif (type == "SphereVolumeEmitter"):
-            self.emitter = SphereVolumeEmitter.SphereVolumeEmitter()
-            self.emitter.setRadius(1.0)
-        elif (type == "TangentRingEmitter"):
-            self.emitter = TangentRingEmitter.TangentRingEmitter()
-        else:
-            print "unknown emitter type: %s" % type
-            return None
-        ParticleSystem.ParticleSystem.setEmitter(self, self.emitter)
-
-    def addForce(self, force):
-        """addForce(force)"""
-        if (force.isLinear()):
-            self.addLinearForce(force)
-        else:
-            self.addAngularForce(force)
-
-    def removeForce(self, force):
-        """removeForce(force)"""
-        if (force == None):
-            self.notify.warning('removeForce() - force == None!')
-            return
-        if (force.isLinear()):
-            self.removeLinearForce(force)
-        else:
-            self.removeAngularForce(force)
-
-    def setRenderNodePath(self, nodePath):
-        self.setRenderParent(nodePath.node())
-
-    ## Getters ##
-    def getName(self):
-        """getName()"""
-        return self.name
-    def getFactory(self):
-        """getFactory()"""
-        return self.factory
-    def getEmitter(self):
-        """getEmitter()"""
-        return self.emitter
-    def getRenderer(self):
-        """getRenderer()"""
-        return self.renderer
-
-    def printParams(self, file = sys.stdout, targ = 'self'):
-        """printParams(file, targ)"""
-        i1="    "
-        i2=i1+i1
-        file.write(i2+'# Particles parameters\n')
-        file.write(i2+targ + '.setFactory(\"' + self.factoryType + '\")\n')
-        file.write(i2+targ + '.setRenderer(\"' + self.rendererType + '\")\n')
-        file.write(i2+targ + '.setEmitter(\"' + self.emitterType + '\")\n')
-
-        # System parameters
-        file.write(i2+targ + ('.setPoolSize(%d)\n' %
-                           int(self.getPoolSize())))
-        file.write(i2+targ + ('.setBirthRate(%.4f)\n' %
-                           self.getBirthRate()))
-        file.write(i2+targ + ('.setLitterSize(%d)\n' %
-                           int(self.getLitterSize())))
-        file.write(i2+targ + ('.setLitterSpread(%d)\n' %
-                           self.getLitterSpread()))
-        file.write(i2+targ + ('.setSystemLifespan(%.4f)\n' %
-                           self.getSystemLifespan()))
-        file.write(i2+targ + ('.setLocalVelocityFlag(%d)\n' %
-                           self.getLocalVelocityFlag()))
-        file.write(i2+targ + ('.setSystemGrowsOlderFlag(%d)\n' %
-                           self.getSystemGrowsOlderFlag()))
-        file.write(i2+'# Factory parameters\n')
-        file.write(i2+targ + ('.factory.setLifespanBase(%.4f)\n' %
-                           self.factory.getLifespanBase()))
-        file.write(i2+targ + '.factory.setLifespanSpread(%.4f)\n' % \
-                                self.factory.getLifespanSpread())
-        file.write(i2+targ + '.factory.setMassBase(%.4f)\n' % \
-                                self.factory.getMassBase())
-        file.write(i2+targ + '.factory.setMassSpread(%.4f)\n' % \
-                                self.factory.getMassSpread())
-        file.write(i2+targ + '.factory.setTerminalVelocityBase(%.4f)\n' % \
-                                self.factory.getTerminalVelocityBase())
-        file.write(i2+targ + '.factory.setTerminalVelocitySpread(%.4f)\n' % \
-                                self.factory.getTerminalVelocitySpread())
-        if (self.factoryType == "PointParticleFactory"):
-            file.write(i2+'# Point factory parameters\n')
-        elif (self.factoryType == "ZSpinParticleFactory"):
-            file.write(i2+'# Z Spin factory parameters\n')
-            file.write(i2+targ + '.factory.setInitialAngle(%.4f)\n' % \
-                                        self.factory.getInitialAngle())
-            file.write(i2+targ + '.factory.setInitialAngleSpread(%.4f)\n' % \
-                                        self.factory.getInitialAngleSpread())
-            file.write(i2+targ + '.factory.enableAngularVelocity(%d)\n' % \
-                                        self.factory.getAngularVelocityEnabled())
-            if(self.factory.getAngularVelocityEnabled()):
-                file.write(i2+targ + '.factory.setAngularVelocity(%.4f)\n' % \
-                                            self.factory.getAngularVelocity())
-                file.write(i2+targ + '.factory.setAngularVelocitySpread(%.4f)\n' % \
-                                            self.factory.getAngularVelocitySpread())
-            else:
-                file.write(i2+targ + '.factory.setFinalAngle(%.4f)\n' % \
-                                            self.factory.getFinalAngle())
-                file.write(i2+targ + '.factory.setFinalAngleSpread(%.4f)\n' % \
-                                        self.factory.getFinalAngleSpread())
-
-        elif (self.factoryType == "OrientedParticleFactory"):
-            file.write(i2+'# Oriented factory parameters\n')
-            file.write(i2+targ + '.factory.setInitialOrientation(%.4f)\n' % \
-                                        self.factory.getInitialOrientation())
-            file.write(i2+targ + '.factory.setFinalOrientation(%.4f)\n' % \
-                                        self.factory.getFinalOrientation())
-
-        file.write(i2+'# Renderer parameters\n')
-        alphaMode = self.renderer.getAlphaMode()
-        aMode = "PRALPHANONE"
-        if (alphaMode == BaseParticleRenderer.BaseParticleRenderer.PRALPHANONE):
-            aMode = "PRALPHANONE"
-        elif (alphaMode ==
-                BaseParticleRenderer.BaseParticleRenderer.PRALPHAOUT):
-            aMode = "PRALPHAOUT"
-        elif (alphaMode ==
-                BaseParticleRenderer.BaseParticleRenderer.PRALPHAIN):
-            aMode = "PRALPHAIN"
-        elif (alphaMode ==
-                BaseParticleRenderer.BaseParticleRenderer.PRALPHAUSER):
-            aMode = "PRALPHAUSER"
-        file.write(i2+targ + '.renderer.setAlphaMode(BaseParticleRenderer.' + aMode + ')\n')
-        file.write(i2+targ + '.renderer.setUserAlpha(%.2f)\n' % \
-                                        self.renderer.getUserAlpha())
-        if (self.rendererType == "PointParticleRenderer"):
-            file.write(i2+'# Point parameters\n')
-            file.write(i2+targ + '.renderer.setPointSize(%.2f)\n' % \
-                                        self.renderer.getPointSize())
-            sColor = self.renderer.getStartColor()
-            file.write(i2+(targ + '.renderer.setStartColor(Vec4(%.2f, %.2f, %.2f, %.2f))\n' % (sColor[0], sColor[1], sColor[2], sColor[3])))
-            sColor = self.renderer.getEndColor()
-            file.write(i2+(targ + '.renderer.setEndColor(Vec4(%.2f, %.2f, %.2f, %.2f))\n' % (sColor[0], sColor[1], sColor[2], sColor[3])))
-            blendType = self.renderer.getBlendType()
-            bType = "PPONECOLOR"
-            if (blendType == PointParticleRenderer.PointParticleRenderer.PPONECOLOR):
-                bType = "PPONECOLOR"
-            elif (blendType == PointParticleRenderer.PointParticleRenderer.PPBLENDLIFE):
-                bType = "PPBLENDLIFE"
-            elif (blendType == PointParticleRenderer.PointParticleRenderer.PPBLENDVEL):
-                bType = "PPBLENDVEL"
-            file.write(i2+targ + '.renderer.setBlendType(PointParticleRenderer.' + bType + ')\n')
-            blendMethod = self.renderer.getBlendMethod()
-            bMethod = "PPNOBLEND"
-            if (blendMethod == BaseParticleRenderer.BaseParticleRenderer.PPNOBLEND):
-                bMethod = "PPNOBLEND"
-            elif (blendMethod == BaseParticleRenderer.BaseParticleRenderer.PPBLENDLINEAR):
-                bMethod = "PPBLENDLINEAR"
-            elif (blendMethod == BaseParticleRenderer.BaseParticleRenderer.PPBLENDCUBIC):
-                bMethod = "PPBLENDCUBIC"
-            file.write(i2+targ + '.renderer.setBlendMethod(BaseParticleRenderer.' + bMethod + ')\n')
-        elif (self.rendererType == "LineParticleRenderer"):
-            file.write(i2+'# Line parameters\n')
-            sColor = self.renderer.getHeadColor()
-            file.write(i2+(targ + '.renderer.setHeadColor(Vec4(%.2f, %.2f, %.2f, %.2f))\n' % (sColor[0], sColor[1], sColor[2], sColor[3])))
-            sColor = self.renderer.getTailColor()
-            file.write(i2+(targ + '.renderer.setTailColor(Vec4(%.2f, %.2f, %.2f, %.2f))\n' % (sColor[0], sColor[1], sColor[2], sColor[3])))
-        elif (self.rendererType == "GeomParticleRenderer"):
-            file.write(i2+'# Geom parameters\n')
-            node = self.renderer.getGeomNode()
-            file.write(i2+targ + '.renderer.setGeomNode(' + node.getName() + ')\n')
-        elif (self.rendererType == "SparkleParticleRenderer"):
-            file.write(i2+'# Sparkle parameters\n')
-            sColor = self.renderer.getCenterColor()
-            file.write(i2+(targ + '.renderer.setCenterColor(Vec4(%.2f, %.2f, %.2f, %.2f))\n' % (sColor[0], sColor[1], sColor[2], sColor[3])))
-            sColor = self.renderer.getEdgeColor()
-            file.write(i2+(targ + '.renderer.setEdgeColor(Vec4(%.2f, %.2f, %.2f, %.2f))\n' % (sColor[0], sColor[1], sColor[2], sColor[3])))
-            file.write(i2+targ + '.renderer.setBirthRadius(%.4f)\n' % self.renderer.getBirthRadius())
-            file.write(i2+targ + '.renderer.setDeathRadius(%.4f)\n' % self.renderer.getDeathRadius())
-            lifeScale = self.renderer.getLifeScale()
-            lScale = "SPNOSCALE"
-            if (lifeScale == SparkleParticleRenderer.SparkleParticleRenderer.SPSCALE):
-                lScale = "SPSCALE"
-            file.write(i2+targ + '.renderer.setLifeScale(SparkleParticleRenderer.' + lScale + ')\n')
-        elif (self.rendererType == "SpriteParticleRenderer"):
-            file.write(i2+'# Sprite parameters\n')
-            if (self.renderer.getSourceType() ==
-                SpriteParticleRenderer.SpriteParticleRenderer.STTexture):
-                tex = self.renderer.getTexture()
-                file.write(i2+targ + '.renderer.setTexture(loader.loadTexture(\'' + tex.getFilename().getFullpath() + '\'))\n')
-            else:
-                modelName = self.renderer.getSourceFileName()
-                nodeName = self.renderer.getSourceNodeName()
-                file.write(i2+targ + '.renderer.setTextureFromNode("%s", "%s")\n' % (modelName, nodeName))
-            sColor = self.renderer.getColor()
-            file.write(i2+(targ + '.renderer.setColor(Vec4(%.2f, %.2f, %.2f, %.2f))\n' % (sColor[0], sColor[1], sColor[2], sColor[3])))
-            file.write(i2+targ + '.renderer.setXScaleFlag(%d)\n' % self.renderer.getXScaleFlag())
-            file.write(i2+targ + '.renderer.setYScaleFlag(%d)\n' % self.renderer.getYScaleFlag())
-            file.write(i2+targ + '.renderer.setAnimAngleFlag(%d)\n' % self.renderer.getAnimAngleFlag())
-            file.write(i2+targ + '.renderer.setInitialXScale(%.4f)\n' % self.renderer.getInitialXScale())
-            file.write(i2+targ + '.renderer.setFinalXScale(%.4f)\n' % self.renderer.getFinalXScale())
-            file.write(i2+targ + '.renderer.setInitialYScale(%.4f)\n' % self.renderer.getInitialYScale())
-            file.write(i2+targ + '.renderer.setFinalYScale(%.4f)\n' % self.renderer.getFinalYScale())
-            file.write(i2+targ + '.renderer.setNonanimatedTheta(%.4f)\n' % self.renderer.getNonanimatedTheta())
-            blendMethod = self.renderer.getAlphaBlendMethod()
-            bMethod = "PPNOBLEND"
-            if (blendMethod == BaseParticleRenderer.BaseParticleRenderer.PPNOBLEND):
-                bMethod = "PPNOBLEND"
-            elif (blendMethod == BaseParticleRenderer.BaseParticleRenderer.PPBLENDLINEAR):
-                bMethod = "PPBLENDLINEAR"
-            elif (blendMethod == BaseParticleRenderer.BaseParticleRenderer.PPBLENDCUBIC):
-                bMethod = "PPBLENDCUBIC"
-            file.write(i2+targ + '.renderer.setAlphaBlendMethod(BaseParticleRenderer.' + bMethod + ')\n')
-            file.write(i2+targ + '.renderer.setAlphaDisable(%d)\n' % self.renderer.getAlphaDisable())
-
-        file.write(i2+'# Emitter parameters\n')
-        emissionType = self.emitter.getEmissionType()
-        eType = "ETEXPLICIT"
-        if (emissionType == BaseParticleEmitter.BaseParticleEmitter.ETEXPLICIT):
-            eType = "ETEXPLICIT"
-        elif (emissionType == BaseParticleEmitter.BaseParticleEmitter.ETRADIATE):
-            eType = "ETRADIATE"
-        elif (emissionType == BaseParticleEmitter.BaseParticleEmitter.ETCUSTOM):
-            eType = "ETCUSTOM"
-        file.write(i2+targ + '.emitter.setEmissionType(BaseParticleEmitter.' + eType + ')\n')
-        file.write(i2+targ + '.emitter.setAmplitude(%.4f)\n' % self.emitter.getAmplitude())
-        file.write(i2+targ + '.emitter.setAmplitudeSpread(%.4f)\n' % self.emitter.getAmplitudeSpread())
-        oForce = self.emitter.getOffsetForce()
-        file.write(i2+(targ + '.emitter.setOffsetForce(Vec3(%.4f, %.4f, %.4f))\n' % (oForce[0], oForce[1], oForce[2])))
-        oForce = self.emitter.getExplicitLaunchVector()
-        file.write(i2+(targ + '.emitter.setExplicitLaunchVector(Vec3(%.4f, %.4f, %.4f))\n' % (oForce[0], oForce[1], oForce[2])))
-        orig = self.emitter.getRadiateOrigin()
-        file.write(i2+(targ + '.emitter.setRadiateOrigin(Point3(%.4f, %.4f, %.4f))\n' % (orig[0], orig[1], orig[2])))
-        if (self.emitterType == "BoxEmitter"):
-            file.write(i2+'# Box parameters\n')
-            bound = self.emitter.getMinBound()
-            file.write(i2+(targ + '.emitter.setMinBound(Point3(%.4f, %.4f, %.4f))\n' % (bound[0], bound[1], bound[2])))
-            bound = self.emitter.getMaxBound()
-            file.write(i2+(targ + '.emitter.setMaxBound(Point3(%.4f, %.4f, %.4f))\n' % (bound[0], bound[1], bound[2])))
-        elif (self.emitterType == "DiscEmitter"):
-            file.write(i2+'# Disc parameters\n')
-            file.write(i2+targ + '.emitter.setRadius(%.4f)\n' % self.emitter.getRadius())
-            if (eType == "ETCUSTOM"):
-                file.write(i2+targ + '.emitter.setOuterAngle(%.4f)\n' % self.emitter.getOuterAngle())
-                file.write(i2+targ + '.emitter.setInnerAngle(%.4f)\n' % self.emitter.getInnerAngle())
-                file.write(i2+targ + '.emitter.setOuterMagnitude(%.4f)\n' % self.emitter.getOuterMagnitude())
-                file.write(i2+targ + '.emitter.setInnerMagnitude(%.4f)\n' % self.emitter.getInnerMagnitude())
-                file.write(i2+targ + '.emitter.setCubicLerping(%d)\n' % self.emitter.getCubicLerping())
-
-        elif (self.emitterType == "LineEmitter"):
-            file.write(i2+'# Line parameters\n')
-            point = self.emitter.getEndpoint1()
-            file.write(i2+(targ + '.emitter.setEndpoint1(Point3(%.4f, %.4f, %.4f))\n' % (point[0], point[1], point[2])))
-            point = self.emitter.getEndpoint2()
-            file.write(i2+(targ + '.emitter.setEndpoint2(Point3(%.4f, %.4f, %.4f))\n' % (point[0], point[1], point[2])))
-        elif (self.emitterType == "PointEmitter"):
-            file.write(i2+'# Point parameters\n')
-            point = self.emitter.getLocation()
-            file.write(i2+(targ + '.emitter.setLocation(Point3(%.4f, %.4f, %.4f))\n' % (point[0], point[1], point[2])))
-        elif (self.emitterType == "RectangleEmitter"):
-            file.write(i2+'# Rectangle parameters\n')
-            point = self.emitter.getMinBound()
-            file.write(i2+(targ + '.emitter.setMinBound(Point2(%.4f, %.4f))\n' % (point[0], point[1])))
-            point = self.emitter.getMaxBound()
-            file.write(i2+(targ + '.emitter.setMaxBound(Point2(%.4f, %.4f))\n' % (point[0], point[1])))
-        elif (self.emitterType == "RingEmitter"):
-            file.write(i2+'# Ring parameters\n')
-            file.write(i2+targ + '.emitter.setRadius(%.4f)\n' % self.emitter.getRadius())
-            if (eType == "ETCUSTOM"):
-                file.write(i2+targ + '.emitter.setAngle(%.4f)\n' % self.emitter.getAngle())
-        elif (self.emitterType == "SphereSurfaceEmitter"):
-            file.write(i2+'# Sphere Surface parameters\n')
-            file.write(i2+targ + '.emitter.setRadius(%.4f)\n' % self.emitter.getRadius())
-        elif (self.emitterType == "SphereVolumeEmitter"):
-            file.write(i2+'# Sphere Volume parameters\n')
-            file.write(i2+targ + '.emitter.setRadius(%.4f)\n' % self.emitter.getRadius())
-        elif (self.emitterType == "TangentRingEmitter"):
-            file.write(i2+'# Tangent Ring parameters\n')
-            file.write(i2+targ + '.emitter.setRadius(%.4f)\n' % self.emitter.getRadius())

+ 0 - 800
doc/SceneEditor/sePlacer.py

@@ -1,800 +0,0 @@
-""" DIRECT Nine DoF Manipulation Panel """
-
-from direct.showbase.DirectObject import DirectObject
-from direct.directtools.DirectGlobals import *
-from direct.tkwidgets.AppShell import AppShell
-from direct.tkwidgets.Dial import AngleDial
-from direct.tkwidgets.Floater import Floater
-from Tkinter import Button, Menubutton, Menu, StringVar
-from pandac.PandaModules import *
-import Tkinter, Pmw
-"""
-TODO:
-Task to monitor pose
-"""
-
-class Placer(AppShell):
-    # Override class variables here
-    appname = 'Placer Panel'
-    frameWidth      = 625
-    frameHeight     = 215
-    usecommandarea = 0
-    usestatusarea  = 0
-
-    def __init__(self, parent = None, **kw):
-        INITOPT = Pmw.INITOPT
-        optiondefs = (
-            ('title',       self.appname,       None),
-            ('nodePath',    SEditor.camera,      None),
-            )
-        self.defineoptions(kw, optiondefs)
-
-        # Call superclass initialization function
-        AppShell.__init__(self)
-        
-        self.initialiseoptions(Placer)
-
-        # Accept the message from sceneEditor to update the information about the target nodePath
-        self.accept('placerUpdate', self.updatePlacer)
-
-    def appInit(self):
-        # Initialize state
-        self.tempCS = SEditor.group.attachNewNode('placerTempCS')
-        self.orbitFromCS = SEditor.group.attachNewNode(
-            'placerOrbitFromCS')
-        self.orbitToCS = SEditor.group.attachNewNode('placerOrbitToCS')
-        self.refCS = self.tempCS
-        
-        # Dictionary keeping track of all node paths manipulated so far
-        self.nodePathDict = {}
-        self.nodePathDict['camera'] = SEditor.camera
-        self.nodePathDict['widget'] = SEditor.widget
-        self.nodePathNames = ['camera', 'widget', 'selected']
-
-        self.refNodePathDict = {}
-        self.refNodePathDict['parent'] = self['nodePath'].getParent()
-        self.refNodePathDict['render'] = render
-        self.refNodePathDict['camera'] = SEditor.camera
-        self.refNodePathDict['widget'] = SEditor.widget
-        self.refNodePathNames = ['parent', 'self', 'render',
-                                 'camera', 'widget', 'selected']
-
-        # Initial state
-        self.initPos = Vec3(0)
-        self.initHpr = Vec3(0)
-        self.initScale = Vec3(1)
-        self.deltaHpr = Vec3(0)
-
-        # Offset for orbital mode
-        self.posOffset = Vec3(0)
-
-        # Set up event hooks
-        self.undoEvents = [('DIRECT_undo', self.undoHook),
-                           ('DIRECT_pushUndo', self.pushUndoHook),
-                           ('DIRECT_undoListEmpty', self.undoListEmptyHook),
-                           ('DIRECT_redo', self.redoHook),
-                           ('DIRECT_pushRedo', self.pushRedoHook),
-                           ('DIRECT_redoListEmpty', self.redoListEmptyHook)]
-        for event, method in self.undoEvents:
-            self.accept(event, method)
-
-        # Init movement mode
-        self.movementMode = 'Relative To:'
-
-    def createInterface(self):
-        # The interior of the toplevel panel
-        interior = self.interior()
-        interior['relief'] = Tkinter.FLAT
-        # Add placer commands to menubar
-        self.menuBar.addmenu('Placer', 'Placer Panel Operations')
-        self.menuBar.addmenuitem('Placer', 'command',
-                            'Zero Node Path',
-                            label = 'Zero All',
-                            command = self.zeroAll)
-        self.menuBar.addmenuitem('Placer', 'command',
-                            'Reset Node Path',
-                            label = 'Reset All',
-                            command = self.resetAll)
-        self.menuBar.addmenuitem('Placer', 'command',
-                            'Print Node Path Info',
-                            label = 'Print Info',
-                            command = self.printNodePathInfo)
-        self.menuBar.addmenuitem(
-            'Placer', 'command',
-            'Toggle widget visability',
-            label = 'Toggle Widget Vis',
-            command = SEditor.toggleWidgetVis)
-        self.menuBar.addmenuitem(
-            'Placer', 'command',
-            'Toggle widget manipulation mode',
-            label = 'Toggle Widget Mode',
-            command = SEditor.manipulationControl.toggleObjectHandlesMode)
-        
-        # Get a handle to the menu frame
-        menuFrame = self.menuFrame
-        self.nodePathMenu = Pmw.ComboBox(
-            menuFrame, labelpos = Tkinter.W, label_text = 'Node Path:',
-            entry_width = 20,
-            selectioncommand = self.selectNodePathNamed,
-            scrolledlist_items = self.nodePathNames)
-        self.nodePathMenu.selectitem('selected')
-        self.nodePathMenuEntry = (
-            self.nodePathMenu.component('entryfield_entry'))
-        self.nodePathMenuBG = (
-            self.nodePathMenuEntry.configure('background')[3])
-        self.nodePathMenu.pack(side = 'left', fill = 'x', expand = 1)
-        self.bind(self.nodePathMenu, 'Select node path to manipulate')
-
-        modeMenu = Pmw.OptionMenu(menuFrame,
-                                  items = ('Relative To:',
-                                           'Orbit:'),
-                                  initialitem = 'Relative To:',
-                                  command = self.setMovementMode,
-                                  menubutton_width = 8)
-        modeMenu.pack(side = 'left', expand = 0)
-        self.bind(modeMenu, 'Select manipulation mode')
-        
-        self.refNodePathMenu = Pmw.ComboBox(
-            menuFrame, entry_width = 16,
-            selectioncommand = self.selectRefNodePathNamed,
-            scrolledlist_items = self.refNodePathNames)
-        self.refNodePathMenu.selectitem('parent')
-        self.refNodePathMenuEntry = (
-            self.refNodePathMenu.component('entryfield_entry'))
-        self.refNodePathMenu.pack(side = 'left', fill = 'x', expand = 1)
-        self.bind(self.refNodePathMenu, 'Select relative node path')
-
-        self.undoButton = Button(menuFrame, text = 'Undo',
-                                 command = SEditor.undo)
-        if SEditor.undoList:
-            self.undoButton['state'] = 'normal'
-        else:
-            self.undoButton['state'] = 'disabled'
-        self.undoButton.pack(side = 'left', expand = 0)
-        self.bind(self.undoButton, 'Undo last operation')
-
-        self.redoButton = Button(menuFrame, text = 'Redo',
-                                 command = SEditor.redo)
-        if SEditor.redoList:
-            self.redoButton['state'] = 'normal'
-        else:
-            self.redoButton['state'] = 'disabled'
-        self.redoButton.pack(side = 'left', expand = 0)
-        self.bind(self.redoButton, 'Redo last operation')
-
-        # Create and pack the Pos Controls
-        posGroup = Pmw.Group(interior,
-                             tag_pyclass = Menubutton,
-                             tag_text = 'Position',
-                             tag_font=('MSSansSerif', 14),
-                             tag_activebackground = '#909090',
-                             ring_relief = Tkinter.RIDGE)
-        posMenubutton = posGroup.component('tag')
-        self.bind(posMenubutton, 'Position menu operations')
-        posMenu = Menu(posMenubutton, tearoff = 0)
-        posMenu.add_command(label = 'Set to zero', command = self.zeroPos)
-        posMenu.add_command(label = 'Reset initial',
-                            command = self.resetPos)
-        posMenubutton['menu'] = posMenu
-        posGroup.pack(side='left', fill = 'both', expand = 1)
-        posInterior = posGroup.interior()
-
-        # Create the dials
-        self.posX = self.createcomponent('posX', (), None,
-                                         Floater, (posInterior,),
-                                         text = 'X', relief = Tkinter.FLAT,
-                                         value = 0.0,
-                                         label_foreground = 'Red')
-        self.posX['commandData'] = ['x']
-        self.posX['preCallback'] = self.xformStart
-        self.posX['postCallback'] = self.xformStop
-        self.posX['callbackData'] = ['x']
-        self.posX.pack(expand=1,fill='both')
-        
-        self.posY = self.createcomponent('posY', (), None,
-                                         Floater, (posInterior,),
-                                         text = 'Y', relief = Tkinter.FLAT,
-                                         value = 0.0,
-                                         label_foreground = '#00A000')
-        self.posY['commandData'] = ['y']
-        self.posY['preCallback'] = self.xformStart
-        self.posY['postCallback'] = self.xformStop
-        self.posY['callbackData'] = ['y']
-        self.posY.pack(expand=1,fill='both')
-        
-        self.posZ = self.createcomponent('posZ', (), None,
-                                         Floater, (posInterior,),
-                                         text = 'Z', relief = Tkinter.FLAT,
-                                         value = 0.0,
-                                         label_foreground = 'Blue')
-        self.posZ['commandData'] = ['z']
-        self.posZ['preCallback'] = self.xformStart
-        self.posZ['postCallback'] = self.xformStop
-        self.posZ['callbackData'] = ['z']
-        self.posZ.pack(expand=1,fill='both')
-
-        # Create and pack the Hpr Controls
-        hprGroup = Pmw.Group(interior,
-                             tag_pyclass = Menubutton,
-                             tag_text = 'Orientation',
-                             tag_font=('MSSansSerif', 14),
-                             tag_activebackground = '#909090',
-                             ring_relief = Tkinter.RIDGE)
-        hprMenubutton = hprGroup.component('tag')
-        self.bind(hprMenubutton, 'Orientation menu operations')
-        hprMenu = Menu(hprMenubutton, tearoff = 0)
-        hprMenu.add_command(label = 'Set to zero', command = self.zeroHpr)
-        hprMenu.add_command(label = 'Reset initial', command = self.resetHpr)
-        hprMenubutton['menu'] = hprMenu
-        hprGroup.pack(side='left',fill = 'both', expand = 1)
-        hprInterior = hprGroup.interior()
-        
-        # Create the dials
-        self.hprH = self.createcomponent('hprH', (), None,
-                                         AngleDial, (hprInterior,),
-                                         style = 'mini',
-                                         text = 'H', value = 0.0,
-                                         relief = Tkinter.FLAT,
-                                         label_foreground = 'blue')
-        self.hprH['commandData'] = ['h']
-        self.hprH['preCallback'] = self.xformStart
-        self.hprH['postCallback'] = self.xformStop
-        self.hprH['callbackData'] = ['h']
-        self.hprH.pack(expand=1,fill='both')
-        
-        self.hprP = self.createcomponent('hprP', (), None,
-                                         AngleDial, (hprInterior,),
-                                         style = 'mini',
-                                         text = 'P', value = 0.0,
-                                         relief = Tkinter.FLAT,
-                                         label_foreground = 'red')
-        self.hprP['commandData'] = ['p']
-        self.hprP['preCallback'] = self.xformStart
-        self.hprP['postCallback'] = self.xformStop
-        self.hprP['callbackData'] = ['p']
-        self.hprP.pack(expand=1,fill='both')
-        
-        self.hprR = self.createcomponent('hprR', (), None,
-                                         AngleDial, (hprInterior,),
-                                         style = 'mini',
-                                         text = 'R', value = 0.0,
-                                         relief = Tkinter.FLAT,
-                                         label_foreground = '#00A000')
-        self.hprR['commandData'] = ['r']
-        self.hprR['preCallback'] = self.xformStart
-        self.hprR['postCallback'] = self.xformStop
-        self.hprR['callbackData'] = ['r']
-        self.hprR.pack(expand=1,fill='both')
-
-        # Create and pack the Scale Controls
-        # The available scaling modes
-        self.scalingMode = StringVar()
-        self.scalingMode.set('Scale Uniform')
-        # The scaling widgets
-        scaleGroup = Pmw.Group(interior,
-                               tag_text = 'Scale Uniform',
-                               tag_pyclass = Menubutton,
-                               tag_font=('MSSansSerif', 14),
-                               tag_activebackground = '#909090',
-                               ring_relief = Tkinter.RIDGE)
-        self.scaleMenubutton = scaleGroup.component('tag')
-        self.bind(self.scaleMenubutton, 'Scale menu operations')
-        self.scaleMenubutton['textvariable'] = self.scalingMode
-
-        # Scaling menu
-        scaleMenu = Menu(self.scaleMenubutton, tearoff = 0)
-        scaleMenu.add_command(label = 'Set to unity',
-                              command = self.unitScale)
-        scaleMenu.add_command(label = 'Reset initial',
-                              command = self.resetScale)
-        scaleMenu.add_radiobutton(label = 'Scale Free',
-                                      variable = self.scalingMode)
-        scaleMenu.add_radiobutton(label = 'Scale Uniform',
-                                      variable = self.scalingMode)
-        scaleMenu.add_radiobutton(label = 'Scale Proportional',
-                                      variable = self.scalingMode)
-        self.scaleMenubutton['menu'] = scaleMenu
-        # Pack group widgets
-        scaleGroup.pack(side='left',fill = 'both', expand = 1)
-        scaleInterior = scaleGroup.interior()
-        
-        # Create the dials
-        self.scaleX = self.createcomponent('scaleX', (), None,
-                                           Floater, (scaleInterior,),
-                                           text = 'X Scale',
-                                           relief = Tkinter.FLAT,
-                                           min = 0.0001, value = 1.0,
-                                           resetValue = 1.0,
-                                           label_foreground = 'Red')
-        self.scaleX['commandData'] = ['sx']
-        self.scaleX['callbackData'] = ['sx']
-        self.scaleX['preCallback'] = self.xformStart
-        self.scaleX['postCallback'] = self.xformStop
-        self.scaleX.pack(expand=1,fill='both')
-        
-        self.scaleY = self.createcomponent('scaleY', (), None,
-                                           Floater, (scaleInterior,),
-                                           text = 'Y Scale',
-                                           relief = Tkinter.FLAT,
-                                           min = 0.0001, value = 1.0,
-                                           resetValue = 1.0,
-                                           label_foreground = '#00A000')
-        self.scaleY['commandData'] = ['sy']
-        self.scaleY['callbackData'] = ['sy']
-        self.scaleY['preCallback'] = self.xformStart
-        self.scaleY['postCallback'] = self.xformStop
-        self.scaleY.pack(expand=1,fill='both')
-        
-        self.scaleZ = self.createcomponent('scaleZ', (), None,
-                                           Floater, (scaleInterior,),
-                                           text = 'Z Scale',
-                                           relief = Tkinter.FLAT,
-                                           min = 0.0001, value = 1.0,
-                                           resetValue = 1.0,
-                                           label_foreground = 'Blue')
-        self.scaleZ['commandData'] = ['sz']
-        self.scaleZ['callbackData'] = ['sz']
-        self.scaleZ['preCallback'] = self.xformStart
-        self.scaleZ['postCallback'] = self.xformStop
-        self.scaleZ.pack(expand=1,fill='both')
-
-        # Make sure appropriate labels are showing
-        self.setMovementMode('Relative To:')
-        # Set up placer for inital node path
-        self.selectNodePathNamed('init')
-        self.selectRefNodePathNamed('parent')
-        # Update place to reflect initial state
-        self.updatePlacer()
-        # Now that you're done setting up, attach commands
-        self.posX['command'] = self.xform
-        self.posY['command'] = self.xform
-        self.posZ['command'] = self.xform
-        self.hprH['command'] = self.xform
-        self.hprP['command'] = self.xform
-        self.hprR['command'] = self.xform
-        self.scaleX['command'] = self.xform
-        self.scaleY['command'] = self.xform
-        self.scaleZ['command'] = self.xform
-
-
-    ### WIDGET OPERATIONS ###
-    def setMovementMode(self, movementMode):
-        # Set prefix
-        namePrefix = ''
-        self.movementMode = movementMode
-        if (movementMode == 'Relative To:'):
-            namePrefix = 'Relative '
-        elif (movementMode == 'Orbit:'):
-            namePrefix = 'Orbit '
-        # Update pos widgets
-        self.posX['text'] = namePrefix + 'X'
-        self.posY['text'] = namePrefix + 'Y'
-        self.posZ['text'] = namePrefix + 'Z'
-        # Update hpr widgets
-        if (movementMode == 'Orbit:'):
-            namePrefix = 'Orbit delta '
-        self.hprH['text'] = namePrefix + 'H'
-        self.hprP['text'] = namePrefix + 'P'
-        self.hprR['text'] = namePrefix + 'R'
-        # Update temp cs and initialize widgets
-        self.updatePlacer()
-
-    def setScalingMode(self):
-        if self['nodePath']:
-            scale = self['nodePath'].getScale()
-            if ((scale[0] != scale[1]) or
-                (scale[0] != scale[2]) or
-                (scale[1] != scale[2])):
-                self.scalingMode.set('Scale Free')
-
-    def selectNodePathNamed(self, name):
-        nodePath = None
-        if name == 'init':
-            nodePath = self['nodePath']
-            # Add Combo box entry for the initial node path
-            self.addNodePath(nodePath)
-        elif name == 'selected':
-            nodePath = SEditor.selected.last
-            # Add Combo box entry for this selected object
-            self.addNodePath(nodePath)
-        else:
-            nodePath = self.nodePathDict.get(name, None)
-            if (nodePath == None):
-                # See if this evaluates into a node path
-                try:
-                    nodePath = eval(name)
-                    if isinstance(nodePath, NodePath):
-                        self.addNodePath(nodePath)
-                    else:
-                        # Good eval but not a node path, give up
-                        nodePath = None
-                except:
-                    # Bogus eval
-                    nodePath = None
-                    # Clear bogus entry from listbox
-                    listbox = self.nodePathMenu.component('scrolledlist')
-                    listbox.setlist(self.nodePathNames)
-            else:
-                if name == 'widget':
-                    # Record relationship between selected nodes and widget
-                    SEditor.selected.getWrtAll()                    
-        # Update active node path
-        self.setActiveNodePath(nodePath)
-
-    def setActiveNodePath(self, nodePath):
-        self['nodePath'] = nodePath
-        if self['nodePath']:
-            self.nodePathMenuEntry.configure(
-                background = self.nodePathMenuBG)
-            # Check to see if node path and ref node path are the same
-            if ((self.refCS != None) and
-                (self.refCS.id() == self['nodePath'].id())):
-                # Yes they are, use temp CS as ref
-                # This calls updatePlacer
-                self.setReferenceNodePath(self.tempCS)
-                # update listbox accordingly
-                self.refNodePathMenu.selectitem('parent')
-            else:
-                # Record initial value and initialize the widgets
-                self.updatePlacer()
-            # Record initial position
-            self.updateResetValues(self['nodePath'])
-            # Set scaling mode based on node path's current scale
-            self.setScalingMode()
-        else:
-            # Flash entry
-            self.nodePathMenuEntry.configure(background = 'Pink')
-
-    def selectRefNodePathNamed(self, name):
-        nodePath = None
-        if name == 'self':
-            nodePath = self.tempCS
-        elif name == 'selected':
-            nodePath = SEditor.selected.last
-            # Add Combo box entry for this selected object
-            self.addRefNodePath(nodePath)
-        elif name == 'parent':
-            nodePath = self['nodePath'].getParent()
-        else:
-            nodePath = self.refNodePathDict.get(name, None)
-            if (nodePath == None):
-                # See if this evaluates into a node path
-                try:
-                    nodePath = eval(name)
-                    if isinstance(nodePath, NodePath):
-                        self.addRefNodePath(nodePath)
-                    else:
-                        # Good eval but not a node path, give up
-                        nodePath = None
-                except:
-                    # Bogus eval
-                    nodePath = None
-                    # Clear bogus entry from listbox
-                    listbox = self.refNodePathMenu.component('scrolledlist')
-                    listbox.setlist(self.refNodePathNames)
-        # Check to see if node path and ref node path are the same
-        if (nodePath != None) and (nodePath.id() == self['nodePath'].id()):
-            # Yes they are, use temp CS and update listbox accordingly
-            nodePath = self.tempCS
-            self.refNodePathMenu.selectitem('parent')
-        # Update ref node path
-        self.setReferenceNodePath(nodePath)
-
-    def setReferenceNodePath(self, nodePath):
-        self.refCS = nodePath
-        if self.refCS:
-            self.refNodePathMenuEntry.configure(
-                background = self.nodePathMenuBG)
-            # Update placer to reflect new state
-            self.updatePlacer()
-        else:
-            # Flash entry
-            self.refNodePathMenuEntry.configure(background = 'Pink')
-        
-    def addNodePath(self, nodePath):
-        self.addNodePathToDict(nodePath, self.nodePathNames,
-                               self.nodePathMenu, self.nodePathDict)
-
-    def addRefNodePath(self, nodePath):
-        self.addNodePathToDict(nodePath, self.refNodePathNames,
-                               self.refNodePathMenu, self.refNodePathDict)
-
-    def addNodePathToDict(self, nodePath, names, menu, dict):
-        if not nodePath:
-            return
-        # Get node path's name
-        name = nodePath.getName()
-        if name in ['parent', 'render', 'camera']:
-            dictName = name
-        else:
-            # Generate a unique name for the dict
-            dictName = name + '-' + `nodePath.id()`
-        if not dict.has_key(dictName):
-            # Update combo box to include new item
-            names.append(dictName)
-            listbox = menu.component('scrolledlist')
-            listbox.setlist(names)
-            # Add new item to dictionary
-            dict[dictName] = nodePath
-        menu.selectitem(dictName)
-
-    def updatePlacer(self):
-        pos = Vec3(0)
-        hpr = Vec3(0)
-        scale = Vec3(1)
-        np = self['nodePath']
-        if (np != None) and isinstance(np, NodePath):
-            # Update temp CS
-            self.updateAuxiliaryCoordinateSystems()
-            # Update widgets
-            if self.movementMode == 'Orbit:':
-                pos.assign(self.posOffset)
-                hpr.assign(ZERO_VEC)
-                scale.assign(np.getScale())
-            elif self.refCS:
-                pos.assign(np.getPos(self.refCS))
-                hpr.assign(np.getHpr(self.refCS))
-                scale.assign(np.getScale())
-        self.updatePosWidgets(pos)
-        self.updateHprWidgets(hpr)
-        self.updateScaleWidgets(scale)
-
-    def updateAuxiliaryCoordinateSystems(self):
-        # Temp CS
-        self.tempCS.setPosHpr(self['nodePath'], 0,0,0,0,0,0)
-        # Orbit CS
-        # At reference
-        self.orbitFromCS.setPos(self.refCS, 0,0,0)
-        # But aligned with target
-        self.orbitFromCS.setHpr(self['nodePath'], 0,0,0)
-        # Also update to CS
-        self.orbitToCS.setPosHpr(self.orbitFromCS, 0,0,0,0,0,0)
-        # Get offset from origin
-        self.posOffset.assign(self['nodePath'].getPos(self.orbitFromCS))
-
-    ### NODE PATH TRANSFORMATION OPERATIONS ###
-    def xform(self, value, axis):
-        if axis in ['sx', 'sy', 'sz']:
-            self.xformScale(value,axis)
-        elif self.movementMode == 'Relative To:':
-            self.xformRelative(value, axis)
-        elif self.movementMode == 'Orbit:':
-            self.xformOrbit(value, axis)
-        if self.nodePathMenu.get() == 'widget':
-            if SEditor.manipulationControl.fSetCoa:
-                # Update coa based on current widget position
-                SEditor.selected.last.mCoa2Dnp.assign(
-                    SEditor.widget.getMat(SEditor.selected.last))
-            else:
-                # Move the objects with the widget
-                SEditor.selected.moveWrtWidgetAll()
-    
-    def xformStart(self, data):
-        # Record undo point
-        self.pushUndo()
-        # If moving widget kill follow task and update wrts
-        if self.nodePathMenu.get() == 'widget':
-            taskMgr.remove('followSelectedNodePath')
-            # Record relationship between selected nodes and widget
-            SEditor.selected.getWrtAll()
-        # Record initial state
-        self.deltaHpr = self['nodePath'].getHpr(self.refCS)
-        # Update placer to reflect new state
-        self.updatePlacer()
-        
-    def xformStop(self, data):
-        # Throw event to signal manipulation done
-        # Send nodepath as a list
-        messenger.send('DIRECT_manipulateObjectCleanup', [[self['nodePath']]])
-        # Update placer to reflect new state
-        self.updatePlacer()
-        # If moving widget restart follow task
-        if self.nodePathMenu.get() == 'widget':
-            # Restart followSelectedNodePath task
-            SEditor.manipulationControl.spawnFollowSelectedNodePathTask()
-
-    def xformRelative(self, value, axis):
-        nodePath = self['nodePath']
-        if (nodePath != None) and (self.refCS != None):
-            if axis == 'x':
-                nodePath.setX(self.refCS, value)
-            elif axis == 'y':
-                nodePath.setY(self.refCS, value)
-            elif axis == 'z':
-                nodePath.setZ(self.refCS, value)
-            else:
-                if axis == 'h':
-                    self.deltaHpr.setX(value)
-                elif axis == 'p':
-                    self.deltaHpr.setY(value)
-                elif axis == 'r':
-                    self.deltaHpr.setZ(value)
-                # Put node path at new hpr
-                nodePath.setHpr(self.refCS, self.deltaHpr)
-
-    def xformOrbit(self, value, axis):
-        nodePath = self['nodePath']
-        if ((nodePath != None) and (self.refCS != None) and
-            (self.orbitFromCS != None) and (self.orbitToCS != None)):
-            if axis == 'x':
-                self.posOffset.setX(value)
-            elif axis == 'y':
-                self.posOffset.setY(value)
-            elif axis == 'z':
-                self.posOffset.setZ(value)
-            elif axis == 'h':
-                self.orbitToCS.setH(self.orbitFromCS, value)
-            elif axis == 'p':
-                self.orbitToCS.setP(self.orbitFromCS, value)
-            elif axis == 'r':
-                self.orbitToCS.setR(self.orbitFromCS, value)
-            nodePath.setPosHpr(self.orbitToCS, self.posOffset, ZERO_VEC)
-
-    def xformScale(self, value, axis):
-        if self['nodePath']:
-            mode = self.scalingMode.get()
-            scale = self['nodePath'].getScale()
-            if mode == 'Scale Free':
-                if axis == 'sx':
-                    scale.setX(value)
-                elif axis == 'sy':
-                    scale.setY(value)
-                elif axis == 'sz':
-                    scale.setZ(value)
-            elif mode == 'Scale Uniform':
-                scale.set(value,value,value)
-            elif mode == 'Scale Proportional':
-                if axis == 'sx':
-                    sf = value/scale[0]
-                elif axis == 'sy':
-                    sf = value/scale[1]
-                elif axis == 'sz':
-                    sf = value/scale[2]
-                scale = scale * sf
-            self['nodePath'].setScale(scale)
-
-    def updatePosWidgets(self, pos):
-        self.posX.set(pos[0])
-        self.posY.set(pos[1])
-        self.posZ.set(pos[2])
-
-    def updateHprWidgets(self, hpr):
-        self.hprH.set(hpr[0])
-        self.hprP.set(hpr[1])
-        self.hprR.set(hpr[2])
-
-    def updateScaleWidgets(self, scale):
-        self.scaleX.set(scale[0])
-        self.scaleY.set(scale[1])
-        self.scaleZ.set(scale[2])
-
-    def zeroAll(self):
-        self.xformStart(None)
-        self.updatePosWidgets(ZERO_VEC)
-        self.updateHprWidgets(ZERO_VEC)
-        self.updateScaleWidgets(UNIT_VEC)
-        self.xformStop(None)
-
-    def zeroPos(self):
-        self.xformStart(None)
-        self.updatePosWidgets(ZERO_VEC)
-        self.xformStop(None)
-
-    def zeroHpr(self):
-        self.xformStart(None)
-        self.updateHprWidgets(ZERO_VEC)
-        self.xformStop(None)
-
-    def unitScale(self):
-        self.xformStart(None)
-        self.updateScaleWidgets(UNIT_VEC)
-        self.xformStop(None)
-
-    def updateResetValues(self, nodePath):
-        self.initPos.assign(nodePath.getPos())
-        self.posX['resetValue'] = self.initPos[0]
-        self.posY['resetValue'] = self.initPos[1]
-        self.posZ['resetValue'] = self.initPos[2]
-        self.initHpr.assign(nodePath.getHpr())
-        self.hprH['resetValue'] = self.initHpr[0]
-        self.hprP['resetValue'] = self.initHpr[1]
-        self.hprR['resetValue'] = self.initHpr[2]
-        self.initScale.assign(nodePath.getScale())
-        self.scaleX['resetValue'] = self.initScale[0]
-        self.scaleY['resetValue'] = self.initScale[1]
-        self.scaleZ['resetValue'] = self.initScale[2]
-
-    def resetAll(self):
-        if self['nodePath']:
-            self.xformStart(None)
-            self['nodePath'].setPosHprScale(
-                self.initPos, self.initHpr, self.initScale)
-            self.xformStop(None)
-
-    def resetPos(self):
-        if self['nodePath']:
-            self.xformStart(None)
-            self['nodePath'].setPos(self.initPos)
-            self.xformStop(None)
-
-    def resetHpr(self):
-        if self['nodePath']:
-            self.xformStart(None)
-            self['nodePath'].setHpr(self.initHpr)
-            self.xformStop(None)
-
-    def resetScale(self):
-        if self['nodePath']:
-            self.xformStart(None)
-            self['nodePath'].setScale(self.initScale)
-            self.xformStop(None)
-
-    def pushUndo(self, fResetRedo = 1):
-        SEditor.pushUndo([self['nodePath']])
-
-    def undoHook(self, nodePathList = []):
-        # Reflect new changes
-        self.updatePlacer()
-
-    def pushUndoHook(self):
-        # Make sure button is reactivated
-        self.undoButton.configure(state = 'normal')
-
-    def undoListEmptyHook(self):
-        # Make sure button is deactivated
-        self.undoButton.configure(state = 'disabled')
-
-    def pushRedo(self):
-        SEditor.pushRedo([self['nodePath']])
-        
-    def redoHook(self, nodePathList = []):
-        # Reflect new changes
-        self.updatePlacer()
-
-    def pushRedoHook(self):
-        # Make sure button is reactivated
-        self.redoButton.configure(state = 'normal')
-
-    def redoListEmptyHook(self):
-        # Make sure button is deactivated
-        self.redoButton.configure(state = 'disabled')
-        
-    def printNodePathInfo(self):
-        np = self['nodePath']
-        if np:
-            name = np.getName()
-            pos = np.getPos()
-            hpr = np.getHpr()
-            scale = np.getScale()
-            posString = '%.2f, %.2f, %.2f' % (pos[0], pos[1], pos[2])
-            hprString = '%.2f, %.2f, %.2f' % (hpr[0], hpr[1], hpr[2])
-            scaleString = '%.2f, %.2f, %.2f' % (scale[0], scale[1], scale[2])
-            print 'NodePath: %s' % name
-            print 'Pos: %s' % posString
-            print 'Hpr: %s' % hprString
-            print 'Scale: %s' % scaleString
-            print ('%s.setPosHprScale(%s, %s, %s)' %
-                   (name, posString, hprString, scaleString))
-
-    def onDestroy(self, event):
-        # Remove hooks
-        for event, method in self.undoEvents:
-            self.ignore(event)
-        self.tempCS.removeNode()
-        self.orbitFromCS.removeNode()
-        self.orbitToCS.removeNode()
-        # send out a message to let sceneEditor know that placer panel has been closed.
-        # Also, stop accepting the updata message from sceneEditor
-        messenger.send('Placer_close')
-        self.ignore('placerUpdate')
-        
-def place(nodePath):
-    return Placer(nodePath = nodePath)
-
-######################################################################
-
-# Create demo in root window for testing.
-if __name__ == '__main__':
-    root = Pmw.initialise()
-    widget = Placer()
-

+ 0 - 209
doc/SceneEditor/seSceneGraphExplorer.py

@@ -1,209 +0,0 @@
-#################################################################
-# seSceneGraphExplorer.py
-# Originally from SceneGraphExplorer.py
-# Altered by Yi-Hong Lin, [email protected], 2004
-#
-# we need a customized SceneGraphExplorer.
-#
-# Do forget to check the seTree. 
-#
-#################################################################
-from direct.showbase.DirectObject import DirectObject
-from Tkinter import IntVar, Frame, Label
-from seTree import TreeNode, TreeItem
-import Pmw, Tkinter
-
-# changing these strings requires changing sceneEditor.py SGE_ strs too!
-# This list of items will be showed on the pop out window when user right click on
-# any node on the graph. And, this is also the main reason we decide to copy from
-# the original one but not inherited from it.
-# Because except drawing part, we have changed a lot of things...
-DEFAULT_MENU_ITEMS = [
-    'Update Explorer',
-    'Separator',
-    'Properties',
-    'Separator',
-    'Duplicate',
-    'Remove',
-    'Add Dummy',
-    'Add Collision Object',
-    'Metadata',
-    'Separator',
-    'Set as Reparent Target',
-    'Reparent to Target',
-    'Separator',
-    'Animation Panel',
-    'Blend Animation Panel',
-    'MoPath Panel',
-    'Align Tool',
-    'Separator']
-
-class seSceneGraphExplorer(Pmw.MegaWidget, DirectObject):
-    "Graphical display of a scene graph"
-    def __init__(self, parent = None, nodePath = render, **kw): 
-        # Define the megawidget options.
-        optiondefs = (
-            ('menuItems',   [],   Pmw.INITOPT),
-            )
-        self.defineoptions(kw, optiondefs)
- 
-        # Initialise superclass
-        Pmw.MegaWidget.__init__(self, parent)
-        
-        # Initialize some class variables
-        self.nodePath = nodePath
-
-        # Create the components.
-        
-        # Setup up container
-        interior = self.interior()
-        interior.configure(relief = Tkinter.GROOVE, borderwidth = 2)
-        
-        # Create a label and an entry
-        self._scrolledCanvas = self.createcomponent(
-            'scrolledCanvas',
-            (), None,
-            Pmw.ScrolledCanvas, (interior,),
-            hull_width = 200, hull_height = 300,
-            usehullsize = 1)
-        self._canvas = self._scrolledCanvas.component('canvas')
-        self._canvas['scrollregion'] = ('0i', '0i', '2i', '4i')
-        self._scrolledCanvas.resizescrollregion()
-        self._scrolledCanvas.pack(padx = 3, pady = 3, expand=1, fill = Tkinter.BOTH)
-        
-        self._canvas.bind('<ButtonPress-2>', self.mouse2Down)
-        self._canvas.bind('<B2-Motion>', self.mouse2Motion)
-        self._canvas.bind('<Configure>',
-                          lambda e, sc = self._scrolledCanvas:
-                          sc.resizescrollregion())
-        self.interior().bind('<Destroy>', self.onDestroy)
-        
-        # Create the contents
-        self._treeItem = SceneGraphExplorerItem(self.nodePath)
-
-        self._node = TreeNode(self._canvas, None, self._treeItem,
-                              DEFAULT_MENU_ITEMS + self['menuItems'])
-        self._node.expand()
-
-        self._parentFrame = Frame(interior)
-        self._label = self.createcomponent(
-            'parentLabel',
-            (), None,
-            Label, (interior,),
-            text = 'Active Reparent Target: ',
-            anchor = Tkinter.W, justify = Tkinter.LEFT)
-        self._label.pack(fill = Tkinter.X)
-
-        # Add update parent label
-        def updateLabel(nodePath = None, s = self):
-            s._label['text'] = 'Active Reparent Target: ' + nodePath.getName()
-        self.accept('DIRECT_activeParent', updateLabel)
-
-        # Add update hook
-        self.accept('SGE_Update Explorer',
-                    lambda np, s = self: s.update())
-
-        # Check keywords and initialise options based on input values.
-        self.initialiseoptions(seSceneGraphExplorer)
-
-    def update(self):
-        """ Refresh scene graph explorer """
-        self._node.update()
-
-    def mouse2Down(self, event):
-        self._width = 1.0 * self._canvas.winfo_width()
-        self._height = 1.0 * self._canvas.winfo_height()
-        xview = self._canvas.xview()
-        yview = self._canvas.yview()        
-        self._left = xview[0]
-        self._top = yview[0]
-        self._dxview = xview[1] - xview[0]
-        self._dyview = yview[1] - yview[0]
-        self._2lx = event.x
-        self._2ly = event.y
-
-    def mouse2Motion(self,event):
-        newx = self._left - ((event.x - self._2lx)/self._width) * self._dxview
-        self._canvas.xview_moveto(newx)
-        newy = self._top - ((event.y - self._2ly)/self._height) * self._dyview
-        self._canvas.yview_moveto(newy)
-        self._2lx = event.x
-        self._2ly = event.y
-        self._left = self._canvas.xview()[0]
-        self._top = self._canvas.yview()[0]
-
-    def onDestroy(self, event):
-        # Remove hooks
-        self.ignore('DIRECT_activeParent')
-        self.ignore('SGE_Update Explorer')
-
-    def deSelectTree(self):
-        self._node.deselecttree()
-
-    def selectNodePath(self,nodePath, callBack=True):
-        item = self._node.find(nodePath.id())
-        if item!= None:
-            item.select(callBack)
-        else:
-            print '----SGE: Error Selection'
-
-class SceneGraphExplorerItem(TreeItem):
-
-    """Example TreeItem subclass -- browse the file system."""
-
-    def __init__(self, nodePath):
-        self.nodePath = nodePath
-
-    def GetText(self):
-        type = self.nodePath.node().getType().getName()
-        name = self.nodePath.getName()
-        return type + "  " + name
-
-    def GetTextForEdit(self):
-        name = self.nodePath.getName()
-        return name
-
-    def GetKey(self):
-        return self.nodePath.id()
-
-    def IsEditable(self):
-        # All nodes' names can be edited nowadays.
-        return 1
-        #return issubclass(self.nodePath.node().__class__, NamedNode)
-
-    def SetText(self, text):
-        try:
-            messenger.send('SGE_changeName', [self.nodePath, text])
-        except AttributeError:
-            pass
-
-    def GetIconName(self):
-        return "sphere2" # XXX wish there was a "file" icon
-
-    def IsExpandable(self):
-        return self.nodePath.getNumChildren() != 0
-
-    def GetSubList(self):
-        sublist = []
-        for nodePath in self.nodePath.getChildren():
-            item = SceneGraphExplorerItem(nodePath)
-            sublist.append(item)
-        return sublist
-
-    def OnSelect(self, callback):
-        messenger.send('SGE_Flash', [self.nodePath])
-        if not callback:
-            messenger.send('SGE_madeSelection', [self.nodePath, callback])
-        else:
-            messenger.send('SGE_madeSelection', [self.nodePath])
-
-    def MenuCommand(self, command):
-        messenger.send('SGE_' + command, [self.nodePath])
-
-
-def explore(nodePath = render):
-    tl = Toplevel()
-    tl.title('Explore: ' + nodePath.getName())
-    sge = seSceneGraphExplorer(parent = tl, nodePath = nodePath)
-    sge.pack(expand = 1, fill = 'both')
-    return sge

+ 0 - 715
doc/SceneEditor/seSelection.py

@@ -1,715 +0,0 @@
-#################################################################
-# seSelection.py
-# Originally from DirectSelection.py
-# Altered by Yi-Hong Lin, [email protected], 2004
-#
-# We didn't change anything essential.
-# Just because we customized the seSession from DirectSession,
-# So we need related files can follow the change.
-# However, we don't want to change anything inside the original directool
-# to let them can work with our scene editor.
-# (If we do change original directools, it will force user has to install the latest version of OUR Panda)
-#
-#################################################################
-from pandac.PandaModules import GeomNode
-from direct.directtools.DirectGlobals import *
-from direct.directtools.DirectUtil import *
-from seGeometry import *
-from direct.showbase.DirectObject import *
-from quad import *
-COA_ORIGIN = 0
-COA_CENTER = 1
-
-# MRM: To do: handle broken node paths in selected and deselected dicts
-class DirectNodePath(NodePath):
-    # A node path augmented with info, bounding box, and utility methods
-    def __init__(self, nodePath):
-        # Initialize the superclass
-        NodePath.__init__(self)
-        self.assign(nodePath)
-        # Create a bounding box
-        self.bbox = DirectBoundingBox(self)
-        center = self.bbox.getCenter()
-        # Create matrix to hold the offset between the nodepath
-        # and its center of action (COA)
-        self.mCoa2Dnp = Mat4(Mat4.identMat())
-        if SEditor.coaMode == COA_CENTER:
-            self.mCoa2Dnp.setRow(3, Vec4(center[0], center[1], center[2], 1))
-            
-        # Transform from nodePath to widget
-        self.tDnp2Widget = TransformState.makeIdentity()
-
-    def highlight(self):
-        self.bbox.show()
-
-    def dehighlight(self):
-        self.bbox.hide()
-
-    def getCenter(self):
-        return self.bbox.getCenter()
-
-    def getRadius(self):
-        return self.bbox.getRadius()
-
-    def getMin(self):
-        return self.bbox.getMin()
-
-    def getMax(self):
-        return self.bbox.getMax()
-
-class SelectedNodePaths(DirectObject):
-    def __init__(self):
-        self.reset()
-
-    def reset(self):
-        self.selectedDict = {}
-        self.deselectedDict = {}
-        __builtins__["last"] = self.last = None
-
-    def select(self, nodePath, fMultiSelect = 0):
-        """ Select the specified node path.  Multiselect as required """
-        # Do nothing if nothing selected
-        if not nodePath:
-            print 'Nothing selected!!'
-            return None
-        
-        # Reset selected objects and highlight if multiSelect is false
-        if not fMultiSelect:
-            self.deselectAll()
-        
-        # Get this pointer
-        id = nodePath.id()
-        # First see if its already in the selected dictionary
-        dnp = self.getSelectedDict(id)
-        # If so, we're done
-        if not dnp:
-            # See if it is in the deselected dictionary
-            dnp = self.getDeselectedDict(id)
-            if dnp:
-                # Remove it from the deselected dictionary
-                del(self.deselectedDict[id])
-                # Show its bounding box
-                dnp.highlight()
-            else:
-                # Didn't find it, create a new selectedNodePath instance
-                dnp = DirectNodePath(nodePath)
-                # Show its bounding box
-                dnp.highlight()
-            # Add it to the selected dictionary
-            self.selectedDict[dnp.id()] = dnp
-        # And update last
-        __builtins__["last"] = self.last = dnp
-        return dnp
-
-    def deselect(self, nodePath):
-        """ Deselect the specified node path """
-        # Get this pointer
-        id = nodePath.id()
-        # See if it is in the selected dictionary
-        dnp = self.getSelectedDict(id)
-        if dnp:
-            # It was selected:
-            # Hide its bounding box
-            dnp.dehighlight()
-            # Remove it from the selected dictionary
-            del(self.selectedDict[id])
-            # And keep track of it in the deselected dictionary
-            self.deselectedDict[id] = dnp
-            # Send a message
-            messenger.send('DIRECT_deselectedNodePath', [dnp])
-        return dnp
-
-    def getSelectedAsList(self):
-        """
-        Return a list of all selected node paths.  No verification of
-        connectivity is performed on the members of the list
-        """
-        return self.selectedDict.values()[:]
-
-    def __getitem__(self,index):
-        return self.getSelectedAsList()[index]
-
-    def getSelectedDict(self, id):
-        """
-        Search selectedDict for node path, try to repair broken node paths.
-        """
-        dnp = self.selectedDict.get(id, None)
-        if dnp:
-            return dnp
-        else:
-            # Not in selected dictionary
-            return None
-
-    def getDeselectedAsList(self):
-        return self.deselectedDict.values()[:]
-
-    def getDeselectedDict(self, id):
-        """
-        Search deselectedDict for node path, try to repair broken node paths.
-        """
-        dnp = self.deselectedDict.get(id, None)
-        if dnp:
-            # Yes
-            return dnp
-        else:
-            # Not in deselected dictionary
-            return None
-
-    def forEachSelectedNodePathDo(self, func):
-        """
-        Perform given func on selected node paths.  No node path
-        connectivity verification performed
-        """
-        selectedNodePaths = self.getSelectedAsList()
-        for nodePath in selectedNodePaths:
-            func(nodePath)
-
-    def forEachDeselectedNodePathDo(self, func):
-        """
-        Perform given func on deselected node paths.  No node path
-        connectivity verification performed
-        """
-        deselectedNodePaths = self.getDeselectedAsList()
-        for nodePath in deselectedNodePaths:
-            func(nodePath)
-
-    def getWrtAll(self):
-        self.forEachSelectedNodePathDo(self.getWrt)
-
-    def getWrt(self, nodePath):
-        nodePath.tDnp2Widget = nodePath.getTransform(SEditor.widget)
-
-    def moveWrtWidgetAll(self):
-        self.forEachSelectedNodePathDo(self.moveWrtWidget)
-
-    def moveWrtWidget(self, nodePath):
-        nodePath.setTransform(SEditor.widget, nodePath.tDnp2Widget)
-
-    def deselectAll(self):
-        self.forEachSelectedNodePathDo(self.deselect)
-
-    def highlightAll(self):
-        self.forEachSelectedNodePathDo(DirectNodePath.highlight)
-
-    def dehighlightAll(self):
-        self.forEachSelectedNodePathDo(DirectNodePath.dehighlight)
-
-    def removeSelected(self):
-        selected = self.last
-        if selected:
-            selected.remove()
-        __builtins__["last"] = self.last = None
-        
-    def removeAll(self):
-        # Remove all selected nodePaths from the Scene Graph
-        self.forEachSelectedNodePathDo(NodePath.remove)
-
-    def toggleVisSelected(self):
-        selected = self.last
-        # Toggle visibility of selected node paths
-        if selected:
-            selected.toggleVis()
-
-    def toggleVisAll(self):
-        # Toggle viz for all selected node paths
-        self.forEachSelectedNodePathDo(NodePath.toggleVis)
-
-    def isolateSelected(self):
-        selected = self.last
-        if selected:
-            selected.isolate()
-
-    def getDirectNodePath(self, nodePath):
-        # Get this pointer
-        id = nodePath.id()
-        # First check selected dict
-        dnp = self.getSelectedDict(id)
-        if dnp:
-            return dnp
-        # Otherwise return result of deselected search
-        return self.getDeselectedDict(id)
-
-    def getNumSelected(self):
-        return len(self.selectedDict.keys())
-
-
-class DirectBoundingBox:
-    def __init__(self, nodePath):
-        # Record the node path
-        self.nodePath = nodePath
-        # Compute bounds, min, max, etc.
-        self.computeTightBounds()
-        # Generate the bounding box
-        self.lines = self.createBBoxLines()
-
-    def computeTightBounds(self):
-        # Compute bounding box using tighter calcTightBounds function
-        # Need to clear out existing transform on node path
-        tMat = Mat4()
-        tMat.assign(self.nodePath.getMat())
-        self.nodePath.clearMat()
-        # Get bounds
-        self.min = Point3(0)
-        self.max = Point3(0)
-        self.nodePath.calcTightBounds(self.min,self.max)
-        # Calc center and radius
-        self.center = Point3((self.min + self.max)/2.0)
-        self.radius = Vec3(self.max - self.min).length()
-        # Restore transform
-        self.nodePath.setMat(tMat)
-        del tMat
-        
-    def computeBounds(self):
-        self.bounds = self.getBounds()
-        if self.bounds.isEmpty() or self.bounds.isInfinite():
-            self.center = Point3(0)
-            self.radius = 1.0
-        else:
-            self.center = self.bounds.getCenter()
-            self.radius = self.bounds.getRadius()
-        self.min = Point3(self.center - Point3(self.radius))
-        self.max = Point3(self.center + Point3(self.radius))
-        
-    def createBBoxLines(self):
-        # Create a line segments object for the bbox
-        lines = LineNodePath(hidden)
-        lines.node().setName('bboxLines')
-        lines.setColor( VBase4( 1., 0., 0., 1. ) )
-        lines.setThickness( 0.5 )
-
-        minX = self.min[0]
-        minY = self.min[1]
-        minZ = self.min[2]
-        maxX = self.max[0]
-        maxY = self.max[1]
-        maxZ = self.max[2]
-        
-        # Bottom face
-        lines.moveTo( minX, minY, minZ )
-        lines.drawTo( maxX, minY, minZ )
-        lines.drawTo( maxX, maxY, minZ )
-        lines.drawTo( minX, maxY, minZ )
-        lines.drawTo( minX, minY, minZ )
-
-        # Front Edge/Top face
-        lines.drawTo( minX, minY, maxZ )
-        lines.drawTo( maxX, minY, maxZ )
-        lines.drawTo( maxX, maxY, maxZ )
-        lines.drawTo( minX, maxY, maxZ )
-        lines.drawTo( minX, minY, maxZ )
-
-        # Three remaining edges
-        lines.moveTo( maxX, minY, minZ )
-        lines.drawTo( maxX, minY, maxZ )
-        lines.moveTo( maxX, maxY, minZ )
-        lines.drawTo( maxX, maxY, maxZ )
-        lines.moveTo( minX, maxY, minZ )
-        lines.drawTo( minX, maxY, maxZ )
-
-        # Create and return bbox lines
-        lines.create()
-        
-        # Make sure bbox is never lit or drawn in wireframe
-        useDirectRenderStyle(lines)
-        
-        return lines
-
-    def updateBBoxLines(self):
-        ls = self.lines.lineSegs
-        
-        minX = self.min[0]
-        minY = self.min[1]
-        minZ = self.min[2]
-        maxX = self.max[0]
-        maxY = self.max[1]
-        maxZ = self.max[2]
-        
-        # Bottom face
-        ls.setVertex( 0, minX, minY, minZ )
-        ls.setVertex( 1, maxX, minY, minZ )
-        ls.setVertex( 2, maxX, maxY, minZ )
-        ls.setVertex( 3, minX, maxY, minZ )
-        ls.setVertex( 4, minX, minY, minZ )
-
-        # Front Edge/Top face
-        ls.setVertex( 5, minX, minY, maxZ )
-        ls.setVertex( 6, maxX, minY, maxZ )
-        ls.setVertex( 7, maxX, maxY, maxZ )
-        ls.setVertex( 8, minX, maxY, maxZ )
-        ls.setVertex( 9, minX, minY, maxZ )
-
-        # Three remaining edges
-        ls.setVertex( 10, maxX, minY, minZ )
-        ls.setVertex( 11, maxX, minY, maxZ )
-        ls.setVertex( 12, maxX, maxY, minZ )
-        ls.setVertex( 13, maxX, maxY, maxZ )
-        ls.setVertex( 14, minX, maxY, minZ )
-        ls.setVertex( 15, minX, maxY, maxZ )
-
-    def getBounds(self):
-        # Get a node path's bounds
-        nodeBounds = BoundingSphere()
-        nodeBounds.extendBy(self.nodePath.node().getInternalBound())
-        for child in self.nodePath.getChildren():
-            nodeBounds.extendBy(child.getBounds())
-        return nodeBounds.makeCopy()
-
-    def show(self):
-        self.lines.reparentTo(self.nodePath)
-
-    def hide(self):
-        self.lines.reparentTo(hidden)
-        
-    def getCenter(self):
-        return self.center
-
-    def getRadius(self):
-        return self.radius
-
-    def getMin(self):
-        return self.min
-
-    def getMax(self):
-        return self.max
-
-    def vecAsString(self, vec):
-        return '%.2f %.2f %.2f' % (vec[0], vec[1], vec[2])
-
-    def __repr__(self):
-        return (`self.__class__` + 
-                '\nNodePath:\t%s\n' % self.nodePath.getName() +
-                'Min:\t\t%s\n' % self.vecAsString(self.min) +
-                'Max:\t\t%s\n' % self.vecAsString(self.max) +
-                'Center:\t\t%s\n' % self.vecAsString(self.center) +
-                'Radius:\t\t%.2f' % self.radius
-                )
-
-
-class SelectionQueue(CollisionHandlerQueue):
-    def __init__(self, parentNP = render):
-        # Initialize the superclass
-        CollisionHandlerQueue.__init__(self)
-        # Current index and entry in collision queue
-        self.index = -1
-        self.entry = None
-        self.skipFlags = SKIP_NONE
-        # Create a collision node path attached to the given NP
-        self.collisionNodePath = NodePath(CollisionNode("collisionNP"))
-        self.setParentNP(parentNP)
-        # Don't pay the penalty of drawing this collision ray
-        self.collisionNodePath.hide()
-        self.collisionNode = self.collisionNodePath.node()
-        # Intersect with geometry to begin with
-        self.collideWithGeom()
-        # And a traverser to do the actual collision tests
-        self.ct = CollisionTraverser()
-        # Let the traverser know about the collision node and the queue
-        #Manakel 2/12/2005: replace CollisionNode by its nodepath
-        self.ct.addCollider(self.collisionNodePath, self)
-        # List of objects that can't be selected
-        self.unpickable = UNPICKABLE
-        # Derived class must add Collider to complete initialization
-
-    def setParentNP(self, parentNP):
-        # Update collisionNodePath's parent
-        self.collisionNodePath.reparentTo(parentNP)
-
-    def addCollider(self, collider):
-        # Inherited class must call this function to specify collider object
-        # Record collision object
-        self.collider = collider
-        # Add the collider to the collision Node
-        self.collisionNode.addSolid( self.collider )
-
-    def collideWithBitMask(self, bitMask):
-        # The into collide mask is the bit pattern colliders look at
-        # when deciding whether or not to test for a collision "into"
-        # this collision solid.  Set to all Off so this collision solid
-        # will not be considered in any collision tests
-        self.collisionNode.setIntoCollideMask(BitMask32().allOff())
-        # The from collide mask is the bit pattern *this* collision solid
-        # compares against the into collide mask of candidate collision solids
-        # Turn this mask all off since we're not testing for collisions against
-        # collision solids
-        self.collisionNode.setFromCollideMask(bitMask)
-
-    def collideWithGeom(self):
-        # The into collide mask is the bit pattern colliders look at
-        # when deciding whether or not to test for a collision "into"
-        # this collision solid.  Set to all Off so this collision solid
-        # will not be considered in any collision tests
-        self.collisionNode.setIntoCollideMask(BitMask32().allOff())
-        # The from collide mask is the bit pattern *this* collision solid
-        # compares against the into collide mask of candidate collision solids
-        # Turn this mask all off since we're not testing for collisions against
-        # collision solids, but we do want to test against geometry
-        self.collisionNode.setFromCollideMask(GeomNode.getDefaultCollideMask())
-
-    def collideWithWidget(self):
-        # This collision node should not be tested against by any other
-        # collision solids
-        self.collisionNode.setIntoCollideMask(BitMask32().allOff())
-        # This collision node will test for collisions with any collision
-        # solids with a bit mask set to 0x80000000
-        mask = BitMask32()
-        mask.setBit(31)
-        self.collisionNode.setFromCollideMask(mask)
-
-    def addUnpickable(self, item):
-        if item not in self.unpickable:
-            self.unpickable.append(item)
-
-    def removeUnpickable(self, item):
-        if item in self.unpickable:
-            self.unpickable.remove(item)
-
-    def setCurrentIndex(self, index):
-        if (index < 0) or (index >= self.getNumEntries()):
-            self.index = -1
-        else:
-            self.index = index
-
-    def setCurrentEntry(self, entry):
-        self.entry = entry
-
-    def getCurrentEntry(self):
-        return self.entry
-
-    def isEntryBackfacing(self, entry):
-        # If dot product of collision point surface normal and
-        # ray from camera to collision point is positive, we are
-        # looking at the backface of the polygon
-        if not entry.hasSurfaceNormal():
-            # Well, no way to tell.  Assume we're not backfacing.
-            return 0
-
-        fromNodePath = entry.getFromNodePath()
-        v = Vec3(entry.getSurfacePoint(fromNodePath))
-        n = entry.getSurfaceNormal(fromNodePath)
-        # Convert to camera space for backfacing test
-        if self.collisionNodePath.getParent() != base.cam:
-            # Problem: assumes base.cam is the camera in question
-            p2cam = self.collisionNodePath.getParent().getMat(base.cam)
-            v = Vec3(p2cam.xformPoint(v))
-            n = p2cam.xformVec(n)
-        # Normalize and check angle between to vectors
-        v.normalize()
-        return v.dot(n) >= 0
-
-    def findNextCollisionEntry(self, skipFlags = SKIP_NONE):
-        return self.findCollisionEntry(skipFlags, self.index + 1)
-
-    def findCollisionEntry(self, skipFlags = SKIP_NONE, startIndex = 0 ):
-        # Init self.index and self.entry
-        self.setCurrentIndex(-1)
-        self.setCurrentEntry(None)
-        # Pick out the closest object that isn't a widget
-        for i in range(startIndex,self.getNumEntries()):
-            entry = self.getEntry(i)
-            nodePath = entry.getIntoNodePath()
-            if (skipFlags & SKIP_HIDDEN) and nodePath.isHidden():
-                # Skip if hidden node
-                pass
-            elif (skipFlags & SKIP_BACKFACE) and self.isEntryBackfacing(entry):
-                # Skip, if backfacing poly
-                pass
-            elif ((skipFlags & SKIP_CAMERA) and
-                  (camera in nodePath.getAncestors())):
-                # Skip if parented to a camera.
-                pass
-            # Can pick unpickable, use the first visible node
-            elif ((skipFlags & SKIP_UNPICKABLE) and
-                  (nodePath.getName() in self.unpickable)):
-                # Skip if in unpickable list
-                pass
-            else:
-                self.setCurrentIndex(i)
-                self.setCurrentEntry(entry)
-                break
-        return self.getCurrentEntry()
-
-class SelectionRay(SelectionQueue):
-    def __init__(self, parentNP = render):
-        # Initialize the superclass
-        SelectionQueue.__init__(self, parentNP)
-        self.addCollider(CollisionRay())
-    
-    def pick(self, targetNodePath, xy = None):
-        # Determine ray direction based upon the mouse coordinates
-        if xy:
-            mx = xy[0]
-            my = xy[1]
-        elif direct:
-            mx = SEditor.dr.mouseX
-            my = SEditor.dr.mouseY
-        else:
-            if not base.mouseWatcherNode.hasMouse():
-                # No mouse in window.
-                self.clearEntries()
-                return
-            mx = base.mouseWatcherNode.getMouseX()
-            my = base.mouseWatcherNode.getMouseY()
-        #base.mouseWatcherNode.setDisplayRegion(base.win.getDisplayRegion(0))
-        #mx = base.mouseWatcherNode.getMouseX()+1
-        #my = base.mouseWatcherNode.getMouseY()+1
-        #print base.camNode.getName()
-        #print "Arrived X" + str(mx) + " Arrived Y " + str(my) 
-        self.collider.setFromLens( base.camNode, mx, my )
-
-        self.ct.traverse( targetNodePath )
-        self.sortEntries()
-
-
-    def pickBitMask(self, bitMask = BitMask32.allOff(),
-                    targetNodePath = render,
-                    skipFlags = SKIP_ALL ):
-        self.collideWithBitMask(bitMask)
-        self.pick(targetNodePath)
-        # Determine collision entry
-        return self.findCollisionEntry(skipFlags)
-
-    def pickGeom(self, targetNodePath = render, skipFlags = SKIP_ALL,
-                 xy = None):
-        self.collideWithGeom()
-        self.pick(targetNodePath, xy = xy)
-        # Determine collision entry
-        return self.findCollisionEntry(skipFlags)
-
-    def pickWidget(self, targetNodePath = render, skipFlags = SKIP_NONE ):
-        self.collideWithWidget()
-        self.pick(targetNodePath)
-        # Determine collision entry
-        return self.findCollisionEntry(skipFlags)
-
-    def pick3D(self, targetNodePath, origin, dir):
-        # Determine ray direction based upon the mouse coordinates
-        self.collider.setOrigin( origin )
-        self.collider.setDirection( dir )
-        self.ct.traverse( targetNodePath )
-        self.sortEntries()
-        
-    def pickGeom3D(self, targetNodePath = render,
-                   origin = Point3(0), dir = Vec3(0,0,-1),
-                   skipFlags = SKIP_HIDDEN | SKIP_CAMERA ):
-        self.collideWithGeom()
-        self.pick3D(targetNodePath, origin, dir)
-        # Determine collision entry
-        return self.findCollisionEntry(skipFlags)
-
-    def pickBitMask3D(self, bitMask = BitMask32.allOff(),
-                      targetNodePath = render,
-                      origin = Point3(0), dir = Vec3(0,0,-1),
-                      skipFlags = SKIP_ALL ):
-        self.collideWithBitMask(bitMask)
-        self.pick3D(targetNodePath, origin, dir)
-        # Determine collision entry
-        return self.findCollisionEntry(skipFlags)
-
-
-class SelectionSegment(SelectionQueue):
-    # Like a selection ray but with two endpoints instead of an endpoint
-    # and a direction
-    def __init__(self, parentNP = render, numSegments = 1):
-        # Initialize the superclass
-        SelectionQueue.__init__(self, parentNP)
-        self.colliders = []
-        self.numColliders = 0
-        for i in range(numSegments):
-            self.addCollider(CollisionSegment())
-    
-    def addCollider(self, collider):
-        # Record new collision object
-        self.colliders.append(collider)
-        # Add the collider to the collision Node
-        self.collisionNode.addSolid( collider )
-        self.numColliders += 1
-
-    def pickGeom(self, targetNodePath = render, endPointList = [],
-                 skipFlags = SKIP_HIDDEN | SKIP_CAMERA ):
-        self.collideWithGeom()
-        for i in range(min(len(endPointList), self.numColliders)):
-            pointA, pointB = endPointList[i]
-            collider = self.colliders[i]
-            collider.setPointA( pointA )
-            collider.setPointB( pointB )
-        self.ct.traverse( targetNodePath )
-        # Determine collision entry
-        return self.findCollisionEntry(skipFlags)
-
-    def pickBitMask(self, bitMask = BitMask32.allOff(),
-                    targetNodePath = render, endPointList = [],
-                 skipFlags = SKIP_HIDDEN | SKIP_CAMERA ):
-        self.collideWithBitMask(bitMask)
-        for i in range(min(len(endPointList), self.numColliders)):
-            pointA, pointB = endPointList[i]
-            collider = self.colliders[i]
-            collider.setPointA( pointA )
-            collider.setPointB( pointB )
-        self.ct.traverse( targetNodePath )
-        # Determine collision entry
-        return self.findCollisionEntry(skipFlags)
-
-
-class SelectionSphere(SelectionQueue):
-    # Wrapper around collision sphere
-    def __init__(self, parentNP = render, numSpheres = 1):
-        # Initialize the superclass
-        SelectionQueue.__init__(self, parentNP)
-        self.colliders = []
-        self.numColliders = 0
-        for i in range(numSpheres):
-            self.addCollider(CollisionSphere(Point3(0), 1))
-        
-    def addCollider(self, collider):
-        # Record new collision object
-        self.colliders.append(collider)
-        # Add the collider to the collision Node
-        self.collisionNode.addSolid( collider )
-        self.numColliders += 1
-    
-    def setCenter(self, i, center):
-        c = self.colliders[i]
-        c.setCenter(center)
-    
-    def setRadius(self, i, radius):
-        c = self.colliders[i]
-        c.setRadius(radius)
-    
-    def setCenterRadius(self, i, center, radius):
-        c = self.colliders[i]
-        c.setCenter(center)
-        c.setRadius(radius)
-    
-    def isEntryBackfacing(self, entry):
-        # If dot product of collision point surface normal and
-        # ray from sphere origin to collision point is positive, 
-        # center is on the backside of the polygon
-        fromNodePath = entry.getFromNodePath()
-        v = Vec3(entry.getSurfacePoint(fromNodePath) -
-                 entry.getFrom().getCenter())
-        n = entry.getSurfaceNormal(fromNodePath)
-        # If points almost on top of each other, reject face
-        # (treat as backfacing)
-        if v.length() < 0.05:
-            return 1
-        # Normalize and check angle between to vectors
-        v.normalize()
-        return v.dot(n) >= 0
-
-
-    def pick(self, targetNodePath, skipFlags):
-        self.ct.traverse( targetNodePath )
-        self.sortEntries()
-        return self.findCollisionEntry(skipFlags)
-
-    def pickGeom(self, targetNodePath = render,
-                 skipFlags = SKIP_HIDDEN | SKIP_CAMERA ):
-        self.collideWithGeom()
-        return self.pick(targetNodePath, skipFlags)
-    
-    def pickBitMask(self, bitMask = BitMask32.allOff(),
-                    targetNodePath = render,
-                    skipFlags = SKIP_HIDDEN | SKIP_CAMERA ):
-        self.collideWithBitMask(bitMask)
-        return self.pick(targetNodePath, skipFlags)
-

+ 0 - 991
doc/SceneEditor/seSession.py

@@ -1,991 +0,0 @@
-#################################################################
-# seSession.py
-# Originally from DirectSession.py
-# Altered by Yi-Hong Lin, [email protected], 2004
-#
-# We took out a lot of stuff we don't need in the sceneeditor.
-# This is also the main reason we didn't just inherite the original directSession.
-# Also, the way of selecting, renaming and some hot-key controls are changed.
-#
-#################################################################
-from direct.showbase.DirectObject import *
-from direct.directtools.DirectGlobals import *
-from direct.directtools.DirectUtil import*
-from direct.interval.IntervalGlobal import *
-from seCameraControl import *
-from seManipulation import *
-from seSelection import *
-from seGrid import *
-from seGeometry import *
-from direct.tkpanels import Placer
-from direct.tkwidgets import Slider
-from direct.gui import OnscreenText
-import types
-import string
-from direct.showbase import Loader
-
-class SeSession(DirectObject):  ### Customized DirectSession
-
-    def __init__(self):
-        # Establish a global pointer to the direct object early on
-        # so dependant classes can access it in their code
-        __builtins__["SEditor"] = self
-        # These come early since they are used later on
-        self.group = render.attachNewNode('SEditor')
-        self.font = TextNode.getDefaultFont()
-        self.fEnabled = 0
-        self.drList = DisplayRegionList()
-        self.iRayList = map(lambda x: x.iRay, self.drList)
-        self.dr = self.drList[0]
-        self.camera = base.camera
-        self.trueCamera = self.camera
-        self.iRay = self.dr.iRay
-        self.coaMode = COA_ORIGIN
-
-        self.enableAutoCamera = True
-
-        self.cameraControl = DirectCameraControl()
-        self.manipulationControl = DirectManipulationControl()
-        self.useObjectHandles()
-        self.grid = DirectGrid()
-        self.grid.disable()
-        
-        # Initialize the collection of selected nodePaths
-        self.selected = SelectedNodePaths()
-        # Ancestry of currently selected object
-        self.ancestry = []
-        self.ancestryIndex = 0
-        self.activeParent = None
-
-        self.selectedNPReadout = OnscreenText.OnscreenText(
-            pos = (-1.0, -0.9), bg=Vec4(1,1,1,1),
-            scale = 0.05, align = TextNode.ALeft,
-            mayChange = 1, font = self.font)
-        # Make sure readout is never lit or drawn in wireframe
-        useDirectRenderStyle(self.selectedNPReadout)
-        self.selectedNPReadout.reparentTo(hidden)
-
-        self.activeParentReadout = OnscreenText.OnscreenText(
-            pos = (-1.0, -0.975), bg=Vec4(1,1,1,1),
-            scale = 0.05, align = TextNode.ALeft,
-            mayChange = 1, font = self.font)
-        # Make sure readout is never lit or drawn in wireframe
-        useDirectRenderStyle(self.activeParentReadout)
-        self.activeParentReadout.reparentTo(hidden)
-
-        self.directMessageReadout = OnscreenText.OnscreenText(
-            pos = (-1.0, 0.9), bg=Vec4(1,1,1,1),
-            scale = 0.05, align = TextNode.ALeft,
-            mayChange = 1, font = self.font)
-        # Make sure readout is never lit or drawn in wireframe
-        useDirectRenderStyle(self.directMessageReadout)
-        self.directMessageReadout.reparentTo(hidden)
-
-        self.fControl = 0
-        self.fAlt = 0
-        self.fShift = 0
-
-        self.pos = VBase3()
-        self.hpr = VBase3()
-        self.scale = VBase3()
-
-        self.hitPt = Point3(0.0)
-
-        # Lists for managing undo/redo operations
-        self.undoList = []
-        self.redoList = []
-        
-        # One run through the context task to init everything
-        self.drList.updateContext()
-        for dr in self.drList:
-            dr.camUpdate()
-
-        
-
-        self.modifierEvents = ['control', 'control-up',
-                              'shift', 'shift-up',
-                              'alt', 'alt-up',
-                              ]
-        self.keyEvents = ['escape', 'delete', 'page_up', 'page_down', 
-                          '[', '{', ']', '}',
-                          'shift-a', 'b', 'control-f',
-                          'l', 'shift-l', 'o', 'p', 'r',
-                          'shift-r', 's', 't', 'v', 'w']
-        self.mouseEvents = ['mouse1', 'mouse1-up',
-                            'shift-mouse1', 'shift-mouse1-up',
-                            'control-mouse1', 'control-mouse1-up',
-                            'alt-mouse1', 'alt-mouse1-up',
-                            'mouse2', 'mouse2-up',
-                            'shift-mouse2', 'shift-mouse2-up',
-                            'control-mouse2', 'control-mouse2-up',
-                            'alt-mouse2', 'alt-mouse2-up',
-                            'mouse3', 'mouse3-up',
-                            'shift-mouse3', 'shift-mouse3-up',
-                            'control-mouse3', 'control-mouse3-up',
-                            'alt-mouse3', 'alt-mouse3-up',
-                            ]
-            
-    def enable(self):
-        if self.fEnabled:
-            return
-        # Make sure old tasks are shut down
-        self.disable()
-        # Start all display region context tasks
-        self.drList.spawnContextTask()
-        # Turn on mouse Flying
-        self.cameraControl.enableMouseFly()
-        # Turn on object manipulation
-        self.manipulationControl.enableManipulation()
-        # Make sure list of selected items is reset
-        self.selected.reset()
-        # Accept appropriate hooks
-        self.enableKeyEvents()
-        self.enableModifierEvents()
-        self.enableMouseEvents()
-        # Set flag
-        self.fEnabled = 1
-
-        if self.enableAutoCamera:
-            self.accept('DH_LoadingComplete', self.autoCameraMove)
-
-    def disable(self):
-        # Shut down all display region context tasks
-        self.drList.removeContextTask()
-        # Turn off camera fly
-        self.cameraControl.disableMouseFly()
-        # Turn off object manipulation
-        self.manipulationControl.disableManipulation()
-        self.disableKeyEvents()
-        self.disableModifierEvents()
-        self.disableMouseEvents()
-        self.ignore('DH_LoadingComplete')
-        # Kill tasks
-        taskMgr.remove('flashNodePath')
-        taskMgr.remove('hideDirectMessage')
-        taskMgr.remove('hideDirectMessageLater')
-        # Set flag
-        self.fEnabled = 0
-
-    def minimumConfiguration(self):
-        # Remove context task
-        self.drList.removeContextTask()
-        # Turn off camera fly
-        self.cameraControl.disableMouseFly()
-        # Ignore keyboard and action events
-        self.disableKeyEvents()
-        self.disableActionEvents()
-        # But let mouse events pass through
-        self.enableMouseEvents()
-        self.enableModifierEvents()
-
-    def oobe(self):
-        # If oobeMode was never set, set it to false and create the
-        # structures we need to implement OOBE.
-        try:
-            self.oobeMode
-        except:
-            self.oobeMode = 0
-
-            self.oobeCamera = hidden.attachNewNode('oobeCamera')
-
-            self.oobeVis = loader.loadModelOnce('models/misc/camera')
-            if self.oobeVis:
-                self.oobeVis.node().setFinal(1)
-
-        if self.oobeMode:
-            # Position a target point to lerp the oobe camera to
-            self.cameraControl.camManipRef.iPosHpr(self.trueCamera)
-            t = self.oobeCamera.lerpPosHpr(
-                Point3(0), Vec3(0), 2.0,
-                other = self.cameraControl.camManipRef,
-                task = 'manipulateCamera',
-                blendType = 'easeInOut')
-            # When move is done, switch to oobe mode
-            t.uponDeath = self.endOOBE
-        else:
-            # Place camera marker at true camera location
-            self.oobeVis.reparentTo(self.trueCamera)
-            # Remove any transformation on the models arc
-            self.oobeVis.clearMat()
-            # Make oobeCamera be a sibling of wherever camera is now.
-            cameraParent = self.camera.getParent()
-            # Prepare oobe camera
-            self.oobeCamera.reparentTo(cameraParent)
-            self.oobeCamera.iPosHpr(self.trueCamera)
-            # Put camera under new oobe camera
-            base.cam.reparentTo(self.oobeCamera)
-            # Position a target point to lerp the oobe camera to
-            self.cameraControl.camManipRef.setPos(
-                self.trueCamera, Vec3(-2,-20, 5))
-            self.cameraControl.camManipRef.lookAt(self.trueCamera)
-            t = self.oobeCamera.lerpPosHpr(
-                Point3(0), Vec3(0), 2.0,
-                other = self.cameraControl.camManipRef,
-                task = 'manipulateCamera',
-                blendType = 'easeInOut')
-            # When move is done, switch to oobe mode
-            t.uponDeath = self.beginOOBE
-
-    def beginOOBE(self, state):
-        # Make sure we've reached our final destination
-        self.oobeCamera.iPosHpr(self.cameraControl.camManipRef)
-        self.camera = self.oobeCamera
-        self.oobeMode = 1
-
-    def endOOBE(self, state):
-        # Make sure we've reached our final destination
-        self.oobeCamera.iPosHpr(self.trueCamera)
-        # Disable OOBE mode.
-        base.cam.reparentTo(self.trueCamera)
-        self.camera = self.trueCamera
-        # Get rid of ancillary node paths
-        self.oobeVis.reparentTo(hidden)
-        self.oobeCamera.reparentTo(hidden)
-        self.oobeMode = 0
-
-    def destroy(self):
-        self.disable()
-
-    def reset(self):
-        self.enable()
-
-    # EVENT FUNCTIONS
-    def enableModifierEvents(self):
-        for event in self.modifierEvents:
-            self.accept(event, self.inputHandler, [event])
-
-    def enableKeyEvents(self):
-        for event in self.keyEvents:
-            self.accept(event, self.inputHandler, [event])
-
-    def enableMouseEvents(self):
-        for event in self.mouseEvents:
-            self.accept(event, self.inputHandler, [event])
-
-    def disableModifierEvents(self):
-        for event in self.modifierEvents:
-            self.ignore(event)
-
-    def disableKeyEvents(self):
-        for event in self.keyEvents:
-            self.ignore(event)
-
-    def disableMouseEvents(self):
-        for event in self.mouseEvents:
-            self.ignore(event)
-
-    def inputHandler(self, input):
-        # Deal with keyboard and mouse input
-        if input == 'mouse1-up':
-            messenger.send('DIRECT-mouse1Up')
-            if SEditor.widget.fActive:
-                messenger.send('shift-f')
-        elif input.find('mouse1') != -1:
-            modifiers = self.getModifiers(input, 'mouse1')
-            messenger.send('DIRECT-mouse1', sentArgs = [modifiers])
-        elif input == 'mouse2-up':
-            messenger.send('DIRECT-mouse2Up')
-            if SEditor.widget.fActive:
-                messenger.send('shift-f')
-        elif input.find('mouse2') != -1:
-            modifiers = self.getModifiers(input, 'mouse2')
-            messenger.send('DIRECT-mouse2', sentArgs = [modifiers])
-        elif input == 'mouse3-up':
-            messenger.send('DIRECT-mouse3Up')
-            if SEditor.widget.fActive:
-                messenger.send('shift-f')
-        elif input.find('mouse3') != -1:
-            modifiers = self.getModifiers(input, 'mouse3')
-            messenger.send('DIRECT-mouse3', sentArgs = [modifiers])
-        elif input == 'shift':
-            self.fShift = 1
-        elif input == 'shift-up':
-            self.fShift = 0
-        elif input == 'control':
-            self.fControl = 1
-        elif input == 'control-up':
-            self.fControl = 0
-        elif input == 'alt':
-            self.fAlt = 1
-        elif input == 'alt-up':
-            self.fAlt = 0
-        elif input == 'page_up':
-            self.upAncestry()
-        elif input == 'page_down':
-            self.downAncestry()
-        elif input == 'escape':
-            self.deselectAll()
-        elif input == 'delete':
-            taskMgr.remove('followSelectedNodePath')
-            #self.removeAllSelected()
-            messenger.send('SGE_Remove',[None])
-            self.deselectAll()
-        elif input == 'v':
-            messenger.send('SEditor-ToggleWidgetVis')
-            self.toggleWidgetVis()
-            if SEditor.widget.fActive:
-                messenger.send('shift-f')
-        elif input == 'b':
-            messenger.send('SEditor-ToggleBackface')
-            base.toggleBackface()
-        #elif input == 'control-f':
-        #    self.flash(last)
-        elif input == 'shift-l':
-            self.cameraControl.toggleCOALock()
-        elif input == 'o':
-            self.oobe()
-        elif input == 'p':
-            if self.selected.last:
-                self.setActiveParent(self.selected.last)
-        elif input == 'r':
-            # Do wrt reparent
-            if self.selected.last:
-                self.reparent(self.selected.last, fWrt = 1)
-        elif input == 'shift-r':
-            # Do regular reparent
-            if self.selected.last:
-                self.reparent(self.selected.last)
-        elif input == 's':
-            if self.selected.last:
-                self.select(self.selected.last)
-        elif input == 't':
-            messenger.send('SEditor-ToggleTexture')
-            base.toggleTexture()
-        elif input == 'shift-a':
-            self.selected.toggleVisAll()
-        elif input == 'w':
-            messenger.send('SEditor-ToggleWireframe')
-            base.toggleWireframe()
-        elif (input == '[') or (input == '{'):
-            self.undo()
-        elif (input == ']') or (input == '}'):
-            self.redo()
-
-        
-    def getModifiers(self, input, base):
-        modifiers = DIRECT_NO_MOD
-        modifierString = input[: input.find(base)]
-        if modifierString.find('shift') != -1:
-            modifiers |= DIRECT_SHIFT_MOD
-        if modifierString.find('control') != -1:
-            modifiers |= DIRECT_CONTROL_MOD
-        if modifierString.find('alt') != -1:
-            modifiers |= DIRECT_ALT_MOD
-        return modifiers
-
-    def gotShift(self, modifiers):
-        return modifiers & DIRECT_SHIFT_MOD
-
-    def gotControl(self, modifiers):
-        return modifiers & DIRECT_CONTROL_MOD
-
-    def gotAlt(self, modifiers):
-        return modifiers & DIRECT_ALT_MOD
-
-    def select(self, nodePath, fMultiSelect = 0, fResetAncestry = 1, callback=False):
-        dnp = self.selected.select(nodePath, fMultiSelect)
-        if dnp:
-            messenger.send('DIRECT_preSelectNodePath', [dnp])
-            if fResetAncestry:
-                # Update ancestry
-                self.ancestry = dnp.getAncestors()
-                self.ancestry.reverse()
-                self.ancestryIndex = 0
-            # Update the selectedNPReadout
-            self.selectedNPReadout.reparentTo(aspect2d)
-            self.selectedNPReadout.setText(
-                'Selected:' + dnp.getName())
-            # Show the manipulation widget
-            self.widget.showWidget()
-            # Update camera controls coa to this point
-            # Coa2Camera = Coa2Dnp * Dnp2Camera
-            mCoa2Camera = dnp.mCoa2Dnp * dnp.getMat(self.camera)
-            row = mCoa2Camera.getRow(3)
-            coa = Vec3(row[0], row[1], row[2])
-            self.cameraControl.updateCoa(coa)
-            # Adjust widgets size
-            # This uses the additional scaling factor used to grow and
-            # shrink the widget            
-            self.widget.setScalingFactor(dnp.getRadius())
-            # Spawn task to have object handles follow the selected object
-            taskMgr.remove('followSelectedNodePath')
-            t = Task.Task(self.followSelectedNodePathTask)
-            t.dnp = dnp
-            taskMgr.add(t, 'followSelectedNodePath')
-            # Send an message marking the event
-            messenger.send('DIRECT_selectedNodePath', [dnp])
-            if callback:
-                messenger.send('se_selectedNodePath', [dnp, False])
-            else:
-                messenger.send('se_selectedNodePath', [dnp])
-
-            self.upAncestry()
-
-            if SEditor.widget.fActive:
-                messenger.send('shift-f')
-
-    def followSelectedNodePathTask(self, state):
-        mCoa2Render = state.dnp.mCoa2Dnp * state.dnp.getMat(render)
-        decomposeMatrix(mCoa2Render,
-                        self.scale,self.hpr,self.pos,
-                        CSDefault)
-        self.widget.setPosHpr(self.pos,self.hpr)
-        return Task.cont
-
-    def deselect(self, nodePath):
-        dnp = self.selected.deselect(nodePath)
-        if dnp:
-            # Hide the manipulation widget
-            self.widget.hideWidget()
-            self.selectedNPReadout.reparentTo(hidden)
-            self.selectedNPReadout.setText(' ')
-            taskMgr.remove('followSelectedNodePath')
-            self.ancestry = []
-            # Send an message marking the event
-            messenger.send('DIRECT_deselectedNodePath', [dnp])
-
-    def deselectAll(self):
-        self.selected.deselectAll()
-        # Hide the manipulation widget
-        self.widget.hideWidget()
-        self.selectedNPReadout.reparentTo(hidden)
-        self.selectedNPReadout.setText(' ')
-        taskMgr.remove('followSelectedNodePath')
-        messenger.send('se_deselectedAll')
-
-    def setActiveParent(self, nodePath = None):
-        # Record new parent
-        self.activeParent = nodePath
-        # Update the activeParentReadout
-        self.activeParentReadout.reparentTo(aspect2d)
-        self.activeParentReadout.setText(
-            'Active Reparent Target:' + nodePath.getName())
-        # Alert everyone else
-        self.activeParentReadout.show()
-        
-    def reparent(self, nodePath = None, fWrt = 0):
-        if (nodePath and self.activeParent and
-            self.isNotCycle(nodePath, self.activeParent)):
-            oldParent = nodePath.getParent()
-            if fWrt:
-                nodePath.wrtReparentTo(self.activeParent)
-            else:
-                nodePath.reparentTo(self.activeParent)
-            # Alert everyone else
-            messenger.send('DIRECT_reparent',
-                           [nodePath, oldParent, self.activeParent])
-            messenger.send('SGE_Update Explorer',[render])
-            self.activeParentReadout.hide()
-
-
-    def isNotCycle(self, nodePath, parent):
-        if nodePath.id() == parent.id():
-            print 'DIRECT.reparent: Invalid parent'
-            return 0
-        elif parent.hasParent():
-            return self.isNotCycle(nodePath, parent.getParent())
-        else:
-            return 1
-        
-    def fitOnNodePath(self, nodePath = 'None Given'):
-        if nodePath == 'None Given':
-            # If nothing specified, try selected node path
-            nodePath = self.selected.last
-        SEditor.select(nodePath)
-        def fitTask(state, self = self):
-            self.cameraControl.fitOnWidget()
-            return Task.done
-        taskMgr.doMethodLater(0.1, fitTask, 'manipulateCamera')
-
-    def isolate(self, nodePath = 'None Given'):
-        """ Show a node path and hide its siblings """
-        # First kill the flashing task to avoid complications
-        taskMgr.remove('flashNodePath')
-        # Use currently selected node path if node selected
-        if nodePath == 'None Given':
-            nodePath = self.selected.last
-        # Do we have a node path?
-        if nodePath:
-            # Yes, show everything in level
-            self.showAllDescendants(nodePath.getParent())
-            # Now hide all of this node path's siblings
-            nodePath.hideSiblings()
-
-    def toggleVis(self, nodePath = 'None Given'):
-        """ Toggle visibility of node path """
-        # First kill the flashing task to avoid complications
-        taskMgr.remove('flashNodePath')
-        if nodePath == 'None Given':
-            # If nothing specified, try selected node path
-            nodePath = self.selected.last
-        if nodePath:
-            # Now toggle node path's visibility state
-            nodePath.toggleVis()
-
-    def removeNodePath(self, nodePath = 'None Given'):
-        if nodePath == 'None Given':
-            # If nothing specified, try selected node path
-            nodePath = self.selected.last
-        if nodePath:
-            nodePath.remove()
-
-    def removeAllSelected(self):
-        self.selected.removeAll()
-
-    def showAllDescendants(self, nodePath = render):
-        """ Show the level and its descendants """
-        nodePath.showAllDescendants()
-        nodePath.hideCS()
-
-    def upAncestry(self):
-        if self.ancestry:
-            l = len(self.ancestry)
-            i = self.ancestryIndex + 1
-            if i < l:
-                np = self.ancestry[i]
-                name = np.getName()
-                if i>0:
-                    type = self.ancestry[i-1].node().getType().getName()
-                else:
-                    type = self.ancestry[0].node().getType().getName()
-
-                ntype = np.node().getType().getName()
-                if (name != 'render') and (name != 'renderTop')and(self.checkTypeNameForAncestry(type, ntype)):
-                    self.ancestryIndex = i
-                    self.select(np, 0, 0, True)
-            
-    def checkTypeNameForAncestry(self, type, nextType ):
-        if (type=='ModelRoot'):
-            if (nextType=='AmbientLight')or(nextType=='PointLight')or(nextType=='DirectionalLight')or(nextType=='Spotlight'):
-                return True
-            return False
-        elif (type=='ModelNode'):
-            if (nextType=='ModelNode'):
-                return True
-            return False
-        elif (type=='CollisionNode'):
-            return False
-        elif (type=='ActorNode'):
-            return False
-        elif (type=='AmbientLight')or(type=='PointLight')or(type=='DirectionalLight')or(type=='Spotlight'):
-            return False
-        else:
-            return True
-
-    def downAncestry(self):
-        if self.ancestry:
-            l = len(self.ancestry)
-            i = self.ancestryIndex - 1
-            if i >= 0:
-                np = self.ancestry[i]
-                name = np.getName()
-                if (name != 'render') and (name != 'renderTop'):
-                    self.ancestryIndex = i
-                    self.select(np, 0, 0, True)
-
-
-    def getAndSetName(self, nodePath):
-        """ Prompt user for new node path name """
-        from tkSimpleDialog import askstring
-        newName = askstring('Node Path: ' + nodePath.getName(),
-                            'Enter new name:')
-        if newName:
-            nodePath.setName(newName)
-            messenger.send('DIRECT_nodePathSetName', [nodePath, newName])
-
-    # UNDO REDO FUNCTIONS
-    def pushUndo(self, nodePathList, fResetRedo = 1):
-        # Assemble group of changes
-        undoGroup = []
-        for nodePath in nodePathList:
-            t = nodePath.getTransform()
-            undoGroup.append([nodePath, t])
-        # Now record group
-        self.undoList.append(undoGroup)
-        # Truncate list
-        self.undoList = self.undoList[-25:]
-        # Alert anyone who cares
-        messenger.send('DIRECT_pushUndo')
-        if fResetRedo and (nodePathList != []):
-            self.redoList = []
-            messenger.send('DIRECT_redoListEmpty')
-
-    def popUndoGroup(self):
-        # Get last item
-        undoGroup = self.undoList[-1]
-        # Strip last item off of undo list
-        self.undoList = self.undoList[:-1]
-        # Update state of undo button
-        if not self.undoList:
-            messenger.send('DIRECT_undoListEmpty')
-        # Return last item
-        return undoGroup
-        
-    def pushRedo(self, nodePathList):
-        # Assemble group of changes
-        redoGroup = []
-        for nodePath in nodePathList:
-            t = nodePath.getTransform()
-            redoGroup.append([nodePath, t])
-        # Now record redo group
-        self.redoList.append(redoGroup)
-        # Truncate list
-        self.redoList = self.redoList[-25:]
-        # Alert anyone who cares
-        messenger.send('DIRECT_pushRedo')
-
-    def popRedoGroup(self):
-        # Get last item
-        redoGroup = self.redoList[-1]
-        # Strip last item off of redo list
-        self.redoList = self.redoList[:-1]
-        # Update state of redo button
-        if not self.redoList:
-            messenger.send('DIRECT_redoListEmpty')
-        # Return last item
-        return redoGroup
-        
-    def undo(self):
-        if self.undoList:
-            # Get last item off of redo list
-            undoGroup = self.popUndoGroup()
-            # Record redo information
-            nodePathList = map(lambda x: x[0], undoGroup)
-            self.pushRedo(nodePathList)
-            # Now undo xform for group
-            for pose in undoGroup:
-                # Undo xform
-                pose[0].setTransform(pose[1])
-            # Alert anyone who cares
-            messenger.send('DIRECT_undo')
-
-    def redo(self):
-        if self.redoList:
-            # Get last item off of redo list
-            redoGroup = self.popRedoGroup()
-            # Record undo information
-            nodePathList = map(lambda x: x[0], redoGroup)
-            self.pushUndo(nodePathList, fResetRedo = 0)
-            # Redo xform
-            for pose in redoGroup:
-                pose[0].setTransform(pose[1])
-            # Alert anyone who cares
-            messenger.send('DIRECT_redo')
-
-    # UTILITY FUNCTIONS
-    def message(self, text):
-        taskMgr.remove('hideDirectMessage')
-        taskMgr.remove('hideDirectMessageLater')
-        self.directMessageReadout.reparentTo(aspect2d)
-        self.directMessageReadout.setText(text)
-        self.hideDirectMessageLater()
-
-    def hideDirectMessageLater(self):
-        taskMgr.doMethodLater(3.0, self.hideDirectMessage, 'hideDirectMessage')
-
-    def hideDirectMessage(self, state):
-        self.directMessageReadout.reparentTo(hidden)
-        return Task.done
-
-    def useObjectHandles(self):
-        self.widget = self.manipulationControl.objectHandles
-        self.widget.reparentTo(SEditor.group)
-
-    def hideSelectedNPReadout(self):
-        self.selectedNPReadout.reparentTo(hidden)
-
-    def hideActiveParentReadout(self):
-        self.activeParentReadout.reparentTo(hidden)
-
-    def toggleWidgetVis(self):
-        self.widget.toggleWidget()
-
-    def setCOAMode(self, mode):
-        self.coaMode = mode
-
-    def isEnabled(self):
-        return self.fEnabled
-
-    def addUnpickable(self, item):
-        for iRay in self.iRayList:
-            iRay.addUnpickable(item)
-
-    def removeUnpickable(self, item):
-        for iRay in self.iRayList:
-            iRay.removeUnpickable(item)
-
-    def toggleAutoCamera(self):
-        self.enableAutoCamera = (self.enableAutoCamera+1)%2
-        if self.enableAutoCamera==1:
-            self.accept('DH_LoadingComplete', self.autoCameraMove)
-        else:
-            self.ignore('DH_LoadingComplete')
-        return
-
-    def autoCameraMove(self, nodePath):
-        time = 1
-        node = DirectNodePath(nodePath)
-        radius = node.getRadius()
-        center = node.getCenter()
-        node.dehighlight()
-        posB = base.camera.getPos()
-        hprB = base.camera.getHpr()
-        posE = Point3((radius*-1.41)+center.getX(), (radius*-1.41)+center.getY(), (radius*1.41)+center.getZ())
-        hprE = Point3(-45, -38, 0)
-        print posB, hprB
-        print posE, hprE
-        posInterval1 = base.camera.posInterval(time, posE, bakeInStart = 1)
-        posInterval2 = base.camera.posInterval(time, posB, bakeInStart = 1)
-        
-        hprInterval1 = base.camera.hprInterval(time, hprE, bakeInStart = 1)
-        hprInterval2 = base.camera.hprInterval(time, hprB, bakeInStart = 1)
-
-        parallel1 = Parallel(posInterval1, hprInterval1)
-        parallel2 = Parallel(posInterval2, hprInterval2)
-
-        Sequence(Wait(7), parallel1, Wait(1), parallel2).start()
-        
-        return
-    
-
-class DisplayRegionContext(DirectObject):
-    regionCount = 0
-    def __init__(self, cam):
-        self.cam = cam
-        self.camNode = self.cam.node()
-        self.camLens = self.camNode.getLens()
-        # set lens change callback
-        changeEvent = 'dr%d-change-event' % DisplayRegionContext.regionCount
-        DisplayRegionContext.regionCount += 1
-        self.camLens.setChangeEvent(changeEvent)
-        self.accept(changeEvent, self.camUpdate)
-        self.iRay = SelectionRay(self.cam)
-        self.nearVec = Vec3(0)
-        self.mouseX = 0.0
-        self.mouseY = 0.0
-        # A Camera node can have more than one display region
-        # associated with it.  Here I assume that there is only
-        # one display region per camera, since we are defining a
-        # display region on a per-camera basis.  See note in
-        # DisplayRegionList.__init__()
-        try:
-            self.dr = self.camNode.getDr(0)
-        except:
-            self.dr = self.camNode.getDisplayRegion(0)
-        left = self.dr.getLeft()
-        right = self.dr.getRight()
-        bottom = self.dr.getBottom()
-        top = self.dr.getTop()
-        self.originX = left+right-1
-        self.originY = top+bottom-1
-        self.scaleX = 1.0/(right-left)
-        self.scaleY = 1.0/(top-bottom)
-        self.setOrientation()
-        self.camUpdate()
-
-    def __getitem__(self,key):
-        return self.__dict__[key]
-
-    def setOrientation(self):
-        # MRM This assumes orientation is set on transform above cam
-        hpr = self.cam.getHpr()
-        if hpr[2] < 135 and hpr[2]>45 or hpr[2]>225 and hpr[2]<315:
-            self.isSideways = 1
-        elif hpr[2] > -135 and hpr[2] < -45 or hpr[2] < -225 and hpr[2] > -315:
-            self.isSideways = 1
-        else:
-            self.isSideways = 0
-
-    # The following take into consideration sideways displays
-    def getHfov(self):
-        if self.isSideways:
-            return self.camLens.getVfov()
-        else:
-            return self.camLens.getHfov()
-
-    def getVfov(self):
-        if self.isSideways:
-            return self.camLens.getHfov()
-        else:
-            return self.camLens.getVfov()
-
-    def setHfov(self,hfov):
-        if self.isSideways:
-            self.camLens.setFov(self.camLens.getHfov(), hfov)
-        else:
-            self.camLens.setFov(hfov, self.camLens.getVfov())
-
-    def setVfov(self,vfov):
-        if self.isSideways:
-            self.camLens.setFov(vfov, self.camLens.getVfov())
-        else:
-            self.camLens.setFov(self.camLens.getHfov(), vfov)
-
-    def setFov(self,hfov,vfov):
-        if self.isSideways:
-            self.camLens.setFov(vfov, hfov)
-        else:
-            self.camLens.setFov(hfov, vfov)
-
-    def getWidth(self):
-        prop = base.win.getProperties()
-        if prop.hasSize():
-            return prop.getXSize()
-        else:
-            return 640
-            
-    def getHeight(self):
-        prop = base.win.getProperties()
-        if prop.hasSize():
-            return prop.getYSize()
-        else:
-            return 480
-            
-    def camUpdate(self, lens = None):
-        # Window Data
-        self.near = self.camLens.getNear()
-        self.far = self.camLens.getFar()
-        self.fovH = self.camLens.getHfov()
-        self.fovV = self.camLens.getVfov()
-        self.nearWidth = math.tan(deg2Rad(self.fovH * 0.5)) * self.near * 2.0
-        self.nearHeight = math.tan(deg2Rad(self.fovV * 0.5)) * self.near * 2.0
-        self.left = -self.nearWidth * 0.5
-        self.right = self.nearWidth * 0.5
-        self.top = self.nearHeight * 0.5
-        self.bottom = -self.nearHeight * 0.5
-
-    def mouseUpdate(self):
-        # Mouse Data
-        # Last frame
-        self.mouseLastX = self.mouseX
-        self.mouseLastY = self.mouseY
-        # Values for this frame
-        # This ranges from -1 to 1
-        if (base.mouseWatcherNode.hasMouse()):
-            self.mouseX = base.mouseWatcherNode.getMouseX()
-            self.mouseY = base.mouseWatcherNode.getMouseY()
-            self.mouseX = (self.mouseX-self.originX)*self.scaleX
-            self.mouseY = (self.mouseY-self.originY)*self.scaleY
-        # Delta percent of window the mouse moved
-        self.mouseDeltaX = self.mouseX - self.mouseLastX
-        self.mouseDeltaY = self.mouseY - self.mouseLastY
-        self.nearVec.set((self.nearWidth*0.5) * self.mouseX,
-                         self.near,
-                         (self.nearHeight*0.5) * self.mouseY)
-
-class DisplayRegionList(DirectObject):
-    def __init__(self):
-        self.displayRegionList = []
-        i = 0
-        # Things are funky if we are oobe
-        if (hasattr(base, 'oobeMode') and base.oobeMode):
-            # assume we only have one cam at this point
-            drc = DisplayRegionContext(base.cam)
-            self.displayRegionList.append(drc)
-        else:
-            # MRM: Doesn't properly handle multiple camera groups anymore
-            # Assumes everything is under main camera
-            
-                # This is following the old way of setting up
-                # display regions.  A display region is set up for
-                # each camera node in the scene graph.  This was done
-                # so that only display regions in the scene graph are
-                # considered.  The right way to do this is to set up
-                # a display region for each real display region, and then
-                # keep track of which are currently active (e.g. use a flag)
-                # processing only them.
-                for camIndex in range(len(base.camList)):
-                    cam = base.camList[camIndex]
-                    if cam.getName()=='<noname>':
-                        cam.setName('Camera%d' % camIndex)
-                    drc = DisplayRegionContext(cam)
-                    self.displayRegionList.append(drc)
-
-        self.accept("DIRECT-mouse1",self.mouseUpdate)
-        self.accept("DIRECT-mouse2",self.mouseUpdate)
-        self.accept("DIRECT-mouse3",self.mouseUpdate)
-        self.accept("DIRECT-mouse1Up",self.mouseUpdate)
-        self.accept("DIRECT-mouse2Up",self.mouseUpdate)
-        self.accept("DIRECT-mouse3Up",self.mouseUpdate)
-
-    def __getitem__(self, index):
-        return self.displayRegionList[index]
-
-    def __len__(self):
-        return len(self.displayRegionList)
-
-    def updateContext(self):
-        self.contextTask(None)
-
-    def setNearFar(self, near, far):
-        for dr in self.displayRegionList:
-            dr.camLens.setNearFar(near, far)
-    
-    def setNear(self, near):
-        for dr in self.displayRegionList:
-            dr.camLens.setNear(near)
-    
-    def setFar(self, far):
-        for dr in self.displayRegionList:
-            dr.camLens.setFar(far)
-
-    def setFov(self, hfov, vfov):
-        for dr in self.displayRegionList:
-            dr.setFov(hfov, vfov)
-
-    def setHfov(self, fov):
-        for dr in self.displayRegionList:
-            dr.setHfov(fov)
-
-    def setVfov(self, fov):
-        for dr in self.displayRegionList:
-            dr.setVfov(fov)
-
-    def mouseUpdate(self, modifiers = DIRECT_NO_MOD):
-        for dr in self.displayRegionList:
-            dr.mouseUpdate()
-        SEditor.dr = self.getCurrentDr()
-
-    def getCurrentDr(self):
-        for dr in self.displayRegionList:
-            if (dr.mouseX >= -1.0 and dr.mouseX <= 1.0 and
-                dr.mouseY >= -1.0 and dr.mouseY <= 1.0):
-                return dr
-        return self.displayRegionList[0]
-
-    def start(self):
-        # First shutdown any existing task
-        self.stop()
-        # Start a new context task
-        self.spawnContextTask()
-
-    def stop(self):
-        # Kill the existing context task
-        taskMgr.remove('DIRECTContextTask')
-
-    def spawnContextTask(self):
-        taskMgr.add(self.contextTask, 'DIRECTContextTask')
-
-    def removeContextTask(self):
-        taskMgr.remove('DIRECTContextTask')
-
-    def contextTask(self, state):
-        # Window Data
-        self.mouseUpdate()
-        # hack to test movement
-        return Task.cont
-
-# Create one
-#__builtins__['direct'] = base.direct = DirectSession()
-
-
-
-
-
-
-
-
-
-
-
-

+ 0 - 418
doc/SceneEditor/seTree.py

@@ -1,418 +0,0 @@
-#################################################################
-# seTree.py
-# Originally from Tree.py
-# Altered by Yi-Hong Lin, [email protected], 2004
-#
-# This class actually decides the behavior of the sceneGraphExplorer
-# You might feel it realy looks like the original one, but we actually did a lots of change in it.
-# such as, when selection happend in other place, such as picking directly inside the scene. or,
-# when user removed something by hot key.
-# The rename process has also been changed. It won't be rename in here anymore.
-# Instead, here we will send out a message to sceneEditor to reaname the target.
-#
-#################################################################
-
-import os, sys, string, Pmw, Tkinter
-from direct.showbase.DirectObject import DirectObject
-from Tkinter import IntVar, Menu, PhotoImage, Label, Frame, Entry
-from pandac.PandaModules import *
-
-# Initialize icon directory
-ICONDIR = getModelPath().findFile(Filename('icons')).toOsSpecific()
-if not os.path.isdir(ICONDIR):
-    raise RuntimeError, "can't find DIRECT icon directory (%s)" % `ICONDIR`
-
-class TreeNode:
-
-    def __init__(self, canvas, parent, item, menuList = []):
-        self.canvas = canvas
-        self.parent = parent
-        self.item = item
-        self.state = 'collapsed'
-        self.selected = 0
-        self.children = {}
-        self.kidKeys = []
-        self.x = self.y = None
-        self.iconimages = {} # cache of PhotoImage instances for icons
-        self.menuList = menuList
-        self.menuVar = IntVar()
-        self.menuVar.set(0)
-        self._popupMenu = None
-        self.image_id = None
-        if self.menuList:
-            if self.menuList[-1] == 'Separator':
-                self.menuList = self.menuList[:-1]
-            self._popupMenu = Menu(self.canvas, tearoff = 0)
-            for i in range(len(self.menuList)):
-                item = self.menuList[i]
-                if item == 'Separator':
-                    self._popupMenu.add_separator()
-                else:
-                    self._popupMenu.add_radiobutton(
-                        label = item,
-                        variable = self.menuVar,
-                        value = i,
-                        indicatoron = 0,
-                        command = self.popupMenuCommand)
-                    
-    def destroy(self):
-        for key in self.kidKeys:
-            c = self.children[key]
-            del self.children[key]
-            c.destroy()
-        self.parent = None
-
-    def geticonimage(self, name):
-        try:
-            return self.iconimages[name]
-        except KeyError:
-            pass
-        file, ext = os.path.splitext(name)
-        ext = ext or ".gif"
-        fullname = os.path.join(ICONDIR, file + ext)
-        image = PhotoImage(master=self.canvas, file=fullname)
-        self.iconimages[name] = image
-        return image
-
-    def select(self, event=None):
-        if self.selected:
-            return
-        self.deselectall()
-        self.selected = 1
-        if self.parent != None:
-            if self.parent.state == 'expanded':
-                self.canvas.delete(self.image_id)
-                self.drawicon()
-                self.drawtext()
-        self.item.OnSelect(event)
-
-    def deselect(self, event=None):
-        if not self.selected:
-            return
-        self.selected = 0
-        if self.parent != None:
-            if self.parent.state == 'expanded':
-                self.canvas.delete(self.image_id)
-                self.drawicon()
-                self.drawtext()
-
-    def deselectall(self):
-        if self.parent:
-            self.parent.deselectall()
-        else:
-            self.deselecttree()
-
-    def deselecttree(self):
-        if self.selected:
-            self.deselect()
-        for key in self.kidKeys:
-            child = self.children[key]
-            child.deselecttree()
-
-    def flip(self, event=None):
-        if self.state == 'expanded':
-            self.collapse()
-        else:
-            self.expand()
-        self.item.OnDoubleClick()
-        return "break"
-
-    def popupMenu(self, event=None):
-        if self._popupMenu:
-            self._popupMenu.post(event.widget.winfo_pointerx(),
-                                 event.widget.winfo_pointery())
-            return "break"
-
-    def popupMenuCommand(self):
-        command = self.menuList[self.menuVar.get()]
-        self.item.MenuCommand(command)
-        if self.parent and (command != 'Update Explorer'):
-            # Update parent to try to keep explorer up to date
-            self.parent.update()
-
-    def expand(self, event=None):
-        if not self.item.IsExpandable():
-            return
-        if self.state != 'expanded':
-            self.state = 'expanded'
-            self.update()
-            self.view()
-
-    def collapse(self, event=None):
-        if self.state != 'collapsed':
-            self.state = 'collapsed'
-            self.update()
-
-    def view(self):
-        top = self.y - 2
-        bottom = self.lastvisiblechild().y + 17
-        height = bottom - top
-        visible_top = self.canvas.canvasy(0)
-        visible_height = self.canvas.winfo_height()
-        visible_bottom = self.canvas.canvasy(visible_height)
-        if visible_top <= top and bottom <= visible_bottom:
-            return
-        x0, y0, x1, y1 = self.canvas._getints(self.canvas['scrollregion'])
-        if top >= visible_top and height <= visible_height:
-            fraction = top + height - visible_height
-        else:
-            fraction = top
-        fraction = float(fraction) / y1
-        self.canvas.yview_moveto(fraction)
-
-    def reveal(self):
-        # Make sure all parent nodes are marked as expanded
-        parent = self.parent
-        while parent:
-            if parent.state == 'collapsed':
-                parent.state = 'expanded'
-                parent = parent.parent
-            else:
-                break
-        # Redraw tree accordingly
-        self.update()
-        # Bring this item into view
-        self.view()
-
-    def lastvisiblechild(self):
-        if self.kidKeys and self.state == 'expanded':
-            return self.children[self.kidKeys[-1]].lastvisiblechild()
-        else:
-            return self
-
-    def update(self):
-        if self.parent:
-            self.parent.update()
-        else:
-            oldcursor = self.canvas['cursor']
-            self.canvas['cursor'] = "watch"
-            self.canvas.update()
-            self.canvas.delete(Tkinter.ALL)     # XXX could be more subtle
-            self.draw(7, 2)
-            x0, y0, x1, y1 = self.canvas.bbox(Tkinter.ALL)
-            self.canvas.configure(scrollregion=(0, 0, x1, y1))
-            self.canvas['cursor'] = oldcursor
-
-    def draw(self, x, y):
-        # XXX This hard-codes too many geometry constants!
-        self.x, self.y = x, y
-        self.drawicon()
-        self.drawtext()
-        if self.state != 'expanded':
-            return y+17
-        # draw children
-        sublist = self.item._GetSubList()
-        if not sublist:
-            # IsExpandable() was mistaken; that's allowed
-            return y+17
-        self.kidKeys = []
-        for item in sublist:
-            key = item.GetKey()
-            if self.children.has_key(key):
-                child = self.children[key]
-            else:
-                child = TreeNode(self.canvas, self, item, self.menuList)
-            self.children[key] = child
-            self.kidKeys.append(key)
-        # Remove unused children
-        for key in self.children.keys():
-            if key not in self.kidKeys:
-                del(self.children[key])
-        cx = x+20
-        cy = y+17
-        cylast = 0
-        for key in self.kidKeys:
-            child = self.children[key]
-            cylast = cy
-            self.canvas.create_line(x+9, cy+7, cx, cy+7, fill="gray50")
-            cy = child.draw(cx, cy)
-            if child.item.IsExpandable():
-                if child.state == 'expanded':
-                    iconname = "minusnode"
-                    callback = child.collapse
-                else:
-                    iconname = "plusnode"
-                    callback = child.expand
-                image = self.geticonimage(iconname)
-                id = self.canvas.create_image(x+9, cylast+7, image=image)
-                # XXX This leaks bindings until canvas is deleted:
-                self.canvas.tag_bind(id, "<1>", callback)
-                self.canvas.tag_bind(id, "<Double-1>", lambda x: None)
-        id = self.canvas.create_line(x+9, y+10, x+9, cylast+7,
-            ##stipple="gray50",     # XXX Seems broken in Tk 8.0.x
-            fill="gray50")
-        self.canvas.tag_lower(id) # XXX .lower(id) before Python 1.5.2
-        return cy
-
-    def drawicon(self):
-        if self.selected:
-            imagename = (self.item.GetSelectedIconName() or
-                         self.item.GetIconName() or
-                         "openfolder")
-        else:
-            imagename = self.item.GetIconName() or "folder"
-        image = self.geticonimage(imagename)
-        id = self.canvas.create_image(self.x, self.y, anchor="nw", image=image)
-        self.image_id = id
-        self.canvas.tag_bind(id, "<1>", self.select)
-        self.canvas.tag_bind(id, "<Double-1>", self.flip)
-        self.canvas.tag_bind(id, "<3>", self.popupMenu)
-        
-    def drawtext(self, text=None):
-        textx = self.x+20-1
-        texty = self.y-1
-        labeltext = self.item.GetLabelText()
-        if labeltext:
-            id = self.canvas.create_text(textx, texty, anchor="nw",
-                                         text=labeltext)
-            self.canvas.tag_bind(id, "<1>", self.select)
-            self.canvas.tag_bind(id, "<Double-1>", self.flip)
-            x0, y0, x1, y1 = self.canvas.bbox(id)
-            textx = max(x1, 200) + 10
-        if text==None:
-            text = self.item.GetText() or "<no text>"
-        try:
-            self.entry
-        except AttributeError:
-            pass
-        else:
-            self.edit_finish()
-        try:
-            label = self.label
-        except AttributeError:
-            # padding carefully selected (on Windows) to match Entry widget:
-            self.label = Label(self.canvas, text=text, bd=0, padx=2, pady=2)
-        if self.selected:
-            self.label.configure(fg="white", bg="darkblue")
-        else:
-            fg = self.item.GetTextFg()
-            self.label.configure(fg=fg, bg="white")
-        id = self.canvas.create_window(textx, texty,
-                                       anchor="nw", window=self.label)
-        self.label.bind("<1>", self.select_or_edit)
-        self.label.bind("<Double-1>", self.flip)
-        self.label.bind("<3>", self.popupMenu)
-        # Update text if necessary
-        if text != self.label['text']:
-            self.label['text'] = text
-        self.text_id = id
-
-    def select_or_edit(self, event=None):
-        if self.selected and self.item.IsEditable():
-            text = self.item.GetTextForEdit()
-            self.label['text'] = text
-            self.drawtext(text)
-            self.edit(event)
-        else:
-            self.select(event)
-
-    def edit(self, event=None):
-        self.entry = Entry(self.label, bd=0, highlightthickness=1, width=0)
-        self.entry.insert(0, self.label['text'])
-        self.entry.selection_range(0, Tkinter.END)
-        self.entry.pack(ipadx=5)
-        self.entry.focus_set()
-        self.entry.bind("<Return>", self.edit_finish)
-        self.entry.bind("<Escape>", self.edit_cancel)
-
-    def edit_finish(self, event=None):
-        try:
-            entry = self.entry
-            del self.entry
-        except AttributeError:
-            return
-        text = entry.get()
-        entry.destroy()
-        if text and text != self.item.GetText():
-            self.item.SetText(text)
-        text = self.item.GetText()
-        self.label['text'] = text
-        self.drawtext()
-        self.canvas.focus_set()
-
-    def edit_cancel(self, event=None):
-        self.drawtext()
-        self.canvas.focus_set()
-
-    def find(self, searchKey):
-        # Search for a node who's key matches the given key
-        # Is it this node
-        if searchKey == self.item.GetKey():
-            return self
-        # Nope, check the children
-        sublist = self.item._GetSubList()
-        for item in sublist:
-            key = item.GetKey()
-            # Use existing child or create new TreeNode if none exists
-            if self.children.has_key(key):
-                child = self.children[key]
-            else:
-                child = TreeNode(self.canvas, self, item, self.menuList)
-                # Update local list of children and keys
-                self.children[key] = child
-                self.kidKeys.append(key)
-            # See if node is child (or one of child's descendants)
-            retVal = child.find(searchKey)
-            if retVal:
-                return retVal
-        # Not here
-        return None
-
-class TreeItem:
-
-    """Abstract class representing tree items.
-
-    Methods should typically be overridden, otherwise a default action
-    is used.
-
-    """
-
-    def __init__(self):
-        """Constructor.  Do whatever you need to do."""
-
-    def GetText(self):
-        """Return text string to display."""
-
-    def GetTextFg(self):
-        return "black"
-
-    def GetLabelText(self):
-        """Return label text string to display in front of text (if any)."""
-
-    def IsExpandable(self):
-        """Return whether there are subitems."""
-        return 1
-
-    def _GetSubList(self):
-        """Do not override!  Called by TreeNode."""
-        if not self.IsExpandable():
-            return []
-        sublist = self.GetSubList()
-        return sublist
-
-    def IsEditable(self):
-        """Return whether the item's text may be edited."""
-
-    def SetText(self, text):
-        """Change the item's text (if it is editable)."""
-
-    def GetIconName(self):
-        """Return name of icon to be displayed normally."""
-
-    def GetSelectedIconName(self):
-        """Return name of icon to be displayed when selected."""
-
-    def GetSubList(self):
-        """Return list of items forming sublist."""
-
-    def OnDoubleClick(self):
-        """Called on a double-click on the item."""
-
-    def OnSelect(self):
-        """Called when item selected."""
-        
-    def GetTextForEdit(self):
-        """Called before editting the item."""
-
-
-

BIN
doc/makepanda/Panda3D-tpl.dmg


+ 0 - 107
doc/makepanda/confauto.in

@@ -1,107 +0,0 @@
-###########################################################
-###                                                     ###
-### Panda3D Configuration File - Auto-Generated Portion ###
-###                                                     ###
-### Editing this file is not recommended. Most of these ###
-### directives can be overriden in Config.prc           ###
-###                                                     ###
-###########################################################
-
-# The egg loader is handy to have available by default.  This allows
-# clients to load egg files.  (The bam loader is built-in so bam files
-# are always loadable).
-
-# By qualifying with the extension "egg", we indicate the egg loader
-# should be made available only if you explicitly name a file with an
-# .egg extension.
-
-# Also see ptloader, which is built as part of pandatool; it allows
-# files of more exotic types (like .flt, .mb, .lwo, and .dxf) to be
-# loaded directly into Panda.
-
-load-file-type egg pandaegg
-
-# The following lines define some handy object types to use within the
-# egg syntax.  This remaps <ObjectType> { name } into whatever egg
-# syntax is given by egg-object-type-name, which makes a handy
-# abbreviation for modeling packages (like Maya) to insert
-# sophisticated egg syntax into the generated egg file, using a single
-# object type string.
-
-egg-object-type-portal          <Scalar> portal { 1 }
-egg-object-type-polylight       <Scalar> polylight { 1 }
-egg-object-type-seq24           <Switch> { 1 } <Scalar> fps { 24 }
-egg-object-type-seq12           <Switch> { 1 } <Scalar> fps { 12 }
-egg-object-type-indexed         <Scalar> indexed { 1 }
-
-egg-object-type-binary          <Scalar> alpha { binary }
-egg-object-type-dual            <Scalar> alpha { dual }
-egg-object-type-glass           <Scalar> alpha { blend_no_occlude }
-
-# These are just shortcuts to define the Model and DCS flags, which
-# indicate nodes that should not be flattened out of the hierarchy
-# during the conversion process.  DCS goes one step further and
-# indicates that the node's transform is important and should be
-# preserved (DCS stands for Dynamic Coordinate System).  Notouch is
-# even stronger, and means not to do any flattening below the node at
-# all.
-egg-object-type-model           <Model> { 1 }
-egg-object-type-dcs             <DCS> { 1 }
-egg-object-type-notouch         <DCS> { no_touch }
-
-# The following define various kinds of collision geometry.  These
-# mark the geometry at this level and below as invisible collision
-# polygons, which can be used by Panda's collision system to detect
-# collisions more optimally than regular visible polygons.
-egg-object-type-barrier         <Collide> { Polyset descend }
-egg-object-type-sphere          <Collide> { Sphere descend }
-egg-object-type-invsphere       <Collide> { InvSphere descend }
-egg-object-type-tube            <Collide> { Tube descend }
-
-# As above, but these are flagged to be "intangible", so that they
-# will trigger an event but not stop an object from passing through.
-egg-object-type-trigger         <Collide> { Polyset descend intangible }
-egg-object-type-trigger-sphere  <Collide> { Sphere descend intangible }
-
-# "floor" and "dupefloor" define the nodes in question as floor
-# polygons.  dupefloor means to duplicate the geometry first so that
-# the same polygons serve both as visible geometry and as collision
-# polygons.
-egg-object-type-floor           <Collide> { Polyset descend level }
-egg-object-type-dupefloor       <Collide> { Polyset keep descend level }
-
-# "bubble" puts an invisible bubble around an object, but does not
-# otherwise remove the geometry.
-egg-object-type-bubble          <Collide> { Sphere keep descend }
-
-# "ghost" turns off the normal collide bit that is set on visible
-# geometry by default, so that if you are using visible geometry for
-# collisions, this particular geometry will not be part of those
-# collisions--it is ghostlike.
-egg-object-type-ghost           <Scalar> collide-mask { 0 }
-
-# "glow" is useful for halo effects and things of that ilk.  It
-# renders the object in add mode instead of the normal opaque mode.
-egg-object-type-glow            <Scalar> blend { add }
-
-# This module allows direct loading of formats like .flt, .mb, or .dxf
-
-load-file-type p3ptloader
-
-# Define a new egg object type.  See the comments in _panda.prc about this.
-
-egg-object-type-direct-widget   <Scalar> collide-mask { 0x80000000 } <Collide> { Polyset descend }
-
-# Define a new cull bin that will render on top of everything else.
-
-cull-bin gui-popup 60 unsorted
-
-# The following two lines are a fix for flaky hardware clocks.
-
-lock-to-one-cpu #t
-paranoid-clock 1
-
-# This default only comes into play if you try to load a model
-# and don't specify an extension.
-
-default-model-extension .egg

+ 0 - 86
doc/makepanda/config.in

@@ -1,86 +0,0 @@
-###########################################################
-###                                                     ###
-### Panda3D Configuration File -  User-Editable Portion ###
-###                                                     ###
-###########################################################
-
-# Uncomment one of the following lines to choose whether you should
-# run using OpenGL or DirectX rendering.
-
-load-display pandagl
-
-# These control the placement and size of the default rendering window.
-
-win-origin 50 50
-win-size 800 600
-
-# Uncomment this line if you want to run Panda fullscreen instead of
-# in a window.
-
-fullscreen #f
-
-# The framebuffer-hardware flag forces it to use an accelerated driver.
-# The framebuffer-software flag forces it to use a software renderer.
-# If you don't set either, it will use whatever's available.
-
-framebuffer-hardware #t
-framebuffer-software #f
-
-# These set the minimum requirements for the framebuffer.
-
-depth-bits 16
-color-bits 16
-alpha-bits 0
-stencil-bits 0
-multisamples 0
-
-# These control the amount of output Panda gives for some various
-# categories.  The severity levels, in order, are "spam", "debug",
-# "info", "warning", and "error"; the default is "info".  Uncomment
-# one (or define a new one for the particular category you wish to
-# change) to control this output.
-
-notify-level warning
-default-directnotify-level warning
-
-# These specify where model files may be loaded from.  You probably
-# want to set this to a sensible path for yourself.  $THIS_PRC_DIR is
-# a special variable that indicates the same directory as this
-# particular Config.prc file.
-
-model-path    $MAIN_DIR
-model-path    $THIS_PRC_DIR/..
-model-path    $THIS_PRC_DIR/../models
-
-# This enable the automatic creation of a TK window when running
-# Direct.
-
-want-directtools  #f
-want-tk           #f
-
-# Enable/disable performance profiling tool and frame-rate meter
-
-want-pstats            #f
-show-frame-rate-meter  #f
-
-# Enable audio using the FMOD audio library by default:
-
-audio-library-name p3fmod_audio
-
-# Enable the use of the new movietexture class.
-
-use-movietexture #t
-
-# The new version of panda supports hardware vertex animation, but it's not quite ready
-
-hardware-animated-vertices 0
-
-# Enable the model-cache, but only for models, not textures.
-
-model-cache-dir $THIS_PRC_DIR/../modelcache
-model-cache-textures #f
-
-# Limit the use of advanced shader profiles.
-# Currently, advanced profiles are not reliable under Cg.
-
-basic-shaders-only #t

+ 0 - 26
doc/makepanda/expandimports.bat

@@ -1,26 +0,0 @@
-@echo off
-
-REM
-REM Verify that we can find the 'expandimports' python script
-REM and the python interpreter.  If we can find both, then
-REM run 'expandimports'.
-REM
-
-if not exist makepanda\expandimports.py goto :missing1
-if not exist thirdparty\win-python\python.exe goto :missing2
-thirdparty\win-python\python.exe makepanda\expandimports.py %*
-goto done
-
-:missing1
-  echo You need to change directory to the root of the panda source tree
-  echo before invoking expandimports.
-  goto done
-
-:missing2
-  echo You seem to be missing the 'thirdparty' directory.  You probably checked
-  echo the source code out from sourceforge.  The sourceforge repository is
-  echo missing the 'thirdparty' directory.  You will need to supplement the
-  echo code by downloading the 'thirdparty' directory from panda3d.etc.cmu.edu
-  goto done
-
-:done

+ 0 - 21
doc/makepanda/expandimports.py

@@ -1,21 +0,0 @@
-########################################################################
-##
-## Win32 Usage: makepanda\expandimports.bat
-## Linux Usage: makepanda/expandimports.py
-##
-########################################################################
-
-import sys,os,re
-sys.path = ["direct/src/directscripts"] + sys.path
-import gendocs
-
-########################################################################
-##
-## Make sure panda has been built.
-##
-########################################################################
-
-if (os.path.isfile("built/pandac/input/libpgraph.in")==0) or (os.path.isfile("built/pandac/input/libputil.in")==0):
-    sys.exit("Cannot read the interrogate-output files in built/pandac/input")
-
-gendocs.expandImports("built/pandac/input", "direct", "samples")

+ 0 - 26
doc/makepanda/makechm.bat

@@ -1,26 +0,0 @@
-@echo off
-
-REM
-REM Verify that we can find the 'makechm' python script
-REM and the python interpreter.  If we can find both, then
-REM run 'makechm'.
-REM
-
-if not exist makepanda\makechm.py goto :missing1
-if not exist thirdparty\win-python\python.exe goto :missing2
-thirdparty\win-python\python.exe makepanda\makechm.py %*
-goto done
-
-:missing1
-  echo You need to change directory to the root of the panda source tree
-  echo before invoking makechm.
-  goto done
-
-:missing2
-  echo You seem to be missing the 'thirdparty' directory.  You probably checked
-  echo the source code out from sourceforge.  The sourceforge repository is
-  echo missing the 'thirdparty' directory.  You will need to supplement the
-  echo code by downloading the 'thirdparty' directory from panda3d.etc.cmu.edu
-  goto done
-
-:done

+ 0 - 278
doc/makepanda/makechm.py

@@ -1,278 +0,0 @@
-########################################################################
-##
-## Win32 Usage: makepanda\makechm.bat
-## Linux Usage: makepanda/makechm.py
-##
-## To use this script, you will need to have hhc.exe on your system.
-## For verbose output, run with -v or --verbose option.
-## To keep the temporary .hhc, .hhk, .hhp, .chw files use -k or --keep.
-##
-## You can also import this file as a python module. You will then have
-## access to three functions: makeCHM, makeManualCHM, makeReferenceCHM.
-## This is how you call them:
-##   makeCHM(outputfile, dirname, title)
-## where outputfile is the filename where the .chm file will be written,
-## and dirname is the directory containing the html files to include.
-## Title will be the title of the CHM file.
-## The functions makeManualCHM and makeReferenceCHM work exactly the
-## same, except that they work with a structure resembling that of the
-## Panda3D manual and reference, respectively.
-## Note: outputfile should not contain spaces.
-##
-########################################################################
-
-__all__ = ["makeCHM", "makeManualCHM", "makeReferenceCHM"]
-import os, re
-from sys import exit
-import xml.dom.minidom
-from xml.dom.minidom import Node
-
-VERBOSE = False
-KEEPTEMP = False
-
-if __name__ == "__main__":
-    from sys import argv
-    VERBOSE  = ("-v" in argv) or ("-vk" in argv) or ("-kv" in argv) or ("--verbose" in argv)
-    KEEPTEMP = ("-k" in argv) or ("-kv" in argv) or ("-vk" in argv) or ("--keep"    in argv)
-
-OPTIONBLOCK = """
-Binary TOC=Yes
-Compatibility=1.1 or later
-Compiled file=%s
-Contents file=%s.hhc
-Default Font=Arial,10,0
-Default topic=%s
-Display compile progress=VERBOSE
-Full-text search=Yes
-Index file=%s.hhk
-Language=0x409 English (United States)
-Title=%s""".replace("VERBOSE", VERBOSE and "Yes" or "No")
-
-HTMLBLOCK = """<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
-<html>
-  <head>
-    <meta name="generator" content="Panda3D - makechm.py">
-  </head>
-  <body>
-    <object type="text/site properties">
-      <param name="Window Styles" value="0x800025">
-      <param name="ImageType" value="Folder">
-      <param name="Font" value="Arial,8,0">
-    </object>
-    <ul>\n"""
-
-REFERENCEITEMS = [
-    ("index.html",     "Main Page"),
-    ("methods.html",   "Methods"),
-    ("functions.html", "Global Functions"),
-    ("classes.html",   "Classes"),
-]
-
-def urldecode(url): 
-    regex = re.compile("%([0-9a-hA-H][0-9a-hA-H])", re.M) 
-    return regex.sub(lambda x: chr(int(x.group(1), 16)), url) 
-
-def ireplace(string, target, replacement):
-    """Case-insensitive replace."""
-    index = string.lower().find(target.lower())
-    if index >= 0:
-        result = string[:index] + replacement + string[index + len(target):]
-        return result
-    else:
-        return string
-
-def parseAnchor(node):
-    """Parses an XML minidom node representing an anchor and returns a tuple
-    containing the href and the content of the link."""
-    assert node.nodeType == Node.ELEMENT_NODE
-    assert node.localName == "a"
-    href = ""
-    title = ""
-    for localName, a in node.attributes.items():
-        if localName.lower() == "href":
-            href = a
-    for e in node.childNodes:
-        if e.nodeType == Node.TEXT_NODE:
-            title += e.data
-    return href, title
-
-def parseManualTree(node):
-    """Parses a tree of the manual Main_Page and returns it through a list containing tuples:
-    [(title, href, [(title, href, [...]), ...]), ...]"""
-    if node.nodeType != Node.ELEMENT_NODE: return []
-    result = []
-    lastadded = None
-    for e in node.childNodes:
-        if e.nodeType == Node.ELEMENT_NODE:
-            if e.localName == "ol":
-                assert lastadded != None
-                for i in xrange(len(result)):
-                    if result[i][:2] == lastadded:
-                        result[i] = lastadded + (parseManualTree(e),)
-            elif e.localName == "a":
-                href, title = parseAnchor(e)
-                lastadded = title, href
-                result.append((title, href, None))
-    return result
-
-def parseManualTOC(filename):
-    """Reads the manual's Main_Page file and returns a list of all the trees found."""
-    filename = open(filename)
-    text = filename.read()
-    filename.close()
-    text = text.split("<h2>Table of Contents</h2>")[1].split("</td>")[0]
-    text = "<root>" + text.replace("<li>", "") + "</root>"
-    text = re.sub(re.compile("<!--([^>]+)>"), "", text)
-    result = []
-    for e in xml.dom.minidom.parseString(text).childNodes[0].childNodes:
-        if e.nodeType == Node.ELEMENT_NODE:
-            result.append(parseManualTree(e))
-    return result
-
-def treeToHTML(tree, dirname, indent = ""):
-    """Converts a tree into HTML code suitable for .hhc or .hhk files. The tree should be like:
-    [(title, href, [(title, href, [...]), ...]), ...]"""
-    html = ""
-    for title, href, sub in tree:
-        html += indent + "<li><object type=\"text/sitemap\">\n"
-        html += indent + "  <param name=\"Name\" value=\"%s\">\n" % title.replace("CXX", "C++").replace("\"", "&quot;")
-        html += indent + "  <param name=\"Local\" value=\"%s\">\n" % urldecode(os.path.join(dirname, href))
-        html += indent + "</object>\n"
-        if sub != None:
-            html += indent + "<ul>\n"
-            html += treeToHTML(sub, dirname, indent + "  ")
-            html += indent + "</ul>\n"
-    return html            
-
-def makeCHM(outputfile, dirname, title, special = None):
-    """Creates a CHM file based on a directory of HTML files. See the top of this file for more info."""
-    assert special == None or special in ["manual", "reference"]
-    reference = (special == "reference")
-    manual = (special == "manual")
-    base = ireplace(outputfile, ".chm", "")
-    if os.path.isfile(base + ".chm"): os.remove(base + ".chm")
-    # Create the hhp file
-    hhp = open(base + ".hhp", "w")
-    hhp.write("[OPTIONS]\n")
-    hhp.write(OPTIONBLOCK % (base + ".chm", base, urldecode(os.path.join(dirname, "index.html")), base, title))
-    hhp.write("\n[FILES]\n")
-    # Create the TOC file and Index file
-    hhk = open(base + ".hhk", "w")
-    hhc = open(base + ".hhc", "w")
-    hhk.write(HTMLBLOCK)
-    hhc.write(HTMLBLOCK)
-    # The manual should be treated as a special case.
-    if manual:
-        hhc.write("      <li><object type=\"text/sitemap\">\n")
-        hhc.write("        <param name=\"Name\" value=\"Main Page\">\n")
-        hhc.write("        <param name=\"Local\" value=\"%s\">\n" % urldecode(os.path.join(dirname, "index.html")))
-        hhc.write("      </object>\n")
-        for item in parseManualTOC("manual/index.html"):
-            hhc.write(treeToHTML(item, dirname, "      "))
-        for i in os.listdir(dirname):
-            hhp.write(os.path.join(dirname, i) + "\n")
-            if i != "index.html":
-                hhk.write("      <li><object type=\"text/sitemap\">\n")
-                hhk.write("        <param name=\"Name\" value=\"%s\">\n" % ireplace(urldecode(i).replace(".1", "").replace("_", " ").replace("CXX", "C++"), ".html", "").replace("\"", "&quot;"))
-                hhk.write("        <param name=\"Local\" value=\"%s\">\n" % urldecode(os.path.join(dirname, i)))
-                hhk.write("      </object>\n")
-    else:
-        idt = "      "
-        # If we are writing out the reference, write some extra stuff.
-        if reference:
-            idt = "        "
-            for i, desc in REFERENCEITEMS:
-                hhk.write("      <li><object type=\"text/sitemap\">\n")
-                hhk.write("        <param name=\"Name\" value=\"%s\">\n" % desc.replace("\"", "&quot;"))
-                hhk.write("        <param name=\"Local\" value=\"%s\">\n" % urldecode(os.path.join(dirname, i)))
-                hhk.write("      </object>\n")
-                hhc.write("      <li><object type=\"text/sitemap\">\n")
-                hhc.write("        <param name=\"Name\" value=\"%s\">\n" % desc.replace("\"", "&quot;"))
-                hhc.write("        <param name=\"Local\" value=\"%s\">\n" % urldecode(os.path.join(dirname, i)))
-                hhc.write("      </object>\n")
-            hhc.write("      <ul>\n")
-        # Loop through the directories and write out relevant data.
-        for i in os.listdir(dirname):
-            hhp.write(os.path.join(dirname, i) + "\n")
-            if i != "index.html" and ((not reference) or (not i  in ["classes.html", "methods.html", "functions.html"])):
-                hhk.write("      <li><object type=\"text/sitemap\">\n")
-                hhk.write("        <param name=\"Name\" value=\"%s\">\n" % ireplace(urldecode(i).replace(".1", ""), ".html", "").replace("\"", "&quot;"))
-                hhk.write("        <param name=\"Local\" value=\"%s\">\n" % urldecode(os.path.join(dirname, i)))
-                hhk.write("      </object>\n")
-                hhc.write(idt + "<li><object type=\"text/sitemap\">\n")
-                hhc.write(idt + "  <param name=\"Name\" value=\"%s\">\n" % ireplace(urldecode(i).replace(".1", ""), ".html", "").replace("\"", "&quot;"))
-                hhc.write(idt + "  <param name=\"Local\" value=\"%s\">\n" % urldecode(os.path.join(dirname, i)))
-                hhc.write(idt + "</object>\n")
-    # Close the files.
-    if reference: hhc.write("      </ul>\n")
-    hhk.write("    </ul>\n  </body>\n</html>")
-    hhc.write("    </ul>\n  </body>\n</html>")
-    hhk.close()
-    hhc.close()
-    hhp.close()
-    # Now, execute the command to compile the files.
-    if os.path.isdir("C:\Program Files\HTML Help Workshop"):
-        cmd = "\"C:\Program Files\HTML Help Workshop\hhc.exe\" %s.hhp" % base
-    else:
-        cmd = "hhc \"%s.hhp\"" % base
-    print cmd
-    os.system(cmd)
-    if not KEEPTEMP:
-        if os.path.isfile("%s.hhp" % base): os.remove("%s.hhp" % base)
-        if os.path.isfile("%s.hhc" % base): os.remove("%s.hhc" % base)
-        if os.path.isfile("%s.hhk" % base): os.remove("%s.hhk" % base)
-        if os.path.isfile("%s.chw" % base): os.remove("%s.chw" % base)
-    if not os.path.isfile(base + ".chm"):
-        print "An error has occurred!"
-        if __name__ == "__main__":
-            exit(1)
-        else:
-            return False
-    if __name__ != "__main__":
-        return True
-
-def makeManualCHM(outputfile, dirname, title):
-    """Same as makeCHM, but suitable for converting the Panda3D manual."""
-    return makeCHM(outputfile, dirname, title, special = "manual")
-
-def makeReferenceCHM(outputfile, dirname, title):
-    """Same as makeCHM, but converts a structure resembling that of the Panda3D reference."""
-    return makeCHM(outputfile, dirname, title, special = "reference")
-
-if __name__ == "__main__":
-    # Extract a version number, if we have one.
-    VERSION = None
-    try:
-        f = file("built/include/pandaVersion.h","r")
-        pattern = re.compile('^\s*[#]\s*define\s+PANDA_VERSION_STR\s+["]([0-9.]+)["]')
-        for line in f:
-            match = pattern.match(line,0)
-            if (match):
-                VERSION = match.group(1)
-                break
-        f.close()
-    except:
-        # If not, we don't care at all.
-        pass
-    
-    # Now, make CHM's for both the manual and reference, if we have them.
-    if not os.path.isdir("manual"):
-        print "No directory named 'manual' found"
-    else:
-        print "Making CHM file for manual..."
-        if VERSION == None:
-            makeManualCHM("manual.chm", "manual", "Panda3D Manual")
-        else:
-            makeManualCHM("manual-%s.chm" % VERSION, "manual", "Panda3D %s Manual" % VERSION)
-    
-    if not os.path.isdir("reference"):
-        print "No directory named 'reference' found"
-    else:
-        print "Making CHM file for API reference..."
-        if VERSION == None:
-            makeReferenceCHM("reference.chm", "reference", "Panda3D Reference")
-        else:
-            makeReferenceCHM("reference-%s.chm" % VERSION, "reference", "Panda3D %s Reference" % VERSION)
-    
-    print "Done!"
-

+ 0 - 26
doc/makepanda/makedocs.bat

@@ -1,26 +0,0 @@
-@echo off
-
-REM
-REM Verify that we can find the 'makedocs' python script
-REM and the python interpreter.  If we can find both, then
-REM run 'makedocs'.
-REM
-
-if not exist makepanda\makedocs.py goto :missing1
-if not exist thirdparty\win-python\python.exe goto :missing2
-thirdparty\win-python\python.exe makepanda\makedocs.py %*
-goto done
-
-:missing1
-  echo You need to change directory to the root of the panda source tree
-  echo before invoking makedocs.
-  goto done
-
-:missing2
-  echo You seem to be missing the 'thirdparty' directory.  You probably checked
-  echo the source code out from sourceforge.  The sourceforge repository is
-  echo missing the 'thirdparty' directory.  You will need to supplement the
-  echo code by downloading the 'thirdparty' directory from panda3d.etc.cmu.edu
-  goto done
-
-:done

+ 0 - 77
doc/makepanda/makedocs.py

@@ -1,77 +0,0 @@
-########################################################################
-##
-## Win32 Usage: makepanda\makedocs.bat
-## Linux Usage: makepanda/makedocs.py
-##
-########################################################################
-
-import sys,os,re
-sys.path = ["direct/src/directscripts"] + sys.path
-import gendocs
-
-########################################################################
-##
-## Some handy utility functions.
-##
-########################################################################
-
-def MakeDirectory(path):
-    if os.path.isdir(path): return 0
-    os.mkdir(path)
-
-########################################################################
-##
-## Read the version number from built/include/pandaVersion.h
-##
-########################################################################
-
-VERSION="0.0.0"
-try:
-    f = file("built/include/pandaVersion.h","r")
-    pattern = re.compile('^\s*[#]\s*define\s+PANDA_VERSION_STR\s+["]([0-9.]+)["]')
-    for line in f:
-        match = pattern.match(line,0)
-        if (match):
-            VERSION = match.group(1)
-            break
-    f.close()
-except: sys.exit("Cannot read version number from built/include/pandaVersion.h")
-
-print "Generating docs for "+VERSION
-
-########################################################################
-##
-## Make sure panda has been built.
-##
-########################################################################
-
-if (os.path.isfile("built/pandac/input/libpgraph.in")==0) or (os.path.isfile("built/pandac/input/libputil.in")==0):
-    sys.exit("Cannot read the interrogate-output files in built/pandac/input")
-
-########################################################################
-##
-## Generate the PHP version.
-##
-## The manual is in the form of a bunch of HTML files that can be
-## included by a PHP script called "/apiref.php".
-##
-########################################################################
-
-MakeDirectory("referphp")
-gendocs.generate(VERSION, "built/pandac/input", "direct", "referphp", "", "", "/apiref.php?page=", "")
-
-########################################################################
-##
-## Generate the HTML version.
-##
-## The manual is in the form of a bunch of standalone HTML files
-## that contain links to each other.
-##
-########################################################################
-
-HEADER = "<html><head></head><body>\n"
-FOOTER = "</body></html>\n"
-
-MakeDirectory("reference")
-gendocs.generate(VERSION, "built/pandac/input", "direct", "reference", HEADER, FOOTER, "", ".html")
-

+ 0 - 28
doc/makepanda/makepanda.bat

@@ -1,28 +0,0 @@
-@echo off
-
-REM
-REM Verify that we can find the 'makepanda' python script
-REM and the python interpreter.  If we can find both, then
-REM run 'makepanda'.
-REM
-
-if not exist makepanda\makepanda.py goto :missing1
-if not exist thirdparty\win-python\python.exe goto :missing2
-thirdparty\win-python\python.exe makepanda\makepanda.py %*
-if errorlevel 1 if x%1 == x--slavebuild exit 1
-goto done
-
-:missing1
-  echo You need to change directory to the root of the panda source tree
-  echo before invoking makepanda.  For further install instructions, read 
-  echo the installation instructions in the file doc/INSTALL-MK.
-  goto done
-
-:missing2
-  echo You seem to be missing the 'thirdparty' directory.  You probably checked
-  echo the source code out from sourceforge.  The sourceforge repository is
-  echo missing the 'thirdparty' directory.  You will need to supplement the
-  echo code by downloading the 'thirdparty' directory from panda3d.etc.cmu.edu
-  goto done
-
-:done

+ 0 - 3839
doc/makepanda/makepanda.py

@@ -1,3839 +0,0 @@
-#!/usr/bin/python
-########################################################################
-#
-# Caution: there are two separate, independent build systems:
-# 'makepanda', and 'ppremake'.  Use one or the other, do not attempt
-# to use both.  This file is part of the 'makepanda' system.
-#
-# To build panda using this script, type 'makepanda.py' on unix
-# or 'makepanda.bat' on windows, and examine the help-text.
-# Then run the script again with the appropriate options to compile
-# panda3d.
-#
-########################################################################
-
-import sys,os,platform,time,stat,string,re,getopt,cPickle,fnmatch,threading,Queue,signal,shutil
-
-from makepandacore import *
-
-########################################################################
-##
-## PARSING THE COMMAND LINE OPTIONS
-##
-## You might be tempted to change the defaults by editing them
-## here.  Don't do it.  Instead, create a script that compiles
-## panda with your preferred options.  Or, create
-## a 'makepandaPreferences' file and put it into your python path.
-##
-########################################################################
-
-COMPILER=0
-THIRDPARTYLIBS=0
-VC90CRTVERSION=""
-OPTIMIZE="3"
-INSTALLER=0
-GENMAN=0
-VERBOSE=1
-COMPRESSOR="zlib"
-THREADCOUNT=0
-
-PkgListSet(MAYAVERSIONS + MAXVERSIONS + DXVERSIONS + [
-  "PYTHON","ZLIB","PNG","JPEG","TIFF","VRPN",
-  "FMODEX","OPENAL","NVIDIACG","OPENSSL","FREETYPE",
-  "FFTW","ARTOOLKIT","SQUISH","ODE","DIRECTCAM",
-  "OPENCV","FFMPEG","FCOLLADA","PANDATOOL"
-])
-
-CheckPandaSourceTree()
-
-VERSION=ParsePandaVersion("dtool/PandaVersion.pp")
-
-LoadDependencyCache()
-
-def keyboardInterruptHandler(x,y):
-    exit("keyboard interrupt")
-
-signal.signal(signal.SIGINT, keyboardInterruptHandler)
-
-########################################################################
-##
-## Command-line parser.
-##
-## You can type "makepanda --help" to see all the options.
-##
-########################################################################
-
-def usage(problem):
-    if (problem):
-        print ""
-        print problem
-    print ""
-    print "Makepanda generates a 'built' subdirectory containing a"
-    print "compiled copy of Panda3D.  Command-line arguments are:"
-    print ""
-    print "  --help            (print the help message you're reading now)"
-    print "  --optimize X      (optimization level can be 1,2,3,4)"
-    print "  --installer       (build an installer)"
-    print "  --version         (set the panda version number)"
-    print "  --lzma            (use lzma compression when building installer)"
-    print "  --threads N       (use the multithreaded build system. see manual)"
-    print ""
-    for pkg in PkgListGet():
-        p = pkg.lower()
-        print "  --use-%-9s   --no-%-9s (enable/disable use of %s)"%(p, p, pkg)
-    print ""
-    print "  --nothing         (disable every third-party lib)"
-    print "  --everything      (enable every third-party lib)"
-    print ""
-    print "The simplest way to compile panda is to just type:"
-    print ""
-    print "  makepanda --everything"
-    print ""
-    exit("")
-
-def parseopts(args):
-    global OPTIMIZE,INSTALLER,GENMAN
-    global VERSION,COMPRESSOR,VERBOSE,THREADCOUNT
-    longopts = [
-        "help",
-        "optimize=","everything","nothing","installer",
-        "version=","lzma","no-python","threads=","outputdir="]
-    anything = 0
-    for pkg in PkgListGet(): longopts.append("no-"+pkg.lower())
-    for pkg in PkgListGet(): longopts.append("use-"+pkg.lower())
-    try:
-        opts, extras = getopt.getopt(args, "", longopts)
-        for option,value in opts:
-            if (option=="--help"): raise "usage"
-            elif (option=="--optimize"): OPTIMIZE=value
-            elif (option=="--installer"): INSTALLER=1
-            elif (option=="--genman"): GENMAN=1
-            elif (option=="--everything"): PkgEnableAll()
-            elif (option=="--nothing"): PkgDisableAll()
-            elif (option=="--threads"): THREADCOUNT=int(value)
-            elif (option=="--outputdir"): SetOutputDir(value.strip())
-            elif (option=="--version"):
-                VERSION=value
-                if (len(VERSION.split(".")) != 3): raise "usage"
-            elif (option=="--lzma"): COMPRESSOR="lzma"
-            else:
-                for pkg in PkgListGet():
-                    if (option=="--use-"+pkg.lower()):
-                        PkgEnable(pkg)
-                        break
-                for pkg in PkgListGet():
-                    if (option=="--no-"+pkg.lower()):
-                        PkgDisable(pkg)
-                        break
-            anything = 1
-    except: usage(0)
-    if (anything==0): usage(0)
-    if   (OPTIMIZE=="1"): OPTIMIZE=1
-    elif (OPTIMIZE=="2"): OPTIMIZE=2
-    elif (OPTIMIZE=="3"): OPTIMIZE=3
-    elif (OPTIMIZE=="4"): OPTIMIZE=4
-    else: usage("Invalid setting for OPTIMIZE")
-
-parseopts(sys.argv[1:])
-
-########################################################################
-##
-## Locate various SDKs.
-##
-########################################################################
-
-MakeBuildTree()
-
-SdkLocateDirectX()
-SdkLocateMaya()
-SdkLocateMax()
-SdkLocateMacOSX()
-SdkLocatePython()
-SdkLocateVisualStudio()
-SdkLocateMSPlatform()
-
-SdkAutoDisableDirectX()
-SdkAutoDisableMaya()
-SdkAutoDisableMax()
-
-########################################################################
-##
-## Choose a Compiler.
-##
-## This should also set up any environment variables needed to make
-## the compiler work.
-##
-########################################################################
-
-if (sys.platform == "win32"):
-    SetupVisualStudioEnviron()
-    COMPILER="MSVC"
-    THIRDPARTYLIBS="thirdparty/win-libs-vc9/"
-    VC90CRTVERSION = GetVC90CRTVersion(THIRDPARTYLIBS+"extras/bin/Microsoft.VC90.CRT.manifest")
-else:
-    CheckLinkerLibraryPath()
-    COMPILER="LINUX"
-    if (sys.platform == "darwin"):
-        THIRDPARTYLIBS="thirdparty/darwin-libs-a/"
-    elif (platform.architecture()[0] == "64bit"):
-        THIRDPARTYLIBS="thirdparty/linux-libs-x64/"
-    else:
-        THIRDPARTYLIBS="thirdparty/linux-libs-a/"
-    VC90CRTVERSION = 0
-
-##########################################################################################
-#
-# Disable packages that are currently broken or not supported.
-#
-##########################################################################################
-
-if (sys.platform == "win32"):
-     os.environ["BISON_SIMPLE"] = "thirdparty/win-util/bison.simple"
-
-if (INSTALLER) and (PkgSkip("PYTHON")):
-    exit("Cannot build installer without python")
-
-########################################################################
-##
-## External includes, external libraries, and external defsyms.
-##
-########################################################################
-
-if (COMPILER=="MSVC"):
-    if (PkgSkip("PYTHON")==0):
-        IncDirectory("ALWAYS", "thirdparty/win-python/include")
-        LibDirectory("ALWAYS", "thirdparty/win-python/libs")
-    for pkg in PkgListGet():
-        if (PkgSkip(pkg)==0):
-            if (pkg[:4]=="MAYA"):
-                IncDirectory(pkg, SDK[pkg]      + "/include")
-                DefSymbol(pkg, "MAYAVERSION", pkg)
-            elif (pkg[:3]=="MAX"):
-                IncDirectory(pkg, SDK[pkg]      + "/include")
-                IncDirectory(pkg, SDK[pkg+"CS"] + "/include")
-                DefSymbol(pkg, "MAX", pkg)
-            elif (pkg[:2]=="DX"):
-                IncDirectory(pkg, SDK[pkg]      + "/include")
-            else:
-                IncDirectory(pkg, "thirdparty/win-libs-vc9/" + pkg.lower() + "/include")
-    for pkg in DXVERSIONS:
-        if (PkgSkip(pkg)==0):
-            vnum=pkg[2:]
-            LibDirectory(pkg, SDK[pkg] + '/lib/x86')
-            LibDirectory(pkg, SDK[pkg] + '/lib')
-            LibName(pkg, 'd3dVNUM.lib'.replace("VNUM", vnum))
-            LibName(pkg, 'd3dxVNUM.lib'.replace("VNUM", vnum))
-            LibName(pkg, 'dxerrVNUM.lib'.replace("VNUM", vnum))
-            LibName(pkg, 'ddraw.lib')
-            LibName(pkg, 'dxguid.lib')
-    LibName("WINSOCK", "wsock32.lib")
-    LibName("WINSOCK2", "wsock32.lib")
-    LibName("WINSOCK2", "ws2_32.lib")
-    LibName("WINCOMCTL", "comctl32.lib")
-    LibName("WINCOMDLG", "comdlg32.lib")
-    LibName("WINUSER", "user32.lib")
-    LibName("WINMM", "winmm.lib")
-    LibName("WINIMM", "imm32.lib")
-    LibName("WINKERNEL", "kernel32.lib")
-    LibName("WINOLDNAMES", "oldnames.lib")
-    LibName("WINSHELL", "shell32.lib")
-    LibName("WINGDI", "gdi32.lib")
-    LibName("ADVAPI", "advapi32.lib")
-    LibName("GLUT", "opengl32.lib")
-    LibName("GLUT", "glu32.lib")
-    if (PkgSkip("DIRECTCAM")==0): LibName("DIRECTCAM", "strmiids.lib")
-    if (PkgSkip("DIRECTCAM")==0): LibName("DIRECTCAM", "quartz.lib")
-    if (PkgSkip("DIRECTCAM")==0): LibName("DIRECTCAM", "odbc32.lib")
-    if (PkgSkip("DIRECTCAM")==0): LibName("DIRECTCAM", "odbccp32.lib")
-    if (PkgSkip("PNG")==0):      LibName("PNG",      "thirdparty/win-libs-vc9/png/lib/libpandapng.lib")
-    if (PkgSkip("JPEG")==0):     LibName("JPEG",     "thirdparty/win-libs-vc9/jpeg/lib/libpandajpeg.lib")
-    if (PkgSkip("TIFF")==0):     LibName("TIFF",     "thirdparty/win-libs-vc9/tiff/lib/libpandatiff.lib")
-    if (PkgSkip("ZLIB")==0):     LibName("ZLIB",     "thirdparty/win-libs-vc9/zlib/lib/libpandazlib1.lib")
-    if (PkgSkip("VRPN")==0):     LibName("VRPN",     "thirdparty/win-libs-vc9/vrpn/lib/vrpn.lib")
-    if (PkgSkip("VRPN")==0):     LibName("VRPN",     "thirdparty/win-libs-vc9/vrpn/lib/quat.lib")
-    if (PkgSkip("FMODEX")==0):   LibName("FMODEX",   "thirdparty/win-libs-vc9/fmodex/lib/fmodex_vc.lib")
-    if (PkgSkip("OPENAL")==0):   LibName("OPENAL",   "thirdparty/win-libs-vc9/openal/lib/pandaopenal32.lib")
-    if (PkgSkip("NVIDIACG")==0): LibName("CGGL",     "thirdparty/win-libs-vc9/nvidiacg/lib/cgGL.lib")
-    if (PkgSkip("NVIDIACG")==0): LibName("CGDX9",    "thirdparty/win-libs-vc9/nvidiacg/lib/cgD3D9.lib")
-    if (PkgSkip("NVIDIACG")==0): LibName("NVIDIACG", "thirdparty/win-libs-vc9/nvidiacg/lib/cg.lib")
-    if (PkgSkip("OPENSSL")==0):  LibName("OPENSSL",  "thirdparty/win-libs-vc9/openssl/lib/libpandassl.lib")
-    if (PkgSkip("OPENSSL")==0):  LibName("OPENSSL",  "thirdparty/win-libs-vc9/openssl/lib/libpandaeay.lib")
-    if (PkgSkip("FREETYPE")==0): LibName("FREETYPE", "thirdparty/win-libs-vc9/freetype/lib/freetype.lib")
-    if (PkgSkip("FFTW")==0):     LibName("FFTW",     "thirdparty/win-libs-vc9/fftw/lib/rfftw.lib")        
-    if (PkgSkip("FFTW")==0):     LibName("FFTW",     "thirdparty/win-libs-vc9/fftw/lib/fftw.lib")        
-    if (PkgSkip("FFMPEG")==0):   LibName("FFMPEG",   "thirdparty/win-libs-vc9/ffmpeg/lib/avcodec-51-panda.lib")
-    if (PkgSkip("FFMPEG")==0):   LibName("FFMPEG",   "thirdparty/win-libs-vc9/ffmpeg/lib/avformat-50-panda.lib")
-    if (PkgSkip("FFMPEG")==0):   LibName("FFMPEG",   "thirdparty/win-libs-vc9/ffmpeg/lib/avutil-49-panda.lib")
-    if (PkgSkip("ARTOOLKIT")==0):LibName("ARTOOLKIT","thirdparty/win-libs-vc9/artoolkit/lib/libAR.lib")
-    if (PkgSkip("ODE")==0):      LibName("ODE",      "thirdparty/win-libs-vc9/ode/lib/ode.lib")
-    if (PkgSkip("FCOLLADA")==0): LibName("FCOLLADA", "thirdparty/win-libs-vc9/fcollada/lib/FCollada.lib")
-    if (PkgSkip("SQUISH")==0):   LibName("SQUISH",   "thirdparty/win-libs-vc9/squish/lib/squish.lib")
-    if (PkgSkip("OPENCV")==0):   LibName("OPENCV",   "thirdparty/win-libs-vc9/opencv/lib/cv.lib")
-    if (PkgSkip("OPENCV")==0):   LibName("OPENCV",   "thirdparty/win-libs-vc9/opencv/lib/highgui.lib")
-    if (PkgSkip("OPENCV")==0):   LibName("OPENCV",   "thirdparty/win-libs-vc9/opencv/lib/cvaux.lib")
-    if (PkgSkip("OPENCV")==0):   LibName("OPENCV",   "thirdparty/win-libs-vc9/opencv/lib/ml.lib")
-    if (PkgSkip("OPENCV")==0):   LibName("OPENCV",   "thirdparty/win-libs-vc9/opencv/lib/cxcore.lib")
-    for pkg in MAYAVERSIONS:
-        if (PkgSkip(pkg)==0):
-            LibName(pkg, SDK[pkg] + '/lib/Foundation.lib')
-            LibName(pkg, SDK[pkg] + '/lib/OpenMaya.lib')
-            LibName(pkg, SDK[pkg] + '/lib/OpenMayaAnim.lib')
-            LibName(pkg, SDK[pkg] + '/lib/OpenMayaUI.lib')
-    for pkg in MAXVERSIONS:
-        if (PkgSkip(pkg)==0):
-            LibName(pkg, SDK[pkg] +  '/lib/core.lib')
-            LibName(pkg, SDK[pkg] +  '/lib/edmodel.lib')
-            LibName(pkg, SDK[pkg] +  '/lib/gfx.lib')
-            LibName(pkg, SDK[pkg] +  '/lib/geom.lib')
-            LibName(pkg, SDK[pkg] +  '/lib/mesh.lib')
-            LibName(pkg, SDK[pkg] +  '/lib/maxutil.lib')
-            LibName(pkg, SDK[pkg] +  '/lib/paramblk2.lib')
-
-if (COMPILER=="LINUX"):
-    if (PkgSkip("PYTHON")==0):
-        IncDirectory("ALWAYS", SDK["PYTHON"])
-    if (sys.platform == "darwin"):
-        if (PkgSkip("FREETYPE")==0):
-          IncDirectory("FREETYPE", "/usr/X11R6/include")
-          IncDirectory("FREETYPE", "/usr/X11/include/freetype2/")
-        IncDirectory("GLUT", "/usr/X11R6/include")
-    else:
-        if (PkgSkip("FREETYPE")==0): IncDirectory("FREETYPE", "/usr/include/freetype2")
-        if (os.path.exists("/usr/lib64")):
-            IncDirectory("GTK2", "/usr/lib64/glib-2.0/include")
-            IncDirectory("GTK2", "/usr/lib64/gtk-2.0/include")
-    PkgConfigEnable("GTK2", "gtk+-2.0")
-    
-    if (sys.platform == "darwin"):
-        pkgs = ["VRPN", "FFTW", "FMODEX", "ARTOOLKIT", "ODE", "OPENCV", "FCOLLADA", "SQUISH", "FFMPEG", "PNG", "JPEG", "TIFF"]
-    else:
-        pkgs = ["VRPN", "FFTW", "FMODEX", "ARTOOLKIT", "ODE", "OPENCV", "FCOLLADA", "SQUISH", "NVIDIACG", "FFMPEG", "OPENAL"]
-    for pkg in pkgs:
-        if (PkgSkip(pkg)==0):
-            if (os.path.isdir(THIRDPARTYLIBS + pkg.lower())):
-                IncDirectory(pkg, THIRDPARTYLIBS + pkg.lower() + "/include")
-                LibDirectory(pkg, THIRDPARTYLIBS + pkg.lower() + "/lib")
-            else:
-                WARNINGS.append("I cannot locate SDK for " + pkg + " in thirdparty directory.")
-                WARNINGS.append("I have automatically added this command-line option: --no-"+pkg.lower())
-                PkgDisable(pkg)
-    
-    for pkg in MAYAVERSIONS:
-        if (PkgSkip(pkg)==0):
-            LibDirectory(pkg, SDK[pkg] + '/lib')
-            IncDirectory(pkg, SDK[pkg] + "/include")
-            DefSymbol(pkg, "MAYAVERSION", pkg)
-    
-    if (sys.platform == "darwin"):
-      if (PkgSkip("NVIDIACG")==0): LibName("NVIDIACG", "-framework Cg")
-      if (PkgSkip("OPENAL")==0):   LibName("OPENAL", "-framework OpenAL")
-      if (PkgSkip("OPENSSL")==0):  LibName("OPENSSL",  "-lcrypto")
-      if (PkgSkip("TIFF")==0):     LibName("TIFF",  "-lpandatiff")
-    else:
-      if (PkgSkip("NVIDIACG")==0): LibName("CGGL", "-lCgGL")
-      if (PkgSkip("NVIDIACG")==0): LibName("NVIDIACG", "-lCg")
-      if (PkgSkip("OPENAL")==0):   LibName("OPENAL", "-lpandaopenal")
-      if (PkgSkip("TIFF")==0):     LibName("TIFF", "-ltiff")
-    if (PkgSkip("SQUISH")==0):     LibName("SQUISH", "-lsquish")
-    if (PkgSkip("FCOLLADA")==0):   LibName("FCOLLADA", "-lFCollada")
-    if (PkgSkip("FMODEX")==0):     LibName("FMODEX", "-lfmodex")
-    if (PkgSkip("FFMPEG")==0):     LibName("FFMPEG", "-lavutil")
-    if (PkgSkip("FFMPEG")==0):     LibName("FFMPEG", "-lavformat")
-    if (PkgSkip("FFMPEG")==0):     LibName("FFMPEG", "-lavcodec")
-    if (PkgSkip("FFMPEG")==0):     LibName("FFMPEG", "-lavformat")
-    if (PkgSkip("FFMPEG")==0):     LibName("FFMPEG", "-lavutil")
-    if (PkgSkip("ZLIB")==0):       LibName("ZLIB", "-lz")
-    if (PkgSkip("PNG")==0):        LibName("PNG", "-lpng")
-    if (PkgSkip("JPEG")==0):       LibName("JPEG", "-ljpeg")
-    if (PkgSkip("OPENSSL")==0):    LibName("OPENSSL",  "-lssl")
-    if (PkgSkip("FREETYPE")==0):   LibName("FREETYPE", "-lfreetype")
-    if (PkgSkip("VRPN")==0):       LibName("VRPN", "-lvrpn")
-    if (PkgSkip("VRPN")==0):       LibName("VRPN", "-lquat")
-    if (PkgSkip("FFTW")==0):       LibName("FFTW", "-lrfftw")
-    if (PkgSkip("FFTW")==0):       LibName("FFTW", "-lfftw")
-    if (PkgSkip("ARTOOLKIT")==0):  LibName("ARTOOLKIT", "-lAR")
-    if (PkgSkip("ODE")==0):        LibName("ODE", "-lode")
-    if (PkgSkip("OPENCV")==0):     LibName("OPENCV", "-lcv")
-    if (PkgSkip("OPENCV")==0):     LibName("OPENCV", "-lhighgui")
-    if (PkgSkip("OPENCV")==0):     LibName("OPENCV", "-lcvaux")
-    if (PkgSkip("OPENCV")==0):     LibName("OPENCV", "-lml")
-    if (PkgSkip("OPENCV")==0):     LibName("OPENCV", "-lcxcore")
-    if (sys.platform == "darwin"):
-        if (PkgSkip("OPENCV")==0):   LibName("OPENCV", "-framework QuickTime")
-        LibName("AGL", "-framework AGL")
-        LibName("CARBON", "-framework Carbon")
-        LibName("COCOA", "-framework Cocoa")
-        LibName("GLUT", "-framework OpenGL")
-        LibName("GLUT", "-lOSMesa")
-        # Fix for a bug in OSX:
-        LibName("GLUT", "-dylib_file /System/Library/Frameworks/OpenGL.framework/Versions/A/Libraries/libGL.dylib:/System/Library/Frameworks/OpenGL.framework/Versions/A/Libraries/libGL.dylib")
-    else:
-        LibName("GLUT", "-lGL")
-        LibName("GLUT", "-lGLU")
-    
-    for pkg in MAYAVERSIONS:
-        if (PkgSkip(pkg)==0):
-            LibName(pkg, "-Wl,-rpath," + SDK[pkg] + "/lib")
-            if (sys.platform != "darwin"):
-                LibName(pkg, "-lOpenMayalib")
-            LibName(pkg, "-lOpenMaya")
-            LibName(pkg, "-lOpenMayaAnim")
-            LibName(pkg, "-lAnimSlice")
-            LibName(pkg, "-lDeformSlice")
-            LibName(pkg, "-lModifiers")
-            LibName(pkg, "-lDynSlice")
-            LibName(pkg, "-lKinSlice")
-            LibName(pkg, "-lModelSlice")
-            LibName(pkg, "-lNurbsSlice")
-            LibName(pkg, "-lPolySlice")
-            LibName(pkg, "-lProjectSlice")
-            LibName(pkg, "-lImage")
-            LibName(pkg, "-lShared")
-            LibName(pkg, "-lTranslators")
-            LibName(pkg, "-lDataModel")
-            LibName(pkg, "-lRenderModel")
-            LibName(pkg, "-lNurbsEngine")
-            LibName(pkg, "-lDependEngine")
-            LibName(pkg, "-lCommandEngine")
-            LibName(pkg, "-lFoundation")
-            LibName(pkg, "-lIMFbase")
-            if (sys.platform == "darwin"):
-                LibName(pkg, "-dylib_file /System/Library/Frameworks/OpenGL.framework/Versions/A/Libraries/libGL.dylib:/System/Library/Frameworks/OpenGL.framework/Versions/A/Libraries/libGL.dylib")
-
-DefSymbol("WITHINPANDA", "WITHIN_PANDA", "1")
-IncDirectory("ALWAYS", GetOutputDir()+"/tmp")
-IncDirectory("ALWAYS", GetOutputDir()+"/include")
-
-########################################################################
-##
-## Give a Status Report on Command-Line Options
-##
-########################################################################
-
-def printStatus(header,warnings):
-    global VERBOSE
-    if VERBOSE >= -2:
-        print ""
-        print "-------------------------------------------------------------------"
-        print header
-        tkeep = ""
-        tomit = ""
-        for x in PkgListGet():
-            if (PkgSkip(x)==0): tkeep = tkeep + x + " "
-            else:                  tomit = tomit + x + " "
-        print "Makepanda: Compiler:",COMPILER
-        print "Makepanda: Optimize:",OPTIMIZE
-        print "Makepanda: Keep Pkg:",tkeep
-        print "Makepanda: Omit Pkg:",tomit
-        print "Makepanda: Verbose vs. Quiet Level:",VERBOSE
-        if (GENMAN): print "Makepanda: Generate API reference manual"
-        else       : print "Makepanda: Don't generate API reference manual"
-        if (sys.platform == "win32"):
-            if INSTALLER:  print "Makepanda: Build installer, using",COMPRESSOR
-            else        :  print "Makepanda: Don't build installer"
-        print "Makepanda: Version ID: "+VERSION
-        for x in warnings: print "Makepanda: "+x
-        print "-------------------------------------------------------------------"
-        print ""
-        sys.stdout.flush()
-
-printStatus("Makepanda Initial Status Report", WARNINGS)
-
-########################################################################
-##
-## CompileCxx
-##
-########################################################################
-
-def CompileCxx(obj,src,opts):
-    ipath = GetListOption(opts, "DIR:")
-    if (COMPILER=="MSVC"):
-        cmd = "cl /wd4996 /Fo" + obj + " /nologo /c "
-        for x in ipath: cmd = cmd + " /I" + x
-        for (opt,dir) in INCDIRECTORIES:
-            if (opt=="ALWAYS") or (opts.count(opt)): cmd = cmd + ' /I"' + dir + '"'
-        for (opt,var,val) in DEFSYMBOLS:
-            if (opt=="ALWAYS") or (opts.count(opt)): cmd = cmd + ' /D' + var + "=" + val
-        if (opts.count('NOFLOATWARN')): cmd = cmd + ' /wd4244 /wd4305'
-        if (opts.count('MSFORSCOPE')): cmd = cmd + ' /Zc:forScope-'
-        optlevel = GetOptimizeOption(opts,OPTIMIZE)
-        if (optlevel==1): cmd = cmd + " /MD /Zi /RTCs /GS"
-        if (optlevel==2): cmd = cmd + " /MD /Zi "
-        if (optlevel==3): cmd = cmd + " /MD /Zi /O2 /Ob2 /DFORCE_INLINING "
-        if (optlevel==4): cmd = cmd + " /MD /Zi /Ox /Ob2 /DFORCE_INLINING /DNDEBUG /GL "
-        cmd = cmd + " /Fd" + obj[:-4] + ".pdb"
-        building = GetValueOption(opts, "BUILDING:")
-        if (building): cmd = cmd + " /DBUILDING_" + building
-        cmd = cmd + " /EHsc /Zm300 /DWIN32_VC /DWIN32 /W3 " + src
-        oscmd(cmd)
-    if (COMPILER=="LINUX"):
-        if (src.endswith(".c")): cmd = 'gcc -fPIC -c -o ' + obj
-        else:                    cmd = 'g++ -ftemplate-depth-30 -fPIC -c -o ' + obj
-        for (opt, dir) in INCDIRECTORIES:
-            if (opt=="ALWAYS") or (opts.count(opt)): cmd = cmd + ' -I"' + dir + '"'
-        for (opt,var,val) in DEFSYMBOLS:
-            if (opt=="ALWAYS") or (opts.count(opt)): cmd = cmd + ' -D' + var + '=' + val
-        for x in ipath: cmd = cmd + ' -I' + x
-        if (sys.platform == "darwin"):
-            cmd = cmd + " -isysroot " + SDK["MACOSX"] + " -arch i386 -arch ppc"
-        optlevel = GetOptimizeOption(opts,OPTIMIZE)
-        if (optlevel==1): cmd = cmd + " -g"
-        if (optlevel==2): cmd = cmd + " -O1"
-        if (optlevel==3): cmd = cmd + " -O2"
-        if (optlevel==4): cmd = cmd + " -O2 -DNDEBUG"
-        building = GetValueOption(opts, "BUILDING:")
-        if (building): cmd = cmd + " -DBUILDING_" + building
-        cmd = cmd + ' ' + src
-        oscmd(cmd)
-
-########################################################################
-##
-## CompileBison
-##
-########################################################################
-
-def CompileBison(wobj, wsrc, opts):
-    ifile = os.path.basename(wsrc)
-    wdsth = GetOutputDir()+"/include/" + ifile[:-4] + ".h"
-    wdstc = GetOutputDir()+"/tmp/" + ifile + ".cxx"
-    pre = GetValueOption(opts, "BISONPREFIX_")
-    if (COMPILER == "MSVC"):
-        oscmd('thirdparty/win-util/bison -y -d -o'+GetOutputDir()+'/tmp/'+ifile+'.c -p '+pre+' '+wsrc)
-        CopyFile(wdstc, GetOutputDir()+"/tmp/"+ifile+".c")
-        CopyFile(wdsth, GetOutputDir()+"/tmp/"+ifile+".h")
-    if (COMPILER == "LINUX"):
-        oscmd("bison -y -d -o"+GetOutputDir()+"/tmp/"+ifile+".c -p "+pre+" "+wsrc)
-        CopyFile(wdstc, GetOutputDir()+"/tmp/"+ifile+".c")
-        CopyFile(wdsth, GetOutputDir()+"/tmp/"+ifile+".h")
-    CompileCxx(wobj,wdstc,opts)
-
-########################################################################
-##
-## CompileFlex
-##
-########################################################################
-
-def CompileFlex(wobj,wsrc,opts):
-    ifile = os.path.basename(wsrc)
-    wdst = GetOutputDir()+"/tmp/"+ifile+".cxx"
-    pre = GetValueOption(opts, "BISONPREFIX_")
-    dashi = opts.count("FLEXDASHI")
-    if (COMPILER == "MSVC"):
-        if (dashi): oscmd("thirdparty/win-util/flex -i -P" + pre + " -o"+wdst+" "+wsrc)
-        else:       oscmd("thirdparty/win-util/flex    -P" + pre + " -o"+wdst+" "+wsrc)
-    if (COMPILER == "LINUX"):
-        if (dashi): oscmd("flex -i -P" + pre + " -o"+wdst+" "+wsrc)
-        else:       oscmd("flex    -P" + pre + " -o"+wdst+" "+wsrc)
-    CompileCxx(wobj,wdst,opts)
-
-########################################################################
-##
-## CompileIgate
-##
-########################################################################
-
-def CompileIgate(woutd,wsrc,opts):
-    outbase = os.path.basename(woutd)[:-3]
-    woutc = GetOutputDir()+"/tmp/"+outbase+"_igate.cxx"
-    wobj = FindLocation(outbase + "_igate.obj", [])
-    srcdir = GetValueOption(opts, "SRCDIR:")
-    module = GetValueOption(opts, "IMOD:")
-    library = GetValueOption(opts, "ILIB:")
-    ipath = GetListOption(opts, "DIR:")
-    if (PkgSkip("PYTHON")):
-        WriteFile(woutc,"")
-        WriteFile(woutd,"")
-        CompileCxx(wobj,woutc,opts)
-        ConditionalWriteFile(woutd,"")
-        return
-    cmd = GetOutputDir()+"/bin/interrogate -srcdir "+srcdir+" -I"+srcdir
-    if (COMPILER=="MSVC"):
-        cmd = cmd + ' -DCPPPARSER -D__STDC__=1 -D__cplusplus -D__inline -longlong __int64 -D_X86_ -DWIN32_VC -D_WIN32'
-        #NOTE: this 1500 value is the version number for VC2008.
-        cmd = cmd + ' -D_MSC_VER=1500 -D"_declspec(param)=" -D_near -D_far -D__near -D__far -D__stdcall'
-    if (COMPILER=="LINUX") and (platform.architecture()[0]=="64bit"):
-        cmd = cmd + ' -DCPPPARSER -D__STDC__=1 -D__cplusplus -D__inline -D__const=const -D_LP64'
-    if (COMPILER=="LINUX") and (platform.architecture()[0]=="32bit"):
-        cmd = cmd + ' -DCPPPARSER -D__STDC__=1 -D__cplusplus -D__inline -D__const=const -D__i386__'
-    optlevel=GetOptimizeOption(opts,OPTIMIZE)
-    if (optlevel==1): cmd = cmd + ' '
-    if (optlevel==2): cmd = cmd + ' '
-    if (optlevel==3): cmd = cmd + ' -DFORCE_INLINING'
-    if (optlevel==4): cmd = cmd + ' -DNDEBUG -DFORCE_INLINING'
-    cmd = cmd + ' -oc ' + woutc + ' -od ' + woutd
-    cmd = cmd + ' -fnames -string -refcount -assert -python-native'
-    cmd = cmd + ' -S' + GetOutputDir() + '/include/parser-inc'
-    for x in ipath: cmd = cmd + ' -I' + x
-    for (opt,dir) in INCDIRECTORIES:
-        if (opt=="ALWAYS") or (opts.count(opt)): cmd = cmd + ' -S"' + dir + '"'
-    for (opt,var,val) in DEFSYMBOLS:
-        if (opt=="ALWAYS") or (opts.count(opt)): cmd = cmd + ' -D' + var + '=' + val
-    building = GetValueOption(opts, "BUILDING:")
-    if (building): cmd = cmd + " -DBUILDING_"+building
-    cmd = cmd + ' -module ' + module + ' -library ' + library
-    for x in wsrc: cmd = cmd + ' ' + os.path.basename(x)
-    oscmd(cmd)
-    CompileCxx(wobj,woutc,opts)
-    return
-
-########################################################################
-##
-## CompileImod
-##
-########################################################################
-
-def CompileImod(wobj, wsrc, opts):
-    module = GetValueOption(opts, "IMOD:")
-    library = GetValueOption(opts, "ILIB:")
-    if (COMPILER=="MSVC"):
-        woutc = wobj[:-4]+".cxx"
-    if (COMPILER=="LINUX"):
-        woutc = wobj[:-2]+".cxx"
-    if (PkgSkip("PYTHON")):
-        WriteFile(woutc,"")
-        CompileCxx(wobj,woutc,opts)
-        return
-    cmd = GetOutputDir() + '/bin/interrogate_module '
-    cmd = cmd + ' -oc ' + woutc + ' -module ' + module + ' -library ' + library + ' -python-native '
-    for x in wsrc: cmd = cmd + ' ' + x
-    oscmd(cmd)
-    CompileCxx(wobj,woutc,opts)
-    return
-
-########################################################################
-##
-## CompileLib
-##
-########################################################################
-
-def CompileLib(lib, obj, opts):
-    if (COMPILER=="MSVC"):
-        cmd = 'link /lib /nologo /OUT:' + lib
-        for x in obj: cmd = cmd + ' ' + x
-        oscmd(cmd)
-    if (COMPILER=="LINUX"):
-        if sys.platform == 'darwin':
-            cmd = 'libtool -static -o ' + lib
-        else:
-            cmd = 'ar cru ' + lib
-        for x in obj: cmd=cmd + ' ' + x
-        oscmd(cmd)
-
-########################################################################
-##
-## CompileLink
-##
-########################################################################
-
-def CompileLink(dll, obj, opts):
-    if (COMPILER=="MSVC"):
-        cmd = 'link /nologo /NOD:MFC80.LIB /NOD:MFC90.LIB /NOD:LIBCI.LIB /NOD:MSVCRTD.LIB /DEBUG '
-        cmd = cmd + " /nod:libc /nod:libcmtd /nod:atlthunk"
-        if (GetOrigExt(dll) != ".exe"): cmd = cmd + " /DLL"
-        optlevel = GetOptimizeOption(opts,OPTIMIZE)
-        if (optlevel==1): cmd = cmd + " /MAP /MAPINFO:EXPORTS"
-        if (optlevel==2): cmd = cmd + " /MAP:NUL "
-        if (optlevel==3): cmd = cmd + " /MAP:NUL "
-        if (optlevel==4): cmd = cmd + " /MAP:NUL /LTCG "
-        cmd = cmd + " /FIXED:NO /OPT:REF /STACK:4194304 /INCREMENTAL:NO "
-        cmd = cmd + ' /OUT:' + dll
-        if (dll.endswith(".dll")):
-            cmd = cmd + ' /IMPLIB:' + GetOutputDir() + '/lib/'+dll[10:-4]+".lib"
-        for (opt, dir) in LIBDIRECTORIES:
-            if (opt=="ALWAYS") or (opts.count(opt)): cmd = cmd + ' /LIBPATH:"' + dir + '"'
-        for x in obj:
-            if (x.endswith(".dll")):
-                cmd = cmd + ' ' + GetOutputDir() + '/lib/' + x[10:-4] + ".lib"
-            elif (x.endswith(".lib")):
-                dname = x[:-4]+".dll"
-                if (os.path.exists(GetOutputDir()+"/bin/" + x[10:-4] + ".dll")):
-                    exit("Error: in makepanda, specify "+dname+", not "+x)
-                cmd = cmd + ' ' + x
-            elif (x.endswith(".def")):
-                cmd = cmd + ' /DEF:"' + x + '"'
-            elif (x.endswith(".dat")):
-                pass
-            else: cmd = cmd + ' ' + x
-        if (GetOrigExt(dll)==".exe"):
-            cmd = cmd + ' panda/src/configfiles/pandaIcon.obj'
-        for (opt, name) in LIBNAMES:
-            if (opt=="ALWAYS") or (opts.count(opt)): cmd = cmd + ' ' + name
-        oscmd(cmd)
-        SetVC90CRTVersion(dll+".manifest", VC90CRTVERSION)
-        mtcmd = 'mt -manifest ' + dll + '.manifest -outputresource:' + dll
-        if (dll.endswith(".exe")==0): mtcmd = mtcmd + ';2'
-        else:                          mtcmd = mtcmd + ';1'
-        oscmd(mtcmd)
-    if (COMPILER=="LINUX"):
-        if (GetOrigExt(dll)==".exe"): cmd = 'g++ -o ' + dll + ' -L' + GetOutputDir() + '/lib -L/usr/X11R6/lib'
-        else:
-            if (sys.platform == "darwin"):
-                cmd = 'g++ -undefined dynamic_lookup -dynamic -dynamiclib -o ' + dll + ' -install_name ' + GetOutputDir() + '/lib/' + os.path.basename(dll) + ' -L' + GetOutputDir() + '/lib -L/usr/X11R6/lib'
-            else:
-                cmd = 'g++ -shared -o ' + dll + ' -L' + GetOutputDir() + '/lib -L/usr/X11R6/lib'
-        for x in obj:
-            if (GetOrigExt(x) != ".dat"):
-                base = os.path.basename(x)
-                if (base[-3:]==".so") and (base[:3]=="lib"):
-                    cmd = cmd + ' -l' + base[3:-3]
-                else:
-                    cmd = cmd + ' ' + x
-        for (opt, dir) in LIBDIRECTORIES:
-            if (opt=="ALWAYS") or (opts.count(opt)): cmd = cmd + ' -L"' + dir + '"'
-        for (opt, name) in LIBNAMES:
-            if (opt=="ALWAYS") or (opts.count(opt)): cmd = cmd + ' ' + name
-        cmd = cmd + " -lpthread -ldl"
-        if (sys.platform == "darwin"):
-            cmd = cmd + " -isysroot " + SDK["MACOSX"] + " -Wl,-syslibroot," + SDK["MACOSX"] + " -arch ppc -arch i386"
-        
-        oscmd(cmd)
-
-##########################################################################################
-#
-# CompileEggPZ
-#
-##########################################################################################
-
-def CompileEggPZ(eggpz, src, opts):
-    if (src.endswith(".egg")):
-        CopyFile(eggpz[:-3], src)
-    elif (src.endswith(".flt")):
-        oscmd(GetOutputDir()+"/bin/flt2egg -ps keep -o " + eggpz[:-3] + " " + src)
-    oscmd(GetOutputDir()+"/bin/pzip " + eggpz[:-3])
-
-##########################################################################################
-#
-# CompileAnything
-#
-##########################################################################################
-
-def CompileAnything(target, inputs, opts):
-    if (opts.count("DEPENDENCYONLY")):
-        return
-    if (len(inputs)==0):
-        exit("No input files for target "+target)
-    infile = inputs[0]
-    origsuffix = GetOrigExt(target)
-    if SUFFIX_LIB.count(origsuffix):
-        return CompileLib(target, inputs, opts)
-    elif SUFFIX_DLL.count(origsuffix):
-        return CompileLink(target, inputs, opts)
-    elif (origsuffix==".in"):
-        return CompileIgate(target, inputs, opts)
-    elif (origsuffix==".pz"):
-        return CompileEggPZ(target, infile, opts)
-    elif (origsuffix==".obj"):
-        if (infile.endswith(".cxx") or infile.endswith(".c") or infile.endswith(".mm")):
-            return CompileCxx(target, infile, opts)
-        elif (infile.endswith(".yxx")):
-            return CompileBison(target, infile, opts)
-        elif (infile.endswith(".lxx")):
-            return CompileFlex(target, infile, opts)
-        elif (infile.endswith(".in")):
-            return CompileImod(target, inputs, opts)
-    exit("Don't know how to compile: "+target)
-
-##########################################################################################
-#
-# Generate dtool_config.h, prc_parameters.h, and dtool_have_xxx.dat
-#
-##########################################################################################
-
-DTOOL_CONFIG=[
-    #_Variable_________________________Windows___________________Unix__________
-    ("HAVE_PYTHON",                    '1',                      '1'),
-    ("PYTHON_FRAMEWORK",               'UNDEF',                  'UNDEF'),
-    ("COMPILE_IN_DEFAULT_FONT",        '1',                      '1'),
-    ("HAVE_MAYA",                      '1',                      '1'),
-    ("MAYA_PRE_5_0",                   'UNDEF',                  'UNDEF'),
-    ("HAVE_SOFTIMAGE",                 'UNDEF',                  'UNDEF'),
-    ("SSL_097",                        'UNDEF',                  'UNDEF'),
-    ("REPORT_OPENSSL_ERRORS",          '1',                      '1'),
-    ("HAVE_GL",                        '1',                      '1'),
-    ("HAVE_MESA",                      'UNDEF',                  'UNDEF'),
-    ("MESA_MGL",                       'UNDEF',                  'UNDEF'),
-    ("HAVE_SGIGL",                     'UNDEF',                  'UNDEF'),
-    ("HAVE_GLX",                       'UNDEF',                  '1'),
-    ("HAVE_WGL",                       '1',                      'UNDEF'),
-    ("HAVE_DX8",                       'UNDEF',                  'UNDEF'),
-    ("HAVE_DX9",                       'UNDEF',                  'UNDEF'),
-    ("HAVE_CHROMIUM",                  'UNDEF',                  'UNDEF'),
-    ("HAVE_THREADS",                   'UNDEF',                  'UNDEF'),
-    ("SIMPLE_THREADS",                 '1',                      '1'),
-    ("HAVE_AUDIO",                     '1',                      '1'),
-    ("NOTIFY_DEBUG",                   'UNDEF',                  'UNDEF'),
-    ("DO_PSTATS",                      'UNDEF',                  'UNDEF'),
-    ("DO_COLLISION_RECORDING",         'UNDEF',                  'UNDEF'),
-    ("SUPPORT_IMMEDIATE_MODE",         '1',                      '1'),
-    ("TRACK_IN_INTERPRETER",           'UNDEF',                  'UNDEF'),
-    ("DO_MEMORY_USAGE",                'UNDEF',                  'UNDEF'),
-    ("DO_PIPELINING",                  'UNDEF',                  'UNDEF'),
-    ("EXPORT_TEMPLATES",               'yes',                    'yes'),
-    ("LINK_IN_GL",                     'UNDEF',                  'UNDEF'),
-    ("LINK_IN_PHYSICS",                'UNDEF',                  'UNDEF'),
-    ("DEFAULT_PATHSEP",                '";"',                    '":"'),
-    ("WORDS_BIGENDIAN",                'UNDEF',                  'UNDEF'),
-    ("HAVE_NAMESPACE",                 '1',                      '1'),
-    ("HAVE_OPEN_MASK",                 'UNDEF',                  'UNDEF'),
-    ("HAVE_WCHAR_T",                   '1',                      '1'),
-    ("HAVE_WSTRING",                   '1',                      '1'),
-    ("HAVE_TYPENAME",                  '1',                      '1'),
-    ("SIMPLE_STRUCT_POINTERS",         '1',                      'UNDEF'),
-    ("HAVE_DINKUM",                    'UNDEF',                  'UNDEF'),
-    ("HAVE_STL_HASH",                  'UNDEF',                  'UNDEF'),
-    ("HAVE_GETTIMEOFDAY",              'UNDEF',                  '1'),
-    ("GETTIMEOFDAY_ONE_PARAM",         'UNDEF',                  'UNDEF'),
-    ("HAVE_GETOPT",                    'UNDEF',                  '1'),
-    ("HAVE_GETOPT_LONG_ONLY",          'UNDEF',                  '1'),
-    ("HAVE_GETOPT_H",                  'UNDEF',                  '1'),
-    ("HAVE_LINUX_INPUT_H",             'UNDEF',                  '1'),
-    ("IOCTL_TERMINAL_WIDTH",           'UNDEF',                  '1'),
-    ("HAVE_STREAMSIZE",                '1',                      '1'),
-    ("HAVE_IOS_TYPEDEFS",              '1',                      '1'),
-    ("HAVE_IOS_BINARY",                '1',                      '1'),
-    ("STATIC_INIT_GETENV",             '1',                      'UNDEF'),
-    ("HAVE_PROC_SELF_EXE",             'UNDEF',                  '1'),
-    ("HAVE_PROC_SELF_MAPS",            'UNDEF',                  '1'),
-    ("HAVE_PROC_SELF_ENVIRON",         'UNDEF',                  '1'),
-    ("HAVE_PROC_SELF_CMDLINE",         'UNDEF',                  '1'),
-    ("HAVE_GLOBAL_ARGV",               '1',                      'UNDEF'),
-    ("PROTOTYPE_GLOBAL_ARGV",          'UNDEF',                  'UNDEF'),
-    ("GLOBAL_ARGV",                    '__argv',                 'UNDEF'),
-    ("GLOBAL_ARGC",                    '__argc',                 'UNDEF'),
-    ("HAVE_IO_H",                      '1',                      'UNDEF'),
-    ("HAVE_IOSTREAM",                  '1',                      '1'),
-    ("HAVE_STRING_H",                  'UNDEF',                  '1'),
-    ("HAVE_LIMITS_H",                  'UNDEF',                  '1'),
-    ("HAVE_STDLIB_H",                  'UNDEF',                  '1'),
-    ("HAVE_MALLOC_H",                  '1',                      '1'),
-    ("HAVE_SYS_MALLOC_H",              'UNDEF',                  'UNDEF'),
-    ("HAVE_ALLOCA_H",                  'UNDEF',                  '1'),
-    ("HAVE_LOCALE_H",                  'UNDEF',                  '1'),
-    ("HAVE_MINMAX_H",                  '1',                      'UNDEF'),
-    ("HAVE_SSTREAM",                   '1',                      '1'),
-    ("HAVE_NEW",                       '1',                      '1'),
-    ("HAVE_SYS_TYPES_H",               '1',                      '1'),
-    ("HAVE_SYS_TIME_H",                'UNDEF',                  '1'),
-    ("HAVE_UNISTD_H",                  'UNDEF',                  '1'),
-    ("HAVE_UTIME_H",                   'UNDEF',                  '1'),
-    ("HAVE_GLOB_H",                    'UNDEF',                  '1'),
-    ("HAVE_DIRENT_H",                  'UNDEF',                  '1'),
-    ("HAVE_SYS_SOUNDCARD_H",           'UNDEF',                  '1'),
-    ("HAVE_RTTI",                      '1',                      '1'),
-    ("IS_LINUX",                       'UNDEF',                  '1'),
-    ("IS_OSX",                         'UNDEF',                  'UNDEF'),
-    ("GLOBAL_OPERATOR_NEW_EXCEPTIONS", 'UNDEF',                  '1'),
-    ("USE_STL_ALLOCATOR",              '1',                      '1'),
-    ("USE_MEMORY_DLMALLOC",            '1',                      'UNDEF'),
-    ("USE_MEMORY_PTMALLOC",            'UNDEF',                  'UNDEF'),
-    ("USE_MEMORY_MALLOC",              'UNDEF',                  '1'),
-    ("HAVE_ZLIB",                      'UNDEF',                  'UNDEF'),
-    ("HAVE_PNG",                       'UNDEF',                  'UNDEF'),
-    ("HAVE_JPEG",                      'UNDEF',                  'UNDEF'),
-    ("HAVE_TIFF",                      'UNDEF',                  'UNDEF'),
-    ("HAVE_VRPN",                      'UNDEF',                  'UNDEF'),
-    ("HAVE_FMODEX",                    'UNDEF',                  'UNDEF'),
-    ("HAVE_OPENAL",                    'UNDEF',                  'UNDEF'),
-    ("HAVE_NVIDIACG",                  'UNDEF',                  'UNDEF'),
-    ("HAVE_FREETYPE",                  'UNDEF',                  'UNDEF'),
-    ("HAVE_FFTW",                      'UNDEF',                  'UNDEF'),
-    ("HAVE_OPENSSL",                   'UNDEF',                  'UNDEF'),
-    ("HAVE_NET",                       'UNDEF',                  'UNDEF'),
-    ("HAVE_CG",                        'UNDEF',                  'UNDEF'),
-    ("HAVE_CGGL",                      'UNDEF',                  'UNDEF'),
-    ("HAVE_CGDX9",                     'UNDEF',                  'UNDEF'),
-    ("HAVE_FFMPEG",                    'UNDEF',                  'UNDEF'),
-    ("HAVE_ARTOOLKIT",                 'UNDEF',                  'UNDEF'),
-    ("HAVE_ODE",                       'UNDEF',                  'UNDEF'),
-    ("HAVE_OPENCV",                    'UNDEF',                  'UNDEF'),
-    ("HAVE_DIRECTCAM",                 'UNDEF',                  'UNDEF'),
-    ("HAVE_SQUISH",                    'UNDEF',                  'UNDEF'),
-    ("HAVE_FCOLLADA",                  'UNDEF',                  'UNDEF'),
-    ("HAVE_OPENAL_FRAMEWORK",          'UNDEF',                  'UNDEF'),
-    ("PRC_SAVE_DESCRIPTIONS",          '1',                      '1'),
-]
-
-PRC_PARAMETERS=[
-    ("DEFAULT_PRC_DIR",                '"<auto>etc"',            '"<auto>etc"'),
-    ("PRC_DIR_ENVVARS",                '"PANDA_PRC_DIR"',        '"PANDA_PRC_DIR"'),
-    ("PRC_PATH_ENVVARS",               '"PANDA_PRC_PATH"',       '"PANDA_PRC_PATH"'),
-    ("PRC_PATTERNS",                   '"*.prc"',                '"*.prc"'),
-    ("PRC_ENCRYPTED_PATTERNS",         '"*.prc.pe"',             '"*.prc.pe"'),
-    ("PRC_ENCRYPTION_KEY",             '""',                     '""'),
-    ("PRC_EXECUTABLE_PATTERNS",        '""',                     '""'),
-    ("PRC_EXECUTABLE_ARGS_ENVVAR",     '"PANDA_PRC_XARGS"',      '"PANDA_PRC_XARGS"'),
-    ("PRC_PUBLIC_KEYS_FILENAME",       '""',                     '""'),
-    ("PRC_RESPECT_TRUST_LEVEL",        'UNDEF',                  'UNDEF'),
-    ("PRC_DCONFIG_TRUST_LEVEL",        '0',                      '0'),
-    ("PRC_INC_TRUST_LEVEL",            '0',                      '0'),
-]
-
-def WriteConfigSettings():
-    dtool_config={}
-    prc_parameters={}
-
-    if (sys.platform == "win32"):
-        for key,win,unix in DTOOL_CONFIG:
-            dtool_config[key] = win
-        for key,win,unix in PRC_PARAMETERS:
-            prc_parameters[key] = win
-    else:
-        for key,win,unix in DTOOL_CONFIG:
-            dtool_config[key] = unix
-        for key,win,unix in PRC_PARAMETERS:
-            prc_parameters[key] = unix
-
-    for x in PkgListGet():
-        if (dtool_config.has_key("HAVE_"+x)):
-            if (PkgSkip(x)==0):
-                dtool_config["HAVE_"+x] = '1'
-            else:
-                dtool_config["HAVE_"+x] = 'UNDEF'
-    
-    dtool_config["HAVE_NET"] = '1'
-    
-    if (PkgSkip("NVIDIACG")==0):
-        dtool_config["HAVE_CG"] = '1'
-        dtool_config["HAVE_CGGL"] = '1'
-        dtool_config["HAVE_CGDX9"] = '1'
-    
-    if (sys.platform == "darwin"):
-        dtool_config["PYTHON_FRAMEWORK"] = 'Python'
-        dtool_config["HAVE_MALLOC_H"] = 'UNDEF'
-        dtool_config["HAVE_SYS_MALLOC_H"] = '1'
-        dtool_config["HAVE_OPENAL_FRAMEWORK"] = '1'
-        dtool_config["IS_LINUX"] = 'UNDEF'
-        dtool_config["IS_OSX"] = '1'
-        dtool_config["HAVE_PROC_SELF_EXE"] = 'UNDEF'
-        dtool_config["HAVE_PROC_SELF_MAPS"] = 'UNDEF'
-        dtool_config["HAVE_PROC_SELF_CMDLINE"] = 'UNDEF'
-        dtool_config["HAVE_PROC_SELF_ENVIRON"] = 'UNDEF'
-        # OSX still doesn't always recognize the <auto> correctly.
-        prc_parameters["DEFAULT_PRC_DIR"] = '"/Applications/Panda3D/' + VERSION + '/etc"'
-    
-    if (OPTIMIZE <= 3):
-        if (dtool_config["HAVE_NET"] != 'UNDEF'):
-            dtool_config["DO_PSTATS"] = '1'
-    
-    if (OPTIMIZE <= 3):
-        dtool_config["DO_COLLISION_RECORDING"] = '1'
-    
-    #if (OPTIMIZE <= 2):
-    #    dtool_config["TRACK_IN_INTERPRETER"] = '1'
-    
-    if (OPTIMIZE <= 3):
-        dtool_config["DO_MEMORY_USAGE"] = '1'
-    
-    #if (OPTIMIZE <= 1):
-    #    dtool_config["DO_PIPELINING"] = '1'
-    
-    if (OPTIMIZE <= 3):
-        dtool_config["NOTIFY_DEBUG"] = '1'
-
-    conf = "/* prc_parameters.h.  Generated automatically by makepanda.py */\n"
-    for key in prc_parameters.keys():
-        if ((key == "DEFAULT_PRC_DIR") or (key[:4]=="PRC_")):
-            val = prc_parameters[key]
-            if (val == 'UNDEF'): conf = conf + "#undef " + key + "\n"
-            else:                conf = conf + "#define " + key + " " + val + "\n"
-            del prc_parameters[key]
-    ConditionalWriteFile(GetOutputDir() + '/include/prc_parameters.h', conf)
-
-    conf = "/* dtool_config.h.  Generated automatically by makepanda.py */\n"
-    for key in dtool_config.keys():
-        val = dtool_config[key]
-        if (val == 'UNDEF'): conf = conf + "#undef " + key + "\n"
-        else:                conf = conf + "#define " + key + " " + val + "\n"
-        del dtool_config[key]
-    ConditionalWriteFile(GetOutputDir() + '/include/dtool_config.h', conf)
-
-    for x in PkgListGet():
-        if (PkgSkip(x)): ConditionalWriteFile(GetOutputDir() + '/tmp/dtool_have_'+x.lower()+'.dat',"0\n")
-        else:            ConditionalWriteFile(GetOutputDir() + '/tmp/dtool_have_'+x.lower()+'.dat',"1\n")
-
-WriteConfigSettings()
-
-
-##########################################################################################
-#
-# Generate pandaVersion.h, pythonversion, null.cxx
-#
-##########################################################################################
-
-PANDAVERSION_H="""
-#define PANDA_MAJOR_VERSION VERSION1
-#define PANDA_MINOR_VERSION VERSION2
-#define PANDA_SEQUENCE_VERSION VERSION2
-#undef  PANDA_OFFICIAL_VERSION
-#define PANDA_VERSION NVERSION
-#define PANDA_VERSION_STR "VERSION1.VERSION2.VERSION3"
-#define PANDA_DISTRIBUTOR "makepanda"
-"""
-
-CHECKPANDAVERSION_CXX="""
-# include "dtoolbase.h"
-EXPCL_DTOOL int panda_version_VERSION1_VERSION2_VERSION3 = 0;
-"""
-
-CHECKPANDAVERSION_H="""
-# include "dtoolbase.h"
-extern EXPCL_DTOOL int panda_version_VERSION1_VERSION2_VERSION3;
-# ifndef WIN32
-/* For Windows, exporting the symbol from the DLL is sufficient; the
-      DLL will not load unless all expected public symbols are defined.
-      Other systems may not mind if the symbol is absent unless we
-      explictly write code that references it. */
-static int check_panda_version = panda_version_VERSION1_VERSION2_VERSION3;
-# endif
-"""
-def CreatePandaVersionFiles():
-    # First, move any conflicting files out of the way.
-    if os.path.isfile("dtool/src/dtoolutil/pandaVersion.h"):
-      os.rename("dtool/src/dtoolutil/pandaVersion.h", "dtool/src/dtoolutil/pandaVersion.h.moved")
-    if os.path.isfile("dtool/src/dtoolutil/checkPandaVersion.h"):
-      os.rename("dtool/src/dtoolutil/checkPandaVersion.h", "dtool/src/dtoolutil/checkPandaVersion.h.moved")
-    if os.path.isfile("dtool/src/dtoolutil/checkPandaVersion.cxx"):
-      os.rename("dtool/src/dtoolutil/checkPandaVersion.cxx", "dtool/src/dtoolutil/checkPandaVersion.cxx.moved")
-    
-    version1=int(VERSION.split(".")[0])
-    version2=int(VERSION.split(".")[1])
-    version3=int(VERSION.split(".")[2])
-    nversion=version1*1000000+version2*1000+version3
-    
-    pandaversion_h = PANDAVERSION_H.replace("VERSION1",str(version1))
-    pandaversion_h = pandaversion_h.replace("VERSION2",str(version2))
-    pandaversion_h = pandaversion_h.replace("VERSION3",str(version3))
-    pandaversion_h = pandaversion_h.replace("NVERSION",str(nversion))
-    
-    checkpandaversion_cxx = CHECKPANDAVERSION_CXX.replace("VERSION1",str(version1))
-    checkpandaversion_cxx = checkpandaversion_cxx.replace("VERSION2",str(version2))
-    checkpandaversion_cxx = checkpandaversion_cxx.replace("VERSION3",str(version3))
-    checkpandaversion_cxx = checkpandaversion_cxx.replace("NVERSION",str(nversion))
-    
-    checkpandaversion_h = CHECKPANDAVERSION_H.replace("VERSION1",str(version1))
-    checkpandaversion_h = checkpandaversion_h.replace("VERSION2",str(version2))
-    checkpandaversion_h = checkpandaversion_h.replace("VERSION3",str(version3))
-    checkpandaversion_h = checkpandaversion_h.replace("NVERSION",str(nversion))
-
-    ConditionalWriteFile(GetOutputDir()+'/include/pandaVersion.h',        pandaversion_h)
-    ConditionalWriteFile(GetOutputDir()+'/include/checkPandaVersion.cxx', checkpandaversion_cxx)
-    ConditionalWriteFile(GetOutputDir()+'/include/checkPandaVersion.h',   checkpandaversion_h)
-    ConditionalWriteFile(GetOutputDir()+"/tmp/null.cxx","")
-
-
-CreatePandaVersionFiles()
-
-##########################################################################################
-#
-# Generate direct/__init__.py
-#
-##########################################################################################
-
-DIRECTINIT="""
-import os,sys
-srcdir1 = os.path.join(__path__[0], 'src')
-srcdir2 = os.path.join(__path__[0], '..', '..', 'direct', 'src')
-if    (os.path.isdir(srcdir1)): __path__[0] = srcdir1
-elif  (os.path.isdir(srcdir2)): __path__[0] = srcdir2
-else: sys.exit("Cannot find the 'direct' tree")
-"""
-
-if (PkgSkip("PYTHON")==0):
-    ConditionalWriteFile(GetOutputDir()+'/direct/__init__.py', DIRECTINIT)
-
-##########################################################################################
-#
-# Generate the PRC files into the ETC directory.
-#
-##########################################################################################
-
-confautoprc=ReadFile("makepanda/confauto.in")
-if (os.path.isfile("makepanda/myconfig.in")):
-  configprc=ReadFile("makepanda/myconfig.in")
-else:
-  configprc=ReadFile("makepanda/config.in")
-
-if (sys.platform != "win32"):
-    confautoprc = confautoprc.replace("aux-display pandadx9","")
-    confautoprc = confautoprc.replace("aux-display pandadx8","")
-    confautoprc = confautoprc.replace("aux-display pandadx7","")
-
-ConditionalWriteFile(GetOutputDir()+"/etc/Config.prc", configprc)
-ConditionalWriteFile(GetOutputDir()+"/etc/Confauto.prc", confautoprc)
-
-##########################################################################################
-#
-# Copy the precompiled binaries and DLLs into the build.
-#
-##########################################################################################
-
-for pkg in PkgListGet():
-    if (PkgSkip(pkg)==0):
-        if (COMPILER == "MSVC"):
-            if (os.path.exists(THIRDPARTYLIBS+pkg.lower()+"/bin")):
-                CopyAllFiles(GetOutputDir()+"/bin/",THIRDPARTYLIBS+pkg.lower()+"/bin/")
-        if (COMPILER == "LINUX"):
-            if (os.path.exists(THIRDPARTYLIBS+pkg.lower()+"/lib")):
-                CopyAllFiles(GetOutputDir()+"/lib/",THIRDPARTYLIBS+pkg.lower()+"/lib/")
-if (COMPILER=="MSVC"):
-    CopyAllFiles(GetOutputDir()+"/bin/", THIRDPARTYLIBS+"extras"+"/bin/")
-if (sys.platform == "win32"):
-    if (PkgSkip("PYTHON")==0):
-        CopyFile(GetOutputDir()+'/bin/python25.dll', 'thirdparty/win-python/python25.dll')
-        CopyTree(GetOutputDir()+'/python', 'thirdparty/win-python')
-        ConditionalWriteFile(GetOutputDir()+'/python/panda.pth',"..\n../bin\n")
-
-########################################################################
-##
-## Copy various stuff into the build.
-##
-########################################################################
-
-CopyFile(GetOutputDir()+"/", "doc/LICENSE")
-CopyFile(GetOutputDir()+"/", "doc/ReleaseNotes")
-CopyAllFiles(GetOutputDir()+"/plugins/",  "pandatool/src/scripts/", ".mel")
-CopyAllFiles(GetOutputDir()+"/plugins/",  "pandatool/src/scripts/", ".ms")
-if (PkgSkip("PYTHON")==0 and os.path.isdir("thirdparty/Pmw")):
-    CopyTree(GetOutputDir()+'/Pmw',         'thirdparty/Pmw')
-ConditionalWriteFile(GetOutputDir()+'/include/ctl3d.h', '/* dummy file to make MAX happy */')
-
-########################################################################
-#
-# Copy header files to the built/include/parser-inc directory.
-#
-########################################################################
-
-CopyAllFiles(GetOutputDir()+'/include/parser-inc/','dtool/src/parser-inc/')
-CopyAllFiles(GetOutputDir()+'/include/parser-inc/openssl/','dtool/src/parser-inc/')
-CopyAllFiles(GetOutputDir()+'/include/parser-inc/netinet/','dtool/src/parser-inc/')
-CopyFile(GetOutputDir()+'/include/parser-inc/Cg/','dtool/src/parser-inc/cg.h')
-CopyFile(GetOutputDir()+'/include/parser-inc/Cg/','dtool/src/parser-inc/cgGL.h')
-
-########################################################################
-#
-# Transfer all header files to the built/include directory.
-#
-########################################################################
-
-CopyAllHeaders('dtool/src/dtoolbase')
-CopyAllHeaders('dtool/src/dtoolutil', skip=["pandaVersion.h", "checkPandaVersion.h"])
-CopyAllHeaders('dtool/metalibs/dtool')
-CopyAllHeaders('dtool/src/cppparser')
-CopyAllHeaders('dtool/src/prc')
-CopyAllHeaders('dtool/src/dconfig')
-CopyAllHeaders('dtool/src/interrogatedb')
-CopyAllHeaders('dtool/metalibs/dtoolconfig')
-CopyAllHeaders('dtool/src/pystub')
-CopyAllHeaders('dtool/src/interrogate')
-CopyAllHeaders('dtool/src/test_interrogate')
-CopyAllHeaders('panda/src/putil')
-CopyAllHeaders('panda/src/pandabase')
-CopyAllHeaders('panda/src/express')
-CopyAllHeaders('panda/src/downloader')
-CopyAllHeaders('panda/metalibs/pandaexpress')
-CopyAllHeaders('panda/src/pipeline')
-CopyAllHeaders('panda/src/putil')
-CopyAllHeaders('dtool/src/prckeys')
-CopyAllHeaders('panda/src/audio')
-CopyAllHeaders('panda/src/event')
-CopyAllHeaders('panda/src/linmath')
-CopyAllHeaders('panda/src/mathutil')
-CopyAllHeaders('panda/src/gsgbase')
-CopyAllHeaders('panda/src/pnmimage')
-CopyAllHeaders('panda/src/nativenet')
-CopyAllHeaders('panda/src/net')
-CopyAllHeaders('panda/src/pstatclient')
-CopyAllHeaders('panda/src/gobj')
-CopyAllHeaders('panda/src/movies')
-CopyAllHeaders('panda/src/lerp')
-CopyAllHeaders('panda/src/pgraphnodes')
-CopyAllHeaders('panda/src/pgraph')
-CopyAllHeaders('panda/src/cull')
-CopyAllHeaders('panda/src/effects')
-CopyAllHeaders('panda/src/chan')
-CopyAllHeaders('panda/src/char')
-CopyAllHeaders('panda/src/dgraph')
-CopyAllHeaders('panda/src/display')
-CopyAllHeaders('panda/src/device')
-CopyAllHeaders('panda/src/pnmtext')
-CopyAllHeaders('panda/src/text')
-CopyAllHeaders('panda/src/grutil')
-CopyAllHeaders('panda/src/tform')
-CopyAllHeaders('panda/src/collide')
-CopyAllHeaders('panda/src/parametrics')
-CopyAllHeaders('panda/src/pgui')
-CopyAllHeaders('panda/src/pnmimagetypes')
-CopyAllHeaders('panda/src/recorder')
-CopyAllHeaders('panda/src/vrpn')
-CopyAllHeaders('panda/src/glgsg')
-CopyAllHeaders('panda/src/wgldisplay')
-CopyAllHeaders('panda/src/ode')
-CopyAllHeaders('panda/metalibs/pandaode')
-CopyAllHeaders('panda/src/physics')
-CopyAllHeaders('panda/src/particlesystem')
-CopyAllHeaders('panda/metalibs/panda')
-CopyAllHeaders('panda/src/audiotraits')
-CopyAllHeaders('panda/src/audiotraits')
-CopyAllHeaders('panda/src/distort')
-CopyAllHeaders('panda/src/downloadertools')
-CopyAllHeaders('panda/src/windisplay')
-CopyAllHeaders('panda/src/dxgsg8')
-CopyAllHeaders('panda/metalibs/pandadx8')
-CopyAllHeaders('panda/src/dxgsg9')
-CopyAllHeaders('panda/metalibs/pandadx9')
-CopyAllHeaders('panda/src/egg')
-CopyAllHeaders('panda/src/egg2pg')
-CopyAllHeaders('panda/src/framework')
-CopyAllHeaders('panda/metalibs/pandafx')
-CopyAllHeaders('panda/src/glstuff')
-CopyAllHeaders('panda/src/glgsg')
-CopyAllHeaders('panda/metalibs/pandaegg')
-if (sys.platform == "win32"):
-    CopyAllHeaders('panda/src/wgldisplay')
-elif (sys.platform == "darwin"):
-    CopyAllHeaders('panda/src/osxdisplay')
-else:
-    CopyAllHeaders('panda/src/glxdisplay')
-CopyAllHeaders('panda/metalibs/pandagl')
-
-CopyAllHeaders('panda/src/physics')
-CopyAllHeaders('panda/src/particlesystem')
-CopyAllHeaders('panda/metalibs/pandaphysics')
-CopyAllHeaders('panda/src/testbed')
-
-CopyAllHeaders('direct/src/directbase')
-CopyAllHeaders('direct/src/dcparser')
-CopyAllHeaders('direct/src/deadrec')
-CopyAllHeaders('direct/src/distributed')
-CopyAllHeaders('direct/src/interval')
-CopyAllHeaders('direct/src/showbase')
-CopyAllHeaders('direct/metalibs/direct')
-CopyAllHeaders('direct/src/dcparse')
-CopyAllHeaders('direct/src/heapq')
-
-CopyAllHeaders('pandatool/src/pandatoolbase')
-CopyAllHeaders('pandatool/src/converter')
-CopyAllHeaders('pandatool/src/progbase')
-CopyAllHeaders('pandatool/src/eggbase')
-CopyAllHeaders('pandatool/src/bam')
-CopyAllHeaders('pandatool/src/cvscopy')
-CopyAllHeaders('pandatool/src/daeegg')
-CopyAllHeaders('pandatool/src/daeprogs')
-CopyAllHeaders('pandatool/src/dxf')
-CopyAllHeaders('pandatool/src/dxfegg')
-CopyAllHeaders('pandatool/src/dxfprogs')
-CopyAllHeaders('pandatool/src/palettizer')
-CopyAllHeaders('pandatool/src/egg-mkfont')
-CopyAllHeaders('pandatool/src/eggcharbase')
-CopyAllHeaders('pandatool/src/egg-optchar')
-CopyAllHeaders('pandatool/src/egg-palettize')
-CopyAllHeaders('pandatool/src/egg-qtess')
-CopyAllHeaders('pandatool/src/eggprogs')
-CopyAllHeaders('pandatool/src/flt')
-CopyAllHeaders('pandatool/src/fltegg')
-CopyAllHeaders('pandatool/src/fltprogs')
-CopyAllHeaders('pandatool/src/imagebase')
-CopyAllHeaders('pandatool/src/imageprogs')
-CopyAllHeaders('pandatool/src/lwo')
-CopyAllHeaders('pandatool/src/lwoegg')
-CopyAllHeaders('pandatool/src/lwoprogs')
-CopyAllHeaders('pandatool/src/maya')
-CopyAllHeaders('pandatool/src/mayaegg')
-CopyAllHeaders('pandatool/src/maxegg')
-CopyAllHeaders('pandatool/src/maxprogs')
-CopyAllHeaders('pandatool/src/vrml')
-CopyAllHeaders('pandatool/src/vrmlegg')
-CopyAllHeaders('pandatool/src/xfile')
-CopyAllHeaders('pandatool/src/xfileegg')
-CopyAllHeaders('pandatool/src/ptloader')
-CopyAllHeaders('pandatool/src/miscprogs')
-CopyAllHeaders('pandatool/src/pstatserver')
-CopyAllHeaders('pandatool/src/softprogs')
-CopyAllHeaders('pandatool/src/text-stats')
-CopyAllHeaders('pandatool/src/vrmlprogs')
-CopyAllHeaders('pandatool/src/win-stats')
-CopyAllHeaders('pandatool/src/xfileprogs')
-CopyFile(GetOutputDir()+'/include/','dtool/src/dtoolutil/vector_src.cxx')
-
-########################################################################
-# 
-# These definitions are syntactic shorthand.  They make it easy
-# to link with the usual libraries without listing them all.
-#
-########################################################################
-
-COMMON_DTOOL_LIBS=[
-    'libp3dtool.dll',
-    'libp3dtoolconfig.dll',
-]
-
-COMMON_PANDA_LIBS=[
-    'libpanda.dll',
-    'libpandaexpress.dll'
-] + COMMON_DTOOL_LIBS
-
-COMMON_EGG2X_LIBS=[
-    'libeggbase.lib',
-    'libprogbase.lib',
-    'libconverter.lib',
-    'libpandatoolbase.lib',
-    'libpandaegg.dll',
-] + COMMON_PANDA_LIBS
-
-COMMON_DTOOL_LIBS_PYSTUB = COMMON_DTOOL_LIBS + ['libp3pystub.dll']
-COMMON_PANDA_LIBS_PYSTUB = COMMON_PANDA_LIBS + ['libp3pystub.dll']
-COMMON_EGG2X_LIBS_PYSTUB = COMMON_EGG2X_LIBS + ['libp3pystub.dll']
-
-########################################################################
-#
-# This section contains a list of all the files that need to be compiled.
-#
-########################################################################
-
-print "Generating dependencies..."
-sys.stdout.flush()
-
-#
-# DIRECTORY: dtool/src/dtoolbase/
-#
-
-OPTS=['DIR:dtool/src/dtoolbase', 'BUILDING:DTOOL']
-TargetAdd('dtoolbase_composite1.obj', opts=OPTS, input='dtoolbase_composite1.cxx')
-TargetAdd('dtoolbase_composite2.obj', opts=OPTS, input='dtoolbase_composite2.cxx')
-TargetAdd('dtoolbase_lookup3.obj',    opts=OPTS, input='lookup3.c')
-TargetAdd('dtoolbase_indent.obj',     opts=OPTS, input='indent.cxx')
-
-#
-# DIRECTORY: dtool/src/dtoolutil/
-#
-
-OPTS=['DIR:dtool/src/dtoolutil', 'BUILDING:DTOOL']
-TargetAdd('dtoolutil_gnu_getopt.obj',  opts=OPTS, input='gnu_getopt.c')
-TargetAdd('dtoolutil_gnu_getopt1.obj', opts=OPTS, input='gnu_getopt1.c')
-TargetAdd('dtoolutil_composite.obj',   opts=OPTS, input='dtoolutil_composite.cxx')
-
-#
-# DIRECTORY: dtool/metalibs/dtool/
-#
-
-OPTS=['DIR:dtool/metalibs/dtool', 'BUILDING:DTOOL']
-TargetAdd('dtool_dtool.obj', opts=OPTS, input='dtool.cxx')
-TargetAdd('libp3dtool.dll', input='dtool_dtool.obj')
-TargetAdd('libp3dtool.dll', input='dtoolutil_gnu_getopt.obj')
-TargetAdd('libp3dtool.dll', input='dtoolutil_gnu_getopt1.obj')
-TargetAdd('libp3dtool.dll', input='dtoolutil_composite.obj')
-TargetAdd('libp3dtool.dll', input='dtoolbase_composite1.obj')
-TargetAdd('libp3dtool.dll', input='dtoolbase_composite2.obj')
-TargetAdd('libp3dtool.dll', input='dtoolbase_indent.obj')
-TargetAdd('libp3dtool.dll', input='dtoolbase_lookup3.obj')
-TargetAdd('libp3dtool.dll', opts=['ADVAPI','WINSHELL'])
-
-#
-# DIRECTORY: dtool/src/cppparser/
-#
-
-OPTS=['DIR:dtool/src/cppparser', 'BISONPREFIX_cppyy']
-CreateFile(GetOutputDir()+"/include/cppBison.h")
-TargetAdd('cppParser_cppBison.obj',  opts=OPTS, input='cppBison.yxx')
-TargetAdd('cppBison.h', input='cppParser_cppBison.obj', opts=['DEPENDENCYONLY'])
-TargetAdd('cppParser_composite.obj', opts=OPTS, input='cppParser_composite.cxx')
-TargetAdd('libcppParser.ilb', input='cppParser_composite.obj')
-TargetAdd('libcppParser.ilb', input='cppParser_cppBison.obj')
-
-#
-# DIRECTORY: dtool/src/prc/
-#
-
-OPTS=['DIR:dtool/src/prc', 'BUILDING:DTOOLCONFIG', 'OPENSSL']
-TargetAdd('prc_composite.obj', opts=OPTS, input='prc_composite.cxx')
-
-#
-# DIRECTORY: dtool/src/dconfig/
-#
-
-OPTS=['DIR:dtool/src/dconfig', 'BUILDING:DTOOLCONFIG']
-TargetAdd('dconfig_composite.obj', opts=OPTS, input='dconfig_composite.cxx')
-
-#
-# DIRECTORY: dtool/src/interrogatedb/
-#
-
-OPTS=['DIR:dtool/src/interrogatedb', 'BUILDING:DTOOLCONFIG']
-TargetAdd('interrogatedb_composite.obj', opts=OPTS, input='interrogatedb_composite.cxx')
-
-#
-# DIRECTORY: dtool/metalibs/dtoolconfig/
-#
-
-OPTS=['DIR:dtool/metalibs/dtoolconfig', 'BUILDING:DTOOLCONFIG']
-if (PkgSkip("PYTHON")): 
-    TargetAdd('dtoolconfig_pydtool.obj', opts=OPTS, input="null.cxx")
-else:
-    TargetAdd('dtoolconfig_pydtool.obj', opts=OPTS, input="pydtool.cxx")
-TargetAdd('dtoolconfig_dtoolconfig.obj', opts=OPTS, input='dtoolconfig.cxx')
-TargetAdd('dtoolconfig_pydtool.obj', dep='dtool_have_python.dat')
-TargetAdd('libp3dtoolconfig.dll', input='dtoolconfig_dtoolconfig.obj')
-TargetAdd('libp3dtoolconfig.dll', input='dtoolconfig_pydtool.obj')
-TargetAdd('libp3dtoolconfig.dll', input='interrogatedb_composite.obj')
-TargetAdd('libp3dtoolconfig.dll', input='dconfig_composite.obj')
-TargetAdd('libp3dtoolconfig.dll', input='prc_composite.obj')
-TargetAdd('libp3dtoolconfig.dll', input='libp3dtool.dll')
-TargetAdd('libp3dtoolconfig.dll', opts=['ADVAPI',  'OPENSSL'])
-
-#
-# DIRECTORY: dtool/src/pystub/
-#
-
-OPTS=['DIR:dtool/src/pystub', 'BUILDING:DTOOLCONFIG']
-TargetAdd('pystub_pystub.obj', opts=OPTS, input='pystub.cxx')
-TargetAdd('libp3pystub.dll', input='pystub_pystub.obj')
-TargetAdd('libp3pystub.dll', input='libp3dtool.dll')
-TargetAdd('libp3pystub.dll', opts=['ADVAPI'])
-
-#
-# DIRECTORY: dtool/src/interrogate/
-#
-
-OPTS=['DIR:dtool/src/interrogate', 'DIR:dtool/src/cppparser', 'DIR:dtool/src/interrogatedb']
-TargetAdd('interrogate_composite.obj', opts=OPTS, input='interrogate_composite.cxx')
-TargetAdd('interrogate.exe', input='interrogate_composite.obj')
-TargetAdd('interrogate.exe', input='libcppParser.ilb')
-TargetAdd('interrogate.exe', input=COMMON_DTOOL_LIBS_PYSTUB)
-TargetAdd('interrogate.exe', opts=['ADVAPI',  'OPENSSL'])
-
-TargetAdd('interrogate_module_interrogate_module.obj', opts=OPTS, input='interrogate_module.cxx')
-TargetAdd('interrogate_module.exe', input='interrogate_module_interrogate_module.obj')
-TargetAdd('interrogate_module.exe', input='libcppParser.ilb')
-TargetAdd('interrogate_module.exe', input=COMMON_DTOOL_LIBS_PYSTUB)
-TargetAdd('interrogate_module.exe', opts=['ADVAPI',  'OPENSSL'])
-
-TargetAdd('parse_file_parse_file.obj', opts=OPTS, input='parse_file.cxx')
-TargetAdd('parse_file.exe', input='parse_file_parse_file.obj')
-TargetAdd('parse_file.exe', input='libcppParser.ilb')
-TargetAdd('parse_file.exe', input=COMMON_DTOOL_LIBS_PYSTUB)
-TargetAdd('parse_file.exe', opts=['ADVAPI',  'OPENSSL'])
-
-#
-# DIRECTORY: dtool/src/prckeys/
-#
-
-if (PkgSkip("OPENSSL")==0):
-    OPTS=['DIR:dtool/src/prckeys', 'OPENSSL']
-    TargetAdd('make-prc-key_makePrcKey.obj', opts=OPTS, input='makePrcKey.cxx')
-    TargetAdd('make-prc-key.exe', input='make-prc-key_makePrcKey.obj')
-    TargetAdd('make-prc-key.exe', input=COMMON_DTOOL_LIBS_PYSTUB)
-    TargetAdd('make-prc-key.exe', opts=['ADVAPI',  'OPENSSL'])
-
-#
-# DIRECTORY: dtool/src/test_interrogate/
-#
-
-OPTS=['DIR:dtool/src/test_interrogate']
-TargetAdd('test_interrogate_test_interrogate.obj', opts=OPTS, input='test_interrogate.cxx')
-TargetAdd('test_interrogate.exe', input='test_interrogate_test_interrogate.obj')
-TargetAdd('test_interrogate.exe', input=COMMON_DTOOL_LIBS_PYSTUB)
-TargetAdd('test_interrogate.exe', opts=['ADVAPI',  'OPENSSL'])
-
-#
-# DIRECTORY: panda/src/pandabase/
-#
-
-OPTS=['DIR:panda/src/pandabase', 'BUILDING:PANDAEXPRESS']
-TargetAdd('pandabase_pandabase.obj', opts=OPTS, input='pandabase.cxx')
-
-#
-# DIRECTORY: panda/src/express/
-#
-
-OPTS=['DIR:panda/src/express', 'BUILDING:PANDAEXPRESS', 'OPENSSL', 'ZLIB']
-TargetAdd('express_composite1.obj', opts=OPTS, input='express_composite1.cxx')
-TargetAdd('express_composite2.obj', opts=OPTS, input='express_composite2.cxx')
-IGATEFILES=GetDirectoryContents('panda/src/express', ["*.h", "*_composite.cxx"])
-TargetAdd('libexpress.in', opts=OPTS, input=IGATEFILES)
-TargetAdd('libexpress.in', opts=['IMOD:pandaexpress', 'ILIB:libexpress', 'SRCDIR:panda/src/express'])
-TargetAdd('libexpress_igate.obj', input='libexpress.in', opts=["DEPENDENCYONLY"])
-
-#
-# DIRECTORY: panda/src/downloader/
-#
-
-OPTS=['DIR:panda/src/downloader', 'BUILDING:PANDAEXPRESS', 'OPENSSL', 'ZLIB']
-TargetAdd('downloader_composite.obj', opts=OPTS, input='downloader_composite.cxx')
-IGATEFILES=GetDirectoryContents('panda/src/downloader', ["*.h", "*_composite.cxx"])
-TargetAdd('libdownloader.in', opts=OPTS, input=IGATEFILES)
-TargetAdd('libdownloader.in', opts=['IMOD:pandaexpress', 'ILIB:libdownloader', 'SRCDIR:panda/src/downloader'])
-TargetAdd('libdownloader_igate.obj', input='libdownloader.in', opts=["DEPENDENCYONLY"])
-
-#
-# DIRECTORY: panda/metalibs/pandaexpress/
-#
-
-OPTS=['DIR:panda/metalibs/pandaexpress', 'BUILDING:PANDAEXPRESS', 'ZLIB']
-TargetAdd('pandaexpress_pandaexpress.obj', opts=OPTS, input='pandaexpress.cxx')
-TargetAdd('libpandaexpress_module.obj', input='libdownloader.in')
-TargetAdd('libpandaexpress_module.obj', input='libexpress.in')
-TargetAdd('libpandaexpress_module.obj', opts=['ADVAPI',  'OPENSSL'])
-TargetAdd('libpandaexpress_module.obj', opts=['IMOD:pandaexpress', 'ILIB:libpandaexpress'])
-
-TargetAdd('libpandaexpress.dll', input='pandaexpress_pandaexpress.obj')
-TargetAdd('libpandaexpress.dll', input='libpandaexpress_module.obj')
-TargetAdd('libpandaexpress.dll', input='downloader_composite.obj')
-TargetAdd('libpandaexpress.dll', input='libdownloader_igate.obj')
-TargetAdd('libpandaexpress.dll', input='express_composite1.obj')
-TargetAdd('libpandaexpress.dll', input='express_composite2.obj')
-TargetAdd('libpandaexpress.dll', input='libexpress_igate.obj')
-TargetAdd('libpandaexpress.dll', input='pandabase_pandabase.obj')
-TargetAdd('libpandaexpress.dll', input=COMMON_DTOOL_LIBS)
-TargetAdd('libpandaexpress.dll', opts=['ADVAPI', 'WINSOCK2',  'OPENSSL', 'ZLIB'])
-
-#
-# DIRECTORY: panda/src/pipeline/
-#
-
-OPTS=['DIR:panda/src/pipeline', 'BUILDING:PANDA']
-TargetAdd('pipeline_composite.obj', opts=OPTS, input='pipeline_composite.cxx')
-IGATEFILES=GetDirectoryContents('panda/src/pipeline', ["*.h", "*_composite.cxx"])
-TargetAdd('libpipeline.in', opts=OPTS, input=IGATEFILES)
-TargetAdd('libpipeline.in', opts=['IMOD:panda', 'ILIB:libpipeline', 'SRCDIR:panda/src/pipeline'])
-TargetAdd('libpipeline_igate.obj', input='libpipeline.in', opts=["DEPENDENCYONLY"])
-
-#
-# DIRECTORY: panda/src/putil/
-#
-
-OPTS=['DIR:panda/src/putil', 'BUILDING:PANDA',  'ZLIB']
-TargetAdd('putil_composite1.obj', opts=OPTS, input='putil_composite1.cxx')
-TargetAdd('putil_composite2.obj', opts=OPTS, input='putil_composite2.cxx')
-IGATEFILES=GetDirectoryContents('panda/src/putil', ["*.h", "*_composite.cxx"])
-IGATEFILES.remove("test_bam.h")
-TargetAdd('libputil.in', opts=OPTS, input=IGATEFILES)
-TargetAdd('libputil.in', opts=['IMOD:panda', 'ILIB:libputil', 'SRCDIR:panda/src/putil'])
-TargetAdd('libputil_igate.obj', input='libputil.in', opts=["DEPENDENCYONLY"])
-
-#
-# DIRECTORY: panda/src/audio/
-#
-
-OPTS=['DIR:panda/src/audio', 'BUILDING:PANDA']
-TargetAdd('audio_composite.obj', opts=OPTS, input='audio_composite.cxx')
-IGATEFILES=["audio.h"]
-TargetAdd('libaudio.in', opts=OPTS, input=IGATEFILES)
-TargetAdd('libaudio.in', opts=['IMOD:panda', 'ILIB:libaudio', 'SRCDIR:panda/src/audio'])
-TargetAdd('libaudio_igate.obj', input='libaudio.in', opts=["DEPENDENCYONLY"])
-
-#
-# DIRECTORY: panda/src/event/
-#
-
-OPTS=['DIR:panda/src/event', 'BUILDING:PANDA']
-TargetAdd('event_composite.obj', opts=OPTS, input='event_composite.cxx')
-IGATEFILES=GetDirectoryContents('panda/src/event', ["*.h", "*_composite.cxx"])
-TargetAdd('libevent.in', opts=OPTS, input=IGATEFILES)
-TargetAdd('libevent.in', opts=['IMOD:panda', 'ILIB:libevent', 'SRCDIR:panda/src/event'])
-TargetAdd('libevent_igate.obj', input='libevent.in', opts=["DEPENDENCYONLY"])
-
-#
-# DIRECTORY: panda/src/linmath/
-#
-
-OPTS=['DIR:panda/src/linmath', 'BUILDING:PANDA']
-TargetAdd('linmath_composite.obj', opts=OPTS, input='linmath_composite.cxx')
-IGATEFILES=GetDirectoryContents('panda/src/linmath', ["*.h", "*_composite.cxx"])
-IGATEFILES.remove('lmat_ops_src.h')
-IGATEFILES.remove('cast_to_double.h')
-IGATEFILES.remove('lmat_ops.h')
-IGATEFILES.remove('cast_to_float.h')
-TargetAdd('liblinmath.in', opts=OPTS, input=IGATEFILES)
-TargetAdd('liblinmath.in', opts=['IMOD:panda', 'ILIB:liblinmath', 'SRCDIR:panda/src/linmath'])
-TargetAdd('liblinmath_igate.obj', input='liblinmath.in', opts=["DEPENDENCYONLY"])
-
-#
-# DIRECTORY: panda/src/mathutil/
-#
-
-OPTS=['DIR:panda/src/mathutil', 'BUILDING:PANDA', 'FFTW']
-TargetAdd('mathutil_composite.obj', opts=OPTS, input='mathutil_composite.cxx')
-IGATEFILES=GetDirectoryContents('panda/src/mathutil', ["*.h", "*_composite.cxx"])
-TargetAdd('libmathutil.in', opts=OPTS, input=IGATEFILES)
-TargetAdd('libmathutil.in', opts=['IMOD:panda', 'ILIB:libmathutil', 'SRCDIR:panda/src/mathutil'])
-TargetAdd('libmathutil_igate.obj', input='libmathutil.in', opts=["DEPENDENCYONLY"])
-
-#
-# DIRECTORY: panda/src/gsgbase/
-#
-
-OPTS=['DIR:panda/src/gsgbase', 'BUILDING:PANDA']
-TargetAdd('gsgbase_composite.obj', opts=OPTS, input='gsgbase_composite.cxx')
-IGATEFILES=GetDirectoryContents('panda/src/gsgbase', ["*.h", "*_composite.cxx"])
-TargetAdd('libgsgbase.in', opts=OPTS, input=IGATEFILES)
-TargetAdd('libgsgbase.in', opts=['IMOD:panda', 'ILIB:libgsgbase', 'SRCDIR:panda/src/gsgbase'])
-TargetAdd('libgsgbase_igate.obj', input='libgsgbase.in', opts=["DEPENDENCYONLY"])
-
-#
-# DIRECTORY: panda/src/pnmimage/
-#
-
-OPTS=['DIR:panda/src/pnmimage', 'BUILDING:PANDA',  'ZLIB']
-TargetAdd('pnmimage_composite.obj', opts=OPTS, input='pnmimage_composite.cxx')
-IGATEFILES=GetDirectoryContents('panda/src/pnmimage', ["*.h", "*_composite.cxx"])
-TargetAdd('libpnmimage.in', opts=OPTS, input=IGATEFILES)
-TargetAdd('libpnmimage.in', opts=['IMOD:panda', 'ILIB:libpnmimage', 'SRCDIR:panda/src/pnmimage'])
-TargetAdd('libpnmimage_igate.obj', input='libpnmimage.in', opts=["DEPENDENCYONLY"])
-
-#
-# DIRECTORY: panda/src/nativenet/
-#
- 
-OPTS=['DIR:panda/src/nativenet', 'OPENSSL', 'BUILDING:PANDA']
-TargetAdd('nativenet_composite.obj', opts=OPTS, input='nativenet_composite1.cxx')
-IGATEFILES=GetDirectoryContents('panda/src/nativenet', ["*.h", "*_composite.cxx"])
-TargetAdd('libnativenet.in', opts=OPTS, input=IGATEFILES)
-TargetAdd('libnativenet.in', opts=['IMOD:panda', 'ILIB:libnativenet', 'SRCDIR:panda/src/nativenet'])
-TargetAdd('libnativenet_igate.obj', input='libnativenet.in', opts=["DEPENDENCYONLY"])
-
-#
-# DIRECTORY: panda/src/net/
-#
-
-OPTS=['DIR:panda/src/net', 'BUILDING:PANDA']
-TargetAdd('net_composite.obj', opts=OPTS, input='net_composite.cxx')
-IGATEFILES=GetDirectoryContents('panda/src/net', ["*.h", "*_composite.cxx"])
-IGATEFILES.remove("datagram_ui.h")
-TargetAdd('libnet.in', opts=OPTS, input=IGATEFILES)
-TargetAdd('libnet.in', opts=['IMOD:panda', 'ILIB:libnet', 'SRCDIR:panda/src/net'])
-TargetAdd('libnet_igate.obj', input='libnet.in', opts=["DEPENDENCYONLY"])
-
-#
-# DIRECTORY: panda/src/pstatclient/
-#
-
-OPTS=['DIR:panda/src/pstatclient', 'BUILDING:PANDA']
-TargetAdd('pstatclient_composite.obj', opts=OPTS, input='pstatclient_composite.cxx')
-IGATEFILES=GetDirectoryContents('panda/src/pstatclient', ["*.h", "*_composite.cxx"])
-TargetAdd('libpstatclient.in', opts=OPTS, input=IGATEFILES)
-TargetAdd('libpstatclient.in', opts=['IMOD:panda', 'ILIB:libpstatclient', 'SRCDIR:panda/src/pstatclient'])
-TargetAdd('libpstatclient_igate.obj', input='libpstatclient.in', opts=["DEPENDENCYONLY"])
-
-#
-# DIRECTORY: panda/src/gobj/
-#
-
-OPTS=['DIR:panda/src/gobj', 'BUILDING:PANDA',  'NVIDIACG', 'ZLIB', 'SQUISH']
-TargetAdd('gobj_composite1.obj', opts=OPTS, input='gobj_composite1.cxx')
-TargetAdd('gobj_composite2.obj', opts=OPTS, input='gobj_composite2.cxx')
-IGATEFILES=GetDirectoryContents('panda/src/gobj', ["*.h", "*_composite.cxx"])
-TargetAdd('libgobj.in', opts=OPTS, input=IGATEFILES)
-TargetAdd('libgobj.in', opts=['IMOD:panda', 'ILIB:libgobj', 'SRCDIR:panda/src/gobj'])
-TargetAdd('libgobj_igate.obj', input='libgobj.in', opts=["DEPENDENCYONLY"])
-
-#
-# DIRECTORY: panda/src/lerp/
-#
-
-OPTS=['DIR:panda/src/lerp', 'BUILDING:PANDA']
-TargetAdd('lerp_composite.obj', opts=OPTS, input='lerp_composite.cxx')
-IGATEFILES=GetDirectoryContents('panda/src/lerp', ["*.h", "*_composite.cxx"])
-IGATEFILES.remove("lerpchans.h")
-TargetAdd('liblerp.in', opts=OPTS, input=IGATEFILES)
-TargetAdd('liblerp.in', opts=['IMOD:panda', 'ILIB:liblerp', 'SRCDIR:panda/src/lerp'])
-TargetAdd('liblerp_igate.obj', input='liblerp.in', opts=["DEPENDENCYONLY"])
-
-#
-# DIRECTORY: panda/src/pgraphnodes/
-#
-
-OPTS=['DIR:panda/src/pgraphnodes', 'BUILDING:PANDA']
-TargetAdd('pgraphnodes_composite1.obj', opts=OPTS, input='pgraphnodes_composite1.cxx')
-TargetAdd('pgraphnodes_composite2.obj', opts=OPTS, input='pgraphnodes_composite2.cxx')
-IGATEFILES=GetDirectoryContents('panda/src/pgraphnodes', ["*.h", "*_composite.cxx"])
-TargetAdd('libpgraphnodes.in', opts=OPTS, input=IGATEFILES)
-TargetAdd('libpgraphnodes.in', opts=['IMOD:panda', 'ILIB:libpgraphnodes', 'SRCDIR:panda/src/pgraphnodes'])
-TargetAdd('libpgraphnodes_igate.obj', input='libpgraphnodes.in', opts=["DEPENDENCYONLY"])
-
-#
-# DIRECTORY: panda/src/pgraph/
-#
-
-OPTS=['DIR:panda/src/pgraph', 'BUILDING:PANDA']
-TargetAdd('pgraph_nodePath.obj', opts=OPTS, input='nodePath.cxx')
-TargetAdd('pgraph_composite1.obj', opts=OPTS, input='pgraph_composite1.cxx')
-TargetAdd('pgraph_composite2.obj', opts=OPTS, input='pgraph_composite2.cxx')
-TargetAdd('pgraph_composite3.obj', opts=OPTS, input='pgraph_composite3.cxx')
-TargetAdd('pgraph_composite4.obj', opts=OPTS, input='pgraph_composite4.cxx')
-IGATEFILES=GetDirectoryContents('panda/src/pgraph', ["*.h", "nodePath.cxx", "*_composite.cxx"])
-# IGATEFILES.remove("antialiasAttrib.h")
-TargetAdd('libpgraph.in', opts=OPTS, input=IGATEFILES)
-TargetAdd('libpgraph.in', opts=['IMOD:panda', 'ILIB:libpgraph', 'SRCDIR:panda/src/pgraph'])
-TargetAdd('libpgraph_igate.obj', input='libpgraph.in', opts=["DEPENDENCYONLY"])
-
-#
-# DIRECTORY: panda/src/cull/
-#
-
-OPTS=['DIR:panda/src/cull', 'BUILDING:PANDA']
-TargetAdd('cull_composite.obj', opts=OPTS, input='cull_composite.cxx')
-IGATEFILES=GetDirectoryContents('panda/src/cull', ["*.h", "*_composite.cxx"])
-TargetAdd('libcull.in', opts=OPTS, input=IGATEFILES)
-TargetAdd('libcull.in', opts=['IMOD:panda', 'ILIB:libcull', 'SRCDIR:panda/src/cull'])
-TargetAdd('libcull_igate.obj', input='libcull.in', opts=["DEPENDENCYONLY"])
-
-#
-# DIRECTORY: panda/src/chan/
-#
-
-OPTS=['DIR:panda/src/chan', 'BUILDING:PANDA']
-TargetAdd('chan_composite.obj', opts=OPTS, input='chan_composite.cxx')
-IGATEFILES=GetDirectoryContents('panda/src/chan', ["*.h", "*_composite.cxx"])
-IGATEFILES.remove('movingPart.h')
-IGATEFILES.remove('animChannelFixed.h')
-TargetAdd('libchan.in', opts=OPTS, input=IGATEFILES)
-TargetAdd('libchan.in', opts=['IMOD:panda', 'ILIB:libchan', 'SRCDIR:panda/src/chan'])
-TargetAdd('libchan_igate.obj', input='libchan.in', opts=["DEPENDENCYONLY"])
-
-
-# DIRECTORY: panda/src/char/
-#
-
-OPTS=['DIR:panda/src/char', 'BUILDING:PANDA']
-TargetAdd('char_composite.obj', opts=OPTS, input='char_composite.cxx')
-IGATEFILES=GetDirectoryContents('panda/src/char', ["*.h", "*_composite.cxx"])
-TargetAdd('libchar.in', opts=OPTS, input=IGATEFILES)
-TargetAdd('libchar.in', opts=['IMOD:panda', 'ILIB:libchar', 'SRCDIR:panda/src/char'])
-TargetAdd('libchar_igate.obj', input='libchar.in', opts=["DEPENDENCYONLY"])
-
-#
-# DIRECTORY: panda/src/dgraph/
-#
-
-OPTS=['DIR:panda/src/dgraph', 'BUILDING:PANDA']
-TargetAdd('dgraph_composite.obj', opts=OPTS, input='dgraph_composite.cxx')
-IGATEFILES=GetDirectoryContents('panda/src/dgraph', ["*.h", "*_composite.cxx"])
-TargetAdd('libdgraph.in', opts=OPTS, input=IGATEFILES)
-TargetAdd('libdgraph.in', opts=['IMOD:panda', 'ILIB:libdgraph', 'SRCDIR:panda/src/dgraph'])
-TargetAdd('libdgraph_igate.obj', input='libdgraph.in', opts=["DEPENDENCYONLY"])
-
-#
-# DIRECTORY: panda/src/display/
-#
-
-OPTS=['DIR:panda/src/display', 'BUILDING:PANDA']
-TargetAdd('display_composite.obj', opts=OPTS, input='display_composite.cxx')
-IGATEFILES=GetDirectoryContents('panda/src/display', ["*.h", "*_composite.cxx"])
-IGATEFILES.remove("renderBuffer.h")
-TargetAdd('libdisplay.in', opts=OPTS, input=IGATEFILES)
-TargetAdd('libdisplay.in', opts=['IMOD:panda', 'ILIB:libdisplay', 'SRCDIR:panda/src/display'])
-TargetAdd('libdisplay_igate.obj', input='libdisplay.in', opts=["DEPENDENCYONLY"])
-
-#
-# DIRECTORY: panda/src/device/
-#
-
-OPTS=['DIR:panda/src/device', 'BUILDING:PANDA']
-TargetAdd('device_composite.obj', opts=OPTS, input='device_composite.cxx')
-IGATEFILES=GetDirectoryContents('panda/src/device', ["*.h", "*_composite.cxx"])
-TargetAdd('libdevice.in', opts=OPTS, input=IGATEFILES)
-TargetAdd('libdevice.in', opts=['IMOD:panda', 'ILIB:libdevice', 'SRCDIR:panda/src/device'])
-TargetAdd('libdevice_igate.obj', input='libdevice.in', opts=["DEPENDENCYONLY"])
-
-#
-# DIRECTORY: panda/src/pnmtext/
-#
-
-if (PkgSkip("FREETYPE")==0):
-    OPTS=['DIR:panda/src/pnmtext', 'BUILDING:PANDA',  'FREETYPE']
-    TargetAdd('pnmtext_composite.obj', opts=OPTS, input='pnmtext_composite.cxx')
-    IGATEFILES=GetDirectoryContents('panda/src/pnmtext', ["*.h", "*_composite.cxx"])
-    TargetAdd('libpnmtext.in', opts=OPTS, input=IGATEFILES)
-    TargetAdd('libpnmtext.in', opts=['IMOD:panda', 'ILIB:libpnmtext', 'SRCDIR:panda/src/pnmtext'])
-    TargetAdd('libpnmtext_igate.obj', input='libpnmtext.in', opts=["DEPENDENCYONLY"])
-
-#
-# DIRECTORY: panda/src/text/
-#
-
-OPTS=['DIR:panda/src/text', 'BUILDING:PANDA', 'ZLIB',  'FREETYPE']
-TargetAdd('text_composite.obj', opts=OPTS, input='text_composite.cxx')
-IGATEFILES=GetDirectoryContents('panda/src/text', ["*.h", "*_composite.cxx"])
-TargetAdd('libtext.in', opts=OPTS, input=IGATEFILES)
-TargetAdd('libtext.in', opts=['IMOD:panda', 'ILIB:libtext', 'SRCDIR:panda/src/text'])
-TargetAdd('libtext_igate.obj', input='libtext.in', opts=["DEPENDENCYONLY"])
-
-#
-# DIRECTORY: panda/src/movies/
-#
-
-OPTS=['DIR:panda/src/movies', 'BUILDING:PANDA', 'FFMPEG', 'DX9', 'DIRECTCAM']
-TargetAdd('movies_composite1.obj', opts=OPTS, input='movies_composite1.cxx')
-IGATEFILES=GetDirectoryContents('panda/src/movies', ["*.h", "*_composite.cxx"])
-TargetAdd('libmovies.in', opts=OPTS, input=IGATEFILES)
-TargetAdd('libmovies.in', opts=['IMOD:panda', 'ILIB:libmovies', 'SRCDIR:panda/src/movies'])
-TargetAdd('libmovies_igate.obj', input='libmovies.in', opts=["DEPENDENCYONLY"])
-
-#
-# DIRECTORY: panda/src/grutil/
-#
-
-OPTS=['DIR:panda/src/grutil', 'BUILDING:PANDA',  'FFMPEG', 'ARTOOLKIT', 'OPENCV']
-TargetAdd('grutil_multitexReducer.obj', opts=OPTS, input='multitexReducer.cxx')
-TargetAdd('grutil_composite1.obj', opts=OPTS, input='grutil_composite1.cxx')
-TargetAdd('grutil_composite2.obj', opts=OPTS, input='grutil_composite2.cxx')
-IGATEFILES=GetDirectoryContents('panda/src/grutil', ["*.h", "*_composite.cxx"])
-TargetAdd('libgrutil.in', opts=OPTS, input=IGATEFILES)
-TargetAdd('libgrutil.in', opts=['IMOD:panda', 'ILIB:libgrutil', 'SRCDIR:panda/src/grutil'])
-TargetAdd('libgrutil_igate.obj', input='libgrutil.in', opts=["DEPENDENCYONLY"])
-
-#
-# DIRECTORY: panda/src/tform/
-#
-
-OPTS=['DIR:panda/src/tform', 'BUILDING:PANDA']
-TargetAdd('tform_composite.obj', opts=OPTS, input='tform_composite.cxx')
-IGATEFILES=GetDirectoryContents('panda/src/tform', ["*.h", "*_composite.cxx"])
-TargetAdd('libtform.in', opts=OPTS, input=IGATEFILES)
-TargetAdd('libtform.in', opts=['IMOD:panda', 'ILIB:libtform', 'SRCDIR:panda/src/tform'])
-TargetAdd('libtform_igate.obj', input='libtform.in', opts=["DEPENDENCYONLY"])
-
-#
-# DIRECTORY: panda/src/collide/
-#
-
-OPTS=['DIR:panda/src/collide', 'BUILDING:PANDA']
-TargetAdd('collide_composite.obj', opts=OPTS, input='collide_composite.cxx')
-IGATEFILES=GetDirectoryContents('panda/src/collide', ["*.h", "*_composite.cxx"])
-TargetAdd('libcollide.in', opts=OPTS, input=IGATEFILES)
-TargetAdd('libcollide.in', opts=['IMOD:panda', 'ILIB:libcollide', 'SRCDIR:panda/src/collide'])
-TargetAdd('libcollide_igate.obj', input='libcollide.in', opts=["DEPENDENCYONLY"])
-
-#
-# DIRECTORY: panda/src/parametrics/
-#
-
-OPTS=['DIR:panda/src/parametrics', 'BUILDING:PANDA']
-TargetAdd('parametrics_composite.obj', opts=OPTS, input='parametrics_composite.cxx')
-IGATEFILES=GetDirectoryContents('panda/src/parametrics', ["*.h", "*_composite.cxx"])
-TargetAdd('libparametrics.in', opts=OPTS, input=IGATEFILES)
-TargetAdd('libparametrics.in', opts=['IMOD:panda', 'ILIB:libparametrics', 'SRCDIR:panda/src/parametrics'])
-TargetAdd('libparametrics_igate.obj', input='libparametrics.in', opts=["DEPENDENCYONLY"])
-
-#
-# DIRECTORY: panda/src/pgui/
-#
-
-OPTS=['DIR:panda/src/pgui', 'BUILDING:PANDA']
-TargetAdd('pgui_composite.obj', opts=OPTS, input='pgui_composite.cxx')
-IGATEFILES=GetDirectoryContents('panda/src/pgui', ["*.h", "*_composite.cxx"])
-TargetAdd('libpgui.in', opts=OPTS, input=IGATEFILES)
-TargetAdd('libpgui.in', opts=['IMOD:panda', 'ILIB:libpgui', 'SRCDIR:panda/src/pgui'])
-TargetAdd('libpgui_igate.obj', input='libpgui.in', opts=["DEPENDENCYONLY"])
-
-#
-# DIRECTORY: panda/src/pnmimagetypes/
-#
-
-OPTS=['DIR:panda/src/pnmimagetypes', 'DIR:panda/src/pnmimage', 'BUILDING:PANDA', 'PNG', 'ZLIB', 'JPEG', 'ZLIB',  'JPEG', 'TIFF']
-TargetAdd('pnmimagetypes_composite.obj', opts=OPTS, input='pnmimagetypes_composite.cxx')
-
-#
-# DIRECTORY: panda/src/recorder/
-#
-
-OPTS=['DIR:panda/src/recorder', 'BUILDING:PANDA']
-TargetAdd('recorder_composite.obj', opts=OPTS, input='recorder_composite.cxx')
-IGATEFILES=GetDirectoryContents('panda/src/recorder', ["*.h", "*_composite.cxx"])
-TargetAdd('librecorder.in', opts=OPTS, input=IGATEFILES)
-TargetAdd('librecorder.in', opts=['IMOD:panda', 'ILIB:librecorder', 'SRCDIR:panda/src/recorder'])
-TargetAdd('librecorder_igate.obj', input='librecorder.in', opts=["DEPENDENCYONLY"])
-
-#
-# DIRECTORY: panda/src/vrpn/
-#
-
-if (PkgSkip("VRPN")==0):
-    OPTS=['DIR:panda/src/vrpn', 'BUILDING:PANDA',  'VRPN']
-    TargetAdd('vrpn_composite.obj', opts=OPTS, input='vrpn_composite.cxx')
-    IGATEFILES=GetDirectoryContents('panda/src/vrpn', ["*.h", "*_composite.cxx"])
-    TargetAdd('libvrpn.in', opts=OPTS, input=IGATEFILES)
-    TargetAdd('libvrpn.in', opts=['IMOD:panda', 'ILIB:libvrpn', 'SRCDIR:panda/src/vrpn'])
-    TargetAdd('libvrpn_igate.obj', input='libvrpn.in', opts=["DEPENDENCYONLY"])
-
-#
-# DIRECTORY: panda/metalibs/panda/
-#
-
-OPTS=['DIR:panda/metalibs/panda', 'BUILDING:PANDA', 'VRPN', 'JPEG', 'PNG',
-      'TIFF', 'ZLIB', 'OPENSSL', 'FREETYPE', 'FFTW', 'ADVAPI', 'WINSOCK2','SQUISH',
-      'NVIDIACG', 'WINUSER', 'WINMM', 'FFMPEG', 'DIRECTCAM', 'ARTOOLKIT', 'OPENCV']
-
-TargetAdd('panda_panda.obj', opts=OPTS, input='panda.cxx')
-
-TargetAdd('libpanda_module.obj', input='librecorder.in')
-TargetAdd('libpanda_module.obj', input='libpgraphnodes.in')
-TargetAdd('libpanda_module.obj', input='libpgraph.in')
-TargetAdd('libpanda_module.obj', input='libcull.in')
-TargetAdd('libpanda_module.obj', input='libgrutil.in')
-TargetAdd('libpanda_module.obj', input='libchan.in')
-TargetAdd('libpanda_module.obj', input='libpstatclient.in')
-TargetAdd('libpanda_module.obj', input='libchar.in')
-TargetAdd('libpanda_module.obj', input='libcollide.in')
-TargetAdd('libpanda_module.obj', input='libdevice.in')
-TargetAdd('libpanda_module.obj', input='libdgraph.in')
-TargetAdd('libpanda_module.obj', input='libdisplay.in')
-TargetAdd('libpanda_module.obj', input='libpipeline.in')
-TargetAdd('libpanda_module.obj', input='libevent.in')
-TargetAdd('libpanda_module.obj', input='libgobj.in')
-TargetAdd('libpanda_module.obj', input='libgsgbase.in')
-TargetAdd('libpanda_module.obj', input='liblinmath.in')
-TargetAdd('libpanda_module.obj', input='libmathutil.in')
-TargetAdd('libpanda_module.obj', input='libparametrics.in')
-TargetAdd('libpanda_module.obj', input='libpnmimage.in')
-TargetAdd('libpanda_module.obj', input='libtext.in')
-TargetAdd('libpanda_module.obj', input='libtform.in')
-TargetAdd('libpanda_module.obj', input='liblerp.in')
-TargetAdd('libpanda_module.obj', input='libputil.in')
-TargetAdd('libpanda_module.obj', input='libaudio.in')
-TargetAdd('libpanda_module.obj', input='libnativenet.in')
-TargetAdd('libpanda_module.obj', input='libnet.in')
-TargetAdd('libpanda_module.obj', input='libpgui.in')
-TargetAdd('libpanda_module.obj', input='libmovies.in')
-
-TargetAdd('libpanda.dll', input='panda_panda.obj')
-TargetAdd('libpanda.dll', input='libpanda_module.obj')
-TargetAdd('libpanda.dll', input='recorder_composite.obj')
-TargetAdd('libpanda.dll', input='librecorder_igate.obj')
-TargetAdd('libpanda.dll', input='pgraphnodes_composite1.obj')
-TargetAdd('libpanda.dll', input='pgraphnodes_composite2.obj')
-TargetAdd('libpanda.dll', input='libpgraphnodes_igate.obj')
-TargetAdd('libpanda.dll', input='pgraph_nodePath.obj')
-TargetAdd('libpanda.dll', input='pgraph_composite1.obj')
-TargetAdd('libpanda.dll', input='pgraph_composite2.obj')
-TargetAdd('libpanda.dll', input='pgraph_composite3.obj')
-TargetAdd('libpanda.dll', input='pgraph_composite4.obj')
-TargetAdd('libpanda.dll', input='libpgraph_igate.obj')
-TargetAdd('libpanda.dll', input='cull_composite.obj')
-TargetAdd('libpanda.dll', input='movies_composite1.obj')
-TargetAdd('libpanda.dll', input='libmovies_igate.obj')
-TargetAdd('libpanda.dll', input='grutil_multitexReducer.obj')
-TargetAdd('libpanda.dll', input='grutil_composite1.obj')
-TargetAdd('libpanda.dll', input='grutil_composite2.obj')
-TargetAdd('libpanda.dll', input='libgrutil_igate.obj')
-TargetAdd('libpanda.dll', input='chan_composite.obj')
-TargetAdd('libpanda.dll', input='libchan_igate.obj')
-TargetAdd('libpanda.dll', input='pstatclient_composite.obj')
-TargetAdd('libpanda.dll', input='libpstatclient_igate.obj')
-TargetAdd('libpanda.dll', input='char_composite.obj')
-TargetAdd('libpanda.dll', input='libchar_igate.obj')
-TargetAdd('libpanda.dll', input='collide_composite.obj')
-TargetAdd('libpanda.dll', input='libcollide_igate.obj')
-TargetAdd('libpanda.dll', input='device_composite.obj')
-TargetAdd('libpanda.dll', input='libdevice_igate.obj')
-TargetAdd('libpanda.dll', input='dgraph_composite.obj')
-TargetAdd('libpanda.dll', input='libdgraph_igate.obj')
-TargetAdd('libpanda.dll', input='display_composite.obj')
-TargetAdd('libpanda.dll', input='libdisplay_igate.obj')
-TargetAdd('libpanda.dll', input='pipeline_composite.obj')
-TargetAdd('libpanda.dll', input='libpipeline_igate.obj')
-TargetAdd('libpanda.dll', input='event_composite.obj')
-TargetAdd('libpanda.dll', input='libevent_igate.obj')
-TargetAdd('libpanda.dll', input='gobj_composite1.obj')
-TargetAdd('libpanda.dll', input='gobj_composite2.obj')
-TargetAdd('libpanda.dll', input='libgobj_igate.obj')
-TargetAdd('libpanda.dll', input='gsgbase_composite.obj')
-TargetAdd('libpanda.dll', input='libgsgbase_igate.obj')
-TargetAdd('libpanda.dll', input='linmath_composite.obj')
-TargetAdd('libpanda.dll', input='liblinmath_igate.obj')
-TargetAdd('libpanda.dll', input='mathutil_composite.obj')
-TargetAdd('libpanda.dll', input='libmathutil_igate.obj')
-TargetAdd('libpanda.dll', input='parametrics_composite.obj')
-TargetAdd('libpanda.dll', input='libparametrics_igate.obj')
-TargetAdd('libpanda.dll', input='pnmimagetypes_composite.obj')
-TargetAdd('libpanda.dll', input='pnmimage_composite.obj')
-TargetAdd('libpanda.dll', input='libpnmimage_igate.obj')
-TargetAdd('libpanda.dll', input='text_composite.obj')
-TargetAdd('libpanda.dll', input='libtext_igate.obj')
-TargetAdd('libpanda.dll', input='tform_composite.obj')
-TargetAdd('libpanda.dll', input='libtform_igate.obj')
-TargetAdd('libpanda.dll', input='lerp_composite.obj')
-TargetAdd('libpanda.dll', input='liblerp_igate.obj')
-TargetAdd('libpanda.dll', input='putil_composite1.obj')
-TargetAdd('libpanda.dll', input='putil_composite2.obj')
-TargetAdd('libpanda.dll', input='libputil_igate.obj')
-TargetAdd('libpanda.dll', input='audio_composite.obj')
-TargetAdd('libpanda.dll', input='libaudio_igate.obj')
-TargetAdd('libpanda.dll', input='pgui_composite.obj')
-TargetAdd('libpanda.dll', input='libpgui_igate.obj')
-TargetAdd('libpanda.dll', input='net_composite.obj')
-TargetAdd('libpanda.dll', input='libnet_igate.obj')
-TargetAdd('libpanda.dll', input='nativenet_composite.obj')
-TargetAdd('libpanda.dll', input='libnativenet_igate.obj')
-TargetAdd('libpanda.dll', input='pandabase_pandabase.obj')
-TargetAdd('libpanda.dll', input='libpandaexpress.dll')
-TargetAdd('libpanda.dll', input='libp3dtoolconfig.dll')
-TargetAdd('libpanda.dll', input='libp3dtool.dll')
-
-if PkgSkip("VRPN")==0:
-    TargetAdd('libpanda.dll', input="vrpn_composite.obj")
-    TargetAdd('libpanda.dll', input="libvrpn_igate.obj")
-    TargetAdd('libpanda_module.obj', input='libvrpn.in')
-
-if PkgSkip("FREETYPE")==0:
-    TargetAdd('libpanda.dll', input="pnmtext_composite.obj")
-    TargetAdd('libpanda.dll', input="libpnmtext_igate.obj")
-    TargetAdd('libpanda_module.obj', input='libpnmtext.in')
-
-TargetAdd('libpanda_module.obj', opts=OPTS)
-TargetAdd('libpanda_module.obj', opts=['IMOD:panda', 'ILIB:libpanda'])
-
-TargetAdd('libpanda.dll', dep='dtool_have_vrpn.dat')
-TargetAdd('libpanda.dll', dep='dtool_have_freetype.dat')
-TargetAdd('libpanda.dll', opts=OPTS)
-
-#
-# DIRECTORY: panda/src/skel
-#
-
-OPTS=['DIR:panda/src/skel', 'BUILDING:PANDASKEL', 'ADVAPI']
-TargetAdd('skel_composite.obj', opts=OPTS, input='skel_composite.cxx')
-IGATEFILES=GetDirectoryContents("panda/src/skel", ["*.h", "*_composite.cxx"])
-TargetAdd('libskel.in', opts=OPTS, input=IGATEFILES)
-TargetAdd('libskel.in', opts=['IMOD:pandaskel', 'ILIB:libskel', 'SRCDIR:panda/src/skel'])
-TargetAdd('libskel_igate.obj', input='libskel.in', opts=["DEPENDENCYONLY"])
-
-#
-# DIRECTORY: panda/src/skel
-#
-
-OPTS=['BUILDING:PANDASKEL', 'ADVAPI']
-
-TargetAdd('libpandaskel_module.obj', input='libskel.in')
-TargetAdd('libpandaskel_module.obj', opts=OPTS)
-TargetAdd('libpandaskel_module.obj', opts=['IMOD:pandaskel', 'ILIB:libpandaskel'])
-
-TargetAdd('libpandaskel.dll', input='skel_composite.obj')
-TargetAdd('libpandaskel.dll', input='libskel_igate.obj')
-TargetAdd('libpandaskel.dll', input='libpandaskel_module.obj')
-TargetAdd('libpandaskel.dll', input=COMMON_PANDA_LIBS)
-TargetAdd('libpandaskel.dll', opts=OPTS)
-
-#
-# DIRECTORY: panda/src/distort/
-#
-
-OPTS=['DIR:panda/src/distort', 'BUILDING:PANDAFX']
-TargetAdd('distort_composite.obj', opts=OPTS, input='distort_composite.cxx')
-IGATEFILES=GetDirectoryContents('panda/src/distort', ["*.h", "*_composite.cxx"])
-TargetAdd('libdistort.in', opts=OPTS, input=IGATEFILES)
-TargetAdd('libdistort.in', opts=['IMOD:pandafx', 'ILIB:libdistort', 'SRCDIR:panda/src/distort'])
-TargetAdd('libdistort_igate.obj', input='libdistort.in', opts=["DEPENDENCYONLY"])
-
-#
-# DIRECTORY: panda/src/effects/
-#
-
-OPTS=['DIR:panda/src/effects', 'BUILDING:PANDAFX',  'NVIDIACG']
-TargetAdd('effects_composite.obj', opts=OPTS, input='effects_composite.cxx')
-IGATEFILES=GetDirectoryContents('panda/src/effects', ["*.h", "*_composite.cxx"])
-TargetAdd('libeffects.in', opts=OPTS, input=IGATEFILES)
-TargetAdd('libeffects.in', opts=['IMOD:pandafx', 'ILIB:libeffects', 'SRCDIR:panda/src/effects'])
-TargetAdd('libeffects_igate.obj', input='libeffects.in', opts=["DEPENDENCYONLY"])
-
-#
-# DIRECTORY: panda/metalibs/pandafx/
-#
-
-OPTS=['DIR:panda/metalibs/pandafx', 'DIR:panda/src/distort', 'BUILDING:PANDAFX',  'NVIDIACG']
-TargetAdd('pandafx_pandafx.obj', opts=OPTS, input='pandafx.cxx')
-
-TargetAdd('libpandafx_module.obj', input='libdistort.in')
-TargetAdd('libpandafx_module.obj', input='libeffects.in')
-TargetAdd('libpandafx_module.obj', opts=OPTS)
-TargetAdd('libpandafx_module.obj', opts=['IMOD:pandfx', 'ILIB:libpandafx'])
-
-TargetAdd('libpandafx.dll', input='pandafx_pandafx.obj')
-TargetAdd('libpandafx.dll', input='libpandafx_module.obj')
-TargetAdd('libpandafx.dll', input='distort_composite.obj')
-TargetAdd('libpandafx.dll', input='libdistort_igate.obj')
-TargetAdd('libpandafx.dll', input='effects_composite.obj')
-TargetAdd('libpandafx.dll', input='libeffects_igate.obj')
-TargetAdd('libpandafx.dll', input=COMMON_PANDA_LIBS)
-TargetAdd('libpandafx.dll', opts=['ADVAPI',  'NVIDIACG'])
-
-
-#
-# DIRECTORY: panda/src/audiotraits/
-#
-
-if PkgSkip("FMODEX") == 0:
-  OPTS=['DIR:panda/src/audiotraits', 'BUILDING:FMOD_AUDIO',  'FMODEX']
-  TargetAdd('fmod_audio_fmod_audio_composite.obj', opts=OPTS, input='fmod_audio_composite.cxx')
-  TargetAdd('libp3fmod_audio.dll', input='fmod_audio_fmod_audio_composite.obj')
-  TargetAdd('libp3fmod_audio.dll', input=COMMON_PANDA_LIBS)
-  TargetAdd('libp3fmod_audio.dll', opts=['ADVAPI', 'WINUSER', 'WINMM', 'FMODEX'])
-
-if PkgSkip("OPENAL") == 0:
-  OPTS=['DIR:panda/src/audiotraits', 'BUILDING:OPENAL_AUDIO',  'OPENAL']
-  TargetAdd('openal_audio_openal_audio_composite.obj', opts=OPTS, input='openal_audio_composite.cxx')
-  TargetAdd('libp3openal_audio.dll', input='openal_audio_openal_audio_composite.obj')
-  TargetAdd('libp3openal_audio.dll', input=COMMON_PANDA_LIBS)
-  TargetAdd('libp3openal_audio.dll', opts=['ADVAPI', 'WINUSER', 'WINMM', 'OPENAL'])
-
-#
-# DIRECTORY: panda/src/downloadertools/
-#
-
-if PkgSkip("OPENSSL")==0:
-    OPTS=['DIR:panda/src/downloadertools', 'OPENSSL', 'ZLIB', 'ADVAPI']
-
-    TargetAdd('apply_patch_apply_patch.obj', opts=OPTS, input='apply_patch.cxx')
-    TargetAdd('apply_patch.exe', input=['apply_patch_apply_patch.obj'])
-    TargetAdd('apply_patch.exe', input=COMMON_PANDA_LIBS_PYSTUB)
-    TargetAdd('apply_patch.exe', opts=OPTS)
-
-    TargetAdd('build_patch_build_patch.obj', opts=OPTS, input='build_patch.cxx')
-    TargetAdd('build_patch.exe', input=['build_patch_build_patch.obj'])
-    TargetAdd('build_patch.exe', input=COMMON_PANDA_LIBS_PYSTUB)
-    TargetAdd('build_patch.exe', opts=OPTS)
-
-    TargetAdd('check_adler_check_adler.obj', opts=OPTS, input='check_adler.cxx')
-    TargetAdd('check_adler.exe', input=['check_adler_check_adler.obj'])
-    TargetAdd('check_adler.exe', input=COMMON_PANDA_LIBS_PYSTUB)
-    TargetAdd('check_adler.exe', opts=OPTS)
-
-    TargetAdd('check_crc_check_crc.obj', opts=OPTS, input='check_crc.cxx')
-    TargetAdd('check_crc.exe', input=['check_crc_check_crc.obj'])
-    TargetAdd('check_crc.exe', input=COMMON_PANDA_LIBS_PYSTUB)
-    TargetAdd('check_crc.exe', opts=OPTS)
-
-    TargetAdd('check_md5_check_md5.obj', opts=OPTS, input='check_md5.cxx')
-    TargetAdd('check_md5.exe', input=['check_md5_check_md5.obj'])
-    TargetAdd('check_md5.exe', input=COMMON_PANDA_LIBS_PYSTUB)
-    TargetAdd('check_md5.exe', opts=OPTS)
-
-    TargetAdd('pdecrypt_pdecrypt.obj', opts=OPTS, input='pdecrypt.cxx')
-    TargetAdd('pdecrypt.exe', input=['pdecrypt_pdecrypt.obj'])
-    TargetAdd('pdecrypt.exe', input=COMMON_PANDA_LIBS_PYSTUB)
-    TargetAdd('pdecrypt.exe', opts=OPTS)
-
-    TargetAdd('pencrypt_pencrypt.obj', opts=OPTS, input='pencrypt.cxx')
-    TargetAdd('pencrypt.exe', input=['pencrypt_pencrypt.obj'])
-    TargetAdd('pencrypt.exe', input=COMMON_PANDA_LIBS_PYSTUB)
-    TargetAdd('pencrypt.exe', opts=OPTS)
-
-    TargetAdd('show_ddb_show_ddb.obj', opts=OPTS, input='show_ddb.cxx')
-    TargetAdd('show_ddb.exe', input=['show_ddb_show_ddb.obj'])
-    TargetAdd('show_ddb.exe', input=COMMON_PANDA_LIBS_PYSTUB)
-    TargetAdd('show_ddb.exe', opts=OPTS)
-
-#
-# DIRECTORY: panda/src/downloadertools/
-#
-
-OPTS=['DIR:panda/src/downloadertools', 'ZLIB', 'ADVAPI']
-
-TargetAdd('multify_multify.obj', opts=OPTS, input='multify.cxx')
-TargetAdd('multify.exe', input=['multify_multify.obj'])
-TargetAdd('multify.exe', input=COMMON_PANDA_LIBS_PYSTUB)
-TargetAdd('multify.exe', opts=OPTS)
-
-TargetAdd('pzip_pzip.obj', opts=OPTS, input='pzip.cxx')
-TargetAdd('pzip.exe', input=['pzip_pzip.obj'])
-TargetAdd('pzip.exe', input=COMMON_PANDA_LIBS_PYSTUB)
-TargetAdd('pzip.exe', opts=OPTS)
-
-TargetAdd('punzip_punzip.obj', opts=OPTS, input='punzip.cxx')
-TargetAdd('punzip.exe', input=['punzip_punzip.obj'])
-TargetAdd('punzip.exe', input=COMMON_PANDA_LIBS_PYSTUB)
-TargetAdd('punzip.exe', opts=OPTS)
-
-#
-# DIRECTORY: panda/src/windisplay/
-#
-
-if (sys.platform == "win32"):
-    OPTS=['DIR:panda/src/windisplay', 'BUILDING:PANDAWIN']
-    TargetAdd('windisplay_composite.obj', opts=OPTS, input='windisplay_composite.cxx')
-    TargetAdd('windisplay_windetectdx8.obj', opts=OPTS + ["DX8"], input='winDetectDx8.cxx')
-    TargetAdd('windisplay_windetectdx9.obj', opts=OPTS + ["DX9"], input='winDetectDx9.cxx')
-    TargetAdd('libp3windisplay.dll', input='windisplay_composite.obj')
-    TargetAdd('libp3windisplay.dll', input='windisplay_windetectdx8.obj')
-    TargetAdd('libp3windisplay.dll', input='windisplay_windetectdx9.obj')
-    TargetAdd('libp3windisplay.dll', input=COMMON_PANDA_LIBS)
-    TargetAdd('libp3windisplay.dll', opts=['WINIMM', 'WINGDI', 'WINKERNEL', 'WINOLDNAMES', 'WINUSER', 'WINMM'])
-
-#
-# DIRECTORY: panda/metalibs/pandadx8/
-#
-
-if PkgSkip("DX8")==0:
-    OPTS=['DIR:panda/src/dxgsg8', 'DIR:panda/metalibs/pandadx8', 'BUILDING:PANDADX', 'DX8']
-    TargetAdd('dxgsg8_dxGraphicsStateGuardian8.obj', opts=OPTS, input='dxGraphicsStateGuardian8.cxx')
-    TargetAdd('dxgsg8_composite.obj', opts=OPTS, input='dxgsg8_composite.cxx')
-    TargetAdd('pandadx8_pandadx8.obj', opts=OPTS, input='pandadx8.cxx')
-    TargetAdd('libpandadx8.dll', input='pandadx8_pandadx8.obj')
-    TargetAdd('libpandadx8.dll', input='dxgsg8_dxGraphicsStateGuardian8.obj')
-    TargetAdd('libpandadx8.dll', input='dxgsg8_composite.obj')
-    TargetAdd('libpandadx8.dll', input='libp3windisplay.dll')
-    TargetAdd('libpandadx8.dll', input=COMMON_PANDA_LIBS)
-    TargetAdd('libpandadx8.dll', opts=['ADVAPI', 'WINGDI', 'WINKERNEL', 'WINUSER', 'WINMM', 'DX8'])
-
-#
-# DIRECTORY: panda/metalibs/pandadx9/
-#
-
-if PkgSkip("DX9")==0:
-    OPTS=['DIR:panda/src/dxgsg9', 'BUILDING:PANDADX', 'DX9',  'NVIDIACG', 'CGDX9']
-    TargetAdd('dxgsg9_dxGraphicsStateGuardian9.obj', opts=OPTS, input='dxGraphicsStateGuardian9.cxx')
-    TargetAdd('dxgsg9_composite.obj', opts=OPTS, input='dxgsg9_composite.cxx')
-    OPTS=['DIR:panda/metalibs/pandadx9', 'BUILDING:PANDADX', 'DX9',  'NVIDIACG', 'CGDX9']
-    TargetAdd('pandadx9_pandadx9.obj', opts=OPTS, input='pandadx9.cxx')
-    TargetAdd('libpandadx9.dll', input='pandadx9_pandadx9.obj')
-    TargetAdd('libpandadx9.dll', input='dxgsg9_dxGraphicsStateGuardian9.obj')
-    TargetAdd('libpandadx9.dll', input='dxgsg9_composite.obj')
-    TargetAdd('libpandadx9.dll', input='libp3windisplay.dll')
-    TargetAdd('libpandadx9.dll', input=COMMON_PANDA_LIBS)
-    TargetAdd('libpandadx9.dll', opts=['ADVAPI', 'WINGDI', 'WINKERNEL', 'WINUSER', 'WINMM', 'DX9',  'NVIDIACG', 'CGDX9'])
-
-#
-# DIRECTORY: panda/src/egg/
-#
-
-OPTS=['DIR:panda/src/egg', 'BUILDING:PANDAEGG',  'ZLIB', 'BISONPREFIX_eggyy', 'FLEXDASHI']
-CreateFile(GetOutputDir()+"/include/parser.h")
-TargetAdd('egg_parser.obj', opts=OPTS, input='parser.yxx')
-TargetAdd('parser.h', input='egg_parser.obj', opts=['DEPENDENCYONLY'])
-TargetAdd('egg_lexer.obj', opts=OPTS, input='lexer.lxx')
-TargetAdd('egg_composite1.obj', opts=OPTS, input='egg_composite1.cxx')
-TargetAdd('egg_composite2.obj', opts=OPTS, input='egg_composite2.cxx')
-IGATEFILES=GetDirectoryContents('panda/src/egg', ["*.h", "*_composite.cxx"])
-TargetAdd('libegg.in', opts=OPTS, input=IGATEFILES)
-TargetAdd('libegg.in', opts=['IMOD:pandaegg', 'ILIB:libegg', 'SRCDIR:panda/src/egg'])
-TargetAdd('libegg_igate.obj', input='libegg.in', opts=["DEPENDENCYONLY"])
-
-#
-# DIRECTORY: panda/src/egg2pg/
-#
-
-OPTS=['DIR:panda/src/egg2pg', 'BUILDING:PANDAEGG']
-TargetAdd('egg2pg_composite.obj', opts=OPTS, input='egg2pg_composite.cxx')
-IGATEFILES=['load_egg_file.h']
-TargetAdd('libegg2pg.in', opts=OPTS, input=IGATEFILES)
-TargetAdd('libegg2pg.in', opts=['IMOD:pandaegg', 'ILIB:libegg2pg', 'SRCDIR:panda/src/egg2pg'])
-TargetAdd('libegg2pg_igate.obj', input='libegg2pg.in', opts=["DEPENDENCYONLY"])
-
-#
-# DIRECTORY: panda/src/framework/
-#
-
-OPTS=['DIR:panda/src/framework', 'BUILDING:FRAMEWORK']
-TargetAdd('framework_composite.obj', opts=OPTS, input='framework_composite.cxx')
-TargetAdd('libp3framework.dll', input='framework_composite.obj')
-TargetAdd('libp3framework.dll', input=COMMON_PANDA_LIBS)
-TargetAdd('libp3framework.dll', opts=['ADVAPI'])
-
-#
-# DIRECTORY: panda/src/glstuff/
-#
-
-OPTS=['DIR:panda/src/glstuff',  'NVIDIACG', 'CGGL']
-TargetAdd('glstuff_glpure.obj', opts=OPTS, input='glpure.cxx')
-TargetAdd('libp3glstuff.dll', input='glstuff_glpure.obj')
-TargetAdd('libp3glstuff.dll', input='libpandafx.dll')
-TargetAdd('libp3glstuff.dll', input=COMMON_PANDA_LIBS)
-TargetAdd('libp3glstuff.dll', opts=['ADVAPI', 'GLUT',  'NVIDIACG', 'CGGL'])
-
-#
-# DIRECTORY: panda/src/glgsg/
-#
-
-OPTS=['DIR:panda/src/glgsg', 'DIR:panda/src/glstuff', 'DIR:panda/src/gobj', 'BUILDING:PANDAGL',  'NVIDIACG']
-TargetAdd('glgsg_config_glgsg.obj', opts=OPTS, input='config_glgsg.cxx')
-TargetAdd('glgsg_glgsg.obj', opts=OPTS, input='glgsg.cxx')
-
-#
-# DIRECTORY: panda/metalibs/pandaegg/
-#
-
-OPTS=['DIR:panda/metalibs/pandaegg', 'DIR:panda/src/egg', 'BUILDING:PANDAEGG']
-TargetAdd('pandaegg_pandaegg.obj', opts=OPTS, input='pandaegg.cxx')
-
-TargetAdd('libpandaegg_module.obj', input='libegg2pg.in')
-TargetAdd('libpandaegg_module.obj', input='libegg.in')
-TargetAdd('libpandaegg_module.obj', opts=OPTS)
-TargetAdd('libpandaegg_module.obj', opts=['IMOD:pandaegg', 'ILIB:libpandaegg'])
-
-TargetAdd('libpandaegg.dll', input='pandaegg_pandaegg.obj')
-TargetAdd('libpandaegg.dll', input='libpandaegg_module.obj')
-TargetAdd('libpandaegg.dll', input='egg2pg_composite.obj')
-TargetAdd('libpandaegg.dll', input='libegg2pg_igate.obj')
-TargetAdd('libpandaegg.dll', input='egg_composite1.obj')
-TargetAdd('libpandaegg.dll', input='egg_composite2.obj')
-TargetAdd('libpandaegg.dll', input='egg_parser.obj')
-TargetAdd('libpandaegg.dll', input='egg_lexer.obj')
-TargetAdd('libpandaegg.dll', input='libegg_igate.obj')
-TargetAdd('libpandaegg.dll', input=COMMON_PANDA_LIBS)
-TargetAdd('libpandaegg.dll', opts=['ADVAPI'])
-
-#
-# DIRECTORY: panda/metalibs/panda/
-#
-
-OPTS=['DIR:panda/metalibs/panda', 'BUILDING:PANDA',  'FFTW', 'PNG', 'JPEG', 'TIFF', 'ZLIB', 'OPENSSL', 'ADVAPI', 'WINSOCK2', 'WINUSER', 'WINMM']
-TargetAdd('libpandastripped.dll', input='pipeline_composite.obj')
-TargetAdd('libpandastripped.dll', input='event_composite.obj')
-TargetAdd('libpandastripped.dll', input='net_composite.obj')
-TargetAdd('libpandastripped.dll', input='nativenet_composite.obj')
-TargetAdd('libpandastripped.dll', input='pstatclient_composite.obj')
-TargetAdd('libpandastripped.dll', input='linmath_composite.obj')
-TargetAdd('libpandastripped.dll', input='mathutil_composite.obj')
-TargetAdd('libpandastripped.dll', input='putil_composite1.obj')
-TargetAdd('libpandastripped.dll', input='putil_composite2.obj')
-TargetAdd('libpandastripped.dll', input='pnmimagetypes_composite.obj')
-TargetAdd('libpandastripped.dll', input='pnmimage_composite.obj')
-TargetAdd('libpandastripped.dll', input='pandabase_pandabase.obj')
-TargetAdd('libpandastripped.dll', input='libpandaexpress.dll')
-TargetAdd('libpandastripped.dll', input='libp3dtoolconfig.dll')
-TargetAdd('libpandastripped.dll', input='libp3dtool.dll')
-TargetAdd('libpandastripped.dll', input='dtool_have_vrpn.dat')
-TargetAdd('libpandastripped.dll', input='dtool_have_freetype.dat')
-TargetAdd('libpandastripped.dll', opts=OPTS)
-
-#
-# DIRECTORY: panda/metalibs/pandaegg/
-#
-
-OPTS=['DIR:panda/metalibs/pandaegg', 'DIR:panda/src/egg', 'BUILDING:PANDAEGG']
-TargetAdd('pandaegg_pandaeggnopg.obj', opts=OPTS, input='pandaeggnopg.cxx')
-TargetAdd('libpandaeggstripped.dll', input='pandaegg_pandaeggnopg.obj')
-TargetAdd('libpandaeggstripped.dll', input='egg_composite1.obj')
-TargetAdd('libpandaeggstripped.dll', input='egg_composite2.obj')
-TargetAdd('libpandaeggstripped.dll', input='egg_parser.obj')
-TargetAdd('libpandaeggstripped.dll', input='egg_lexer.obj')
-TargetAdd('libpandaeggstripped.dll', input='libpandastripped.dll')
-TargetAdd('libpandaeggstripped.dll', input='libpandaexpress.dll')
-TargetAdd('libpandaeggstripped.dll', input='libp3dtoolconfig.dll')
-TargetAdd('libpandaeggstripped.dll', input='libp3dtool.dll')
-TargetAdd('libpandaeggstripped.dll', opts=['ADVAPI'])
-
-#
-# DIRECTORY: panda/src/mesadisplay/
-#
-
-if (sys.platform != "win32"):
-    OPTS=['DIR:panda/src/mesadisplay', 'DIR:panda/src/glstuff', 'BUILDING:PANDAGLUT', 'NVIDIACG', 'GLUT']
-    TargetAdd('mesadisplay_composite.obj', opts=OPTS, input='mesadisplay_composite.cxx')
-    OPTS=['DIR:panda/metalibs/pandagl', 'BUILDING:PANDAGLUT', 'NVIDIACG', 'GLUT']
-    TargetAdd('libpandamesa.dll', input='mesadisplay_composite.obj')
-    TargetAdd('libpandamesa.dll', input='libp3glstuff.dll')
-    TargetAdd('libpandamesa.dll', input='libpandafx.dll')
-    TargetAdd('libpandamesa.dll', input=COMMON_PANDA_LIBS)
-    TargetAdd('libpandamesa.dll', opts=['GLUT'])
-
-#
-# DIRECTORY: panda/src/glxdisplay/
-#
-
-if (sys.platform != "win32" and sys.platform != "darwin"):
-    OPTS=['DIR:panda/src/glxdisplay', 'BUILDING:PANDAGLUT',  'GLUT', 'NVIDIACG', 'CGGL']
-    TargetAdd('glxdisplay_composite.obj', opts=OPTS, input='glxdisplay_composite.cxx')
-    OPTS=['DIR:panda/metalibs/pandagl', 'BUILDING:PANDAGLUT',  'GLUT', 'NVIDIACG', 'CGGL']
-    TargetAdd('pandagl_pandagl.obj', opts=OPTS, input='pandagl.cxx')
-    TargetAdd('libpandagl.dll', input='pandagl_pandagl.obj')
-    TargetAdd('libpandagl.dll', input='glgsg_config_glgsg.obj')
-    TargetAdd('libpandagl.dll', input='glgsg_glgsg.obj')
-    TargetAdd('libpandagl.dll', input='glxdisplay_composite.obj')
-    TargetAdd('libpandagl.dll', input='libp3glstuff.dll')
-    TargetAdd('libpandagl.dll', input='libpandafx.dll')
-    TargetAdd('libpandagl.dll', input=COMMON_PANDA_LIBS)
-    TargetAdd('libpandagl.dll', opts=['GLUT', 'NVIDIACG', 'CGGL'])
-
-#
-# DIRECTORY: panda/src/osxdisplay/
-#
-
-if (sys.platform == 'darwin'):
-    OPTS=['DIR:panda/src/osxdisplay', 'BUILDING:PANDAGLUT',  'GLUT', 'NVIDIACG', 'CGGL']
-    TargetAdd('osxdisplay_composite.obj', opts=OPTS, input='osxdisplay_composite.mm')
-    OPTS=['DIR:panda/metalibs/pandagl', 'BUILDING:PANDAGLUT',  'GLUT', 'NVIDIACG', 'CGGL']
-    TargetAdd('pandagl_pandagl.obj', opts=OPTS, input='pandagl.cxx')
-    TargetAdd('libpandagl.dll', input='pandagl_pandagl.obj')
-    TargetAdd('libpandagl.dll', input='glgsg_config_glgsg.obj')
-    TargetAdd('libpandagl.dll', input='glgsg_glgsg.obj')
-    TargetAdd('libpandagl.dll', input='osxdisplay_composite.obj')
-    TargetAdd('libpandagl.dll', input='libp3glstuff.dll')
-    TargetAdd('libpandagl.dll', input='libpandafx.dll')
-    TargetAdd('libpandagl.dll', input=COMMON_PANDA_LIBS)
-    TargetAdd('libpandagl.dll', opts=['GLUT', 'NVIDIACG', 'CGGL', 'CARBON', 'AGL', 'COCOA'])
-
-#
-# DIRECTORY: panda/src/wgldisplay/
-#
-
-if (sys.platform == "win32"):
-    OPTS=['DIR:panda/src/wgldisplay', 'DIR:panda/src/glstuff', 'BUILDING:PANDAGL',  'NVIDIACG', 'CGGL']
-    TargetAdd('wgldisplay_composite.obj', opts=OPTS, input='wgldisplay_composite.cxx')
-    OPTS=['DIR:panda/metalibs/pandagl', 'BUILDING:PANDAGL',  'NVIDIACG', 'CGGL']
-    TargetAdd('pandagl_pandagl.obj', opts=OPTS, input='pandagl.cxx')
-    TargetAdd('libpandagl.dll', input='pandagl_pandagl.obj')
-    TargetAdd('libpandagl.dll', input='glgsg_config_glgsg.obj')
-    TargetAdd('libpandagl.dll', input='glgsg_glgsg.obj')
-    TargetAdd('libpandagl.dll', input='wgldisplay_composite.obj')
-    TargetAdd('libpandagl.dll', input='libp3windisplay.dll')
-    TargetAdd('libpandagl.dll', input='libp3glstuff.dll')
-    TargetAdd('libpandagl.dll', input='libpandafx.dll')
-    TargetAdd('libpandagl.dll', input=COMMON_PANDA_LIBS)
-    TargetAdd('libpandagl.dll', opts=['WINGDI', 'GLUT', 'WINKERNEL', 'WINOLDNAMES', 'WINUSER', 'WINMM',  'NVIDIACG', 'CGGL'])
-
-#
-# DIRECTORY: panda/src/ode/
-#
-if (PkgSkip("ODE")==0):
-    OPTS=['DIR:panda/src/ode', 'BUILDING:PANDAODE', 'ODE']
-    TargetAdd('pode_composite1.obj', opts=OPTS, input='pode_composite1.cxx')
-    TargetAdd('pode_composite2.obj', opts=OPTS, input='pode_composite2.cxx')
-    TargetAdd('pode_composite3.obj', opts=OPTS, input='pode_composite3.cxx')
-    IGATEFILES=GetDirectoryContents('panda/src/ode', ["*.h", "*_composite.cxx"])
-    IGATEFILES.remove("odeConvexGeom.h")
-    IGATEFILES.remove("odeHeightFieldGeom.h")
-    IGATEFILES.remove("odeHelperStructs.h")
-    TargetAdd('libpandaode.in', opts=OPTS, input=IGATEFILES)
-    TargetAdd('libpandaode.in', opts=['IMOD:pandaode', 'ILIB:libpandaode', 'SRCDIR:panda/src/ode'])
-    TargetAdd('libpandaode_igate.obj', input='libpandaode.in', opts=["DEPENDENCYONLY"])
-
-#
-# DIRECTORY: panda/metalibs/pandaode/
-#
-if (PkgSkip("ODE")==0):
-    OPTS=['DIR:panda/metalibs/pandaode', 'BUILDING:PANDAODE', 'ODE']
-    TargetAdd('pandaode_pandaode.obj', opts=OPTS, input='pandaode.cxx')
-    
-    TargetAdd('libpandaode_module.obj', input='libpandaode.in')
-    TargetAdd('libpandaode_module.obj', opts=OPTS)
-    TargetAdd('libpandaode_module.obj', opts=['IMOD:pandaode', 'ILIB:libpandaode'])
-    
-    TargetAdd('libpandaode.dll', input='pandaode_pandaode.obj')
-    TargetAdd('libpandaode.dll', input='libpandaode_module.obj')
-    TargetAdd('libpandaode.dll', input='pode_composite1.obj')
-    TargetAdd('libpandaode.dll', input='pode_composite2.obj')
-    TargetAdd('libpandaode.dll', input='pode_composite3.obj')
-    TargetAdd('libpandaode.dll', input='libpandaode_igate.obj')
-    TargetAdd('libpandaode.dll', input=COMMON_PANDA_LIBS)
-    TargetAdd('libpandaode.dll', opts=['WINUSER', 'ODE'])
-
-#
-# DIRECTORY: panda/src/physics/
-#
-
-OPTS=['DIR:panda/src/physics', 'BUILDING:PANDAPHYSICS']
-TargetAdd('physics_composite.obj', opts=OPTS, input='physics_composite.cxx')
-IGATEFILES=GetDirectoryContents('panda/src/physics', ["*.h", "*_composite.cxx"])
-IGATEFILES.remove("forces.h")
-TargetAdd('libphysics.in', opts=OPTS, input=IGATEFILES)
-TargetAdd('libphysics.in', opts=['IMOD:pandaphysics', 'ILIB:libphysics', 'SRCDIR:panda/src/physics'])
-TargetAdd('libphysics_igate.obj', input='libphysics.in', opts=["DEPENDENCYONLY"])
-
-#
-# DIRECTORY: panda/src/particlesystem/
-#
-
-OPTS=['DIR:panda/src/particlesystem', 'BUILDING:PANDAPHYSICS']
-TargetAdd('particlesystem_composite.obj', opts=OPTS, input='particlesystem_composite.cxx')
-IGATEFILES=GetDirectoryContents('panda/src/particlesystem', ["*.h", "*_composite.cxx"])
-IGATEFILES.remove('orientedParticle.h')
-IGATEFILES.remove('orientedParticleFactory.h')
-IGATEFILES.remove('particlefactories.h')
-IGATEFILES.remove('emitters.h')
-IGATEFILES.remove('particles.h')
-TargetAdd('libparticlesystem.in', opts=OPTS, input=IGATEFILES)
-TargetAdd('libparticlesystem.in', opts=['IMOD:pandaphysics', 'ILIB:libparticlesystem', 'SRCDIR:panda/src/particlesystem'])
-
-#
-# DIRECTORY: panda/metalibs/pandaphysics/
-#
-
-OPTS=['DIR:panda/metalibs/pandaphysics', 'BUILDING:PANDAPHYSICS']
-TargetAdd('pandaphysics_pandaphysics.obj', opts=OPTS, input='pandaphysics.cxx')
-
-TargetAdd('libpandaphysics_module.obj', input='libphysics.in')
-TargetAdd('libpandaphysics_module.obj', input='libparticlesystem.in')
-TargetAdd('libpandaphysics_module.obj', opts=OPTS)
-TargetAdd('libpandaphysics_module.obj', opts=['IMOD:pandaphysics', 'ILIB:libpandaphysics'])
-
-TargetAdd('libpandaphysics.dll', input='pandaphysics_pandaphysics.obj')
-TargetAdd('libpandaphysics.dll', input='libpandaphysics_module.obj')
-TargetAdd('libpandaphysics.dll', input='physics_composite.obj')
-TargetAdd('libpandaphysics.dll', input='libphysics_igate.obj')
-TargetAdd('libpandaphysics.dll', input='particlesystem_composite.obj')
-TargetAdd('libpandaphysics.dll', input='libparticlesystem_igate.obj')
-TargetAdd('libpandaphysics.dll', input=COMMON_PANDA_LIBS)
-TargetAdd('libpandaphysics.dll', opts=['ADVAPI'])
-
-#
-# DIRECTORY: panda/src/testbed/
-#
-
-OPTS=['DIR:panda/src/testbed']
-TargetAdd('pview_pview.obj', opts=OPTS, input='pview.cxx')
-TargetAdd('pview.exe', input='pview_pview.obj')
-TargetAdd('pview.exe', input='libp3framework.dll')
-TargetAdd('pview.exe', input='libpandafx.dll')
-TargetAdd('pview.exe', input=COMMON_PANDA_LIBS_PYSTUB)
-TargetAdd('pview.exe', opts=['ADVAPI'])
-
-#
-# DIRECTORY: panda/src/tinydisplay/
-#
-
-OPTS=['DIR:panda/src/tinydisplay', 'BUILDING:TINYDISPLAY']
-TargetAdd('tinydisplay_composite1.obj', opts=OPTS, input='tinydisplay_composite1.cxx')
-TargetAdd('tinydisplay_composite2.obj', opts=OPTS, input='tinydisplay_composite2.cxx')
-TargetAdd('tinydisplay_ztriangle_1.obj', opts=OPTS, input='ztriangle_1.cxx')
-TargetAdd('tinydisplay_ztriangle_2.obj', opts=OPTS, input='ztriangle_2.cxx')
-TargetAdd('tinydisplay_ztriangle_3.obj', opts=OPTS, input='ztriangle_3.cxx')
-TargetAdd('tinydisplay_ztriangle_4.obj', opts=OPTS, input='ztriangle_4.cxx')
-TargetAdd('tinydisplay_ztriangle_table.obj', opts=OPTS, input='ztriangle_table.cxx')
-TargetAdd('libtinydisplay.dll', input='tinydisplay_composite1.obj')
-TargetAdd('libtinydisplay.dll', input='tinydisplay_composite2.obj')
-TargetAdd('libtinydisplay.dll', input='tinydisplay_ztriangle_1.obj')
-TargetAdd('libtinydisplay.dll', input='tinydisplay_ztriangle_2.obj')
-TargetAdd('libtinydisplay.dll', input='tinydisplay_ztriangle_3.obj')
-TargetAdd('libtinydisplay.dll', input='tinydisplay_ztriangle_4.obj')
-TargetAdd('libtinydisplay.dll', input='tinydisplay_ztriangle_table.obj')
-TargetAdd('libtinydisplay.dll', input=COMMON_PANDA_LIBS)
-if (sys.platform == "win32"):
-    TargetAdd('libtinydisplay.dll', input='libp3windisplay.dll')
-    TargetAdd('libtinydisplay.dll', opts=['WINIMM', 'WINGDI', 'WINKERNEL', 'WINOLDNAMES', 'WINUSER', 'WINMM'])
-
-#
-# DIRECTORY: direct/src/directbase/
-#
-
-if (PkgSkip("PYTHON")==0):
-    OPTS=['DIR:direct/src/directbase']
-
-    TargetAdd('genpycode.obj', opts=OPTS+['BUILDING:GENPYCODE'], input='ppython.cxx')
-    TargetAdd('genpycode.exe', input='genpycode.obj')
-    TargetAdd('genpycode.exe', opts=['WINUSER'])
-
-    TargetAdd('packpanda.obj', opts=OPTS+['BUILDING:PACKPANDA'], input='ppython.cxx')
-    TargetAdd('packpanda.exe', input='packpanda.obj')
-    TargetAdd('packpanda.exe', opts=['WINUSER'])
-
-    TargetAdd('eggcacher.obj', opts=OPTS+['BUILDING:EGGCACHER'], input='ppython.cxx')
-    TargetAdd('eggcacher.exe', input='eggcacher.obj')
-    TargetAdd('eggcacher.exe', opts=['WINUSER'])
-
-    OPTS=['DIR:direct/src/directbase', 'BUILDING:DIRECT']
-
-    TargetAdd('directbase_directbase.obj', opts=OPTS, input='directbase.cxx')
-
-#
-# DIRECTORY: direct/src/dcparser/
-#
-
-if (PkgSkip("PYTHON")==0):
-    OPTS=['DIR:direct/src/dcparser', 'WITHINPANDA', 'BUILDING:DIRECT', 'BISONPREFIX_dcyy']
-    CreateFile(GetOutputDir()+"/include/dcParser.h")
-    TargetAdd('dcparser_dcParser.obj', opts=OPTS, input='dcParser.yxx')
-    TargetAdd('dcParser.h', input='egg_parser.obj', opts=['DEPENDENCYONLY'])
-    TargetAdd('dcparser_dcLexer.obj', opts=OPTS, input='dcLexer.lxx')
-    TargetAdd('dcparser_composite.obj', opts=OPTS, input='dcparser_composite.cxx')
-    IGATEFILES=GetDirectoryContents('direct/src/dcparser', ["*.h", "*_composite.cxx"])
-    IGATEFILES.remove('dcmsgtypes.h')
-    TargetAdd('libdcparser.in', opts=OPTS, input=IGATEFILES)
-    TargetAdd('libdcparser.in', opts=['IMOD:p3direct', 'ILIB:libdcparser', 'SRCDIR:direct/src/dcparser'])
-    TargetAdd('libdcparser_igate.obj', input='libdcparser.in', opts=["DEPENDENCYONLY"])
-
-#
-# DIRECTORY: direct/src/deadrec/
-#
-
-if (PkgSkip("PYTHON")==0):
-    OPTS=['DIR:direct/src/deadrec', 'BUILDING:DIRECT']
-    TargetAdd('deadrec_composite.obj', opts=OPTS, input='deadrec_composite.cxx')
-    IGATEFILES=GetDirectoryContents('direct/src/deadrec', ["*.h", "*_composite.cxx"])
-    TargetAdd('libdeadrec.in', opts=OPTS, input=IGATEFILES)
-    TargetAdd('libdeadrec.in', opts=['IMOD:p3direct', 'ILIB:libdeadrec', 'SRCDIR:direct/src/deadrec'])
-    TargetAdd('libdeadrec_igate.obj', input='libdeadrec.in', opts=["DEPENDENCYONLY"])
-
-#
-# DIRECTORY: direct/src/distributed/
-#
-
-if (PkgSkip("PYTHON")==0):
-    OPTS=['DIR:direct/src/distributed', 'DIR:direct/src/dcparser', 'WITHINPANDA', 'BUILDING:DIRECT', 'OPENSSL']
-    TargetAdd('distributed_config_distributed.obj', opts=OPTS, input='config_distributed.cxx')
-    TargetAdd('distributed_cConnectionRepository.obj', opts=OPTS, input='cConnectionRepository.cxx')
-    TargetAdd('distributed_cDistributedSmoothNodeBase.obj', opts=OPTS, input='cDistributedSmoothNodeBase.cxx')
-    IGATEFILES=GetDirectoryContents('direct/src/distributed', ["*.h", "*.cxx"])
-    TargetAdd('libdistributed.in', opts=OPTS, input=IGATEFILES)
-    TargetAdd('libdistributed.in', opts=['IMOD:p3direct', 'ILIB:libdistributed', 'SRCDIR:direct/src/distributed'])
-    TargetAdd('libdistributed_igate.obj', input='libdistributed.in', opts=["DEPENDENCYONLY"])
-
-#
-# DIRECTORY: direct/src/interval/
-#
-
-if (PkgSkip("PYTHON")==0):
-    OPTS=['DIR:direct/src/interval', 'BUILDING:DIRECT']
-    TargetAdd('interval_composite.obj', opts=OPTS, input='interval_composite.cxx')
-    IGATEFILES=GetDirectoryContents('direct/src/interval', ["*.h", "*_composite.cxx"])
-    TargetAdd('libinterval.in', opts=OPTS, input=IGATEFILES)
-    TargetAdd('libinterval.in', opts=['IMOD:p3direct', 'ILIB:libinterval', 'SRCDIR:direct/src/interval'])
-    TargetAdd('libinterval_igate.obj', input='libinterval.in', opts=["DEPENDENCYONLY"])
-
-#
-# DIRECTORY: direct/src/showbase/
-#
-
-if (PkgSkip("PYTHON")==0):
-    OPTS=['DIR:direct/src/showbase', 'BUILDING:DIRECT']
-    TargetAdd('showbase_showBase.obj', opts=OPTS, input='showBase.cxx')
-    IGATEFILES=GetDirectoryContents('direct/src/showbase', ["*.h", "showBase.cxx"])
-    TargetAdd('libshowbase.in', opts=OPTS, input=IGATEFILES)
-    TargetAdd('libshowbase.in', opts=['IMOD:p3direct', 'ILIB:libshowbase', 'SRCDIR:direct/src/showbase'])
-    TargetAdd('libshowbase_igate.obj', input='libshowbase.in', opts=["DEPENDENCYONLY"])
-
-#
-# DIRECTORY: direct/metalibs/direct/
-#
-
-if (PkgSkip("PYTHON")==0):
-    OPTS=['DIR:direct/metalibs/direct', 'BUILDING:DIRECT']
-    TargetAdd('direct_direct.obj', opts=OPTS, input='direct.cxx')
-
-    TargetAdd('libp3direct_module.obj', input='libdcparser.in')
-    TargetAdd('libp3direct_module.obj', input='libshowbase.in')
-    TargetAdd('libp3direct_module.obj', input='libdeadrec.in')
-    TargetAdd('libp3direct_module.obj', input='libinterval.in')
-    TargetAdd('libp3direct_module.obj', input='libdistributed.in')
-    TargetAdd('libp3direct_module.obj', opts=OPTS)
-    TargetAdd('libp3direct_module.obj', opts=['IMOD:p3direct', 'ILIB:libp3direct'])
-
-    TargetAdd('libp3direct.dll', input='direct_direct.obj')
-    TargetAdd('libp3direct.dll', input='libp3direct_module.obj')
-    TargetAdd('libp3direct.dll', input='directbase_directbase.obj')
-    TargetAdd('libp3direct.dll', input='dcparser_composite.obj')
-    TargetAdd('libp3direct.dll', input='dcparser_dcParser.obj')
-    TargetAdd('libp3direct.dll', input='dcparser_dcLexer.obj')
-    TargetAdd('libp3direct.dll', input='libdcparser_igate.obj')
-    TargetAdd('libp3direct.dll', input='showbase_showBase.obj')
-    TargetAdd('libp3direct.dll', input='libshowbase_igate.obj')
-    TargetAdd('libp3direct.dll', input='deadrec_composite.obj')
-    TargetAdd('libp3direct.dll', input='libdeadrec_igate.obj')
-    TargetAdd('libp3direct.dll', input='interval_composite.obj')
-    TargetAdd('libp3direct.dll', input='libinterval_igate.obj')
-    TargetAdd('libp3direct.dll', input='distributed_config_distributed.obj')
-    TargetAdd('libp3direct.dll', input='distributed_cConnectionRepository.obj')
-    TargetAdd('libp3direct.dll', input='distributed_cDistributedSmoothNodeBase.obj')
-    TargetAdd('libp3direct.dll', input='libdistributed_igate.obj')
-    TargetAdd('libp3direct.dll', input=COMMON_PANDA_LIBS)
-    TargetAdd('libp3direct.dll', opts=['ADVAPI',  'OPENSSL'])
-
-#
-# DIRECTORY: direct/src/dcparse/
-#
-
-if (PkgSkip("PYTHON")==0):
-    OPTS=['DIR:direct/src/dcparse', 'DIR:direct/src/dcparser', 'WITHINPANDA', 'ADVAPI']
-    TargetAdd('dcparse_dcparse.obj', opts=OPTS, input='dcparse.cxx')
-    TargetAdd('p3dcparse.exe', input='dcparse_dcparse.obj')
-    TargetAdd('p3dcparse.exe', input='libp3direct.dll')
-    TargetAdd('p3dcparse.exe', input=COMMON_PANDA_LIBS_PYSTUB)
-    TargetAdd('p3dcparse.exe', opts=['ADVAPI'])
-
-#
-# DIRECTORY: direct/src/heapq/
-#
-
-if (PkgSkip("PYTHON")==0):
-    OPTS=['DIR:direct/src/heapq']
-    TargetAdd('heapq_heapq.obj', opts=OPTS, input='heapq.cxx')
-    TargetAdd('libp3heapq.dll', input='heapq_heapq.obj')
-    TargetAdd('libp3heapq.dll', input='libpandaexpress.dll')
-    TargetAdd('libp3heapq.dll', input=COMMON_DTOOL_LIBS)
-    TargetAdd('libp3heapq.dll', opts=['ADVAPI'])
-
-#
-# DIRECTORY: pandatool/src/pandatoolbase/
-#
-
-if (PkgSkip("PANDATOOL")==0):
-    OPTS=['DIR:pandatool/src/pandatoolbase']
-    TargetAdd('pandatoolbase_composite1.obj', opts=OPTS, input='pandatoolbase_composite1.cxx')
-    TargetAdd('libpandatoolbase.lib', input='pandatoolbase_composite1.obj')
-
-#
-# DIRECTORY: pandatool/src/converter/
-#
-
-if (PkgSkip("PANDATOOL")==0):
-    OPTS=['DIR:pandatool/src/converter']
-    TargetAdd('converter_somethingToEggConverter.obj', opts=OPTS, input='somethingToEggConverter.cxx')
-    TargetAdd('libconverter.lib', input='converter_somethingToEggConverter.obj')
-
-#
-# DIRECTORY: pandatool/src/progbase/
-#
-
-if (PkgSkip("PANDATOOL")==0):
-    OPTS=['DIR:pandatool/src/progbase', 'ZLIB']
-    TargetAdd('progbase_composite1.obj', opts=OPTS, input='progbase_composite1.cxx')
-    TargetAdd('libprogbase.lib', input='progbase_composite1.obj')
-
-#
-# DIRECTORY: pandatool/src/eggbase/
-#
-
-if (PkgSkip("PANDATOOL")==0):
-    OPTS=['DIR:pandatool/src/eggbase']
-    TargetAdd('eggbase_composite1.obj', opts=OPTS, input='eggbase_composite1.cxx')
-    TargetAdd('libeggbase.lib', input='eggbase_composite1.obj')
-
-#
-# DIRECTORY: pandatool/src/bam/
-#
-
-if (PkgSkip("PANDATOOL")==0):
-    OPTS=['DIR:pandatool/src/bam']
-    TargetAdd('bam-info_bamInfo.obj', opts=OPTS, input='bamInfo.cxx')
-    TargetAdd('bam-info.exe', input='bam-info_bamInfo.obj')
-    TargetAdd('bam-info.exe', input='libprogbase.lib')
-    TargetAdd('bam-info.exe', input='libpandatoolbase.lib')
-    TargetAdd('bam-info.exe', input='libpandaegg.dll')
-    TargetAdd('bam-info.exe', input=COMMON_PANDA_LIBS_PYSTUB)
-    TargetAdd('bam-info.exe', opts=['ADVAPI',  'FFTW'])
-
-    TargetAdd('bam2egg_bamToEgg.obj', opts=OPTS, input='bamToEgg.cxx')
-    TargetAdd('bam2egg.exe', input='bam2egg_bamToEgg.obj')
-    TargetAdd('bam2egg.exe', input=COMMON_EGG2X_LIBS_PYSTUB)
-    TargetAdd('bam2egg.exe', opts=['ADVAPI',  'FFTW'])
-
-    TargetAdd('egg2bam_eggToBam.obj', opts=OPTS, input='eggToBam.cxx')
-    TargetAdd('egg2bam.exe', input='egg2bam_eggToBam.obj')
-    TargetAdd('egg2bam.exe', input=COMMON_EGG2X_LIBS_PYSTUB)
-    TargetAdd('egg2bam.exe', opts=['ADVAPI',  'FFTW'])
-    
-#
-# DIRECTORY: pandatool/src/cvscopy/
-#
-
-if (PkgSkip("PANDATOOL")==0):
-    OPTS=['DIR:pandatool/src/cvscopy']
-    TargetAdd('cvscopy_composite1.obj', opts=OPTS, input='cvscopy_composite1.cxx')
-    TargetAdd('libcvscopy.lib', input='cvscopy_composite1.obj')
-
-#
-# DIRECTORY: pandatool/src/daeegg/
-#
-if (PkgSkip("PANDATOOL")==0 and PkgSkip("FCOLLADA")==0):
-    OPTS=['DIR:pandatool/src/daeegg', 'FCOLLADA']
-    TargetAdd('daeegg_composite1.obj', opts=OPTS, input='daeegg_composite1.cxx')
-    TargetAdd('libdaeegg.lib', input='daeegg_composite1.obj')
-    TargetAdd('libdaeegg.lib', opts=['FCOLLADA', 'CARBON'])
-
-#
-# DIRECTORY: pandatool/src/daeprogs/
-#
-if (PkgSkip("PANDATOOL")==0 and PkgSkip("FCOLLADA")==0):
-    OPTS=['DIR:pandatool/src/daeprogs', 'FCOLLADA']
-    TargetAdd('dae2egg_daeToEgg.obj', opts=OPTS, input='daeToEgg.cxx')
-    TargetAdd('dae2egg.exe', input='dae2egg_daeToEgg.obj')
-    TargetAdd('dae2egg.exe', input='libdaeegg.lib')
-    TargetAdd('dae2egg.exe', input=COMMON_EGG2X_LIBS_PYSTUB)
-    TargetAdd('dae2egg.exe', opts=['WINUSER', 'FCOLLADA', 'CARBON'])
-
-#
-# DIRECTORY: pandatool/src/dxf/
-#
-
-if (PkgSkip("PANDATOOL")==0):
-    OPTS=['DIR:pandatool/src/dxf']
-    TargetAdd('dxf_composite1.obj', opts=OPTS, input='dxf_composite1.cxx')
-    TargetAdd('libdxf.lib', input='dxf_composite1.obj')
-
-#
-# DIRECTORY: pandatool/src/dxfegg/
-#
-
-if (PkgSkip("PANDATOOL")==0):
-    OPTS=['DIR:pandatool/src/dxfegg']
-    TargetAdd('dxfegg_dxfToEggConverter.obj', opts=OPTS, input='dxfToEggConverter.cxx')
-    TargetAdd('dxfegg_dxfToEggLayer.obj', opts=OPTS, input='dxfToEggLayer.cxx')
-    TargetAdd('libdxfegg.lib', input='dxfegg_dxfToEggConverter.obj')
-    TargetAdd('libdxfegg.lib', input='dxfegg_dxfToEggLayer.obj')
-
-#
-# DIRECTORY: pandatool/src/dxfprogs/
-#
-
-if (PkgSkip("PANDATOOL")==0):
-    OPTS=['DIR:pandatool/src/dxfprogs']
-    TargetAdd('dxf-points_dxfPoints.obj', opts=OPTS, input='dxfPoints.cxx')
-    TargetAdd('dxf-points.exe', input='dxf-points_dxfPoints.obj')
-    TargetAdd('dxf-points.exe', input='libprogbase.lib')
-    TargetAdd('dxf-points.exe', input='libdxf.lib')
-    TargetAdd('dxf-points.exe', input='libpandatoolbase.lib')
-    TargetAdd('dxf-points.exe', input=COMMON_PANDA_LIBS_PYSTUB)
-    TargetAdd('dxf-points.exe', opts=['ADVAPI',  'FFTW'])
-
-    TargetAdd('dxf2egg_dxfToEgg.obj', opts=OPTS, input='dxfToEgg.cxx')
-    TargetAdd('dxf2egg.exe', input='dxf2egg_dxfToEgg.obj')
-    TargetAdd('dxf2egg.exe', input='libdxfegg.lib')
-    TargetAdd('dxf2egg.exe', input='libdxf.lib')
-    TargetAdd('dxf2egg.exe', input=COMMON_EGG2X_LIBS_PYSTUB)
-    TargetAdd('dxf2egg.exe', opts=['ADVAPI',  'FFTW'])
-
-    TargetAdd('egg2dxf_eggToDXF.obj', opts=OPTS, input='eggToDXF.cxx')
-    TargetAdd('egg2dxf_eggToDXFLayer.obj', opts=OPTS, input='eggToDXFLayer.cxx')
-    TargetAdd('egg2dxf.exe', input='egg2dxf_eggToDXF.obj')
-    TargetAdd('egg2dxf.exe', input='egg2dxf_eggToDXFLayer.obj')
-    TargetAdd('egg2dxf.exe', input='libdxf.lib')
-    TargetAdd('egg2dxf.exe', input=COMMON_EGG2X_LIBS_PYSTUB)
-    TargetAdd('egg2dxf.exe', opts=['ADVAPI',  'FFTW'])
-
-#
-# DIRECTORY: pandatool/src/palettizer/
-#
-
-if (PkgSkip("PANDATOOL")==0):
-    OPTS=['DIR:pandatool/src/palettizer']
-    TargetAdd('palettizer_composite1.obj', opts=OPTS, input='palettizer_composite1.cxx')
-    TargetAdd('libpalettizer.lib', input='palettizer_composite1.obj')
-
-#
-# DIRECTORY: pandatool/src/egg-mkfont/
-#
-
-if (PkgSkip("FREETYPE")==0) and (PkgSkip("PANDATOOL")==0):
-    OPTS=['DIR:pandatool/src/egg-mkfont', 'DIR:pandatool/src/palettizer', 'FREETYPE']
-    TargetAdd('egg-mkfont_eggMakeFont.obj', opts=OPTS, input='eggMakeFont.cxx')
-    TargetAdd('egg-mkfont_rangeDescription.obj', opts=OPTS, input='rangeDescription.cxx')
-    TargetAdd('egg-mkfont_rangeIterator.obj', opts=OPTS, input='rangeIterator.cxx')
-    TargetAdd('egg-mkfont.exe', input='egg-mkfont_eggMakeFont.obj')
-    TargetAdd('egg-mkfont.exe', input='egg-mkfont_rangeDescription.obj')
-    TargetAdd('egg-mkfont.exe', input='egg-mkfont_rangeIterator.obj')
-    TargetAdd('egg-mkfont.exe', input='libpalettizer.lib')
-    TargetAdd('egg-mkfont.exe', input=COMMON_EGG2X_LIBS_PYSTUB)
-    TargetAdd('egg-mkfont.exe', opts=['ADVAPI', 'FREETYPE'])
-
-#
-# DIRECTORY: pandatool/src/eggcharbase/
-#
-
-if (PkgSkip("PANDATOOL")==0):
-    OPTS=['DIR:pandatool/src/eggcharbase', 'ZLIB']
-    TargetAdd('eggcharbase_composite1.obj', opts=OPTS, input='eggcharbase_composite1.cxx')
-    TargetAdd('libeggcharbase.lib', input='eggcharbase_composite1.obj')
-
-#
-# DIRECTORY: pandatool/src/egg-optchar/
-#
-
-if (PkgSkip("PANDATOOL")==0):
-    OPTS=['DIR:pandatool/src/egg-optchar']
-    TargetAdd('egg-optchar_config_egg_optchar.obj', opts=OPTS, input='config_egg_optchar.cxx')
-    TargetAdd('egg-optchar_eggOptchar.obj', opts=OPTS, input='eggOptchar.cxx')
-    TargetAdd('egg-optchar_eggOptcharUserData.obj', opts=OPTS, input='eggOptcharUserData.cxx')
-    TargetAdd('egg-optchar_vertexMembership.obj', opts=OPTS, input='vertexMembership.cxx')
-    TargetAdd('egg-optchar.exe', input='egg-optchar_config_egg_optchar.obj')
-    TargetAdd('egg-optchar.exe', input='egg-optchar_eggOptchar.obj')
-    TargetAdd('egg-optchar.exe', input='egg-optchar_eggOptcharUserData.obj')
-    TargetAdd('egg-optchar.exe', input='egg-optchar_vertexMembership.obj')
-    TargetAdd('egg-optchar.exe', input='libeggcharbase.lib')
-    TargetAdd('egg-optchar.exe', input=COMMON_EGG2X_LIBS_PYSTUB)
-    TargetAdd('egg-optchar.exe', opts=['ADVAPI', 'FREETYPE'])
-
-#
-# DIRECTORY: pandatool/src/egg-palettize/
-#
-
-if (PkgSkip("PANDATOOL")==0):
-    OPTS=['DIR:pandatool/src/egg-palettize', 'DIR:pandatool/src/palettizer']
-    TargetAdd('egg-palettize_eggPalettize.obj', opts=OPTS, input='eggPalettize.cxx')
-    TargetAdd('egg-palettize.exe', input='egg-palettize_eggPalettize.obj')
-    TargetAdd('egg-palettize.exe', input='libpalettizer.lib')
-    TargetAdd('egg-palettize.exe', input=COMMON_EGG2X_LIBS_PYSTUB)
-    TargetAdd('egg-palettize.exe', opts=['ADVAPI'])
-
-#
-# DIRECTORY: pandatool/src/egg-qtess/
-#
-
-if (PkgSkip("PANDATOOL")==0):
-    OPTS=['DIR:pandatool/src/egg-qtess']
-    TargetAdd('egg-qtess_composite1.obj', opts=OPTS, input='egg-qtess_composite1.cxx')
-    TargetAdd('egg-qtess.exe', input='egg-qtess_composite1.obj')
-    TargetAdd('egg-qtess.exe', input='libeggbase.lib')
-    TargetAdd('egg-qtess.exe', input='libprogbase.lib')
-    TargetAdd('egg-qtess.exe', input='libconverter.lib')
-    TargetAdd('egg-qtess.exe', input=COMMON_EGG2X_LIBS_PYSTUB)
-    TargetAdd('egg-qtess.exe', opts=['ADVAPI'])
-    
-#
-# DIRECTORY: pandatool/src/eggprogs/
-#
-
-if (PkgSkip("PANDATOOL")==0):
-    OPTS=['DIR:pandatool/src/eggprogs']
-    TargetAdd('egg-crop_eggCrop.obj', opts=OPTS, input='eggCrop.cxx')
-    TargetAdd('egg-crop.exe', input='egg-crop_eggCrop.obj')
-    TargetAdd('egg-crop.exe', input=COMMON_EGG2X_LIBS_PYSTUB)
-    TargetAdd('egg-crop.exe', opts=['ADVAPI'])
-
-    TargetAdd('egg-make-tube_eggMakeTube.obj', opts=OPTS, input='eggMakeTube.cxx')
-    TargetAdd('egg-make-tube.exe', input='egg-make-tube_eggMakeTube.obj')
-    TargetAdd('egg-make-tube.exe', input=COMMON_EGG2X_LIBS_PYSTUB)
-    TargetAdd('egg-make-tube.exe', opts=['ADVAPI'])
-
-    TargetAdd('egg-texture-cards_eggTextureCards.obj', opts=OPTS, input='eggTextureCards.cxx')
-    TargetAdd('egg-texture-cards.exe', input='egg-texture-cards_eggTextureCards.obj')
-    TargetAdd('egg-texture-cards.exe', input=COMMON_EGG2X_LIBS_PYSTUB)
-    TargetAdd('egg-texture-cards.exe', opts=['ADVAPI'])
-
-    TargetAdd('egg-topstrip_eggTopstrip.obj', opts=OPTS, input='eggTopstrip.cxx')
-    TargetAdd('egg-topstrip.exe', input='egg-topstrip_eggTopstrip.obj')
-    TargetAdd('egg-topstrip.exe', input='libeggcharbase.lib')
-    TargetAdd('egg-topstrip.exe', input=COMMON_EGG2X_LIBS_PYSTUB)
-    TargetAdd('egg-topstrip.exe', opts=['ADVAPI'])
-
-    TargetAdd('egg-trans_eggTrans.obj', opts=OPTS, input='eggTrans.cxx')
-    TargetAdd('egg-trans.exe', input='egg-trans_eggTrans.obj')
-    TargetAdd('egg-trans.exe', input=COMMON_EGG2X_LIBS_PYSTUB)
-    TargetAdd('egg-trans.exe', opts=['ADVAPI'])
-
-    TargetAdd('egg2c_eggToC.obj', opts=OPTS, input='eggToC.cxx')
-    TargetAdd('egg2c.exe', input='egg2c_eggToC.obj')
-    TargetAdd('egg2c.exe', input=COMMON_EGG2X_LIBS_PYSTUB)
-    TargetAdd('egg2c.exe', opts=['ADVAPI'])
-
-    TargetAdd('egg-rename_eggRename.obj', opts=OPTS, input='eggRename.cxx')
-    TargetAdd('egg-rename.exe', input='egg-rename_eggRename.obj')
-    TargetAdd('egg-rename.exe', input=COMMON_EGG2X_LIBS_PYSTUB)
-    TargetAdd('egg-rename.exe', opts=['ADVAPI'])
-
-    TargetAdd('egg-retarget-anim_eggRetargetAnim.obj', opts=OPTS, input='eggRetargetAnim.cxx')
-    TargetAdd('egg-retarget-anim.exe', input='egg-retarget-anim_eggRetargetAnim.obj')
-    TargetAdd('egg-retarget-anim.exe', input='libeggcharbase.lib')
-    TargetAdd('egg-retarget-anim.exe', input=COMMON_EGG2X_LIBS_PYSTUB)
-    TargetAdd('egg-retarget-anim.exe', opts=['ADVAPI'])
-
-#
-# DIRECTORY: pandatool/src/flt/
-#
-
-if (PkgSkip("PANDATOOL")==0):
-    OPTS=['DIR:pandatool/src/flt', 'ZLIB']
-    TargetAdd('flt_fltVectorRecord.obj', opts=OPTS, input='fltVectorRecord.cxx')
-    TargetAdd('flt_composite1.obj', opts=OPTS, input='flt_composite1.cxx')
-    TargetAdd('libflt.lib', input=['flt_fltVectorRecord.obj', 'flt_composite1.obj'])
-
-#
-# DIRECTORY: pandatool/src/fltegg/
-#
-
-if (PkgSkip("PANDATOOL")==0):
-    OPTS=['DIR:pandatool/src/fltegg']
-    TargetAdd('fltegg_fltToEggConverter.obj', opts=OPTS, input='fltToEggConverter.cxx')
-    TargetAdd('fltegg_fltToEggLevelState.obj', opts=OPTS, input='fltToEggLevelState.cxx')
-    TargetAdd('libfltegg.lib', input=['fltegg_fltToEggConverter.obj', 'fltegg_fltToEggLevelState.obj'])
-
-#
-# DIRECTORY: pandatool/src/fltprogs/
-#
-
-if (PkgSkip("PANDATOOL")==0):
-    OPTS=['DIR:pandatool/src/fltprogs', 'DIR:pandatool/src/flt', 'DIR:pandatool/src/cvscopy']
-    TargetAdd('egg2flt_eggToFlt.obj', opts=OPTS, input='eggToFlt.cxx')
-    TargetAdd('egg2flt.exe', input='egg2flt_eggToFlt.obj')
-    TargetAdd('egg2flt.exe', input='libflt.lib')
-    TargetAdd('egg2flt.exe', input=COMMON_EGG2X_LIBS_PYSTUB)
-    TargetAdd('egg2flt.exe', opts=['ADVAPI'])
-
-    TargetAdd('flt-info_fltInfo.obj', opts=OPTS, input='fltInfo.cxx')
-    TargetAdd('flt-info.exe', input='flt-info_fltInfo.obj')
-    TargetAdd('flt-info.exe', input='libflt.lib')
-    TargetAdd('flt-info.exe', input=COMMON_EGG2X_LIBS_PYSTUB)
-    TargetAdd('flt-info.exe', opts=['ADVAPI'])
-
-    TargetAdd('flt-trans_fltTrans.obj', opts=OPTS, input='fltTrans.cxx')
-    TargetAdd('flt-trans.exe', input='flt-trans_fltTrans.obj')
-    TargetAdd('flt-trans.exe', input='libflt.lib')
-    TargetAdd('flt-trans.exe', input=COMMON_EGG2X_LIBS_PYSTUB)
-    TargetAdd('flt-trans.exe', opts=['ADVAPI'])
-
-    TargetAdd('flt2egg_fltToEgg.obj', opts=OPTS, input='fltToEgg.cxx')
-    TargetAdd('flt2egg.exe', input='flt2egg_fltToEgg.obj')
-    TargetAdd('flt2egg.exe', input='libflt.lib')
-    TargetAdd('flt2egg.exe', input='libfltegg.lib')
-    TargetAdd('flt2egg.exe', input=COMMON_EGG2X_LIBS_PYSTUB)
-    TargetAdd('flt2egg.exe', opts=['ADVAPI'])
-
-    TargetAdd('fltcopy_fltCopy.obj', opts=OPTS, input='fltCopy.cxx')
-    TargetAdd('fltcopy.exe', input='fltcopy_fltCopy.obj')
-    TargetAdd('fltcopy.exe', input='libcvscopy.lib')
-    TargetAdd('fltcopy.exe', input='libflt.lib')
-    TargetAdd('fltcopy.exe', input=COMMON_EGG2X_LIBS_PYSTUB)
-    TargetAdd('fltcopy.exe', opts=['ADVAPI'])
-
-
-#
-# DIRECTORY: pandatool/src/imagebase/
-#
-
-if (PkgSkip("PANDATOOL")==0):
-    OPTS=['DIR:pandatool/src/imagebase']
-    TargetAdd('imagebase_composite1.obj', opts=OPTS, input='imagebase_composite1.cxx')
-    TargetAdd('libimagebase.lib', input='imagebase_composite1.obj')
-
-#
-# DIRECTORY: pandatool/src/imageprogs/
-#
-
-if (PkgSkip("PANDATOOL")==0):
-    OPTS=['DIR:pandatool/src/imageprogs']
-    TargetAdd('image-info_imageInfo.obj', opts=OPTS, input='imageInfo.cxx')
-    TargetAdd('image-info.exe', input='image-info_imageInfo.obj')
-    TargetAdd('image-info.exe', input='libimagebase.lib')
-    TargetAdd('image-info.exe', input='libprogbase.lib')
-    TargetAdd('image-info.exe', input='libpandatoolbase.lib')
-    TargetAdd('image-info.exe', input='libpandaegg.dll')
-    TargetAdd('image-info.exe', input=COMMON_PANDA_LIBS)
-    TargetAdd('image-info.exe', input='libp3pystub.dll')
-    TargetAdd('image-info.exe', opts=['ADVAPI'])
-    
-    TargetAdd('image-resize_imageResize.obj', opts=OPTS, input='imageResize.cxx')
-    TargetAdd('image-resize.exe', input='image-resize_imageResize.obj')
-    TargetAdd('image-resize.exe', input='libimagebase.lib')
-    TargetAdd('image-resize.exe', input='libprogbase.lib')
-    TargetAdd('image-resize.exe', input='libpandatoolbase.lib')
-    TargetAdd('image-resize.exe', input='libpandaegg.dll')
-    TargetAdd('image-resize.exe', input=COMMON_PANDA_LIBS)
-    TargetAdd('image-resize.exe', input='libp3pystub.dll')
-    TargetAdd('image-resize.exe', opts=['ADVAPI'])
-    
-    TargetAdd('image-trans_imageTrans.obj', opts=OPTS, input='imageTrans.cxx')
-    TargetAdd('image-trans.exe', input='image-trans_imageTrans.obj')
-    TargetAdd('image-trans.exe', input='libimagebase.lib')
-    TargetAdd('image-trans.exe', input='libprogbase.lib')
-    TargetAdd('image-trans.exe', input='libpandatoolbase.lib')
-    TargetAdd('image-trans.exe', input='libpandaegg.dll')
-    TargetAdd('image-trans.exe', input=COMMON_PANDA_LIBS)
-    TargetAdd('image-trans.exe', input='libp3pystub.dll')
-    TargetAdd('image-trans.exe', opts=['ADVAPI'])
-
-
-#
-# DIRECTORY: pandatool/src/lwo/
-#
-
-if (PkgSkip("PANDATOOL")==0):
-    OPTS=['DIR:pandatool/src/lwo']
-    TargetAdd('lwo_composite1.obj', opts=OPTS, input='lwo_composite1.cxx')
-    TargetAdd('liblwo.lib', input='lwo_composite1.obj')
-
-#
-# DIRECTORY: pandatool/src/lwoegg/
-#
-
-if (PkgSkip("PANDATOOL")==0):
-    OPTS=['DIR:pandatool/src/lwoegg']
-    TargetAdd('lwoegg_composite1.obj', opts=OPTS, input='lwoegg_composite1.cxx')
-    TargetAdd('liblwoegg.lib', input='lwoegg_composite1.obj')
-
-#
-# DIRECTORY: pandatool/src/lwoprogs/
-#
-
-if (PkgSkip("PANDATOOL")==0):
-    OPTS=['DIR:pandatool/src/lwoprogs', 'DIR:pandatool/src/lwo']
-    TargetAdd('lwo-scan_lwoScan.obj', opts=OPTS, input='lwoScan.cxx')
-    TargetAdd('lwo-scan.exe', input='lwo-scan_lwoScan.obj')
-    TargetAdd('lwo-scan.exe', input='liblwo.lib')
-    TargetAdd('lwo-scan.exe', input='libprogbase.lib')
-    TargetAdd('lwo-scan.exe', input='libpandatoolbase.lib')
-    TargetAdd('lwo-scan.exe', input='libpandaegg.dll')
-    TargetAdd('lwo-scan.exe', input=COMMON_PANDA_LIBS)
-    TargetAdd('lwo-scan.exe', input='libp3pystub.dll')
-    TargetAdd('lwo-scan.exe', opts=['ADVAPI'])
-    
-    TargetAdd('lwo2egg_lwoToEgg.obj', opts=OPTS, input='lwoToEgg.cxx')
-    TargetAdd('lwo2egg.exe', input='lwo2egg_lwoToEgg.obj')
-    TargetAdd('lwo2egg.exe', input='liblwo.lib')
-    TargetAdd('lwo2egg.exe', input='liblwoegg.lib')
-    TargetAdd('lwo2egg.exe', input=COMMON_EGG2X_LIBS_PYSTUB)
-    TargetAdd('lwo2egg.exe', opts=['ADVAPI'])
-
-#
-# DIRECTORY: pandatool/src/maya/
-#
-
-for VER in MAYAVERSIONS:
-  VNUM=VER[4:]
-  if (PkgSkip(VER)==0) and (PkgSkip("PANDATOOL")==0):
-    OPTS=['DIR:pandatool/src/maya', VER]
-    TargetAdd('maya'+VNUM+'_composite1.obj', opts=OPTS, input='maya_composite1.cxx')
-    TargetAdd('libmaya'+VNUM+'.lib', input='maya'+VNUM+'_composite1.obj')
-
-#
-# DIRECTORY: pandatool/src/mayaegg/
-#
-
-for VER in MAYAVERSIONS:
-  VNUM=VER[4:]
-  if (PkgSkip(VER)==0) and (PkgSkip("PANDATOOL")==0):
-    OPTS=['DIR:pandatool/src/mayaegg', 'DIR:pandatool/src/maya', VER]
-    TargetAdd('mayaegg'+VNUM+'_loader.obj', opts=OPTS, input='mayaEggLoader.cxx')
-    TargetAdd('mayaegg'+VNUM+'_composite1.obj', opts=OPTS, input='mayaegg_composite1.cxx')
-    TargetAdd('libmayaegg'+VNUM+'.lib', input='mayaegg'+VNUM+'_composite1.obj')
-
-#
-# DIRECTORY: pandatool/src/maxegg/
-#
-
-for VER in MAXVERSIONS:
-  VNUM=VER[3:]
-  if (PkgSkip(VER)==0) and (PkgSkip("PANDATOOL")==0):
-    OPTS=['DIR:pandatool/src/maxegg', VER,  "WINCOMCTL", "WINCOMDLG", "WINUSER", "MSFORSCOPE"]
-    CopyFile(GetOutputDir()+"/tmp/maxEgg.obj", "pandatool/src/maxegg/maxEgg.obj")
-    TargetAdd('maxegg'+VNUM+'_loader.obj', opts=OPTS, input='maxEggLoader.cxx')
-    TargetAdd('maxegg'+VNUM+'_composite1.obj', opts=OPTS, input='maxegg_composite1.cxx')
-    TargetAdd('maxegg'+VNUM+'.dlo', input='maxegg'+VNUM+'_composite1.obj')
-    TargetAdd('maxegg'+VNUM+'.dlo', input='maxEgg.obj')
-    TargetAdd('maxegg'+VNUM+'.dlo', input='maxEgg.def', ipath=OPTS)
-    TargetAdd('maxegg'+VNUM+'.dlo', input=COMMON_EGG2X_LIBS_PYSTUB)
-    TargetAdd('maxegg'+VNUM+'.dlo', opts=OPTS)
-
-#
-# DIRECTORY: pandatool/src/maxprogs/
-#
-
-for VER in MAXVERSIONS:
-  VNUM=VER[3:]
-  if (PkgSkip(VER)==0) and (PkgSkip("PANDATOOL")==0):
-    OPTS=['DIR:pandatool/src/maxprogs', VER,  "WINCOMCTL", "WINCOMDLG", "WINUSER", "MSFORSCOPE"]
-    CopyFile(GetOutputDir()+"/tmp/maxImportRes.obj", "pandatool/src/maxprogs/maxImportRes.obj")
-    TargetAdd('maxprogs'+VNUM+'_maxeggimport.obj', opts=OPTS, input='maxEggImport.cxx')
-    TargetAdd('maxeggimport'+VNUM+'.dle', input='maxegg'+VNUM+'_loader.obj')
-    TargetAdd('maxeggimport'+VNUM+'.dle', input='maxprogs'+VNUM+'_maxeggimport.obj')
-    TargetAdd('maxeggimport'+VNUM+'.dle', input='maxImportRes.obj')
-    TargetAdd('maxeggimport'+VNUM+'.dle', input='libpandaeggstripped.dll')
-    TargetAdd('maxeggimport'+VNUM+'.dle', input='libpandastripped.dll')
-    TargetAdd('maxeggimport'+VNUM+'.dle', input='libpandaexpress.dll')
-    TargetAdd('maxeggimport'+VNUM+'.dle', input='maxEggImport.def', ipath=OPTS)
-    TargetAdd('maxeggimport'+VNUM+'.dle', input=COMMON_DTOOL_LIBS)
-    TargetAdd('maxeggimport'+VNUM+'.dle', opts=OPTS)
-
-#
-# DIRECTORY: pandatool/src/vrml/
-#
-
-if (PkgSkip("PANDATOOL")==0):
-    OPTS=['DIR:pandatool/src/vrml', 'ZLIB', 'BISONPREFIX_vrmlyy']
-    CreateFile(GetOutputDir()+"/include/vrmlParser.h")
-    TargetAdd('pvrml_vrmlParser.obj', opts=OPTS, input='vrmlParser.yxx')
-    TargetAdd('vrmlParser.h', input='pvrml_vrmlParser.obj', opts=['DEPENDENCYONLY'])
-    TargetAdd('pvrml_vrmlLexer.obj', opts=OPTS, input='vrmlLexer.lxx')
-    TargetAdd('pvrml_parse_vrml.obj', opts=OPTS, input='parse_vrml.cxx')
-    TargetAdd('pvrml_standard_nodes.obj', opts=OPTS, input='standard_nodes.cxx')
-    TargetAdd('pvrml_vrmlNode.obj', opts=OPTS, input='vrmlNode.cxx')
-    TargetAdd('pvrml_vrmlNodeType.obj', opts=OPTS, input='vrmlNodeType.cxx')
-    TargetAdd('libpvrml.lib', input='pvrml_parse_vrml.obj')
-    TargetAdd('libpvrml.lib', input='pvrml_standard_nodes.obj')
-    TargetAdd('libpvrml.lib', input='pvrml_vrmlNode.obj')
-    TargetAdd('libpvrml.lib', input='pvrml_vrmlNodeType.obj')
-    TargetAdd('libpvrml.lib', input='pvrml_vrmlParser.obj')
-    TargetAdd('libpvrml.lib', input='pvrml_vrmlLexer.obj')
-
-#
-# DIRECTORY: pandatool/src/vrmlegg/
-#
-
-if (PkgSkip("PANDATOOL")==0):
-    OPTS=['DIR:pandatool/src/vrmlegg', 'DIR:pandatool/src/vrml']
-    TargetAdd('vrmlegg_indexedFaceSet.obj', opts=OPTS, input='indexedFaceSet.cxx')
-    TargetAdd('vrmlegg_vrmlAppearance.obj', opts=OPTS, input='vrmlAppearance.cxx')
-    TargetAdd('vrmlegg_vrmlToEggConverter.obj', opts=OPTS, input='vrmlToEggConverter.cxx')
-    TargetAdd('libvrmlegg.lib', input='vrmlegg_indexedFaceSet.obj')
-    TargetAdd('libvrmlegg.lib', input='vrmlegg_vrmlAppearance.obj')
-    TargetAdd('libvrmlegg.lib', input='vrmlegg_vrmlToEggConverter.obj')
-
-#
-# DIRECTORY: pandatool/src/xfile/
-#
-
-if (PkgSkip("PANDATOOL")==0):
-    OPTS=['DIR:pandatool/src/xfile', 'ZLIB', 'BISONPREFIX_xyy', 'FLEXDASHI']
-    CreateFile(GetOutputDir()+"/include/xParser.h")
-    TargetAdd('xfile_xParser.obj', opts=OPTS, input='xParser.yxx')
-    TargetAdd('xParser.h', input='xfile_xParser.obj', opts=['DEPENDENCYONLY'])
-    TargetAdd('xfile_xLexer.obj', opts=OPTS, input='xLexer.lxx')
-    TargetAdd('xfile_composite1.obj', opts=OPTS, input='xfile_composite1.cxx')
-    TargetAdd('libxfile.lib', input='xfile_composite1.obj')
-    TargetAdd('libxfile.lib', input='xfile_xParser.obj')
-    TargetAdd('libxfile.lib', input='xfile_xLexer.obj')
-
-#
-# DIRECTORY: pandatool/src/xfileegg/
-#
-
-if (PkgSkip("PANDATOOL")==0):
-    OPTS=['DIR:pandatool/src/xfileegg', 'DIR:pandatool/src/xfile']
-    TargetAdd('xfileegg_composite1.obj', opts=OPTS, input='xfileegg_composite1.cxx')
-    TargetAdd('libxfileegg.lib', input='xfileegg_composite1.obj')
-
-#
-# DIRECTORY: pandatool/src/ptloader/
-#
-
-if (PkgSkip("PANDATOOL")==0):
-    OPTS=['DIR:pandatool/src/ptloader', 'DIR:pandatool/src/flt', 'DIR:pandatool/src/lwo', 'DIR:pandatool/src/xfile', 'DIR:pandatool/src/xfileegg', 'DIR:pandatool/src/daeegg', 'BUILDING:PTLOADER', 'FCOLLADA']
-    TargetAdd('ptloader_config_ptloader.obj', opts=OPTS, input='config_ptloader.cxx')
-    TargetAdd('ptloader_loaderFileTypePandatool.obj', opts=OPTS, input='loaderFileTypePandatool.cxx')
-    TargetAdd('libp3ptloader.dll', input='ptloader_config_ptloader.obj')
-    TargetAdd('libp3ptloader.dll', input='ptloader_loaderFileTypePandatool.obj')
-    TargetAdd('libp3ptloader.dll', input='libfltegg.lib')
-    TargetAdd('libp3ptloader.dll', input='libflt.lib')
-    TargetAdd('libp3ptloader.dll', input='liblwoegg.lib')
-    TargetAdd('libp3ptloader.dll', input='liblwo.lib')
-    TargetAdd('libp3ptloader.dll', input='libdxfegg.lib')
-    TargetAdd('libp3ptloader.dll', input='libdxf.lib')
-    TargetAdd('libp3ptloader.dll', input='libvrmlegg.lib')
-    TargetAdd('libp3ptloader.dll', input='libpvrml.lib')
-    TargetAdd('libp3ptloader.dll', input='libxfileegg.lib')
-    TargetAdd('libp3ptloader.dll', input='libxfile.lib')
-    TargetAdd('libp3ptloader.dll', input='libdaeegg.lib')
-    TargetAdd('libp3ptloader.dll', input='libeggbase.lib')
-    TargetAdd('libp3ptloader.dll', input='libprogbase.lib')
-    TargetAdd('libp3ptloader.dll', input='libconverter.lib')
-    TargetAdd('libp3ptloader.dll', input='libpandatoolbase.lib')
-    TargetAdd('libp3ptloader.dll', input='libpandaegg.dll')
-    TargetAdd('libp3ptloader.dll', input=COMMON_PANDA_LIBS)
-    TargetAdd('libp3ptloader.dll', opts=['ADVAPI', 'FCOLLADA', 'WINUSER'])
-
-#
-# DIRECTORY: pandatool/src/mayaprogs/
-#
-
-for VER in MAYAVERSIONS:
-  VNUM=VER[4:]
-  if (PkgSkip(VER)==0) and (PkgSkip("PANDATOOL")==0):
-    OPTS=['DIR:pandatool/src/mayaprogs', 'DIR:pandatool/src/maya', 'DIR:pandatool/src/mayaegg', 'DIR:pandatool/src/cvscopy', 'BUILDING:MISC', VER]
-    TargetAdd('mayaeggimport'+VNUM+'_mayaeggimport.obj', opts=OPTS, input='mayaEggImport.cxx')
-    TargetAdd('mayaeggimport'+VNUM+'.mll', input='mayaegg'+VNUM+'_loader.obj')
-    TargetAdd('mayaeggimport'+VNUM+'.mll', input='mayaeggimport'+VNUM+'_mayaeggimport.obj')
-    TargetAdd('mayaeggimport'+VNUM+'.mll', input='libpandaegg.dll')
-    TargetAdd('mayaeggimport'+VNUM+'.mll', input=COMMON_PANDA_LIBS)
-    if sys.platform == "win32":
-      TargetAdd('mayaeggimport'+VNUM+'.mll', input='libp3pystub.dll')
-    TargetAdd('mayaeggimport'+VNUM+'.mll', opts=['ADVAPI', VER])
-
-    TargetAdd('mayaloader'+VNUM+'_config_mayaloader.obj', opts=OPTS, input='config_mayaloader.cxx')
-    TargetAdd('libp3mayaloader'+VNUM+'.dll', input='mayaloader'+VNUM+'_config_mayaloader.obj')
-    TargetAdd('libp3mayaloader'+VNUM+'.dll', input='libmayaegg'+VNUM+'.lib')
-    TargetAdd('libp3mayaloader'+VNUM+'.dll', input='libp3ptloader.dll')
-    TargetAdd('libp3mayaloader'+VNUM+'.dll', input='libmaya'+VNUM+'.lib')
-    TargetAdd('libp3mayaloader'+VNUM+'.dll', input='libfltegg.lib')
-    TargetAdd('libp3mayaloader'+VNUM+'.dll', input='libflt.lib')
-    TargetAdd('libp3mayaloader'+VNUM+'.dll', input='liblwoegg.lib')
-    TargetAdd('libp3mayaloader'+VNUM+'.dll', input='liblwo.lib')
-    TargetAdd('libp3mayaloader'+VNUM+'.dll', input='libdxfegg.lib')
-    TargetAdd('libp3mayaloader'+VNUM+'.dll', input='libdxf.lib')
-    TargetAdd('libp3mayaloader'+VNUM+'.dll', input='libvrmlegg.lib')
-    TargetAdd('libp3mayaloader'+VNUM+'.dll', input='libpvrml.lib')
-    TargetAdd('libp3mayaloader'+VNUM+'.dll', input='libxfileegg.lib')
-    TargetAdd('libp3mayaloader'+VNUM+'.dll', input='libxfile.lib')
-    TargetAdd('libp3mayaloader'+VNUM+'.dll', input='libeggbase.lib')
-    TargetAdd('libp3mayaloader'+VNUM+'.dll', input='libprogbase.lib')
-    TargetAdd('libp3mayaloader'+VNUM+'.dll', input='libconverter.lib')
-    TargetAdd('libp3mayaloader'+VNUM+'.dll', input='libpandatoolbase.lib')
-    TargetAdd('libp3mayaloader'+VNUM+'.dll', input='libpandaegg.dll')
-    TargetAdd('libp3mayaloader'+VNUM+'.dll', input=COMMON_PANDA_LIBS)
-    TargetAdd('libp3mayaloader'+VNUM+'.dll', opts=['ADVAPI', VER])
-
-    TargetAdd('mayapview'+VNUM+'_mayaPview.obj', opts=OPTS, input='mayaPview.cxx')
-    TargetAdd('libmayapview'+VNUM+'.mll', input='mayapview'+VNUM+'_mayaPview.obj')
-    TargetAdd('libmayapview'+VNUM+'.mll', input='libmayaegg'+VNUM+'.lib')
-    TargetAdd('libmayapview'+VNUM+'.mll', input='libmaya'+VNUM+'.lib')
-    TargetAdd('libmayapview'+VNUM+'.mll', input='libp3framework.dll')
-    if sys.platform == "win32":
-      TargetAdd('libmayapview'+VNUM+'.mll', input=COMMON_EGG2X_LIBS_PYSTUB)
-    else:
-      TargetAdd('libmayapview'+VNUM+'.mll', input=COMMON_EGG2X_LIBS)
-    TargetAdd('libmayapview'+VNUM+'.mll', opts=['ADVAPI', VER])
-    
-    TargetAdd('maya2egg'+VNUM+'_mayaToEgg.obj', opts=OPTS, input='mayaToEgg.cxx')
-    TargetAdd('maya2egg'+VNUM+'-wrapped.exe', input='maya2egg'+VNUM+'_mayaToEgg.obj')
-    TargetAdd('maya2egg'+VNUM+'-wrapped.exe', input='libmayaegg'+VNUM+'.lib')
-    TargetAdd('maya2egg'+VNUM+'-wrapped.exe', input='libmaya'+VNUM+'.lib')
-    if sys.platform == "win32":
-      TargetAdd('maya2egg'+VNUM+'-wrapped.exe', input=COMMON_EGG2X_LIBS_PYSTUB)
-    else:
-      TargetAdd('maya2egg'+VNUM+'-wrapped.exe', input=COMMON_EGG2X_LIBS)
-    TargetAdd('maya2egg'+VNUM+'-wrapped.exe', opts=['ADVAPI', VER])
-    
-    TargetAdd('mayacopy'+VNUM+'_mayaCopy.obj', opts=OPTS, input='mayaCopy.cxx')
-    TargetAdd('mayacopy'+VNUM+'-wrapped.exe', input='mayacopy'+VNUM+'_mayaCopy.obj')
-    TargetAdd('mayacopy'+VNUM+'-wrapped.exe', input='libcvscopy.lib')
-    TargetAdd('mayacopy'+VNUM+'-wrapped.exe', input='libmaya'+VNUM+'.lib')
-    if sys.platform == "win32":
-      TargetAdd('mayacopy'+VNUM+'-wrapped.exe', input=COMMON_EGG2X_LIBS_PYSTUB)
-    else:
-      TargetAdd('mayacopy'+VNUM+'-wrapped.exe', input=COMMON_EGG2X_LIBS)
-    TargetAdd('mayacopy'+VNUM+'-wrapped.exe', opts=['ADVAPI', VER])
-    
-    TargetAdd('mayasavepview'+VNUM+'_mayaSavePview.obj', opts=OPTS, input='mayaSavePview.cxx')
-    TargetAdd('libmayasavepview'+VNUM+'.mll', input='mayasavepview'+VNUM+'_mayaSavePview.obj')
-    TargetAdd('libmayasavepview'+VNUM+'.mll', opts=['ADVAPI',  VER])
-    
-    TargetAdd('mayaWrapper'+VNUM+'.obj', opts=OPTS, input='mayaWrapper.cxx')
-    
-    TargetAdd('maya2egg'+VNUM+'.exe', input='mayaWrapper'+VNUM+'.obj')
-    TargetAdd('maya2egg'+VNUM+'.exe', opts=['ADVAPI'])
-    
-    TargetAdd('mayacopy'+VNUM+'.exe', input='mayaWrapper'+VNUM+'.obj')
-    TargetAdd('mayacopy'+VNUM+'.exe', opts=['ADVAPI'])
-
-
-#
-# DIRECTORY: pandatool/src/miscprogs/
-#
-
-if (PkgSkip("PANDATOOL")==0):
-    OPTS=['DIR:pandatool/src/miscprogs']
-    TargetAdd('bin2c_binToC.obj', opts=OPTS, input='binToC.cxx')
-    TargetAdd('bin2c.exe', input='bin2c_binToC.obj')
-    TargetAdd('bin2c.exe', input='libprogbase.lib')
-    TargetAdd('bin2c.exe', input='libpandatoolbase.lib')
-    TargetAdd('bin2c.exe', input=COMMON_PANDA_LIBS)
-    TargetAdd('bin2c.exe', input='libp3pystub.dll')
-    TargetAdd('bin2c.exe', opts=['ADVAPI'])
-
-#
-# DIRECTORY: pandatool/src/pstatserver/
-#
-
-if (PkgSkip("PANDATOOL")==0):
-    OPTS=['DIR:pandatool/src/pstatserver']
-    TargetAdd('pstatserver_composite1.obj', opts=OPTS, input='pstatserver_composite1.cxx')
-    TargetAdd('libpstatserver.lib', input='pstatserver_composite1.obj')
-
-#
-# DIRECTORY: pandatool/src/softprogs/
-#
-
-if (PkgSkip("PANDATOOL")==0):
-    OPTS=['DIR:pandatool/src/softprogs']
-    TargetAdd('softcvs_softCVS.obj', opts=OPTS, input='softCVS.cxx')
-    TargetAdd('softcvs_softFilename.obj', opts=OPTS, input='softFilename.cxx')
-    TargetAdd('softcvs.exe', input='softcvs_softCVS.obj')
-    TargetAdd('softcvs.exe', input='softcvs_softFilename.obj')
-    TargetAdd('softcvs.exe', input='libprogbase.lib')
-    TargetAdd('softcvs.exe', input='libpandatoolbase.lib')
-    TargetAdd('softcvs.exe', input='libpandaegg.dll')
-    TargetAdd('softcvs.exe', input=COMMON_PANDA_LIBS)
-    TargetAdd('softcvs.exe', input='libp3pystub.dll')
-    TargetAdd('softcvs.exe', opts=['ADVAPI'])
-
-#
-# DIRECTORY: pandatool/src/text-stats/
-#
-
-if (PkgSkip("PANDATOOL")==0):
-    OPTS=['DIR:pandatool/src/text-stats']
-    TargetAdd('text-stats_textMonitor.obj', opts=OPTS, input='textMonitor.cxx')
-    TargetAdd('text-stats_textStats.obj', opts=OPTS, input='textStats.cxx')
-    TargetAdd('text-stats.exe', input='text-stats_textMonitor.obj')
-    TargetAdd('text-stats.exe', input='text-stats_textStats.obj')
-    TargetAdd('text-stats.exe', input='libprogbase.lib')
-    TargetAdd('text-stats.exe', input='libpstatserver.lib')
-    TargetAdd('text-stats.exe', input='libpandatoolbase.lib')
-    TargetAdd('text-stats.exe', input='libpandaegg.dll')
-    TargetAdd('text-stats.exe', input=COMMON_PANDA_LIBS)
-    TargetAdd('text-stats.exe', input='libp3pystub.dll')
-    TargetAdd('text-stats.exe', opts=['ADVAPI'])
-
-#
-# DIRECTORY: pandatool/src/vrmlprogs/
-#
-
-if (PkgSkip("PANDATOOL")==0):
-    OPTS=['DIR:pandatool/src/vrmlprogs', 'DIR:pandatool/src/vrml', 'DIR:pandatool/src/vrmlegg']
-    TargetAdd('vrml-trans_vrmlTrans.obj', opts=OPTS, input='vrmlTrans.cxx')
-    TargetAdd('vrml-trans.exe', input='vrml-trans_vrmlTrans.obj')
-    TargetAdd('vrml-trans.exe', input='libpvrml.lib')
-    TargetAdd('vrml-trans.exe', input='libprogbase.lib')
-    TargetAdd('vrml-trans.exe', input='libpandatoolbase.lib')
-    TargetAdd('vrml-trans.exe', input=COMMON_PANDA_LIBS)
-    TargetAdd('vrml-trans.exe', input='libp3pystub.dll')
-    TargetAdd('vrml-trans.exe', opts=['ADVAPI'])
-
-    TargetAdd('vrml2egg_vrmlToEgg.obj', opts=OPTS, input='vrmlToEgg.cxx')
-    TargetAdd('vrml2egg.exe', input='vrml2egg_vrmlToEgg.obj')
-    TargetAdd('vrml2egg.exe', input='libvrmlegg.lib')
-    TargetAdd('vrml2egg.exe', input='libpvrml.lib')
-    TargetAdd('vrml2egg.exe', input=COMMON_EGG2X_LIBS_PYSTUB)
-    TargetAdd('vrml2egg.exe', opts=['ADVAPI'])
-
-#
-# DIRECTORY: pandatool/src/win-stats/
-# DIRECTORY: pandatool/src/gtk-stats/
-#
-
-if (PkgSkip("PANDATOOL")==0 and (sys.platform == "win32" or PkgConfigHavePkg("gtk+-2.0"))):
-    if (sys.platform == "win32"):
-      OPTS=['DIR:pandatool/src/win-stats']
-      TargetAdd('pstats_composite1.obj', opts=OPTS, input='winstats_composite1.cxx')
-    else:
-      OPTS=['DIR:pandatool/src/gtk-stats', 'GTK2']
-      TargetAdd('pstats_composite1.obj', opts=OPTS, input='gtkstats_composite1.cxx')
-    TargetAdd('pstats.exe', input='pstats_composite1.obj')
-    TargetAdd('pstats.exe', input='libpstatserver.lib')
-    TargetAdd('pstats.exe', input='libprogbase.lib')
-    TargetAdd('pstats.exe', input='libpandatoolbase.lib')
-    TargetAdd('pstats.exe', input=COMMON_PANDA_LIBS)
-    TargetAdd('pstats.exe', input='libp3pystub.dll')
-    TargetAdd('pstats.exe', opts=['WINSOCK', 'WINIMM', 'WINGDI', 'WINKERNEL', 'WINOLDNAMES', 'WINUSER', 'WINMM', 'GTK2'])
-
-#
-# DIRECTORY: pandatool/src/xfileprogs/
-#
-
-if (PkgSkip("PANDATOOL")==0):
-    OPTS=['DIR:pandatool/src/xfileprogs', 'DIR:pandatool/src/xfile', 'DIR:pandatool/src/xfileegg']
-    TargetAdd('egg2x_eggToX.obj', opts=OPTS, input='eggToX.cxx')
-    TargetAdd('egg2x.exe', input='egg2x_eggToX.obj')
-    TargetAdd('egg2x.exe', input='libxfileegg.lib')
-    TargetAdd('egg2x.exe', input='libxfile.lib')
-    TargetAdd('egg2x.exe', input=COMMON_EGG2X_LIBS_PYSTUB)
-    TargetAdd('egg2x.exe', opts=['ADVAPI'])
-
-    TargetAdd('x-trans_xFileTrans.obj', opts=OPTS, input='xFileTrans.cxx')
-    TargetAdd('x-trans.exe', input='x-trans_xFileTrans.obj')
-    TargetAdd('x-trans.exe', input='libprogbase.lib')
-    TargetAdd('x-trans.exe', input='libxfile.lib')
-    TargetAdd('x-trans.exe', input='libpandatoolbase.lib')
-    TargetAdd('x-trans.exe', input=COMMON_PANDA_LIBS)
-    TargetAdd('x-trans.exe', input='libp3pystub.dll')
-    TargetAdd('x-trans.exe', opts=['ADVAPI'])
-
-    TargetAdd('x2egg_xFileToEgg.obj', opts=OPTS, input='xFileToEgg.cxx')
-    TargetAdd('x2egg.exe', input='x2egg_xFileToEgg.obj')
-    TargetAdd('x2egg.exe', input='libxfileegg.lib')
-    TargetAdd('x2egg.exe', input='libxfile.lib')
-    TargetAdd('x2egg.exe', input=COMMON_EGG2X_LIBS_PYSTUB)
-    TargetAdd('x2egg.exe', opts=['ADVAPI'])
-
-#
-# Generate the models directory and samples directory
-#
-
-if (PkgSkip("PANDATOOL")==0):
-
-    for model in GetDirectoryContents("dmodels/src/misc", ["*.egg", "*.flt"]):
-        eggpz = model[:-4] + ".egg.pz"
-        TargetAdd(GetOutputDir()+"/models/misc/"+eggpz, input="dmodels/src/misc/"+model)
-
-    for model in GetDirectoryContents("dmodels/src/gui", ["*.egg", "*.flt"]):
-        eggpz = model[:-4] + ".egg.pz"
-        TargetAdd(GetOutputDir()+"/models/gui/"+eggpz, input="dmodels/src/gui/"+model)
-
-    for model in GetDirectoryContents("models", ["*.egg", "*.flt"]):
-        eggpz = model[:-4] + ".egg.pz"
-        TargetAdd(GetOutputDir()+"/models/"+eggpz, input="models/"+model)
-
-    CopyAllFiles(GetOutputDir()+"/models/audio/sfx/",  "dmodels/src/audio/sfx/", ".wav")
-    CopyAllFiles(GetOutputDir()+"/models/icons/",      "dmodels/src/icons/",     ".gif")
-    
-    CopyAllFiles(GetOutputDir()+"/models/maps/",       "models/maps/",           ".jpg")
-    CopyAllFiles(GetOutputDir()+"/models/maps/",       "models/maps/",           ".png")
-    CopyAllFiles(GetOutputDir()+"/models/maps/",       "models/maps/",           ".rgb")
-    CopyAllFiles(GetOutputDir()+"/models/maps/",       "models/maps/",           ".rgba")
-    
-    CopyAllFiles(GetOutputDir()+"/models/maps/",       "dmodels/src/maps/",      ".jpg")
-    CopyAllFiles(GetOutputDir()+"/models/maps/",       "dmodels/src/maps/",      ".png")
-    CopyAllFiles(GetOutputDir()+"/models/maps/",       "dmodels/src/maps/",      ".rgb")
-    CopyAllFiles(GetOutputDir()+"/models/maps/",       "dmodels/src/maps/",      ".rgba")
-
-
-##########################################################################################
-#
-# Dependency-Based Distributed Build System.
-#
-##########################################################################################
-
-DEPENDENCYQUEUE=[]
-
-for target in TARGET_LIST:
-    name = target.name
-    inputs = target.inputs
-    opts = target.opts
-    deps = target.deps
-    DEPENDENCYQUEUE.append([CompileAnything, [name, inputs, opts], [name], deps, []])
-
-def BuildWorker(taskqueue, donequeue):
-    while (1):
-        task = taskqueue.get()
-        sys.stdout.flush()
-        if (task == 0): return
-        try:
-            apply(task[0],task[1])
-            donequeue.put(task)
-        except:
-            donequeue.put(0)
-
-def AllSourcesReady(task, pending):
-    sources = task[3]
-    for x in sources:
-        if (pending.has_key(x)):
-            return 0
-    altsources = task[4]
-    for x in altsources:
-        if (pending.has_key(x)):
-            return 0
-    return 1
-
-def ParallelMake(tasklist):
-    # create the communication queues.
-    donequeue=Queue.Queue()
-    taskqueue=Queue.Queue()
-    # build up a table listing all the pending targets
-    pending = {}
-    for task in tasklist:
-        for target in task[2]:
-            pending[target] = 1
-    # create the workers
-    for slave in range(THREADCOUNT):
-        th = threading.Thread(target=BuildWorker, args=[taskqueue,donequeue])
-        th.setDaemon(1)
-        th.start()
-    # feed tasks to the workers.
-    tasksqueued = 0
-    while (1):
-        if (tasksqueued < THREADCOUNT*2):
-            extras = []
-            for task in tasklist:
-                if (tasksqueued < THREADCOUNT*3) & (AllSourcesReady(task, pending)):
-                    if (NeedsBuild(task[2], task[3])):
-                        tasksqueued += 1
-                        taskqueue.put(task)
-                    else:
-                        for target in task[2]:
-                            del pending[target]
-                else:
-                    extras.append(task)
-            tasklist = extras
-        sys.stdout.flush()
-        if (tasksqueued == 0): break
-        donetask = donequeue.get()
-        if (donetask == 0):
-            exit("Build process aborting.")
-        sys.stdout.flush()
-        tasksqueued -= 1
-        JustBuilt(donetask[2], donetask[3])
-        for target in donetask[2]:
-            del pending[target]
-    # kill the workers.
-    for slave in range(THREADCOUNT):
-        taskqueue.put(0)
-    # make sure there aren't any unsatisfied tasks
-    if (len(tasklist)>0):
-        exit("Dependency problem - task unsatisfied: "+str(tasklist[0][2]))
-
-
-def SequentialMake(tasklist):
-    for task in tasklist:
-        if (NeedsBuild(task[2], task[3])):
-            apply(task[0], task[1])
-            JustBuilt(task[2], task[3])
-
-def RunDependencyQueue(tasklist):
-    if (THREADCOUNT!=0):
-        ParallelMake(tasklist)
-    else:
-        SequentialMake(tasklist)
-
-RunDependencyQueue(DEPENDENCYQUEUE)
-
-##########################################################################################
-#
-# Run genpycode
-#
-##########################################################################################
-
-if (PkgSkip("PYTHON")==0):
-    inputs = []
-    for x in GetDirectoryContents(GetOutputDir()+"/pandac/input", ["*.in"]):
-        inputs.append(GetOutputDir()+"/pandac/input/" + x)
-    if (NeedsBuild([GetOutputDir()+'/pandac/PandaModules.py'],inputs)):
-        if (GENMAN): oscmd(GetOutputDir()+"/bin/genpycode -d")
-        else       : oscmd(GetOutputDir()+"/bin/genpycode")
-        JustBuilt([GetOutputDir()+'/pandac/PandaModules.py'],inputs)
-
-##########################################################################################
-#
-# The Installers
-#
-# Under windows, we can build an 'exe' package using NSIS
-# Under linux, we can build a 'deb' package or an 'rpm' package.
-# Under OSX, we can make a 'dmg' package.
-#
-##########################################################################################
-
-def MakeInstallerNSIS(file,fullname,smdirectory,installdir):
-    print "Building "+fullname+" installer. This can take up to an hour."
-    if (COMPRESSOR != "lzma"):
-        print("Note: you are using zlib, which is faster, but lzma gives better compression.")
-    if (os.path.exists(file)):
-        os.remove(file)
-    if (os.path.exists("nsis-output.exe")):
-        os.remove("nsis-output.exe")
-    WriteFile(GetOutputDir()+"/tmp/__init__.py", "")
-    psource=os.path.abspath(".")
-    panda=os.path.abspath(GetOutputDir())
-    cmd="thirdparty/win-nsis/makensis /V2 "
-    cmd=cmd+'/DCOMPRESSOR="'+COMPRESSOR+'" '
-    cmd=cmd+'/DNAME="'+fullname+'" '
-    cmd=cmd+'/DSMDIRECTORY="'+smdirectory+'" '
-    cmd=cmd+'/DINSTALLDIR="'+installdir+'" '
-    cmd=cmd+'/DOUTFILE="'+psource+'\\nsis-output.exe" '
-    cmd=cmd+'/DLICENSE="'+panda+'\\LICENSE" '
-    cmd=cmd+'/DLANGUAGE="Panda3DEnglish" '
-    cmd=cmd+'/DRUNTEXT="Visit the Panda Manual" '
-    cmd=cmd+'/DIBITMAP="panda-install.bmp" '
-    cmd=cmd+'/DUBITMAP="panda-uninstall.bmp" '
-    cmd=cmd+'/DPANDA="'+panda+'" '
-    cmd=cmd+'/DPANDACONF="'+panda+'\\etc" '
-    cmd=cmd+'/DPSOURCE="'+psource+'" '
-    cmd=cmd+'/DPYEXTRAS="'+psource+'\\thirdparty\\win-extras" '
-    cmd=cmd+'"'+psource+'\\direct\\src\\directscripts\\packpanda.nsi"'
-    oscmd( cmd)
-    os.rename("nsis-output.exe", file)
-
-
-INSTALLER_DEB_FILE="""
-Package: panda3d
-Version: VERSION
-Section: libdevel
-Priority: optional
-Architecture: ARCH
-Essential: no
-Depends: PYTHONV
-Recommends: python-profiler (>= PV)
-Provides: panda3d
-Maintainer: [email protected]
-Description: The Panda3D free 3D engine
-"""
-
-# We're not putting "python" in the "Requires" field,
-# since the rpm-based distros don't have a common
-# naming for the Python package.
-# The "AutoReqProv: no" field is necessary, otherwise
-# the user will be required to install Maya in order
-# to install the resulting RPM.
-INSTALLER_SPEC_FILE="""
-Summary: The Panda3D free 3D engine
-Name: panda3d
-Version: VERSION
-Release: 1
-License: BSD License
-Group: Development/Libraries
-BuildRoot: PANDASOURCE/linuxroot
-AutoReqProv: no
-%description
-The Panda3D engine.
-%post
-/sbin/ldconfig
-%postun
-/sbin/ldconfig
-%files
-%defattr(-,root,root)
-/etc/Confauto.prc
-/etc/Config.prc
-/usr/share/panda3d
-/etc/ld.so.conf.d/panda3d.conf
-/usr/bin
-/usr/lib
-/usr/include/panda3d
-"""
-
-
-def MakeInstallerLinux():
-    import compileall
-    PYTHONV=SDK["PYTHONVERSION"]
-    PV=PYTHONV.replace("python", "")
-    if (os.path.isdir("linuxroot")): oscmd("chmod -R 755 linuxroot")
-    oscmd("rm -rf linuxroot data.tar.gz control.tar.gz panda3d.spec")
-    if (os.path.exists("/usr/bin/rpmbuild")):
-        oscmd("rm -rf `rpm -E '%_target_cpu'`")
-    if (os.path.exists("/usr/bin/dpkg-deb")):
-        oscmd("rm -rf `dpkg --print-architecture`")
-    oscmd("mkdir -p linuxroot/usr/bin")
-    oscmd("mkdir -p linuxroot/usr/include")
-    oscmd("mkdir -p linuxroot/usr/share/panda3d")
-    oscmd("mkdir -p linuxroot/usr/share/panda3d/direct")
-    oscmd("mkdir -p linuxroot/usr/lib/panda3d")
-    oscmd("mkdir -p linuxroot/usr/lib/"+PYTHONV+"/lib-dynload")
-    oscmd("mkdir -p linuxroot/usr/lib/"+PYTHONV+"/site-packages")
-    oscmd("mkdir -p linuxroot/etc/ld.so.conf.d")
-    WriteFile("linuxroot/usr/share/panda3d/direct/__init__.py", "")
-    oscmd("sed -e 's@model-cache-@# model-cache-@' -e 's@$THIS_PRC_DIR/[.][.]@/usr/share/panda3d@' < "+GetOutputDir()+"/etc/Config.prc > linuxroot/etc/Config.prc")
-    oscmd("cp "+GetOutputDir()+"/etc/Confauto.prc  linuxroot/etc/Confauto.prc")
-    oscmd("cp --recursive "+GetOutputDir()+"/include linuxroot/usr/include/panda3d")
-    oscmd("cp --recursive direct/src/*               linuxroot/usr/share/panda3d/direct")
-    oscmd("cp --recursive "+GetOutputDir()+"/pandac  linuxroot/usr/share/panda3d/pandac")
-    oscmd("cp --recursive "+GetOutputDir()+"/models  linuxroot/usr/share/panda3d/models")
-    if os.path.isdir("samples"):                  oscmd("cp --recursive samples                    linuxroot/usr/share/panda3d/samples")
-    if os.path.isdir(GetOutputDir()+"/Pmw"):      oscmd("cp --recursive "+GetOutputDir()+"/Pmw     linuxroot/usr/share/panda3d/Pmw")
-    if os.path.isdir(GetOutputDir()+"/plugins"):  oscmd("cp --recursive "+GetOutputDir()+"/plugins linuxroot/usr/share/panda3d/plugins")
-    oscmd("cp doc/LICENSE               linuxroot/usr/share/panda3d/LICENSE")
-    oscmd("cp doc/LICENSE               linuxroot/usr/include/panda3d/LICENSE")
-    oscmd("cp doc/ReleaseNotes          linuxroot/usr/share/panda3d/ReleaseNotes")
-    oscmd("echo '/usr/lib/panda3d'   >  linuxroot/etc/ld.so.conf.d/panda3d.conf")
-    oscmd("echo '/usr/share/panda3d' >  linuxroot/usr/lib/"+PYTHONV+"/site-packages/panda3d.pth")
-    oscmd("echo '/usr/lib/panda3d'   >> linuxroot/usr/lib/"+PYTHONV+"/site-packages/panda3d.pth")
-    oscmd("cp "+GetOutputDir()+"/bin/*               linuxroot/usr/bin/")
-    for base in os.listdir(GetOutputDir()+"/lib"):
-        oscmd("cp "+GetOutputDir()+"/lib/"+base+" linuxroot/usr/lib/panda3d/"+base)
-    for base in os.listdir("linuxroot/usr/share/panda3d/direct"):
-        if ((base != "extensions") and (base != "extensions_native")):
-            compileall.compile_dir("linuxroot/usr/share/panda3d/direct/"+base)
-    compileall.compile_dir("linuxroot/usr/share/panda3d/Pmw")
-    DeleteCVS("linuxroot")
-    oscmd("chmod -R 555 linuxroot/usr/share/panda3d")
-    
-    if (os.path.exists("/usr/bin/rpmbuild") and not os.path.exists("/usr/bin/dpkg-deb")):
-        oscmd("rm -rf linuxroot/DEBIAN")
-        oscmd("rpm -E '%_target_cpu' > "+GetOutputDir()+"/tmp/architecture.txt")
-        ARCH=ReadFile(GetOutputDir()+"/tmp/architecture.txt").strip()
-        pandasource = os.path.abspath(os.getcwd())
-        txt = INSTALLER_SPEC_FILE[1:].replace("VERSION",VERSION).replace("PANDASOURCE",pandasource).replace("PYTHONV",PYTHONV).replace("PV",PV)
-        WriteFile("panda3d.spec", txt)
-        oscmd("rpmbuild --define '_rpmdir "+pandasource+"' -bb panda3d.spec")
-        oscmd("mv "+ARCH+"/panda3d-"+VERSION+"-1."+ARCH+".rpm .")
-    
-    if (os.path.exists("/usr/bin/dpkg-deb")):
-        oscmd("dpkg --print-architecture > "+GetOutputDir()+"/tmp/architecture.txt")
-        ARCH=ReadFile(GetOutputDir()+"/tmp/architecture.txt").strip()
-        txt = INSTALLER_DEB_FILE[1:].replace("VERSION",str(VERSION)).replace("PYTHONV",PYTHONV).replace("ARCH",ARCH).replace("PV",PV)
-        oscmd("mkdir -p linuxroot/DEBIAN")
-        oscmd("cd linuxroot ; (find usr -type f -exec md5sum {} \;) >  DEBIAN/md5sums")
-        oscmd("cd linuxroot ; (find etc -type f -exec md5sum {} \;) >> DEBIAN/md5sums")
-        WriteFile("linuxroot/DEBIAN/conffiles","/etc/Config.prc\n")
-        WriteFile("linuxroot/DEBIAN/control",txt)
-        WriteFile("linuxroot/DEBIAN/postinst","#!/bin/sh\necho running ldconfig\nldconfig\n")
-        oscmd("chmod 755 linuxroot/DEBIAN/postinst")
-        oscmd("cp linuxroot/DEBIAN/postinst linuxroot/DEBIAN/postrm")
-        oscmd("dpkg-deb -b linuxroot panda3d_"+VERSION+"_"+ARCH+".deb")
-        oscmd("chmod -R 755 linuxroot")
-    
-    if not(os.path.exists("/usr/bin/rpmbuild") or os.path.exists("/usr/bin/dpkg-deb")):
-        exit("To build an installer, either rpmbuild or dpkg-deb must be present on your system!")
-    
-#    oscmd("chmod -R 755 linuxroot")
-#    oscmd("rm -rf linuxroot data.tar.gz control.tar.gz panda3d.spec "+ARCH)
-
-def MakeInstallerOSX():
-    import compileall
-    PYTHONV=SDK["PYTHONVERSION"].replace("python", "").strip()
-    if (os.path.isfile("Panda3D-tpl-rw.dmg")): oscmd("rm -f Panda3D-tpl-rw.dmg")
-    if (os.path.isdir("Panda3D-tpl-rw")):
-        oscmd("hdiutil detach Panda3D-tpl-rw -quiet -force", True)
-        oscmd("rm -rf Panda3D-tpl-rw")
-    if (os.path.isfile("Panda3D-%s.dmg" % VERSION)): oscmd("rm -f Panda3D-%s.dmg" % VERSION)
-    oscmd("hdiutil convert -format UDRW -o Panda3D-tpl-rw.dmg makepanda/Panda3D-tpl.dmg", True)
-    if (not os.path.exists("Panda3D-tpl-rw.dmg")): exit()
-    oscmd("mkdir Panda3D-tpl-rw")
-    oscmd("hdiutil attach Panda3D-tpl-rw.dmg -noautoopen -quiet -mountpoint Panda3D-tpl-rw", True)
-    if (not os.path.exists("Panda3D-tpl-rw")): exit()
-    try:
-      oscmd("mkdir -p Panda3D-tpl-rw/Panda3D/%s/etc" % VERSION)
-      oscmd("mkdir -p Panda3D-tpl-rw/Panda3D/%s/bin" % VERSION)
-      oscmd("mkdir -p Panda3D-tpl-rw/Panda3D/%s/lib" % VERSION)
-      oscmd("mkdir -p Panda3D-tpl-rw/Panda3D/%s/lib/direct" % VERSION)
-      oscmd("sed -e 's@\\$1@%s@' < direct/src/directscripts/profilepaths-osx.command >> Panda3D-tpl-rw/panda3dpaths.command" % VERSION)
-      oscmd("sed -e 's@model-cache-@# model-cache-@' -e 's@$THIS_PRC_DIR/[.][.]@/Applications/Panda3D/%s@' < %s/etc/Config.prc > Panda3D-tpl-rw/Panda3D/%s/etc/Config.prc" % (VERSION, GetOutputDir(), VERSION))
-      # Append the plugin-path to the Config.prc.
-      f = open("Panda3D-tpl-rw/Panda3D/%s/etc/Config.prc" % VERSION, "a")
-      f.write("\nplugin-path /Applications/Panda3D/%s/lib\n" % VERSION)
-      f.close()
-      WriteFile("Panda3D-tpl-rw/Panda3D/%s/lib/direct/__init__.py" % VERSION, "")
-      oscmd("cp %s/etc/Confauto.prc   Panda3D-tpl-rw/Panda3D/%s/etc/Confauto.prc" % (GetOutputDir(), VERSION))
-      oscmd("cp -R %s/include         Panda3D-tpl-rw/Panda3D/%s/include" % (GetOutputDir(), VERSION))
-      oscmd("cp -R direct/src/*       Panda3D-tpl-rw/Panda3D/%s/lib/direct" % VERSION)
-      oscmd("cp -R %s/pandac          Panda3D-tpl-rw/Panda3D/%s/lib/pandac" % (GetOutputDir(), VERSION))
-      oscmd("cp -R %s/models          Panda3D-tpl-rw/Panda3D/%s/models" % (GetOutputDir(), VERSION))
-      oscmd("cp -R doc/LICENSE        Panda3D-tpl-rw/Panda3D/%s/LICENSE" % VERSION)
-      oscmd("cp -R doc/ReleaseNotes   Panda3D-tpl-rw/Panda3D/%s/ReleaseNotes" % VERSION)
-      oscmd("cp -R %s/bin/*           Panda3D-tpl-rw/Panda3D/%s/bin/" % (GetOutputDir(), VERSION))
-      if os.path.isdir("samples"):       oscmd("cp -R samples   Panda3D-tpl-rw/Panda3D/%s/samples" % VERSION)
-      if os.path.isdir(GetOutputDir()+"/Pmw"):     oscmd("cp -R %s/Pmw Panda3D-tpl-rw/Panda3D/%s/lib/Pmw" % (GetOutputDir(), VERSION))
-      if os.path.isdir(GetOutputDir()+"/plugins"): oscmd("cp -R %s/plugins Panda3D-tpl-rw/Panda3D/%s/plugins" % (GetOutputDir(), VERSION))
-      for base in os.listdir(GetOutputDir()+"/lib"):
-          oscmd("cp "+GetOutputDir()+"/lib/"+base+" Panda3D-tpl-rw/Panda3D/"+VERSION+"/lib/"+base)
-      # Loop through the binaries and libraries and execute install_name_tool on them
-      bindir = "Panda3D-tpl-rw/Panda3D/%s/bin/" % VERSION
-      libdir = "Panda3D-tpl-rw/Panda3D/%s/lib/" % VERSION
-      for fn in os.listdir(bindir):
-          if os.path.isfile(bindir + fn):
-              oscmd("otool -L %s%s | grep %s/lib/ > %s/tmp/otool-libs.txt" % (bindir, fn, GetOutputDir(), GetOutputDir()), True)
-              for line in open(GetOutputDir()+"/tmp/otool-libs.txt", "r"):
-                  if len(line.strip()) > 0:
-                      libname = line.strip().split(GetOutputDir()+"/lib/")[1].split(" ")[0]
-                      oscmd("install_name_tool -change %s/lib/%s %s %s%s" % (GetOutputDir(), libname, libname, bindir, fn), True)
-      for fn in os.listdir(libdir):
-          if os.path.isfile(libdir + fn):
-              oscmd("install_name_tool -id %s %s%s" % (fn, libdir, fn), True)
-              oscmd("otool -L %s%s | grep %s/lib/ > %s/tmp/otool-libs.txt" % (libdir, fn, GetOutputDir(), GetOutputDir()), True)
-              for line in open(GetOutputDir()+"/tmp/otool-libs.txt", "r"):
-                  if len(line.strip()) > 0:
-                      libname = line.strip().split(GetOutputDir()+"/lib/")[1].split(" ")[0]
-                      oscmd("install_name_tool -change %s/lib/%s %s %s%s" % (GetOutputDir(), libname, libname, libdir, fn), True)
-      # Compile the python files
-      for base in os.listdir("Panda3D-tpl-rw/Panda3D/"+VERSION+"/lib/direct"):
-          if ((base != "extensions") and (base != "extensions_native")):
-              compileall.compile_dir("Panda3D-tpl-rw/Panda3D/"+VERSION+"/lib/direct/"+base)
-      compileall.compile_dir("Panda3D-tpl-rw/Panda3D/"+VERSION+"/lib/Pmw")
-      oscmd("chmod -R 555 Panda3D-tpl-rw/Panda3D/"+VERSION+"/lib/direct")
-      oscmd("chmod -R 555 Panda3D-tpl-rw/Panda3D/"+VERSION+"/lib/pandac")
-      oscmd("chmod -R 555 Panda3D-tpl-rw/Panda3D/"+VERSION+"/models")
-      if os.path.isdir("samples"):   oscmd("chmod -R 555 Panda3D-tpl-rw/Panda3D/"+VERSION+"/samples")
-      if os.path.isdir(GetOutputDir()+"/Pmw"): oscmd("chmod -R 555 Panda3D-tpl-rw/Panda3D/"+VERSION+"/lib/Pmw")
-    except: # Make sure the dmg gets unmounted even when error occurs
-      oscmd("hdiutil detach Panda3D-tpl-rw -quiet -force", True)
-      oscmd("rm -f Panda3D-tpl-rw.dmg")
-      raise
-    oscmd("hdiutil detach Panda3D-tpl-rw -quiet -force", True)
-    oscmd("hdiutil convert -format UDBZ -o Panda3D-"+VERSION+".dmg Panda3D-tpl-rw.dmg", True)
-    if (not os.path.exists("Panda3D-%s.dmg" % VERSION)): exit()
-    oscmd("rm -f Panda3D-tpl-rw.dmg")
-    oscmd("rm -rf Panda3D-tpl-rw")
-
-if (INSTALLER != 0):
-    if (sys.platform == "win32"):
-        MakeInstallerNSIS("Panda3D-"+VERSION+".exe", "Panda3D", "Panda3D "+VERSION, "C:\\Panda3D-"+VERSION)
-    elif (sys.platform == "linux2"):
-        MakeInstallerLinux()
-    elif (sys.platform == "darwin"):
-        MakeInstallerOSX()
-    else:
-        exit("Do not know how to make an installer for this platform")
-
-##########################################################################################
-#
-# Print final status report.
-#
-##########################################################################################
-
-SaveDependencyCache()
-
-# Move any files we've moved away back.
-if os.path.isfile("dtool/src/dtoolutil/pandaVersion.h.moved"):
-  os.rename("dtool/src/dtoolutil/pandaVersion.h.moved", "dtool/src/dtoolutil/pandaVersion.h")
-if os.path.isfile("dtool/src/dtoolutil/checkPandaVersion.h.moved"):
-  os.rename("dtool/src/dtoolutil/checkPandaVersion.h.moved", "dtool/src/dtoolutil/checkPandaVersion.h")
-if os.path.isfile("dtool/src/dtoolutil/checkPandaVersion.cxx.moved"):
-  os.rename("dtool/src/dtoolutil/checkPandaVersion.cxx.moved", "dtool/src/dtoolutil/checkPandaVersion.cxx")
-
-WARNINGS.append("Elapsed Time: "+PrettyTime(time.time() - STARTTIME))
-
-printStatus("Makepanda Final Status Report", WARNINGS)
-

+ 0 - 20
doc/makepanda/makepanda.sln

@@ -1,20 +0,0 @@
-
-Microsoft Visual Studio Solution File, Format Version 10.00
-# Visual C++ Express 2008
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "makepanda", "makepanda.vcproj", "{F4935D7A-20AD-4132-B3CB-ADFF4F928D25}"
-EndProject
-Global
-	GlobalSection(SolutionConfigurationPlatforms) = preSolution
-		Debug|Win32 = Debug|Win32
-		Release|Win32 = Release|Win32
-	EndGlobalSection
-	GlobalSection(ProjectConfigurationPlatforms) = postSolution
-		{F4935D7A-20AD-4132-B3CB-ADFF4F928D25}.Debug|Win32.ActiveCfg = Debug|Win32
-		{F4935D7A-20AD-4132-B3CB-ADFF4F928D25}.Debug|Win32.Build.0 = Debug|Win32
-		{F4935D7A-20AD-4132-B3CB-ADFF4F928D25}.Release|Win32.ActiveCfg = Release|Win32
-		{F4935D7A-20AD-4132-B3CB-ADFF4F928D25}.Release|Win32.Build.0 = Release|Win32
-	EndGlobalSection
-	GlobalSection(SolutionProperties) = preSolution
-		HideSolutionNode = FALSE
-	EndGlobalSection
-EndGlobal

+ 0 - 5061
doc/makepanda/makepanda.vcproj

@@ -1,5061 +0,0 @@
-<?xml version="1.0" encoding="Windows-1252"?>
-<VisualStudioProject
-	ProjectType="Visual C++"
-	Version="9,00"
-	Name="makepanda"
-	ProjectGUID="{F4935D7A-20AD-4132-B3CB-ADFF4F928D25}"
-	RootNamespace="makepanda"
-	Keyword="MakeFileProj"
-	TargetFrameworkVersion="0"
-	>
-	<Platforms>
-		<Platform
-			Name="Win32"
-		/>
-	</Platforms>
-	<ToolFiles>
-	</ToolFiles>
-	<Configurations>
-		<Configuration
-			Name="Debug|Win32"
-			OutputDirectory="..\debug"
-			IntermediateDirectory="..\debug"
-			ConfigurationType="0"
-			>
-			<Tool
-				Name="VCNMakeTool"
-				BuildCommandLine="cd .. &amp; makepanda\makepanda --everything --optimize 1 --outputdir debug"
-				ReBuildCommandLine=""
-				CleanCommandLine="cd .. &amp; RD /S /Q debug"
-				Output=""
-				PreprocessorDefinitions=""
-				IncludeSearchPath=""
-				ForcedIncludes=""
-				AssemblySearchPath=""
-				ForcedUsingAssemblies=""
-				CompileAsManaged=""
-			/>
-		</Configuration>
-		<Configuration
-			Name="Release|Win32"
-			OutputDirectory="..\built"
-			IntermediateDirectory="..\built"
-			ConfigurationType="0"
-			>
-			<Tool
-				Name="VCNMakeTool"
-				BuildCommandLine="cd .. &amp; makepanda\makepanda --everything --optimize 3 --installer"
-				ReBuildCommandLine=""
-				CleanCommandLine="cd .. &amp; RD /S /Q built"
-				Output=""
-				PreprocessorDefinitions=""
-				IncludeSearchPath=""
-				ForcedIncludes=""
-				AssemblySearchPath=""
-				ForcedUsingAssemblies=""
-				CompileAsManaged=""
-			/>
-		</Configuration>
-	</Configurations>
-	<References>
-	</References>
-	<Files>
-		<Filter Name="dtool">
-			<Filter Name="dconfig">
-				<File RelativePath="..\dtool\src\dconfig\config_dconfig.h"></File>
-				<File RelativePath="..\dtool\src\dconfig\configTable.I"></File>
-				<File RelativePath="..\dtool\src\dconfig\serialization.I"></File>
-				<File RelativePath="..\dtool\src\dconfig\dconfig.cxx"></File>
-				<File RelativePath="..\dtool\src\dconfig\config_dconfig.cxx"></File>
-				<File RelativePath="..\dtool\src\dconfig\serialization.h"></File>
-				<File RelativePath="..\dtool\src\dconfig\dconfig_composite1.cxx"></File>
-				<File RelativePath="..\dtool\src\dconfig\config_setup.h"></File>
-				<File RelativePath="..\dtool\src\dconfig\configTable.cxx"></File>
-				<File RelativePath="..\dtool\src\dconfig\symbolEnt.cxx"></File>
-				<File RelativePath="..\dtool\src\dconfig\test_searchpath.cxx"></File>
-				<File RelativePath="..\dtool\src\dconfig\symbolEnt.I"></File>
-				<File RelativePath="..\dtool\src\dconfig\test_config.cxx"></File>
-				<File RelativePath="..\dtool\src\dconfig\test_pfstream.cxx"></File>
-				<File RelativePath="..\dtool\src\dconfig\configTable.h"></File>
-				<File RelativePath="..\dtool\src\dconfig\test_expand.cxx"></File>
-				<File RelativePath="..\dtool\src\dconfig\dconfig.I"></File>
-				<File RelativePath="..\dtool\src\dconfig\symbolEnt.h"></File>
-				<File RelativePath="..\dtool\src\dconfig\dconfig.h"></File>
-				<File RelativePath="..\dtool\src\dconfig\dconfig_composite.cxx"></File>
-			</Filter>
-			<Filter Name="parser-inc">
-				<File RelativePath="..\dtool\src\parser-inc\setjmp.h"></File>
-				<File RelativePath="..\dtool\src\parser-inc\Max.h"></File>
-				<File RelativePath="..\dtool\src\parser-inc\ucontext.h"></File>
-				<File RelativePath="..\dtool\src\parser-inc\avformat.h"></File>
-				<File RelativePath="..\dtool\src\parser-inc\stdcompare.h"></File>
-				<File RelativePath="..\dtool\src\parser-inc\rational.h"></File>
-				<File RelativePath="..\dtool\src\parser-inc\cg.h"></File>
-				<File RelativePath="..\dtool\src\parser-inc\libtar.h"></File>
-				<File RelativePath="..\dtool\src\parser-inc\tcp.h"></File>
-				<File RelativePath="..\dtool\src\parser-inc\cv.h"></File>
-				<File RelativePath="..\dtool\src\parser-inc\hex.h"></File>
-				<File RelativePath="..\dtool\src\parser-inc\iparamm2.h"></File>
-				<File RelativePath="..\dtool\src\parser-inc\cxcore.h"></File>
-				<File RelativePath="..\dtool\src\parser-inc\hxcore.h"></File>
-				<File RelativePath="..\dtool\src\parser-inc\math.h"></File>
-				<File RelativePath="..\dtool\src\parser-inc\cxtypes.h"></File>
-				<File RelativePath="..\dtool\src\parser-inc\pthreadtypes.h"></File>
-				<File RelativePath="..\dtool\src\parser-inc\istdplug.h"></File>
-				<File RelativePath="..\dtool\src\parser-inc\intfloat_readwrite.h"></File>
-				<File RelativePath="..\dtool\src\parser-inc\pem.h"></File>
-				<File RelativePath="..\dtool\src\parser-inc\dllpath.h"></File>
-				<File RelativePath="..\dtool\src\parser-inc\hxengin.h"></File>
-				<File RelativePath="..\dtool\src\parser-inc\artools.h"></File>
-				<File RelativePath="..\dtool\src\parser-inc\stdmat.h"></File>
-				<File RelativePath="..\dtool\src\parser-inc\iskin.h"></File>
-				<File RelativePath="..\dtool\src\parser-inc\phyexp.h"></File>
-				<File RelativePath="..\dtool\src\parser-inc\hxerror.h"></File>
-				<File RelativePath="..\dtool\src\parser-inc\collision_trimesh.h"></File>
-				<File RelativePath="..\dtool\src\parser-inc\iparamb2.h"></File>
-				<File RelativePath="..\dtool\src\parser-inc\rtp.h"></File>
-				<File RelativePath="..\dtool\src\parser-inc\ode.h"></File>
-				<File RelativePath="..\dtool\src\parser-inc\windows.h"></File>
-				<File RelativePath="..\dtool\src\parser-inc\hxcom.h"></File>
-				<File RelativePath="..\dtool\src\parser-inc\hxfiles.h"></File>
-				<File RelativePath="..\dtool\src\parser-inc\md5.h"></File>
-				<File RelativePath="..\dtool\src\parser-inc\rtsp.h"></File>
-				<File RelativePath="..\dtool\src\parser-inc\highgui.h"></File>
-				<File RelativePath="..\dtool\src\parser-inc\cgGL.h"></File>
-				<File RelativePath="..\dtool\src\parser-inc\cvtypes.h"></File>
-				<File RelativePath="..\dtool\src\parser-inc\x509.h"></File>
-				<File RelativePath="..\dtool\src\parser-inc\rfftw.h"></File>
-				<File RelativePath="..\dtool\src\parser-inc\hxcomm.h"></File>
-				<File RelativePath="..\dtool\src\parser-inc\krb5.h"></File>
-				<File RelativePath="..\dtool\src\parser-inc\files.h"></File>
-				<File RelativePath="..\dtool\src\parser-inc\py_panda.h"></File>
-				<File RelativePath="..\dtool\src\parser-inc\mathematics.h"></File>
-				<File RelativePath="..\dtool\src\parser-inc\hxtbuf.h"></File>
-				<File RelativePath="..\dtool\src\parser-inc\avutil.h"></File>
-				<File RelativePath="..\dtool\src\parser-inc\stdtypedefs.h"></File>
-				<File RelativePath="..\dtool\src\parser-inc\cxerror.h"></File>
-				<File RelativePath="..\dtool\src\parser-inc\malloc.h"></File>
-				<File RelativePath="..\dtool\src\parser-inc\ssl.h"></File>
-				<File RelativePath="..\dtool\src\parser-inc\zlib.h"></File>
-				<File RelativePath="..\dtool\src\parser-inc\winsock2.h"></File>
-				<File RelativePath="..\dtool\src\parser-inc\socket.h"></File>
-				<File RelativePath="..\dtool\src\parser-inc\ctype.h"></File>
-				<File RelativePath="..\dtool\src\parser-inc\err.h"></File>
-				<File RelativePath="..\dtool\src\parser-inc\pthread.h"></File>
-				<File RelativePath="..\dtool\src\parser-inc\ft2build.h"></File>
-				<File RelativePath="..\dtool\src\parser-inc\hxwin.h"></File>
-				<File RelativePath="..\dtool\src\parser-inc\mmsystem.h"></File>
-				<File RelativePath="..\dtool\src\parser-inc\avio.h"></File>
-				<File RelativePath="..\dtool\src\parser-inc\stddef.h"></File>
-				<File RelativePath="..\dtool\src\parser-inc\Python.h"></File>
-				<File RelativePath="..\dtool\src\parser-inc\control.h"></File>
-				<File RelativePath="..\dtool\src\parser-inc\rtspcodes.h"></File>
-				<File RelativePath="..\dtool\src\parser-inc\hxtbuff.h"></File>
-				<File RelativePath="..\dtool\src\parser-inc\integer.h"></File>
-				<File RelativePath="..\dtool\src\parser-inc\ip.h"></File>
-				<File RelativePath="..\dtool\src\parser-inc\crypto.h"></File>
-				<File RelativePath="..\dtool\src\parser-inc\rand.h"></File>
-				<File RelativePath="..\dtool\src\parser-inc\MainHelix.h"></File>
-				<File RelativePath="..\dtool\src\parser-inc\evp.h"></File>
-				<File RelativePath="..\dtool\src\parser-inc\rsa.h"></File>
-				<File RelativePath="..\dtool\src\parser-inc\avcodec.h"></File>
-			</Filter>
-			<Filter Name="prc">
-				<File RelativePath="..\dtool\src\prc\configVariableSearchPath.cxx"></File>
-				<File RelativePath="..\dtool\src\prc\notifyCategoryProxy.I"></File>
-				<File RelativePath="..\dtool\src\prc\configVariableList.h"></File>
-				<File RelativePath="..\dtool\src\prc\reversedNumericData.h"></File>
-				<File RelativePath="..\dtool\src\prc\bigEndian.h"></File>
-				<File RelativePath="..\dtool\src\prc\configVariableManager.I"></File>
-				<File RelativePath="..\dtool\src\prc\prc_parameters.h"></File>
-				<File RelativePath="..\dtool\src\prc\configFlags.h"></File>
-				<File RelativePath="..\dtool\src\prc\nativeNumericData.I"></File>
-				<File RelativePath="..\dtool\src\prc\notifySeverity.h"></File>
-				<File RelativePath="..\dtool\src\prc\configVariableSearchPath.I"></File>
-				<File RelativePath="..\dtool\src\prc\prcKeyRegistry.h"></File>
-				<File RelativePath="..\dtool\src\prc\configDeclaration.I"></File>
-				<File RelativePath="..\dtool\src\prc\littleEndian.h"></File>
-				<File RelativePath="..\dtool\src\prc\reversedNumericData.cxx"></File>
-				<File RelativePath="..\dtool\src\prc\configPage.I"></File>
-				<File RelativePath="..\dtool\src\prc\streamWriter.I"></File>
-				<File RelativePath="..\dtool\src\prc\configVariable.h"></File>
-				<File RelativePath="..\dtool\src\prc\configVariableCore.h"></File>
-				<File RelativePath="..\dtool\src\prc\configVariable.cxx"></File>
-				<File RelativePath="..\dtool\src\prc\encryptStreamBuf.I"></File>
-				<File RelativePath="..\dtool\src\prc\configVariableBool.I"></File>
-				<File RelativePath="..\dtool\src\prc\configVariableFilename.cxx"></File>
-				<File RelativePath="..\dtool\src\prc\configVariableEnum.cxx"></File>
-				<File RelativePath="..\dtool\src\prc\streamReader.h"></File>
-				<File RelativePath="..\dtool\src\prc\reversedNumericData.I"></File>
-				<File RelativePath="..\dtool\src\prc\configDeclaration.cxx"></File>
-				<File RelativePath="..\dtool\src\prc\configVariableBase.cxx"></File>
-				<File RelativePath="..\dtool\src\prc\encryptStream.h"></File>
-				<File RelativePath="..\dtool\src\prc\configVariableInt.I"></File>
-				<File RelativePath="..\dtool\src\prc\configVariableDouble.cxx"></File>
-				<File RelativePath="..\dtool\src\prc\prcKeyRegistry.I"></File>
-				<File RelativePath="..\dtool\src\prc\configVariableString.I"></File>
-				<File RelativePath="..\dtool\src\prc\streamWrapper.cxx"></File>
-				<File RelativePath="..\dtool\src\prc\notifySeverity.cxx"></File>
-				<File RelativePath="..\dtool\src\prc\configVariableEnum.h"></File>
-				<File RelativePath="..\dtool\src\prc\configVariableSearchPath.h"></File>
-				<File RelativePath="..\dtool\src\prc\encryptStreamBuf.h"></File>
-				<File RelativePath="..\dtool\src\prc\config_prc.h"></File>
-				<File RelativePath="..\dtool\src\prc\configDeclaration.h"></File>
-				<File RelativePath="..\dtool\src\prc\globPattern.I"></File>
-				<File RelativePath="..\dtool\src\prc\prcKeyRegistry.cxx"></File>
-				<File RelativePath="..\dtool\src\prc\configVariableInt64.h"></File>
-				<File RelativePath="..\dtool\src\prc\configVariableInt64.I"></File>
-				<File RelativePath="..\dtool\src\prc\streamReader.cxx"></File>
-				<File RelativePath="..\dtool\src\prc\config_prc.cxx"></File>
-				<File RelativePath="..\dtool\src\prc\configPageManager.I"></File>
-				<File RelativePath="..\dtool\src\prc\notifyCategory.I"></File>
-				<File RelativePath="..\dtool\src\prc\encryptStreamBuf.cxx"></File>
-				<File RelativePath="..\dtool\src\prc\notifyCategory.h"></File>
-				<File RelativePath="..\dtool\src\prc\streamWrapper.I"></File>
-				<File RelativePath="..\dtool\src\prc\configVariableBase.h"></File>
-				<File RelativePath="..\dtool\src\prc\configPageManager.h"></File>
-				<File RelativePath="..\dtool\src\prc\configVariableFilename.I"></File>
-				<File RelativePath="..\dtool\src\prc\nativeNumericData.h"></File>
-				<File RelativePath="..\dtool\src\prc\configPage.cxx"></File>
-				<File RelativePath="..\dtool\src\prc\globPattern.cxx"></File>
-				<File RelativePath="..\dtool\src\prc\configVariableList.I"></File>
-				<File RelativePath="..\dtool\src\prc\notifyCategory.cxx"></File>
-				<File RelativePath="..\dtool\src\prc\configVariableFilename.h"></File>
-				<File RelativePath="..\dtool\src\prc\configVariableEnum.I"></File>
-				<File RelativePath="..\dtool\src\prc\prc_composite.cxx"></File>
-				<File RelativePath="..\dtool\src\prc\configVariableCore.I"></File>
-				<File RelativePath="..\dtool\src\prc\streamWrapper.h"></File>
-				<File RelativePath="..\dtool\src\prc\configVariableInt64.cxx"></File>
-				<File RelativePath="..\dtool\src\prc\configVariableBool.cxx"></File>
-				<File RelativePath="..\dtool\src\prc\encryptStream.I"></File>
-				<File RelativePath="..\dtool\src\prc\notifyCategoryProxy.h"></File>
-				<File RelativePath="..\dtool\src\prc\encryptStream.cxx"></File>
-				<File RelativePath="..\dtool\src\prc\pnotify.I"></File>
-				<File RelativePath="..\dtool\src\prc\configVariableDouble.h"></File>
-				<File RelativePath="..\dtool\src\prc\prc_composite2.cxx"></File>
-				<File RelativePath="..\dtool\src\prc\configVariableCore.cxx"></File>
-				<File RelativePath="..\dtool\src\prc\configVariableManager.cxx"></File>
-				<File RelativePath="..\dtool\src\prc\configVariableBase.I"></File>
-				<File RelativePath="..\dtool\src\prc\configVariableString.h"></File>
-				<File RelativePath="..\dtool\src\prc\configFlags.cxx"></File>
-				<File RelativePath="..\dtool\src\prc\configVariableList.cxx"></File>
-				<File RelativePath="..\dtool\src\prc\streamWriter.h"></File>
-				<File RelativePath="..\dtool\src\prc\configVariableBool.h"></File>
-				<File RelativePath="..\dtool\src\prc\globPattern.h"></File>
-				<File RelativePath="..\dtool\src\prc\configPage.h"></File>
-				<File RelativePath="..\dtool\src\prc\configVariableInt.h"></File>
-				<File RelativePath="..\dtool\src\prc\configFlags.I"></File>
-				<File RelativePath="..\dtool\src\prc\configVariableManager.h"></File>
-				<File RelativePath="..\dtool\src\prc\configPageManager.cxx"></File>
-				<File RelativePath="..\dtool\src\prc\configVariableInt.cxx"></File>
-				<File RelativePath="..\dtool\src\prc\configVariable.I"></File>
-				<File RelativePath="..\dtool\src\prc\streamWriter.cxx"></File>
-				<File RelativePath="..\dtool\src\prc\streamReader.I"></File>
-				<File RelativePath="..\dtool\src\prc\notify.cxx"></File>
-				<File RelativePath="..\dtool\src\prc\configVariableDouble.I"></File>
-				<File RelativePath="..\dtool\src\prc\pnotify.h"></File>
-				<File RelativePath="..\dtool\src\prc\nativeNumericData.cxx"></File>
-				<File RelativePath="..\dtool\src\prc\configVariableString.cxx"></File>
-				<File RelativePath="..\dtool\src\prc\prc_composite1.cxx"></File>
-			</Filter>
-			<Filter Name="newheader">
-				<File RelativePath="..\dtool\src\newheader\newheader.cxx"></File>
-			</Filter>
-			<Filter Name="dtoolbase">
-				<File RelativePath="..\dtool\src\dtoolbase\lookup3.c"></File>
-				<File RelativePath="..\dtool\src\dtoolbase\cmath.I"></File>
-				<File RelativePath="..\dtool\src\dtoolbase\register_type.h"></File>
-				<File RelativePath="..\dtool\src\dtoolbase\dlmalloc_src.cxx"></File>
-				<File RelativePath="..\dtool\src\dtoolbase\typedObject.cxx"></File>
-				<File RelativePath="..\dtool\src\dtoolbase\deletedBufferChain.cxx"></File>
-				<File RelativePath="..\dtool\src\dtoolbase\pallocator.h"></File>
-				<File RelativePath="..\dtool\src\dtoolbase\verdate.cpp"></File>
-				<File RelativePath="..\dtool\src\dtoolbase\typeRegistry.cxx"></File>
-				<File RelativePath="..\dtool\src\dtoolbase\deletedBufferChain.I"></File>
-				<File RelativePath="..\dtool\src\dtoolbase\atomicAdjustDummyImpl.cxx"></File>
-				<File RelativePath="..\dtool\src\dtoolbase\deletedChain.h"></File>
-				<File RelativePath="..\dtool\src\dtoolbase\dtoolsymbols.h"></File>
-				<File RelativePath="..\dtool\src\dtoolbase\mutexImpl.h"></File>
-				<File RelativePath="..\dtool\src\dtoolbase\mutexDummyImpl.cxx"></File>
-				<File RelativePath="..\dtool\src\dtoolbase\numeric_types.h"></File>
-				<File RelativePath="..\dtool\src\dtoolbase\mutexPosixImpl.h"></File>
-				<File RelativePath="..\dtool\src\dtoolbase\addHash.cxx"></File>
-				<File RelativePath="..\dtool\src\dtoolbase\atomicAdjustPosixImpl.I"></File>
-				<File RelativePath="..\dtool\src\dtoolbase\dtoolbase.h"></File>
-				<File RelativePath="..\dtool\src\dtoolbase\atomicAdjustWin32Impl.I"></File>
-				<File RelativePath="..\dtool\src\dtoolbase\atomicAdjustI386Impl.h"></File>
-				<File RelativePath="..\dtool\src\dtoolbase\atomicAdjustI386Impl.cxx"></File>
-				<File RelativePath="..\dtool\src\dtoolbase\typeHandle.h"></File>
-				<File RelativePath="..\dtool\src\dtoolbase\addHash.h"></File>
-				<File RelativePath="..\dtool\src\dtoolbase\register_type.cxx"></File>
-				<File RelativePath="..\dtool\src\dtoolbase\atomicAdjustWin32Impl.h"></File>
-				<File RelativePath="..\dtool\src\dtoolbase\nearly_zero.h"></File>
-				<File RelativePath="..\dtool\src\dtoolbase\neverFreeMemory.I"></File>
-				<File RelativePath="..\dtool\src\dtoolbase\pmap.h"></File>
-				<File RelativePath="..\dtool\src\dtoolbase\memoryHook.cxx"></File>
-				<File RelativePath="..\dtool\src\dtoolbase\mutexWin32Impl.I"></File>
-				<File RelativePath="..\dtool\src\dtoolbase\dtoolbase_composite1.cxx"></File>
-				<File RelativePath="..\dtool\src\dtoolbase\typeRegistry.I"></File>
-				<File RelativePath="..\dtool\src\dtoolbase\pset.h"></File>
-				<File RelativePath="..\dtool\src\dtoolbase\atomicAdjustPosixImpl.cxx"></File>
-				<File RelativePath="..\dtool\src\dtoolbase\mutexSpinlockImpl.h"></File>
-				<File RelativePath="..\dtool\src\dtoolbase\plist.h"></File>
-				<File RelativePath="..\dtool\src\dtoolbase\indent.cxx"></File>
-				<File RelativePath="..\dtool\src\dtoolbase\lookup3.h"></File>
-				<File RelativePath="..\dtool\src\dtoolbase\version.h"></File>
-				<File RelativePath="..\dtool\src\dtoolbase\typeRegistryNode.h"></File>
-				<File RelativePath="..\dtool\src\dtoolbase\selectThreadImpl.h"></File>
-				<File RelativePath="..\dtool\src\dtoolbase\ptmalloc2_smp_src.cxx"></File>
-				<File RelativePath="..\dtool\src\dtoolbase\indent.I"></File>
-				<File RelativePath="..\dtool\src\dtoolbase\atomicAdjustI386Impl.I"></File>
-				<File RelativePath="..\dtool\src\dtoolbase\dtoolbase_composite2.cxx"></File>
-				<File RelativePath="..\dtool\src\dtoolbase\memoryBase.cxx"></File>
-				<File RelativePath="..\dtool\src\dtoolbase\mutexSpinlockImpl.I"></File>
-				<File RelativePath="..\dtool\src\dtoolbase\deletedBufferChain.h"></File>
-				<File RelativePath="..\dtool\src\dtoolbase\neverFreeMemory.cxx"></File>
-				<File RelativePath="..\dtool\src\dtoolbase\typedObject.I"></File>
-				<File RelativePath="..\dtool\src\dtoolbase\typeRegistryNode.cxx"></File>
-				<File RelativePath="..\dtool\src\dtoolbase\mutexSpinlockImpl.cxx"></File>
-				<File RelativePath="..\dtool\src\dtoolbase\mutexDummyImpl.I"></File>
-				<File RelativePath="..\dtool\src\dtoolbase\atomicAdjustPosixImpl.h"></File>
-				<File RelativePath="..\dtool\src\dtoolbase\memoryHook.I"></File>
-				<File RelativePath="..\dtool\src\dtoolbase\stl_compares.h"></File>
-				<File RelativePath="..\dtool\src\dtoolbase\pvector.h"></File>
-				<File RelativePath="..\dtool\src\dtoolbase\typeRegistryNode.I"></File>
-				<File RelativePath="..\dtool\src\dtoolbase\mutexPosixImpl.I"></File>
-				<File RelativePath="..\dtool\src\dtoolbase\atomicAdjust.h"></File>
-				<File RelativePath="..\dtool\src\dtoolbase\register_type.I"></File>
-				<File RelativePath="..\dtool\src\dtoolbase\mutexPosixImpl.cxx"></File>
-				<File RelativePath="..\dtool\src\dtoolbase\memoryBase.h"></File>
-				<File RelativePath="..\dtool\src\dtoolbase\typeHandle.cxx"></File>
-				<File RelativePath="..\dtool\src\dtoolbase\indent.h"></File>
-				<File RelativePath="..\dtool\src\dtoolbase\dlmalloc.h"></File>
-				<File RelativePath="..\dtool\src\dtoolbase\addHash.I"></File>
-				<File RelativePath="..\dtool\src\dtoolbase\mutexWin32Impl.h"></File>
-				<File RelativePath="..\dtool\src\dtoolbase\neverFreeMemory.h"></File>
-				<File RelativePath="..\dtool\src\dtoolbase\mutexDummyImpl.h"></File>
-				<File RelativePath="..\dtool\src\dtoolbase\fakestringstream.h"></File>
-				<File RelativePath="..\dtool\src\dtoolbase\cmath.h"></File>
-				<File RelativePath="..\dtool\src\dtoolbase\pdeque.h"></File>
-				<File RelativePath="..\dtool\src\dtoolbase\typeRegistry.h"></File>
-				<File RelativePath="..\dtool\src\dtoolbase\atomicAdjustDummyImpl.h"></File>
-				<File RelativePath="..\dtool\src\dtoolbase\dtoolbase.cxx"></File>
-				<File RelativePath="..\dtool\src\dtoolbase\memoryHook.h"></File>
-				<File RelativePath="..\dtool\src\dtoolbase\typeHandle.I"></File>
-				<File RelativePath="..\dtool\src\dtoolbase\dtoolbase_cc.h"></File>
-				<File RelativePath="..\dtool\src\dtoolbase\stl_compares.I"></File>
-				<File RelativePath="..\dtool\src\dtoolbase\atomicAdjustDummyImpl.I"></File>
-				<File RelativePath="..\dtool\src\dtoolbase\atomicAdjustWin32Impl.cxx"></File>
-				<File RelativePath="..\dtool\src\dtoolbase\typedObject.h"></File>
-				<File RelativePath="..\dtool\src\dtoolbase\mutexWin32Impl.cxx"></File>
-			</Filter>
-			<Filter Name="pystub">
-				<File RelativePath="..\dtool\src\pystub\pystub.h"></File>
-				<File RelativePath="..\dtool\src\pystub\pystub.cxx"></File>
-			</Filter>
-			<Filter Name="dtoolutil">
-				<File RelativePath="..\dtool\src\dtoolutil\pandaFileStreamBuf.h"></File>
-				<File RelativePath="..\dtool\src\dtoolutil\vector_src.h"></File>
-				<File RelativePath="..\dtool\src\dtoolutil\dSearchPath.I"></File>
-				<File RelativePath="..\dtool\src\dtoolutil\pfstreamBuf.h"></File>
-				<File RelativePath="..\dtool\src\dtoolutil\config_dtoolutil.h"></File>
-				<File RelativePath="..\dtool\src\dtoolutil\load_dso.cxx"></File>
-				<File RelativePath="..\dtool\src\dtoolutil\dtoolutil_composite.cxx"></File>
-				<File RelativePath="..\dtool\src\dtoolutil\pfstreamBuf.cxx"></File>
-				<File RelativePath="..\dtool\src\dtoolutil\filename.I"></File>
-				<File RelativePath="..\dtool\src\dtoolutil\checkPandaVersion.h"></File>
-				<File RelativePath="..\dtool\src\dtoolutil\pandaFileStream.cxx"></File>
-				<File RelativePath="..\dtool\src\dtoolutil\executionEnvironment.I"></File>
-				<File RelativePath="..\dtool\src\dtoolutil\dtoolutil_composite1.cxx"></File>
-				<File RelativePath="..\dtool\src\dtoolutil\filename.cxx"></File>
-				<File RelativePath="..\dtool\src\dtoolutil\vector_string.h"></File>
-				<File RelativePath="..\dtool\src\dtoolutil\filename.h"></File>
-				<File RelativePath="..\dtool\src\dtoolutil\executionEnvironment.cxx"></File>
-				<File RelativePath="..\dtool\src\dtoolutil\executionEnvironment.h"></File>
-				<File RelativePath="..\dtool\src\dtoolutil\test_touch.cxx"></File>
-				<File RelativePath="..\dtool\src\dtoolutil\test_pfstream.cxx"></File>
-				<File RelativePath="..\dtool\src\dtoolutil\vector_src.cxx"></File>
-				<File RelativePath="..\dtool\src\dtoolutil\gnu_getopt.c"></File>
-				<File RelativePath="..\dtool\src\dtoolutil\gnu_getopt.h"></File>
-				<File RelativePath="..\dtool\src\dtoolutil\dSearchPath.h"></File>
-				<File RelativePath="..\dtool\src\dtoolutil\config_dtoolutil.cxx"></File>
-				<File RelativePath="..\dtool\src\dtoolutil\pandaFileStream.I"></File>
-				<File RelativePath="..\dtool\src\dtoolutil\pfstream.cxx"></File>
-				<File RelativePath="..\dtool\src\dtoolutil\vector_string.cxx"></File>
-				<File RelativePath="..\dtool\src\dtoolutil\pandaSystem.h"></File>
-				<File RelativePath="..\dtool\src\dtoolutil\gnu_getopt1.c"></File>
-				<File RelativePath="..\dtool\src\dtoolutil\pandaFileStreamBuf.cxx"></File>
-				<File RelativePath="..\dtool\src\dtoolutil\dtoolutil_composite2.cxx"></File>
-				<File RelativePath="..\dtool\src\dtoolutil\checkPandaVersion.cxx"></File>
-				<File RelativePath="..\dtool\src\dtoolutil\pfstream.h"></File>
-				<File RelativePath="..\dtool\src\dtoolutil\dSearchPath.cxx"></File>
-				<File RelativePath="..\dtool\src\dtoolutil\load_dso.h"></File>
-				<File RelativePath="..\dtool\src\dtoolutil\pandaSystem.cxx"></File>
-				<File RelativePath="..\dtool\src\dtoolutil\pandaFileStream.h"></File>
-				<File RelativePath="..\dtool\src\dtoolutil\pandaVersion.h"></File>
-				<File RelativePath="..\dtool\src\dtoolutil\pfstream.I"></File>
-			</Filter>
-			<Filter Name="test_interrogate">
-				<File RelativePath="..\dtool\src\test_interrogate\test_lib.h"></File>
-				<File RelativePath="..\dtool\src\test_interrogate\test_lib.cxx"></File>
-				<File RelativePath="..\dtool\src\test_interrogate\test_interrogate.cxx"></File>
-			</Filter>
-			<Filter Name="interrogate">
-				<File RelativePath="..\dtool\src\interrogate\interrogateBuilder.cxx"></File>
-				<File RelativePath="..\dtool\src\interrogate\functionWriterPtrToPython.cxx"></File>
-				<File RelativePath="..\dtool\src\interrogate\parameterRemapToString.h"></File>
-				<File RelativePath="..\dtool\src\interrogate\interrogate_composite1.cxx"></File>
-				<File RelativePath="..\dtool\src\interrogate\functionWriter.h"></File>
-				<File RelativePath="..\dtool\src\interrogate\parameterRemap.I"></File>
-				<File RelativePath="..\dtool\src\interrogate\functionRemap.cxx"></File>
-				<File RelativePath="..\dtool\src\interrogate\interfaceMakerPythonObj.h"></File>
-				<File RelativePath="..\dtool\src\interrogate\parameterRemapBasicStringToString.cxx"></File>
-				<File RelativePath="..\dtool\src\interrogate\parameterRemap.cxx"></File>
-				<File RelativePath="..\dtool\src\interrogate\parameterRemapReferenceToPointer.h"></File>
-				<File RelativePath="..\dtool\src\interrogate\parameterRemapToString.cxx"></File>
-				<File RelativePath="..\dtool\src\interrogate\parameterRemapBasicStringRefToString.h"></File>
-				<File RelativePath="..\dtool\src\interrogate\interrogate_composite2.cxx"></File>
-				<File RelativePath="..\dtool\src\interrogate\typeManager.cxx"></File>
-				<File RelativePath="..\dtool\src\interrogate\parameterRemapCharStarToString.h"></File>
-				<File RelativePath="..\dtool\src\interrogate\parse_file.cxx"></File>
-				<File RelativePath="..\dtool\src\interrogate\interrogateBuilder.h"></File>
-				<File RelativePath="..\dtool\src\interrogate\parameterRemapThis.cxx"></File>
-				<File RelativePath="..\dtool\src\interrogate\parameterRemapEnumToInt.cxx"></File>
-				<File RelativePath="..\dtool\src\interrogate\parameterRemapPTToPointer.cxx"></File>
-				<File RelativePath="..\dtool\src\interrogate\parameterRemapEnumToInt.h"></File>
-				<File RelativePath="..\dtool\src\interrogate\interfaceMakerPythonObj.cxx"></File>
-				<File RelativePath="..\dtool\src\interrogate\parameterRemapBasicStringRefToString.cxx"></File>
-				<File RelativePath="..\dtool\src\interrogate\parameterRemapPTToPointer.h"></File>
-				<File RelativePath="..\dtool\src\interrogate\interrogate.cxx"></File>
-				<File RelativePath="..\dtool\src\interrogate\interfaceMakerC.cxx"></File>
-				<File RelativePath="..\dtool\src\interrogate\parameterRemapConstToNonConst.cxx"></File>
-				<File RelativePath="..\dtool\src\interrogate\parameterRemapReferenceToConcrete.cxx"></File>
-				<File RelativePath="..\dtool\src\interrogate\parameterRemapUnchanged.h"></File>
-				<File RelativePath="..\dtool\src\interrogate\parameterRemapReferenceToConcrete.h"></File>
-				<File RelativePath="..\dtool\src\interrogate\typeManager.h"></File>
-				<File RelativePath="..\dtool\src\interrogate\parameterRemapConstToNonConst.h"></File>
-				<File RelativePath="..\dtool\src\interrogate\interrogate_composite.cxx"></File>
-				<File RelativePath="..\dtool\src\interrogate\parameterRemapReferenceToPointer.cxx"></File>
-				<File RelativePath="..\dtool\src\interrogate\functionRemap.h"></File>
-				<File RelativePath="..\dtool\src\interrogate\interfaceMakerPythonNative.h"></File>
-				<File RelativePath="..\dtool\src\interrogate\interfaceMaker.h"></File>
-				<File RelativePath="..\dtool\src\interrogate\functionWriterPtrFromPython.h"></File>
-				<File RelativePath="..\dtool\src\interrogate\interfaceMakerPython.cxx"></File>
-				<File RelativePath="..\dtool\src\interrogate\parameterRemapConcreteToPointer.cxx"></File>
-				<File RelativePath="..\dtool\src\interrogate\parameterRemapBasicStringToString.h"></File>
-				<File RelativePath="..\dtool\src\interrogate\functionWriters.cxx"></File>
-				<File RelativePath="..\dtool\src\interrogate\interfaceMakerPythonNative.cxx"></File>
-				<File RelativePath="..\dtool\src\interrogate\functionWriterPtrToPython.h"></File>
-				<File RelativePath="..\dtool\src\interrogate\interfaceMakerPythonSimple.cxx"></File>
-				<File RelativePath="..\dtool\src\interrogate\parameterRemapUnchanged.cxx"></File>
-				<File RelativePath="..\dtool\src\interrogate\functionWriters.h"></File>
-				<File RelativePath="..\dtool\src\interrogate\interfaceMakerPython.h"></File>
-				<File RelativePath="..\dtool\src\interrogate\functionWriter.cxx"></File>
-				<File RelativePath="..\dtool\src\interrogate\interfaceMakerC.h"></File>
-				<File RelativePath="..\dtool\src\interrogate\interfaceMakerPythonSimple.h"></File>
-				<File RelativePath="..\dtool\src\interrogate\parameterRemapThis.h"></File>
-				<File RelativePath="..\dtool\src\interrogate\parameterRemapCharStarToString.cxx"></File>
-				<File RelativePath="..\dtool\src\interrogate\interrogate_module.cxx"></File>
-				<File RelativePath="..\dtool\src\interrogate\parameterRemapConcreteToPointer.h"></File>
-				<File RelativePath="..\dtool\src\interrogate\interrogate.h"></File>
-				<File RelativePath="..\dtool\src\interrogate\functionWriterPtrFromPython.cxx"></File>
-				<File RelativePath="..\dtool\src\interrogate\parameterRemap.h"></File>
-				<File RelativePath="..\dtool\src\interrogate\interfaceMaker.cxx"></File>
-			</Filter>
-			<Filter Name="cppparser">
-				<File RelativePath="..\dtool\src\cppparser\cppManifest.cxx"></File>
-				<File RelativePath="..\dtool\src\cppparser\cppFunctionGroup.h"></File>
-				<File RelativePath="..\dtool\src\cppparser\cppIdentifier.h"></File>
-				<File RelativePath="..\dtool\src\cppparser\cppTypedef.h"></File>
-				<File RelativePath="..\dtool\src\cppparser\cppTBDType.cxx"></File>
-				<File RelativePath="..\dtool\src\cppparser\cppParser_composite2.cxx"></File>
-				<File RelativePath="..\dtool\src\cppparser\cppScope.cxx"></File>
-				<File RelativePath="..\dtool\src\cppparser\cppDeclaration.h"></File>
-				<File RelativePath="..\dtool\src\cppparser\cppTypeParser.cxx"></File>
-				<File RelativePath="..\dtool\src\cppparser\cppFile.cxx"></File>
-				<File RelativePath="..\dtool\src\cppparser\cppNameComponent.h"></File>
-				<File RelativePath="..\dtool\src\cppparser\cppVisibility.h"></File>
-				<File RelativePath="..\dtool\src\cppparser\cppParameterList.h"></File>
-				<File RelativePath="..\dtool\src\cppparser\cppConstType.cxx"></File>
-				<File RelativePath="..\dtool\src\cppparser\cppNamespace.cxx"></File>
-				<File RelativePath="..\dtool\src\cppparser\cppType.h"></File>
-				<File RelativePath="..\dtool\src\cppparser\cppExtensionType.h"></File>
-				<File RelativePath="..\dtool\src\cppparser\cppGlobals.h"></File>
-				<File RelativePath="..\dtool\src\cppparser\cppFunctionType.cxx"></File>
-				<File RelativePath="..\dtool\src\cppparser\cppVisibility.cxx"></File>
-				<File RelativePath="..\dtool\src\cppparser\cppInstance.cxx"></File>
-				<File RelativePath="..\dtool\src\cppparser\cppSimpleType.cxx"></File>
-				<File RelativePath="..\dtool\src\cppparser\cppBison.cxx"></File>
-				<File RelativePath="..\dtool\src\cppparser\cppUsing.h"></File>
-				<File RelativePath="..\dtool\src\cppparser\cppTemplateParameterList.cxx"></File>
-				<File RelativePath="..\dtool\src\cppparser\cppExpressionParser.cxx"></File>
-				<File RelativePath="..\dtool\src\cppparser\cppIdentifier.cxx"></File>
-				<File RelativePath="..\dtool\src\cppparser\cppToken.h"></File>
-				<File RelativePath="..\dtool\src\cppparser\cppPreprocessor.cxx"></File>
-				<File RelativePath="..\dtool\src\cppparser\cppBison.h"></File>
-				<File RelativePath="..\dtool\src\cppparser\cppInstanceIdentifier.cxx"></File>
-				<File RelativePath="..\dtool\src\cppparser\cppStructType.cxx"></File>
-				<File RelativePath="..\dtool\src\cppparser\cppManifest.h"></File>
-				<File RelativePath="..\dtool\src\cppparser\cppExpressionParser.h"></File>
-				<File RelativePath="..\dtool\src\cppparser\cppInstance.h"></File>
-				<File RelativePath="..\dtool\src\cppparser\cppStructType.h"></File>
-				<File RelativePath="..\dtool\src\cppparser\cppParameterList.cxx"></File>
-				<File RelativePath="..\dtool\src\cppparser\cppToken.cxx"></File>
-				<File RelativePath="..\dtool\src\cppparser\cppTemplateScope.h"></File>
-				<File RelativePath="..\dtool\src\cppparser\cppMakeSeq.h"></File>
-				<File RelativePath="..\dtool\src\cppparser\cppTypeProxy.cxx"></File>
-				<File RelativePath="..\dtool\src\cppparser\cppExtensionType.cxx"></File>
-				<File RelativePath="..\dtool\src\cppparser\cppTypedef.cxx"></File>
-				<File RelativePath="..\dtool\src\cppparser\cppClassTemplateParameter.cxx"></File>
-				<File RelativePath="..\dtool\src\cppparser\cppNamespace.h"></File>
-				<File RelativePath="..\dtool\src\cppparser\cppFunctionType.h"></File>
-				<File RelativePath="..\dtool\src\cppparser\cppParser_composite1.cxx"></File>
-				<File RelativePath="..\dtool\src\cppparser\cppSimpleType.h"></File>
-				<File RelativePath="..\dtool\src\cppparser\cppFunctionGroup.cxx"></File>
-				<File RelativePath="..\dtool\src\cppparser\cppBisonDefs.h"></File>
-				<File RelativePath="..\dtool\src\cppparser\cppInstanceIdentifier.h"></File>
-				<File RelativePath="..\dtool\src\cppparser\cppArrayType.cxx"></File>
-				<File RelativePath="..\dtool\src\cppparser\cppTemplateScope.cxx"></File>
-				<File RelativePath="..\dtool\src\cppparser\cppParser.h"></File>
-				<File RelativePath="..\dtool\src\cppparser\cppCommentBlock.cxx"></File>
-				<File RelativePath="..\dtool\src\cppparser\cppClassTemplateParameter.h"></File>
-				<File RelativePath="..\dtool\src\cppparser\cppDeclaration.cxx"></File>
-				<File RelativePath="..\dtool\src\cppparser\cppTBDType.h"></File>
-				<File RelativePath="..\dtool\src\cppparser\cppParser_composite.cxx"></File>
-				<File RelativePath="..\dtool\src\cppparser\cppReferenceType.cxx"></File>
-				<File RelativePath="..\dtool\src\cppparser\cppFile.h"></File>
-				<File RelativePath="..\dtool\src\cppparser\cppCommentBlock.h"></File>
-				<File RelativePath="..\dtool\src\cppparser\cppExpression.cxx"></File>
-				<File RelativePath="..\dtool\src\cppparser\cppTypeParser.h"></File>
-				<File RelativePath="..\dtool\src\cppparser\cppPointerType.cxx"></File>
-				<File RelativePath="..\dtool\src\cppparser\cppEnumType.cxx"></File>
-				<File RelativePath="..\dtool\src\cppparser\cppParser.cxx"></File>
-				<File RelativePath="..\dtool\src\cppparser\cppReferenceType.h"></File>
-				<File RelativePath="..\dtool\src\cppparser\cppPointerType.h"></File>
-				<File RelativePath="..\dtool\src\cppparser\cppConstType.h"></File>
-				<File RelativePath="..\dtool\src\cppparser\cppTypeDeclaration.h"></File>
-				<File RelativePath="..\dtool\src\cppparser\cppPreprocessor.h"></File>
-				<File RelativePath="..\dtool\src\cppparser\cppExpression.h"></File>
-				<File RelativePath="..\dtool\src\cppparser\cppType.cxx"></File>
-				<File RelativePath="..\dtool\src\cppparser\cppNameComponent.cxx"></File>
-				<File RelativePath="..\dtool\src\cppparser\cppScope.h"></File>
-				<File RelativePath="..\dtool\src\cppparser\cppMakeSeq.cxx"></File>
-				<File RelativePath="..\dtool\src\cppparser\cppEnumType.h"></File>
-				<File RelativePath="..\dtool\src\cppparser\cppTemplateParameterList.h"></File>
-				<File RelativePath="..\dtool\src\cppparser\cppGlobals.cxx"></File>
-				<File RelativePath="..\dtool\src\cppparser\cppArrayType.h"></File>
-				<File RelativePath="..\dtool\src\cppparser\cppTypeDeclaration.cxx"></File>
-				<File RelativePath="..\dtool\src\cppparser\cppUsing.cxx"></File>
-				<File RelativePath="..\dtool\src\cppparser\cppTypeProxy.h"></File>
-			</Filter>
-			<Filter Name="interrogatedb">
-				<File RelativePath="..\dtool\src\interrogatedb\interrogateComponent.I"></File>
-				<File RelativePath="..\dtool\src\interrogatedb\interrogateFunctionWrapper.h"></File>
-				<File RelativePath="..\dtool\src\interrogatedb\interrogateFunction.cxx"></File>
-				<File RelativePath="..\dtool\src\interrogatedb\interrogateFunction.I"></File>
-				<File RelativePath="..\dtool\src\interrogatedb\config_interrogatedb.h"></File>
-				<File RelativePath="..\dtool\src\interrogatedb\indexRemapper.cxx"></File>
-				<File RelativePath="..\dtool\src\interrogatedb\interrogateType.cxx"></File>
-				<File RelativePath="..\dtool\src\interrogatedb\interrogateManifest.I"></File>
-				<File RelativePath="..\dtool\src\interrogatedb\interrogatedb_composite2.cxx"></File>
-				<File RelativePath="..\dtool\src\interrogatedb\interrogateManifest.cxx"></File>
-				<File RelativePath="..\dtool\src\interrogatedb\interrogateComponent.h"></File>
-				<File RelativePath="..\dtool\src\interrogatedb\config_interrogatedb.cxx"></File>
-				<File RelativePath="..\dtool\src\interrogatedb\interrogateFunctionWrapper.cxx"></File>
-				<File RelativePath="..\dtool\src\interrogatedb\interrogate_interface.h"></File>
-				<File RelativePath="..\dtool\src\interrogatedb\interrogateElement.I"></File>
-				<File RelativePath="..\dtool\src\interrogatedb\interrogateType.I"></File>
-				<File RelativePath="..\dtool\src\interrogatedb\interrogate_datafile.cxx"></File>
-				<File RelativePath="..\dtool\src\interrogatedb\interrogateFunctionWrapper.I"></File>
-				<File RelativePath="..\dtool\src\interrogatedb\interrogateDatabase.I"></File>
-				<File RelativePath="..\dtool\src\interrogatedb\vector_int.cxx"></File>
-				<File RelativePath="..\dtool\src\interrogatedb\interrogateManifest.h"></File>
-				<File RelativePath="..\dtool\src\interrogatedb\interrogateElement.h"></File>
-				<File RelativePath="..\dtool\src\interrogatedb\interrogateType.h"></File>
-				<File RelativePath="..\dtool\src\interrogatedb\py_panda.h"></File>
-				<File RelativePath="..\dtool\src\interrogatedb\indexRemapper.h"></File>
-				<File RelativePath="..\dtool\src\interrogatedb\interrogate_request.h"></File>
-				<File RelativePath="..\dtool\src\interrogatedb\interrogateDatabase.cxx"></File>
-				<File RelativePath="..\dtool\src\interrogatedb\interrogate_request.cxx"></File>
-				<File RelativePath="..\dtool\src\interrogatedb\vector_int.h"></File>
-				<File RelativePath="..\dtool\src\interrogatedb\interrogateDatabase.h"></File>
-				<File RelativePath="..\dtool\src\interrogatedb\interrogatedb_composite.cxx"></File>
-				<File RelativePath="..\dtool\src\interrogatedb\interrogateComponent.cxx"></File>
-				<File RelativePath="..\dtool\src\interrogatedb\interrogate_interface.cxx"></File>
-				<File RelativePath="..\dtool\src\interrogatedb\interrogateElement.cxx"></File>
-				<File RelativePath="..\dtool\src\interrogatedb\interrogate_datafile.I"></File>
-				<File RelativePath="..\dtool\src\interrogatedb\dtool_super_base.cxx"></File>
-				<File RelativePath="..\dtool\src\interrogatedb\py_panda.cxx"></File>
-				<File RelativePath="..\dtool\src\interrogatedb\interrogateFunction.h"></File>
-				<File RelativePath="..\dtool\src\interrogatedb\interrogate_datafile.h"></File>
-				<File RelativePath="..\dtool\src\interrogatedb\interrogatedb_composite1.cxx"></File>
-			</Filter>
-			<Filter Name="prckeys">
-				<File RelativePath="..\dtool\src\prckeys\signPrcFile_src.cxx"></File>
-				<File RelativePath="..\dtool\src\prckeys\makePrcKey.cxx"></File>
-			</Filter>
-		</Filter>
-		<Filter Name="panda">
-			<Filter Name="char">
-				<File RelativePath="..\panda\src\char\characterVertexSlider.h"></File>
-				<File RelativePath="..\panda\src\char\characterJointBundle.cxx"></File>
-				<File RelativePath="..\panda\src\char\character.cxx"></File>
-				<File RelativePath="..\panda\src\char\jointVertexTransform.h"></File>
-				<File RelativePath="..\panda\src\char\characterVertexSlider.cxx"></File>
-				<File RelativePath="..\panda\src\char\characterJoint.cxx"></File>
-				<File RelativePath="..\panda\src\char\jointVertexTransform.I"></File>
-				<File RelativePath="..\panda\src\char\config_char.cxx"></File>
-				<File RelativePath="..\panda\src\char\char_composite1.cxx"></File>
-				<File RelativePath="..\panda\src\char\characterJointBundle.h"></File>
-				<File RelativePath="..\panda\src\char\characterSlider.cxx"></File>
-				<File RelativePath="..\panda\src\char\character.I"></File>
-				<File RelativePath="..\panda\src\char\jointVertexTransform.cxx"></File>
-				<File RelativePath="..\panda\src\char\char_composite2.cxx"></File>
-				<File RelativePath="..\panda\src\char\characterJointEffect.cxx"></File>
-				<File RelativePath="..\panda\src\char\characterJoint.h"></File>
-				<File RelativePath="..\panda\src\char\characterVertexSlider.I"></File>
-				<File RelativePath="..\panda\src\char\config_char.h"></File>
-				<File RelativePath="..\panda\src\char\character.h"></File>
-				<File RelativePath="..\panda\src\char\characterJointEffect.h"></File>
-				<File RelativePath="..\panda\src\char\char_composite.cxx"></File>
-				<File RelativePath="..\panda\src\char\characterSlider.h"></File>
-				<File RelativePath="..\panda\src\char\characterJointEffect.I"></File>
-				<File RelativePath="..\panda\src\char\characterJoint.I"></File>
-				<File RelativePath="..\panda\src\char\characterJointBundle.I"></File>
-			</Filter>
-			<Filter Name="gobj">
-				<File RelativePath="..\panda\src\gobj\geomEnums.cxx"></File>
-				<File RelativePath="..\panda\src\gobj\geomContext.h"></File>
-				<File RelativePath="..\panda\src\gobj\geomVertexData.h"></File>
-				<File RelativePath="..\panda\src\gobj\shaderContext.h"></File>
-				<File RelativePath="..\panda\src\gobj\transformBlend.I"></File>
-				<File RelativePath="..\panda\src\gobj\sliderTable.I"></File>
-				<File RelativePath="..\panda\src\gobj\gobj_composite1.cxx"></File>
-				<File RelativePath="..\panda\src\gobj\geomLinestrips.h"></File>
-				<File RelativePath="..\panda\src\gobj\preparedGraphicsObjects.h"></File>
-				<File RelativePath="..\panda\src\gobj\geomVertexReader.cxx"></File>
-				<File RelativePath="..\panda\src\gobj\transformTable.cxx"></File>
-				<File RelativePath="..\panda\src\gobj\transformBlendTable.h"></File>
-				<File RelativePath="..\panda\src\gobj\geomVertexAnimationSpec.I"></File>
-				<File RelativePath="..\panda\src\gobj\bufferContext.I"></File>
-				<File RelativePath="..\panda\src\gobj\gobj_composite.cxx"></File>
-				<File RelativePath="..\panda\src\gobj\materialPool.h"></File>
-				<File RelativePath="..\panda\src\gobj\orthographicLens.h"></File>
-				<File RelativePath="..\panda\src\gobj\geomPrimitive.I"></File>
-				<File RelativePath="..\panda\src\gobj\geomPoints.h"></File>
-				<File RelativePath="..\panda\src\gobj\geomVertexRewriter.I"></File>
-				<File RelativePath="..\panda\src\gobj\geomCacheManager.h"></File>
-				<File RelativePath="..\panda\src\gobj\lens.I"></File>
-				<File RelativePath="..\panda\src\gobj\geomPoints.cxx"></File>
-				<File RelativePath="..\panda\src\gobj\geomVertexFormat.I"></File>
-				<File RelativePath="..\panda\src\gobj\shaderContext.I"></File>
-				<File RelativePath="..\panda\src\gobj\lens.cxx"></File>
-				<File RelativePath="..\panda\src\gobj\vertexDataBlock.h"></File>
-				<File RelativePath="..\panda\src\gobj\geomCacheEntry.h"></File>
-				<File RelativePath="..\panda\src\gobj\transformTable.I"></File>
-				<File RelativePath="..\panda\src\gobj\preparedGraphicsObjects.cxx"></File>
-				<File RelativePath="..\panda\src\gobj\adaptiveLru.cxx"></File>
-				<File RelativePath="..\panda\src\gobj\geomTriangles.cxx"></File>
-				<File RelativePath="..\panda\src\gobj\vertexDataBuffer.cxx"></File>
-				<File RelativePath="..\panda\src\gobj\geom.I"></File>
-				<File RelativePath="..\panda\src\gobj\vertexDataPage.h"></File>
-				<File RelativePath="..\panda\src\gobj\materialPool.I"></File>
-				<File RelativePath="..\panda\src\gobj\geomCacheEntry.cxx"></File>
-				<File RelativePath="..\panda\src\gobj\vertexSlider.cxx"></File>
-				<File RelativePath="..\panda\src\gobj\geomLinestrips.cxx"></File>
-				<File RelativePath="..\panda\src\gobj\queryContext.I"></File>
-				<File RelativePath="..\panda\src\gobj\geomVertexWriter.h"></File>
-				<File RelativePath="..\panda\src\gobj\indexBufferContext.h"></File>
-				<File RelativePath="..\panda\src\gobj\geomLines.cxx"></File>
-				<File RelativePath="..\panda\src\gobj\savedContext.cxx"></File>
-				<File RelativePath="..\panda\src\gobj\perspectiveLens.I"></File>
-				<File RelativePath="..\panda\src\gobj\transformBlendTable.I"></File>
-				<File RelativePath="..\panda\src\gobj\geomVertexArrayData.I"></File>
-				<File RelativePath="..\panda\src\gobj\geomTriangles.h"></File>
-				<File RelativePath="..\panda\src\gobj\geomVertexAnimationSpec.cxx"></File>
-				<File RelativePath="..\panda\src\gobj\orthographicLens.I"></File>
-				<File RelativePath="..\panda\src\gobj\bufferResidencyTracker.cxx"></File>
-				<File RelativePath="..\panda\src\gobj\vertexDataBook.h"></File>
-				<File RelativePath="..\panda\src\gobj\vertexDataSaveFile.cxx"></File>
-				<File RelativePath="..\panda\src\gobj\texturePeeker.h"></File>
-				<File RelativePath="..\panda\src\gobj\queryContext.cxx"></File>
-				<File RelativePath="..\panda\src\gobj\geomVertexData.I"></File>
-				<File RelativePath="..\panda\src\gobj\geomMunger.I"></File>
-				<File RelativePath="..\panda\src\gobj\transformBlend.cxx"></File>
-				<File RelativePath="..\panda\src\gobj\textureContext.cxx"></File>
-				<File RelativePath="..\panda\src\gobj\internalName.I"></File>
-				<File RelativePath="..\panda\src\gobj\sliderTable.h"></File>
-				<File RelativePath="..\panda\src\gobj\vertexBufferContext.h"></File>
-				<File RelativePath="..\panda\src\gobj\geomEnums.h"></File>
-				<File RelativePath="..\panda\src\gobj\shader.I"></File>
-				<File RelativePath="..\panda\src\gobj\geomContext.I"></File>
-				<File RelativePath="..\panda\src\gobj\transformTable.h"></File>
-				<File RelativePath="..\panda\src\gobj\geomTristrips.cxx"></File>
-				<File RelativePath="..\panda\src\gobj\texture.I"></File>
-				<File RelativePath="..\panda\src\gobj\config_gobj.h"></File>
-				<File RelativePath="..\panda\src\gobj\texturePoolFilter.I"></File>
-				<File RelativePath="..\panda\src\gobj\bufferContextChain.cxx"></File>
-				<File RelativePath="..\panda\src\gobj\textureReloadRequest.h"></File>
-				<File RelativePath="..\panda\src\gobj\geomVertexWriter.cxx"></File>
-				<File RelativePath="..\panda\src\gobj\texturePoolFilter.h"></File>
-				<File RelativePath="..\panda\src\gobj\lens.h"></File>
-				<File RelativePath="..\panda\src\gobj\matrixLens.h"></File>
-				<File RelativePath="..\panda\src\gobj\adaptiveLru.h"></File>
-				<File RelativePath="..\panda\src\gobj\occlusionQueryContext.cxx"></File>
-				<File RelativePath="..\panda\src\gobj\textureStage.cxx"></File>
-				<File RelativePath="..\panda\src\gobj\vertexTransform.I"></File>
-				<File RelativePath="..\panda\src\gobj\vertexTransform.h"></File>
-				<File RelativePath="..\panda\src\gobj\occlusionQueryContext.h"></File>
-				<File RelativePath="..\panda\src\gobj\geomCacheManager.cxx"></File>
-				<File RelativePath="..\panda\src\gobj\vertexDataPage.I"></File>
-				<File RelativePath="..\panda\src\gobj\geomVertexRewriter.h"></File>
-				<File RelativePath="..\panda\src\gobj\geomTrifans.h"></File>
-				<File RelativePath="..\panda\src\gobj\vertexDataBuffer.I"></File>
-				<File RelativePath="..\panda\src\gobj\vertexDataPage.cxx"></File>
-				<File RelativePath="..\panda\src\gobj\bufferResidencyTracker.h"></File>
-				<File RelativePath="..\panda\src\gobj\geomVertexReader.I"></File>
-				<File RelativePath="..\panda\src\gobj\vertexSlider.h"></File>
-				<File RelativePath="..\panda\src\gobj\textureCollection.cxx"></File>
-				<File RelativePath="..\panda\src\gobj\orthographicLens.cxx"></File>
-				<File RelativePath="..\panda\src\gobj\queryContext.h"></File>
-				<File RelativePath="..\panda\src\gobj\shader.h"></File>
-				<File RelativePath="..\panda\src\gobj\textureCollection.h"></File>
-				<File RelativePath="..\panda\src\gobj\geomVertexColumn.h"></File>
-				<File RelativePath="..\panda\src\gobj\geomVertexAnimationSpec.h"></File>
-				<File RelativePath="..\panda\src\gobj\textureStage.I"></File>
-				<File RelativePath="..\panda\src\gobj\simpleLru.h"></File>
-				<File RelativePath="..\panda\src\gobj\material.cxx"></File>
-				<File RelativePath="..\panda\src\gobj\geomVertexWriter.I"></File>
-				<File RelativePath="..\panda\src\gobj\bufferContext.cxx"></File>
-				<File RelativePath="..\panda\src\gobj\textureContext.I"></File>
-				<File RelativePath="..\panda\src\gobj\internalName.h"></File>
-				<File RelativePath="..\panda\src\gobj\test_gobj.cxx"></File>
-				<File RelativePath="..\panda\src\gobj\geomTristrips.h"></File>
-				<File RelativePath="..\panda\src\gobj\textureContext.h"></File>
-				<File RelativePath="..\panda\src\gobj\config_gobj.cxx"></File>
-				<File RelativePath="..\panda\src\gobj\geomVertexArrayData.cxx"></File>
-				<File RelativePath="..\panda\src\gobj\shaderContext.cxx"></File>
-				<File RelativePath="..\panda\src\gobj\texturePeeker.cxx"></File>
-				<File RelativePath="..\panda\src\gobj\geomMunger.h"></File>
-				<File RelativePath="..\panda\src\gobj\vertexDataBook.cxx"></File>
-				<File RelativePath="..\panda\src\gobj\simpleAllocator.h"></File>
-				<File RelativePath="..\panda\src\gobj\simpleLru.I"></File>
-				<File RelativePath="..\panda\src\gobj\texturePool.cxx"></File>
-				<File RelativePath="..\panda\src\gobj\geomVertexArrayFormat.cxx"></File>
-				<File RelativePath="..\panda\src\gobj\geomVertexColumn.cxx"></File>
-				<File RelativePath="..\panda\src\gobj\userVertexSlider.I"></File>
-				<File RelativePath="..\panda\src\gobj\geomPrimitive.cxx"></File>
-				<File RelativePath="..\panda\src\gobj\indexBufferContext.cxx"></File>
-				<File RelativePath="..\panda\src\gobj\material.I"></File>
-				<File RelativePath="..\panda\src\gobj\bufferContextChain.I"></File>
-				<File RelativePath="..\panda\src\gobj\perspectiveLens.h"></File>
-				<File RelativePath="..\panda\src\gobj\materialPool.cxx"></File>
-				<File RelativePath="..\panda\src\gobj\vertexSlider.I"></File>
-				<File RelativePath="..\panda\src\gobj\videoTexture.h"></File>
-				<File RelativePath="..\panda\src\gobj\vertexBufferContext.cxx"></File>
-				<File RelativePath="..\panda\src\gobj\simpleLru.cxx"></File>
-				<File RelativePath="..\panda\src\gobj\vertexDataSaveFile.I"></File>
-				<File RelativePath="..\panda\src\gobj\geomVertexArrayFormat.h"></File>
-				<File RelativePath="..\panda\src\gobj\geom.h"></File>
-				<File RelativePath="..\panda\src\gobj\bufferContext.h"></File>
-				<File RelativePath="..\panda\src\gobj\internalName.cxx"></File>
-				<File RelativePath="..\panda\src\gobj\geomCacheManager.I"></File>
-				<File RelativePath="..\panda\src\gobj\bufferResidencyTracker.I"></File>
-				<File RelativePath="..\panda\src\gobj\vertexBufferContext.I"></File>
-				<File RelativePath="..\panda\src\gobj\geomTrifans.cxx"></File>
-				<File RelativePath="..\panda\src\gobj\geomVertexReader.h"></File>
-				<File RelativePath="..\panda\src\gobj\geomContext.cxx"></File>
-				<File RelativePath="..\panda\src\gobj\gobj_composite2.cxx"></File>
-				<File RelativePath="..\panda\src\gobj\texturePool.I"></File>
-				<File RelativePath="..\panda\src\gobj\vertexDataSaveFile.h"></File>
-				<File RelativePath="..\panda\src\gobj\sliderTable.cxx"></File>
-				<File RelativePath="..\panda\src\gobj\occlusionQueryContext.I"></File>
-				<File RelativePath="..\panda\src\gobj\userVertexSlider.cxx"></File>
-				<File RelativePath="..\panda\src\gobj\geomMunger.cxx"></File>
-				<File RelativePath="..\panda\src\gobj\texture.cxx"></File>
-				<File RelativePath="..\panda\src\gobj\savedContext.I"></File>
-				<File RelativePath="..\panda\src\gobj\textureReloadRequest.cxx"></File>
-				<File RelativePath="..\panda\src\gobj\geomVertexArrayFormat.I"></File>
-				<File RelativePath="..\panda\src\gobj\texture.h"></File>
-				<File RelativePath="..\panda\src\gobj\geomPrimitive.h"></File>
-				<File RelativePath="..\panda\src\gobj\geomVertexFormat.cxx"></File>
-				<File RelativePath="..\panda\src\gobj\simpleAllocator.cxx"></File>
-				<File RelativePath="..\panda\src\gobj\bufferContextChain.h"></File>
-				<File RelativePath="..\panda\src\gobj\texturePoolFilter.cxx"></File>
-				<File RelativePath="..\panda\src\gobj\indexBufferContext.I"></File>
-				<File RelativePath="..\panda\src\gobj\textureReloadRequest.I"></File>
-				<File RelativePath="..\panda\src\gobj\geomVertexColumn.I"></File>
-				<File RelativePath="..\panda\src\gobj\textureCollection.I"></File>
-				<File RelativePath="..\panda\src\gobj\userVertexTransform.I"></File>
-				<File RelativePath="..\panda\src\gobj\geomCacheEntry.I"></File>
-				<File RelativePath="..\panda\src\gobj\texturePeeker.I"></File>
-				<File RelativePath="..\panda\src\gobj\geomVertexArrayData.h"></File>
-				<File RelativePath="..\panda\src\gobj\geomLines.h"></File>
-				<File RelativePath="..\panda\src\gobj\savedContext.h"></File>
-				<File RelativePath="..\panda\src\gobj\perspectiveLens.cxx"></File>
-				<File RelativePath="..\panda\src\gobj\userVertexTransform.h"></File>
-				<File RelativePath="..\panda\src\gobj\preparedGraphicsObjects.I"></File>
-				<File RelativePath="..\panda\src\gobj\transformBlendTable.cxx"></File>
-				<File RelativePath="..\panda\src\gobj\geom.cxx"></File>
-				<File RelativePath="..\panda\src\gobj\vertexTransform.cxx"></File>
-				<File RelativePath="..\panda\src\gobj\matrixLens.I"></File>
-				<File RelativePath="..\panda\src\gobj\vertexDataBuffer.h"></File>
-				<File RelativePath="..\panda\src\gobj\shader.cxx"></File>
-				<File RelativePath="..\panda\src\gobj\textureStage.h"></File>
-				<File RelativePath="..\panda\src\gobj\userVertexTransform.cxx"></File>
-				<File RelativePath="..\panda\src\gobj\texturePool.h"></File>
-				<File RelativePath="..\panda\src\gobj\vertexDataBlock.cxx"></File>
-				<File RelativePath="..\panda\src\gobj\geomVertexRewriter.cxx"></File>
-				<File RelativePath="..\panda\src\gobj\material.h"></File>
-				<File RelativePath="..\panda\src\gobj\simpleAllocator.I"></File>
-				<File RelativePath="..\panda\src\gobj\geomVertexData.cxx"></File>
-				<File RelativePath="..\panda\src\gobj\geomVertexFormat.h"></File>
-				<File RelativePath="..\panda\src\gobj\videoTexture.I"></File>
-				<File RelativePath="..\panda\src\gobj\transformBlend.h"></File>
-				<File RelativePath="..\panda\src\gobj\vertexDataBook.I"></File>
-				<File RelativePath="..\panda\src\gobj\userVertexSlider.h"></File>
-				<File RelativePath="..\panda\src\gobj\videoTexture.cxx"></File>
-				<File RelativePath="..\panda\src\gobj\vertexDataBlock.I"></File>
-				<File RelativePath="..\panda\src\gobj\adaptiveLru.I"></File>
-				<File RelativePath="..\panda\src\gobj\matrixLens.cxx"></File>
-			</Filter>
-			<Filter Name="parametrics">
-				<File RelativePath="..\panda\src\parametrics\nurbsSurfaceResult.cxx"></File>
-				<File RelativePath="..\panda\src\parametrics\nurbsCurveResult.h"></File>
-				<File RelativePath="..\panda\src\parametrics\config_parametrics.h"></File>
-				<File RelativePath="..\panda\src\parametrics\nurbsVertex.h"></File>
-				<File RelativePath="..\panda\src\parametrics\sheetNode.h"></File>
-				<File RelativePath="..\panda\src\parametrics\nurbsVertex.cxx"></File>
-				<File RelativePath="..\panda\src\parametrics\cubicCurveseg.h"></File>
-				<File RelativePath="..\panda\src\parametrics\nurbsCurveEvaluator.h"></File>
-				<File RelativePath="..\panda\src\parametrics\parametrics_composite2.cxx"></File>
-				<File RelativePath="..\panda\src\parametrics\parametrics_composite.cxx"></File>
-				<File RelativePath="..\panda\src\parametrics\hermiteCurve.cxx"></File>
-				<File RelativePath="..\panda\src\parametrics\cubicCurveseg.cxx"></File>
-				<File RelativePath="..\panda\src\parametrics\sheetNode.I"></File>
-				<File RelativePath="..\panda\src\parametrics\ropeNode.I"></File>
-				<File RelativePath="..\panda\src\parametrics\nurbsCurve.h"></File>
-				<File RelativePath="..\panda\src\parametrics\nurbsCurveInterface.cxx"></File>
-				<File RelativePath="..\panda\src\parametrics\curveFitter.h"></File>
-				<File RelativePath="..\panda\src\parametrics\nurbsCurveResult.I"></File>
-				<File RelativePath="..\panda\src\parametrics\nurbsSurfaceEvaluator.cxx"></File>
-				<File RelativePath="..\panda\src\parametrics\nurbsCurveInterface.h"></File>
-				<File RelativePath="..\panda\src\parametrics\test_parametrics.cxx"></File>
-				<File RelativePath="..\panda\src\parametrics\ropeNode.cxx"></File>
-				<File RelativePath="..\panda\src\parametrics\ropeNode.h"></File>
-				<File RelativePath="..\panda\src\parametrics\parametricCurveCollection.cxx"></File>
-				<File RelativePath="..\panda\src\parametrics\nurbsSurfaceResult.I"></File>
-				<File RelativePath="..\panda\src\parametrics\nurbsSurfaceEvaluator.I"></File>
-				<File RelativePath="..\panda\src\parametrics\nurbsCurveResult.cxx"></File>
-				<File RelativePath="..\panda\src\parametrics\sheetNode.cxx"></File>
-				<File RelativePath="..\panda\src\parametrics\parametricCurve.cxx"></File>
-				<File RelativePath="..\panda\src\parametrics\nurbsCurveInterface.I"></File>
-				<File RelativePath="..\panda\src\parametrics\nurbsCurve.I"></File>
-				<File RelativePath="..\panda\src\parametrics\parametrics_composite1.cxx"></File>
-				<File RelativePath="..\panda\src\parametrics\nurbsCurveEvaluator.I"></File>
-				<File RelativePath="..\panda\src\parametrics\nurbsVertex.I"></File>
-				<File RelativePath="..\panda\src\parametrics\nurbsCurveEvaluator.cxx"></File>
-				<File RelativePath="..\panda\src\parametrics\parametricCurveCollection.h"></File>
-				<File RelativePath="..\panda\src\parametrics\piecewiseCurve.h"></File>
-				<File RelativePath="..\panda\src\parametrics\hermiteCurve.h"></File>
-				<File RelativePath="..\panda\src\parametrics\parametricCurveCollection.I"></File>
-				<File RelativePath="..\panda\src\parametrics\nurbsSurfaceEvaluator.h"></File>
-				<File RelativePath="..\panda\src\parametrics\nurbsCurve.cxx"></File>
-				<File RelativePath="..\panda\src\parametrics\piecewiseCurve.cxx"></File>
-				<File RelativePath="..\panda\src\parametrics\nurbsBasisVector.I"></File>
-				<File RelativePath="..\panda\src\parametrics\nurbsBasisVector.cxx"></File>
-				<File RelativePath="..\panda\src\parametrics\parametricCurve.h"></File>
-				<File RelativePath="..\panda\src\parametrics\nurbsBasisVector.h"></File>
-				<File RelativePath="..\panda\src\parametrics\config_parametrics.cxx"></File>
-				<File RelativePath="..\panda\src\parametrics\curveFitter.I"></File>
-				<File RelativePath="..\panda\src\parametrics\nurbsSurfaceResult.h"></File>
-				<File RelativePath="..\panda\src\parametrics\curveFitter.cxx"></File>
-			</Filter>
-			<Filter Name="linmath">
-				<File RelativePath="..\panda\src\linmath\vector_TexCoordf.h"></File>
-				<File RelativePath="..\panda\src\linmath\lvec3_ops_src.I"></File>
-				<File RelativePath="..\panda\src\linmath\lvector4_src.h"></File>
-				<File RelativePath="..\panda\src\linmath\vector_LVecBase3f.h"></File>
-				<File RelativePath="..\panda\src\linmath\lorientation.h"></File>
-				<File RelativePath="..\panda\src\linmath\linmath_composite.cxx"></File>
-				<File RelativePath="..\panda\src\linmath\compose_matrix.h"></File>
-				<File RelativePath="..\panda\src\linmath\lpoint3.cxx"></File>
-				<File RelativePath="..\panda\src\linmath\lvector2_src.cxx"></File>
-				<File RelativePath="..\panda\src\linmath\lpoint2.h"></File>
-				<File RelativePath="..\panda\src\linmath\lvecBase4_src.h"></File>
-				<File RelativePath="..\panda\src\linmath\vector_LPoint2f.h"></File>
-				<File RelativePath="..\panda\src\linmath\coordinateSystem.cxx"></File>
-				<File RelativePath="..\panda\src\linmath\deg_2_rad.h"></File>
-				<File RelativePath="..\panda\src\linmath\lorientation_src.cxx"></File>
-				<File RelativePath="..\panda\src\linmath\lorientation_src.I"></File>
-				<File RelativePath="..\panda\src\linmath\lvecBase2_src.h"></File>
-				<File RelativePath="..\panda\src\linmath\mathNumbers.cxx"></File>
-				<File RelativePath="..\panda\src\linmath\lquaternion_src.h"></File>
-				<File RelativePath="..\panda\src\linmath\lvec2_ops_src.I"></File>
-				<File RelativePath="..\panda\src\linmath\lrotation.h"></File>
-				<File RelativePath="..\panda\src\linmath\lpoint2.cxx"></File>
-				<File RelativePath="..\panda\src\linmath\cast_to_float.h"></File>
-				<File RelativePath="..\panda\src\linmath\lquaternion_src.I"></File>
-				<File RelativePath="..\panda\src\linmath\lvecBase3_src.h"></File>
-				<File RelativePath="..\panda\src\linmath\lpoint2_src.I"></File>
-				<File RelativePath="..\panda\src\linmath\lmatrix4_src.cxx"></File>
-				<File RelativePath="..\panda\src\linmath\compose_matrix_src.I"></File>
-				<File RelativePath="..\panda\src\linmath\lvec4_ops.h"></File>
-				<File RelativePath="..\panda\src\linmath\lvector3_src.I"></File>
-				<File RelativePath="..\panda\src\linmath\dblnames.h"></File>
-				<File RelativePath="..\panda\src\linmath\lrotation_src.h"></File>
-				<File RelativePath="..\panda\src\linmath\lvec2_ops.h"></File>
-				<File RelativePath="..\panda\src\linmath\lrotation.cxx"></File>
-				<File RelativePath="..\panda\src\linmath\lvector3.cxx"></File>
-				<File RelativePath="..\panda\src\linmath\lvector3_src.h"></File>
-				<File RelativePath="..\panda\src\linmath\cast_to_double.I"></File>
-				<File RelativePath="..\panda\src\linmath\lvector4.cxx"></File>
-				<File RelativePath="..\panda\src\linmath\lcast_to_src.h"></File>
-				<File RelativePath="..\panda\src\linmath\lvecBase2_src.I"></File>
-				<File RelativePath="..\panda\src\linmath\lvector4_src.I"></File>
-				<File RelativePath="..\panda\src\linmath\cast_to_double.h"></File>
-				<File RelativePath="..\panda\src\linmath\lvecBase4.h"></File>
-				<File RelativePath="..\panda\src\linmath\luse.h"></File>
-				<File RelativePath="..\panda\src\linmath\lvec2_ops_src.h"></File>
-				<File RelativePath="..\panda\src\linmath\compose_matrix.cxx"></File>
-				<File RelativePath="..\panda\src\linmath\lvecBase3_src.cxx"></File>
-				<File RelativePath="..\panda\src\linmath\lvecBase2.cxx"></File>
-				<File RelativePath="..\panda\src\linmath\lpoint3_src.cxx"></File>
-				<File RelativePath="..\panda\src\linmath\lvector2_src.h"></File>
-				<File RelativePath="..\panda\src\linmath\lrotation_src.cxx"></File>
-				<File RelativePath="..\panda\src\linmath\lmatrix.h"></File>
-				<File RelativePath="..\panda\src\linmath\lmatrix4_src.I"></File>
-				<File RelativePath="..\panda\src\linmath\lmatrix3_src.I"></File>
-				<File RelativePath="..\panda\src\linmath\compose_matrix_src.h"></File>
-				<File RelativePath="..\panda\src\linmath\lmat_ops.h"></File>
-				<File RelativePath="..\panda\src\linmath\config_linmath.h"></File>
-				<File RelativePath="..\panda\src\linmath\luse.I"></File>
-				<File RelativePath="..\panda\src\linmath\lvecBase3_src.I"></File>
-				<File RelativePath="..\panda\src\linmath\lorientation_src.h"></File>
-				<File RelativePath="..\panda\src\linmath\lquaternion_src.cxx"></File>
-				<File RelativePath="..\panda\src\linmath\mathNumbers.h"></File>
-				<File RelativePath="..\panda\src\linmath\lpoint3_src.I"></File>
-				<File RelativePath="..\panda\src\linmath\vector_Normalf.h"></File>
-				<File RelativePath="..\panda\src\linmath\lvecBase2.h"></File>
-				<File RelativePath="..\panda\src\linmath\lvector3_src.cxx"></File>
-				<File RelativePath="..\panda\src\linmath\lcast_to_src.I"></File>
-				<File RelativePath="..\panda\src\linmath\lpoint4_src.h"></File>
-				<File RelativePath="..\panda\src\linmath\cast_to_float.I"></File>
-				<File RelativePath="..\panda\src\linmath\lpoint2_src.cxx"></File>
-				<File RelativePath="..\panda\src\linmath\lcast_to.h"></File>
-				<File RelativePath="..\panda\src\linmath\linmath_composite1.cxx"></File>
-				<File RelativePath="..\panda\src\linmath\lmatrix3_src.cxx"></File>
-				<File RelativePath="..\panda\src\linmath\flt2dblnames.h"></File>
-				<File RelativePath="..\panda\src\linmath\lmatrix3_src.h"></File>
-				<File RelativePath="..\panda\src\linmath\fltnames.h"></File>
-				<File RelativePath="..\panda\src\linmath\vector_Colorf.h"></File>
-				<File RelativePath="..\panda\src\linmath\lmatrix4_src.h"></File>
-				<File RelativePath="..\panda\src\linmath\lpoint2_src.h"></File>
-				<File RelativePath="..\panda\src\linmath\lquaternion.h"></File>
-				<File RelativePath="..\panda\src\linmath\lrotation_src.I"></File>
-				<File RelativePath="..\panda\src\linmath\lvec3_ops.h"></File>
-				<File RelativePath="..\panda\src\linmath\lpoint4.cxx"></File>
-				<File RelativePath="..\panda\src\linmath\lmat_ops_src.I"></File>
-				<File RelativePath="..\panda\src\linmath\lpoint4.h"></File>
-				<File RelativePath="..\panda\src\linmath\aa_luse.h"></File>
-				<File RelativePath="..\panda\src\linmath\test_math.cxx"></File>
-				<File RelativePath="..\panda\src\linmath\lvector2_src.I"></File>
-				<File RelativePath="..\panda\src\linmath\lvec3_ops_src.h"></File>
-				<File RelativePath="..\panda\src\linmath\lmatrix.cxx"></File>
-				<File RelativePath="..\panda\src\linmath\lvecBase4_src.cxx"></File>
-				<File RelativePath="..\panda\src\linmath\mathNumbers.I"></File>
-				<File RelativePath="..\panda\src\linmath\lvector4.h"></File>
-				<File RelativePath="..\panda\src\linmath\lvecBase3.h"></File>
-				<File RelativePath="..\panda\src\linmath\lquaternion.cxx"></File>
-				<File RelativePath="..\panda\src\linmath\dbl2fltnames.h"></File>
-				<File RelativePath="..\panda\src\linmath\compose_matrix_src.cxx"></File>
-				<File RelativePath="..\panda\src\linmath\vector_Vertexf.cxx"></File>
-				<File RelativePath="..\panda\src\linmath\config_linmath.cxx"></File>
-				<File RelativePath="..\panda\src\linmath\lvecBase2_src.cxx"></File>
-				<File RelativePath="..\panda\src\linmath\vector_Normalf.cxx"></File>
-				<File RelativePath="..\panda\src\linmath\lvec4_ops_src.I"></File>
-				<File RelativePath="..\panda\src\linmath\vector_Vertexf.h"></File>
-				<File RelativePath="..\panda\src\linmath\lvector4_src.cxx"></File>
-				<File RelativePath="..\panda\src\linmath\lmat_ops_src.h"></File>
-				<File RelativePath="..\panda\src\linmath\lvecBase3.cxx"></File>
-				<File RelativePath="..\panda\src\linmath\vector_LVecBase3f.cxx"></File>
-				<File RelativePath="..\panda\src\linmath\lpoint3_src.h"></File>
-				<File RelativePath="..\panda\src\linmath\lpoint4_src.I"></File>
-				<File RelativePath="..\panda\src\linmath\linmath_composite2.cxx"></File>
-				<File RelativePath="..\panda\src\linmath\lvector2.cxx"></File>
-				<File RelativePath="..\panda\src\linmath\coordinateSystem.h"></File>
-				<File RelativePath="..\panda\src\linmath\lpoint4_src.cxx"></File>
-				<File RelativePath="..\panda\src\linmath\lpoint3.h"></File>
-				<File RelativePath="..\panda\src\linmath\vector_Colorf.cxx"></File>
-				<File RelativePath="..\panda\src\linmath\lvecBase4_src.I"></File>
-				<File RelativePath="..\panda\src\linmath\lvecBase4.cxx"></File>
-				<File RelativePath="..\panda\src\linmath\lvector3.h"></File>
-				<File RelativePath="..\panda\src\linmath\lvec4_ops_src.h"></File>
-				<File RelativePath="..\panda\src\linmath\lorientation.cxx"></File>
-				<File RelativePath="..\panda\src\linmath\luse.cxx"></File>
-				<File RelativePath="..\panda\src\linmath\lvector2.h"></File>
-				<File RelativePath="..\panda\src\linmath\vector_LPoint2f.cxx"></File>
-			</Filter>
-			<Filter Name="collide">
-				<File RelativePath="..\panda\src\collide\collisionHandlerEvent.cxx"></File>
-				<File RelativePath="..\panda\src\collide\collisionHandlerFloor.I"></File>
-				<File RelativePath="..\panda\src\collide\collisionParabola.cxx"></File>
-				<File RelativePath="..\panda\src\collide\collisionHandlerFloor.cxx"></File>
-				<File RelativePath="..\panda\src\collide\collisionRay.h"></File>
-				<File RelativePath="..\panda\src\collide\collisionHandlerFluidPusher.cxx"></File>
-				<File RelativePath="..\panda\src\collide\collisionSphere.cxx"></File>
-				<File RelativePath="..\panda\src\collide\collisionHandler.cxx"></File>
-				<File RelativePath="..\panda\src\collide\collisionLevelState.cxx"></File>
-				<File RelativePath="..\panda\src\collide\collisionRecorder.h"></File>
-				<File RelativePath="..\panda\src\collide\collisionLine.I"></File>
-				<File RelativePath="..\panda\src\collide\collisionHandlerFluidPusher.h"></File>
-				<File RelativePath="..\panda\src\collide\config_collide.h"></File>
-				<File RelativePath="..\panda\src\collide\collisionTube.h"></File>
-				<File RelativePath="..\panda\src\collide\collisionSegment.cxx"></File>
-				<File RelativePath="..\panda\src\collide\collide_composite1.cxx"></File>
-				<File RelativePath="..\panda\src\collide\collisionSolid.I"></File>
-				<File RelativePath="..\panda\src\collide\collisionVisualizer.cxx"></File>
-				<File RelativePath="..\panda\src\collide\collisionInvSphere.h"></File>
-				<File RelativePath="..\panda\src\collide\collisionHandlerFluidPusher.I"></File>
-				<File RelativePath="..\panda\src\collide\collisionNode.h"></File>
-				<File RelativePath="..\panda\src\collide\collisionGeom.I"></File>
-				<File RelativePath="..\panda\src\collide\collisionSegment.I"></File>
-				<File RelativePath="..\panda\src\collide\collisionTube.cxx"></File>
-				<File RelativePath="..\panda\src\collide\collisionHandlerQueue.h"></File>
-				<File RelativePath="..\panda\src\collide\collisionParabola.I"></File>
-				<File RelativePath="..\panda\src\collide\collisionPlane.cxx"></File>
-				<File RelativePath="..\panda\src\collide\collisionHandlerEvent.h"></File>
-				<File RelativePath="..\panda\src\collide\collisionTraverser.cxx"></File>
-				<File RelativePath="..\panda\src\collide\collisionPlane.h"></File>
-				<File RelativePath="..\panda\src\collide\collisionDSSolid.I"></File>
-				<File RelativePath="..\panda\src\collide\collide_composite2.cxx"></File>
-				<File RelativePath="..\panda\src\collide\collisionHandlerGravity.h"></File>
-				<File RelativePath="..\panda\src\collide\collisionHandlerPusher.I"></File>
-				<File RelativePath="..\panda\src\collide\collisionInvSphere.I"></File>
-				<File RelativePath="..\panda\src\collide\collisionLevelState.I"></File>
-				<File RelativePath="..\panda\src\collide\collisionSolid.cxx"></File>
-				<File RelativePath="..\panda\src\collide\collisionLevelStateBase.cxx"></File>
-				<File RelativePath="..\panda\src\collide\collisionPolygon.cxx"></File>
-				<File RelativePath="..\panda\src\collide\collisionSphere.I"></File>
-				<File RelativePath="..\panda\src\collide\collisionVisualizer.h"></File>
-				<File RelativePath="..\panda\src\collide\collisionHandlerPhysical.cxx"></File>
-				<File RelativePath="..\panda\src\collide\collisionDSSolid.cxx"></File>
-				<File RelativePath="..\panda\src\collide\collisionDSSolid.h"></File>
-				<File RelativePath="..\panda\src\collide\collisionSphere.h"></File>
-				<File RelativePath="..\panda\src\collide\collisionSegment.h"></File>
-				<File RelativePath="..\panda\src\collide\collisionVisualizer.I"></File>
-				<File RelativePath="..\panda\src\collide\collisionParabola.h"></File>
-				<File RelativePath="..\panda\src\collide\collisionNode.I"></File>
-				<File RelativePath="..\panda\src\collide\collisionHandlerEvent.I"></File>
-				<File RelativePath="..\panda\src\collide\collisionHandler.I"></File>
-				<File RelativePath="..\panda\src\collide\collisionFloorMesh.h"></File>
-				<File RelativePath="..\panda\src\collide\collisionTraverser.h"></File>
-				<File RelativePath="..\panda\src\collide\collisionHandlerPusher.h"></File>
-				<File RelativePath="..\panda\src\collide\collisionInvSphere.cxx"></File>
-				<File RelativePath="..\panda\src\collide\collisionLine.cxx"></File>
-				<File RelativePath="..\panda\src\collide\collisionEntry.I"></File>
-				<File RelativePath="..\panda\src\collide\collisionTube.I"></File>
-				<File RelativePath="..\panda\src\collide\collisionSolid.h"></File>
-				<File RelativePath="..\panda\src\collide\collisionPlane.I"></File>
-				<File RelativePath="..\panda\src\collide\collisionHandlerGravity.cxx"></File>
-				<File RelativePath="..\panda\src\collide\collisionRecorder.cxx"></File>
-				<File RelativePath="..\panda\src\collide\collisionLevelStateBase.I"></File>
-				<File RelativePath="..\panda\src\collide\collisionGeom.h"></File>
-				<File RelativePath="..\panda\src\collide\collisionLevelStateBase.h"></File>
-				<File RelativePath="..\panda\src\collide\collide_composite.cxx"></File>
-				<File RelativePath="..\panda\src\collide\collisionLevelState.h"></File>
-				<File RelativePath="..\panda\src\collide\collisionEntry.h"></File>
-				<File RelativePath="..\panda\src\collide\collisionHandlerPusher.cxx"></File>
-				<File RelativePath="..\panda\src\collide\collisionFloorMesh.I"></File>
-				<File RelativePath="..\panda\src\collide\collisionHandlerFloor.h"></File>
-				<File RelativePath="..\panda\src\collide\collisionPolygon.I"></File>
-				<File RelativePath="..\panda\src\collide\collisionHandlerQueue.cxx"></File>
-				<File RelativePath="..\panda\src\collide\collisionEntry.cxx"></File>
-				<File RelativePath="..\panda\src\collide\collisionRay.I"></File>
-				<File RelativePath="..\panda\src\collide\collisionHandlerPhysical.h"></File>
-				<File RelativePath="..\panda\src\collide\config_collide.cxx"></File>
-				<File RelativePath="..\panda\src\collide\collisionHandlerGravity.I"></File>
-				<File RelativePath="..\panda\src\collide\collisionLine.h"></File>
-				<File RelativePath="..\panda\src\collide\collisionHandlerPhysical.I"></File>
-				<File RelativePath="..\panda\src\collide\test_collide.cxx"></File>
-				<File RelativePath="..\panda\src\collide\collisionFloorMesh.cxx"></File>
-				<File RelativePath="..\panda\src\collide\collisionPolygon.h"></File>
-				<File RelativePath="..\panda\src\collide\collisionGeom.cxx"></File>
-				<File RelativePath="..\panda\src\collide\collisionTraverser.I"></File>
-				<File RelativePath="..\panda\src\collide\collisionRecorder.I"></File>
-				<File RelativePath="..\panda\src\collide\collisionHandler.h"></File>
-				<File RelativePath="..\panda\src\collide\collisionNode.cxx"></File>
-				<File RelativePath="..\panda\src\collide\collisionRay.cxx"></File>
-			</Filter>
-			<Filter Name="putil">
-				<File RelativePath="..\panda\src\putil\bamWriter.h"></File>
-				<File RelativePath="..\panda\src\putil\compareTo.h"></File>
-				<File RelativePath="..\panda\src\putil\globalPointerRegistry.cxx"></File>
-				<File RelativePath="..\panda\src\putil\ioPtaDatagramShort.cxx"></File>
-				<File RelativePath="..\panda\src\putil\callbackData.cxx"></File>
-				<File RelativePath="..\panda\src\putil\factory.I"></File>
-				<File RelativePath="..\panda\src\putil\firstOfPairLess.h"></File>
-				<File RelativePath="..\panda\src\putil\animInterface.I"></File>
-				<File RelativePath="..\panda\src\putil\loaderOptions.I"></File>
-				<File RelativePath="..\panda\src\putil\writableParam.I"></File>
-				<File RelativePath="..\panda\src\putil\loaderOptions.h"></File>
-				<File RelativePath="..\panda\src\putil\factoryParams.h"></File>
-				<File RelativePath="..\panda\src\putil\copyOnWriteObject.I"></File>
-				<File RelativePath="..\panda\src\putil\buttonRegistry.cxx"></File>
-				<File RelativePath="..\panda\src\putil\test_bam.h"></File>
-				<File RelativePath="..\panda\src\putil\writableParam.h"></File>
-				<File RelativePath="..\panda\src\putil\datagramInputFile.h"></File>
-				<File RelativePath="..\panda\src\putil\timedCycle.h"></File>
-				<File RelativePath="..\panda\src\putil\firstOfPairCompare.h"></File>
-				<File RelativePath="..\panda\src\putil\cPointerCallbackObject.h"></File>
-				<File RelativePath="..\panda\src\putil\nodeCachedReferenceCount.I"></File>
-				<File RelativePath="..\panda\src\putil\buttonHandle.h"></File>
-				<File RelativePath="..\panda\src\putil\pta_ushort.cxx"></File>
-				<File RelativePath="..\panda\src\putil\lineStreamBuf.I"></File>
-				<File RelativePath="..\panda\src\putil\modifierButtons.cxx"></File>
-				<File RelativePath="..\panda\src\putil\datagramInputFile.I"></File>
-				<File RelativePath="..\panda\src\putil\pbitops.I"></File>
-				<File RelativePath="..\panda\src\putil\test_uniqueIdAllocator.cxx"></File>
-				<File RelativePath="..\panda\src\putil\bamTextureMode.cxx"></File>
-				<File RelativePath="..\panda\src\putil\uniqueIdAllocator.cxx"></File>
-				<File RelativePath="..\panda\src\putil\loaderOptions.cxx"></File>
-				<File RelativePath="..\panda\src\putil\collideMask.h"></File>
-				<File RelativePath="..\panda\src\putil\vector_typedWritable.cxx"></File>
-				<File RelativePath="..\panda\src\putil\timedCycle.I"></File>
-				<File RelativePath="..\panda\src\putil\nameUniquifier.cxx"></File>
-				<File RelativePath="..\panda\src\putil\pythonCallbackObject.I"></File>
-				<File RelativePath="..\panda\src\putil\doubleBitMask.I"></File>
-				<File RelativePath="..\panda\src\putil\buttonRegistry.I"></File>
-				<File RelativePath="..\panda\src\putil\simpleHashMap.I"></File>
-				<File RelativePath="..\panda\src\putil\mouseButton.h"></File>
-				<File RelativePath="..\panda\src\putil\bamCache.cxx"></File>
-				<File RelativePath="..\panda\src\putil\updateSeq.I"></File>
-				<File RelativePath="..\panda\src\putil\bitArray.h"></File>
-				<File RelativePath="..\panda\src\putil\pta_int.cxx"></File>
-				<File RelativePath="..\panda\src\putil\globalPointerRegistry.h"></File>
-				<File RelativePath="..\panda\src\putil\keyboardButton.cxx"></File>
-				<File RelativePath="..\panda\src\putil\bamEndian.cxx"></File>
-				<File RelativePath="..\panda\src\putil\bamCacheIndex.cxx"></File>
-				<File RelativePath="..\panda\src\putil\factoryBase.h"></File>
-				<File RelativePath="..\panda\src\putil\linkedListNode.h"></File>
-				<File RelativePath="..\panda\src\putil\callbackObject.cxx"></File>
-				<File RelativePath="..\panda\src\putil\keyboardButton.h"></File>
-				<File RelativePath="..\panda\src\putil\vector_writable.h"></File>
-				<File RelativePath="..\panda\src\putil\callbackData.h"></File>
-				<File RelativePath="..\panda\src\putil\lineStream.I"></File>
-				<File RelativePath="..\panda\src\putil\factoryParam.I"></File>
-				<File RelativePath="..\panda\src\putil\sparseArray.cxx"></File>
-				<File RelativePath="..\panda\src\putil\vector_ushort.h"></File>
-				<File RelativePath="..\panda\src\putil\putil_composite2.cxx"></File>
-				<File RelativePath="..\panda\src\putil\string_utils.cxx"></File>
-				<File RelativePath="..\panda\src\putil\test_bam.cxx"></File>
-				<File RelativePath="..\panda\src\putil\buttonHandle.cxx"></File>
-				<File RelativePath="..\panda\src\putil\ioPtaDatagramInt.h"></File>
-				<File RelativePath="..\panda\src\putil\factory.h"></File>
-				<File RelativePath="..\panda\src\putil\factoryBase.cxx"></File>
-				<File RelativePath="..\panda\src\putil\linkedListNode.cxx"></File>
-				<File RelativePath="..\panda\src\putil\firstOfPairCompare.I"></File>
-				<File RelativePath="..\panda\src\putil\cPointerCallbackObject.cxx"></File>
-				<File RelativePath="..\panda\src\putil\bitMask.I"></File>
-				<File RelativePath="..\panda\src\putil\sparseArray.I"></File>
-				<File RelativePath="..\panda\src\putil\datagramOutputFile.cxx"></File>
-				<File RelativePath="..\panda\src\putil\typedWritableReferenceCount.cxx"></File>
-				<File RelativePath="..\panda\src\putil\typedWritable.cxx"></File>
-				<File RelativePath="..\panda\src\putil\timedCycle.cxx"></File>
-				<File RelativePath="..\panda\src\putil\writableConfigurable.cxx"></File>
-				<File RelativePath="..\panda\src\putil\bamReaderParam.h"></File>
-				<File RelativePath="..\panda\src\putil\mouseData.h"></File>
-				<File RelativePath="..\panda\src\putil\simpleHashMap.cxx"></File>
-				<File RelativePath="..\panda\src\putil\indirectCompareSort.h"></File>
-				<File RelativePath="..\panda\src\putil\copyOnWritePointer.h"></File>
-				<File RelativePath="..\panda\src\putil\clockObject.I"></File>
-				<File RelativePath="..\panda\src\putil\writableConfigurable.h"></File>
-				<File RelativePath="..\panda\src\putil\bamEndian.h"></File>
-				<File RelativePath="..\panda\src\putil\factoryParams.I"></File>
-				<File RelativePath="..\panda\src\putil\bamCacheIndex.h"></File>
-				<File RelativePath="..\panda\src\putil\vector_ushort.cxx"></File>
-				<File RelativePath="..\panda\src\putil\sparseArray.h"></File>
-				<File RelativePath="..\panda\src\putil\callbackObject.I"></File>
-				<File RelativePath="..\panda\src\putil\typedWritable.h"></File>
-				<File RelativePath="..\panda\src\putil\vector_double.h"></File>
-				<File RelativePath="..\panda\src\putil\pbitops.h"></File>
-				<File RelativePath="..\panda\src\putil\ioPtaDatagramFloat.h"></File>
-				<File RelativePath="..\panda\src\putil\test_filename.cxx"></File>
-				<File RelativePath="..\panda\src\putil\putil_composite1.cxx"></File>
-				<File RelativePath="..\panda\src\putil\mouseButton.cxx"></File>
-				<File RelativePath="..\panda\src\putil\indirectCompareNames.I"></File>
-				<File RelativePath="..\panda\src\putil\pbitops.cxx"></File>
-				<File RelativePath="..\panda\src\putil\clockObject.cxx"></File>
-				<File RelativePath="..\panda\src\putil\test_bamWrite.cxx"></File>
-				<File RelativePath="..\panda\src\putil\mouseData.cxx"></File>
-				<File RelativePath="..\panda\src\putil\vector_writable.cxx"></File>
-				<File RelativePath="..\panda\src\putil\pta_double.h"></File>
-				<File RelativePath="..\panda\src\putil\copyOnWritePointer.cxx"></File>
-				<File RelativePath="..\panda\src\putil\bitMask.cxx"></File>
-				<File RelativePath="..\panda\src\putil\config_util.h"></File>
-				<File RelativePath="..\panda\src\putil\clockObject.h"></File>
-				<File RelativePath="..\panda\src\putil\lineStream.h"></File>
-				<File RelativePath="..\panda\src\putil\datagramInputFile.cxx"></File>
-				<File RelativePath="..\panda\src\putil\ioPtaDatagramInt.cxx"></File>
-				<File RelativePath="..\panda\src\putil\load_prc_file.h"></File>
-				<File RelativePath="..\panda\src\putil\bamWriter.I"></File>
-				<File RelativePath="..\panda\src\putil\nameUniquifier.h"></File>
-				<File RelativePath="..\panda\src\putil\datagramOutputFile.h"></File>
-				<File RelativePath="..\panda\src\putil\load_prc_file.cxx"></File>
-				<File RelativePath="..\panda\src\putil\modifierButtons.I"></File>
-				<File RelativePath="..\panda\src\putil\cPointerCallbackObject.I"></File>
-				<File RelativePath="..\panda\src\putil\typedWritableReferenceCount.h"></File>
-				<File RelativePath="..\panda\src\putil\indirectCompareTo.h"></File>
-				<File RelativePath="..\panda\src\putil\buttonHandle.I"></File>
-				<File RelativePath="..\panda\src\putil\bitArray.cxx"></File>
-				<File RelativePath="..\panda\src\putil\nodeCachedReferenceCount.cxx"></File>
-				<File RelativePath="..\panda\src\putil\buttonRegistry.h"></File>
-				<File RelativePath="..\panda\src\putil\pta_ushort.h"></File>
-				<File RelativePath="..\panda\src\putil\vector_typedWritable.h"></File>
-				<File RelativePath="..\panda\src\putil\indirectCompareSort.I"></File>
-				<File RelativePath="..\panda\src\putil\factoryBase.I"></File>
-				<File RelativePath="..\panda\src\putil\updateSeq.h"></File>
-				<File RelativePath="..\panda\src\putil\writableParam.cxx"></File>
-				<File RelativePath="..\panda\src\putil\portalMask.h"></File>
-				<File RelativePath="..\panda\src\putil\bamCacheIndex.I"></File>
-				<File RelativePath="..\panda\src\putil\vector_ulong.h"></File>
-				<File RelativePath="..\panda\src\putil\typedWritable.I"></File>
-				<File RelativePath="..\panda\src\putil\pta_double.cxx"></File>
-				<File RelativePath="..\panda\src\putil\drawMask.h"></File>
-				<File RelativePath="..\panda\src\putil\doubleBitMask.cxx"></File>
-				<File RelativePath="..\panda\src\putil\bamCache.h"></File>
-				<File RelativePath="..\panda\src\putil\callbackData.I"></File>
-				<File RelativePath="..\panda\src\putil\indirectCompareTo.I"></File>
-				<File RelativePath="..\panda\src\putil\copyOnWritePointer.I"></File>
-				<File RelativePath="..\panda\src\putil\test_glob.cxx"></File>
-				<File RelativePath="..\panda\src\putil\updateSeq.cxx"></File>
-				<File RelativePath="..\panda\src\putil\vector_double.cxx"></File>
-				<File RelativePath="..\panda\src\putil\simpleHashMap.h"></File>
-				<File RelativePath="..\panda\src\putil\lineStream.cxx"></File>
-				<File RelativePath="..\panda\src\putil\uniqueIdAllocator.h"></File>
-				<File RelativePath="..\panda\src\putil\bamReader.I"></File>
-				<File RelativePath="..\panda\src\putil\cachedTypedWritableReferenceCount.h"></File>
-				<File RelativePath="..\panda\src\putil\bamCacheRecord.cxx"></File>
-				<File RelativePath="..\panda\src\putil\ioPtaDatagramFloat.cxx"></File>
-				<File RelativePath="..\panda\src\putil\bitMask.h"></File>
-				<File RelativePath="..\panda\src\putil\configurable.cxx"></File>
-				<File RelativePath="..\panda\src\putil\bamCache.I"></File>
-				<File RelativePath="..\panda\src\putil\pythonCallbackObject.h"></File>
-				<File RelativePath="..\panda\src\putil\copyOnWriteObject.h"></File>
-				<File RelativePath="..\panda\src\putil\pta_int.h"></File>
-				<File RelativePath="..\panda\src\putil\vector_ulong.cxx"></File>
-				<File RelativePath="..\panda\src\putil\test_bamRead.cxx"></File>
-				<File RelativePath="..\panda\src\putil\copyOnWriteObject.cxx"></File>
-				<File RelativePath="..\panda\src\putil\bamReader.h"></File>
-				<File RelativePath="..\panda\src\putil\factoryParams.cxx"></File>
-				<File RelativePath="..\panda\src\putil\bamReaderParam.cxx"></File>
-				<File RelativePath="..\panda\src\putil\factoryParam.h"></File>
-				<File RelativePath="..\panda\src\putil\putil_composite.cxx"></File>
-				<File RelativePath="..\panda\src\putil\configurable.h"></File>
-				<File RelativePath="..\panda\src\putil\bamTextureMode.h"></File>
-				<File RelativePath="..\panda\src\putil\bitArray.I"></File>
-				<File RelativePath="..\panda\src\putil\cachedTypedWritableReferenceCount.I"></File>
-				<File RelativePath="..\panda\src\putil\string_utils.h"></File>
-				<File RelativePath="..\panda\src\putil\indirectCompareNames.h"></File>
-				<File RelativePath="..\panda\src\putil\iterator_types.h"></File>
-				<File RelativePath="..\panda\src\putil\typedWritableReferenceCount.I"></File>
-				<File RelativePath="..\panda\src\putil\string_utils.I"></File>
-				<File RelativePath="..\panda\src\putil\bamCacheRecord.h"></File>
-				<File RelativePath="..\panda\src\putil\bamWriter.cxx"></File>
-				<File RelativePath="..\panda\src\putil\compareTo.I"></File>
-				<File RelativePath="..\panda\src\putil\bamReaderParam.I"></File>
-				<File RelativePath="..\panda\src\putil\animInterface.h"></File>
-				<File RelativePath="..\panda\src\putil\modifierButtons.h"></File>
-				<File RelativePath="..\panda\src\putil\doubleBitMask.h"></File>
-				<File RelativePath="..\panda\src\putil\bamReader.cxx"></File>
-				<File RelativePath="..\panda\src\putil\lineStreamBuf.cxx"></File>
-				<File RelativePath="..\panda\src\putil\nameUniquifier.I"></File>
-				<File RelativePath="..\panda\src\putil\bamCacheRecord.I"></File>
-				<File RelativePath="..\panda\src\putil\animInterface.cxx"></File>
-				<File RelativePath="..\panda\src\putil\lineStreamBuf.h"></File>
-				<File RelativePath="..\panda\src\putil\config_util.cxx"></File>
-				<File RelativePath="..\panda\src\putil\cachedTypedWritableReferenceCount.cxx"></File>
-				<File RelativePath="..\panda\src\putil\pythonCallbackObject.cxx"></File>
-				<File RelativePath="..\panda\src\putil\test_linestream.cxx"></File>
-				<File RelativePath="..\panda\src\putil\ioPtaDatagramShort.h"></File>
-				<File RelativePath="..\panda\src\putil\callbackObject.h"></File>
-				<File RelativePath="..\panda\src\putil\nodeCachedReferenceCount.h"></File>
-				<File RelativePath="..\panda\src\putil\datagramOutputFile.I"></File>
-				<File RelativePath="..\panda\src\putil\firstOfPairLess.I"></File>
-				<File RelativePath="..\panda\src\putil\globalPointerRegistry.I"></File>
-				<File RelativePath="..\panda\src\putil\bam.h"></File>
-				<File RelativePath="..\panda\src\putil\factoryParam.cxx"></File>
-				<File RelativePath="..\panda\src\putil\linkedListNode.I"></File>
-				<File RelativePath="..\panda\src\putil\mouseData.I"></File>
-			</Filter>
-			<Filter Name="dxgsg9">
-				<File RelativePath="..\panda\src\dxgsg9\wdxGraphicsPipe9.I"></File>
-				<File RelativePath="..\panda\src\dxgsg9\wdxGraphicsWindow9.cxx"></File>
-				<File RelativePath="..\panda\src\dxgsg9\dxGeomMunger9.I"></File>
-				<File RelativePath="..\panda\src\dxgsg9\dxShaderContext9.I"></File>
-				<File RelativePath="..\panda\src\dxgsg9\dxGraphicsStateGuardian9.I"></File>
-				<File RelativePath="..\panda\src\dxgsg9\vertexElementArray.cxx"></File>
-				<File RelativePath="..\panda\src\dxgsg9\dxVertexBufferContext9.h"></File>
-				<File RelativePath="..\panda\src\dxgsg9\wdxGraphicsBuffer9.h"></File>
-				<File RelativePath="..\panda\src\dxgsg9\dxGeomMunger9.h"></File>
-				<File RelativePath="..\panda\src\dxgsg9\dxTextureContext9.h"></File>
-				<File RelativePath="..\panda\src\dxgsg9\dxOcclusionQueryContext9.h"></File>
-				<File RelativePath="..\panda\src\dxgsg9\dxgsg9_composite.cxx"></File>
-				<File RelativePath="..\panda\src\dxgsg9\dxShaderContext9.h"></File>
-				<File RelativePath="..\panda\src\dxgsg9\dxOcclusionQueryContext9.cxx"></File>
-				<File RelativePath="..\panda\src\dxgsg9\dxgsg9_composite1.cxx"></File>
-				<File RelativePath="..\panda\src\dxgsg9\dxTextureContext9.cxx"></File>
-				<File RelativePath="..\panda\src\dxgsg9\wdxGraphicsPipe9.cxx"></File>
-				<File RelativePath="..\panda\src\dxgsg9\wdxGraphicsWindow9.h"></File>
-				<File RelativePath="..\panda\src\dxgsg9\dxOcclusionQueryContext9.I"></File>
-				<File RelativePath="..\panda\src\dxgsg9\dxGraphicsDevice9.cxx"></File>
-				<File RelativePath="..\panda\src\dxgsg9\dxInput9.h"></File>
-				<File RelativePath="..\panda\src\dxgsg9\dxGraphicsStateGuardian9.cxx"></File>
-				<File RelativePath="..\panda\src\dxgsg9\dxGeomMunger9.cxx"></File>
-				<File RelativePath="..\panda\src\dxgsg9\dxGraphicsStateGuardian9.h"></File>
-				<File RelativePath="..\panda\src\dxgsg9\dxTextureContext9.I"></File>
-				<File RelativePath="..\panda\src\dxgsg9\dxIndexBufferContext9.cxx"></File>
-				<File RelativePath="..\panda\src\dxgsg9\dxIndexBufferContext9.h"></File>
-				<File RelativePath="..\panda\src\dxgsg9\dxShaderContext9.cxx"></File>
-				<File RelativePath="..\panda\src\dxgsg9\dxIndexBufferContext9.I"></File>
-				<File RelativePath="..\panda\src\dxgsg9\dxInput9.cxx"></File>
-				<File RelativePath="..\panda\src\dxgsg9\wdxGraphicsBuffer9.cxx"></File>
-				<File RelativePath="..\panda\src\dxgsg9\wdxGraphicsWindow9.I"></File>
-				<File RelativePath="..\panda\src\dxgsg9\config_dxgsg9.cxx"></File>
-				<File RelativePath="..\panda\src\dxgsg9\dxgsg9base.h"></File>
-				<File RelativePath="..\panda\src\dxgsg9\wdxGraphicsPipe9.h"></File>
-				<File RelativePath="..\panda\src\dxgsg9\dxVertexBufferContext9.cxx"></File>
-				<File RelativePath="..\panda\src\dxgsg9\vertexElementArray.h"></File>
-				<File RelativePath="..\panda\src\dxgsg9\dxVertexBufferContext9.I"></File>
-				<File RelativePath="..\panda\src\dxgsg9\dxGraphicsDevice9.h"></File>
-				<File RelativePath="..\panda\src\dxgsg9\config_dxgsg9.h"></File>
-			</Filter>
-			<Filter Name="display">
-				<File RelativePath="..\panda\src\display\displayRegionCullCallbackData.I"></File>
-				<File RelativePath="..\panda\src\display\graphicsEngine.cxx"></File>
-				<File RelativePath="..\panda\src\display\displayRegionCullCallbackData.h"></File>
-				<File RelativePath="..\panda\src\display\renderBuffer.h"></File>
-				<File RelativePath="..\panda\src\display\graphicsEngine.h"></File>
-				<File RelativePath="..\panda\src\display\config_display.h"></File>
-				<File RelativePath="..\panda\src\display\display_composite2.cxx"></File>
-				<File RelativePath="..\panda\src\display\displayInformation.cxx"></File>
-				<File RelativePath="..\panda\src\display\windowProperties.I"></File>
-				<File RelativePath="..\panda\src\display\displayRegion.h"></File>
-				<File RelativePath="..\panda\src\display\displayRegionCullCallbackData.cxx"></File>
-				<File RelativePath="..\panda\src\display\graphicsOutput.cxx"></File>
-				<File RelativePath="..\panda\src\display\test_display.cxx"></File>
-				<File RelativePath="..\panda\src\display\graphicsBuffer.I"></File>
-				<File RelativePath="..\panda\src\display\stencilRenderStates.cxx"></File>
-				<File RelativePath="..\panda\src\display\stereoDisplayRegion.I"></File>
-				<File RelativePath="..\panda\src\display\graphicsWindowInputDevice.h"></File>
-				<File RelativePath="..\panda\src\display\graphicsThreadingModel.I"></File>
-				<File RelativePath="..\panda\src\display\parasiteBuffer.cxx"></File>
-				<File RelativePath="..\panda\src\display\stencilRenderStates.h"></File>
-				<File RelativePath="..\panda\src\display\frameBufferProperties.h"></File>
-				<File RelativePath="..\panda\src\display\graphicsPipeSelection.h"></File>
-				<File RelativePath="..\panda\src\display\standardMunger.I"></File>
-				<File RelativePath="..\panda\src\display\lru.cxx"></File>
-				<File RelativePath="..\panda\src\display\graphicsPipeSelection.cxx"></File>
-				<File RelativePath="..\panda\src\display\displayInformation.h"></File>
-				<File RelativePath="..\panda\src\display\display_composite1.cxx"></File>
-				<File RelativePath="..\panda\src\display\lru.h"></File>
-				<File RelativePath="..\panda\src\display\windowProperties.cxx"></File>
-				<File RelativePath="..\panda\src\display\drawableRegion.h"></File>
-				<File RelativePath="..\panda\src\display\graphicsBuffer.cxx"></File>
-				<File RelativePath="..\panda\src\display\drawableRegion.I"></File>
-				<File RelativePath="..\panda\src\display\graphicsBuffer.h"></File>
-				<File RelativePath="..\panda\src\display\parasiteBuffer.h"></File>
-				<File RelativePath="..\panda\src\display\graphicsPipeSelection.I"></File>
-				<File RelativePath="..\panda\src\display\graphicsWindow.I"></File>
-				<File RelativePath="..\panda\src\display\graphicsPipe.I"></File>
-				<File RelativePath="..\panda\src\display\displayRegion.I"></File>
-				<File RelativePath="..\panda\src\display\graphicsOutput.I"></File>
-				<File RelativePath="..\panda\src\display\graphicsEngine.I"></File>
-				<File RelativePath="..\panda\src\display\stereoDisplayRegion.cxx"></File>
-				<File RelativePath="..\panda\src\display\displayRegion.cxx"></File>
-				<File RelativePath="..\panda\src\display\graphicsWindow.cxx"></File>
-				<File RelativePath="..\panda\src\display\displayRegionDrawCallbackData.h"></File>
-				<File RelativePath="..\panda\src\display\stereoDisplayRegion.h"></File>
-				<File RelativePath="..\panda\src\display\graphicsOutput.h"></File>
-				<File RelativePath="..\panda\src\display\graphicsDevice.I"></File>
-				<File RelativePath="..\panda\src\display\graphicsThreadingModel.h"></File>
-				<File RelativePath="..\panda\src\display\drawableRegion.cxx"></File>
-				<File RelativePath="..\panda\src\display\display_composite.cxx"></File>
-				<File RelativePath="..\panda\src\display\standardMunger.cxx"></File>
-				<File RelativePath="..\panda\src\display\displaySearchParameters.h"></File>
-				<File RelativePath="..\panda\src\display\config_display.cxx"></File>
-				<File RelativePath="..\panda\src\display\graphicsThreadingModel.cxx"></File>
-				<File RelativePath="..\panda\src\display\standardMunger.h"></File>
-				<File RelativePath="..\panda\src\display\graphicsDevice.cxx"></File>
-				<File RelativePath="..\panda\src\display\graphicsStateGuardian.h"></File>
-				<File RelativePath="..\panda\src\display\parasiteBuffer.I"></File>
-				<File RelativePath="..\panda\src\display\windowProperties.h"></File>
-				<File RelativePath="..\panda\src\display\graphicsStateGuardian.cxx"></File>
-				<File RelativePath="..\panda\src\display\graphicsWindowInputDevice.I"></File>
-				<File RelativePath="..\panda\src\display\frameBufferProperties.cxx"></File>
-				<File RelativePath="..\panda\src\display\graphicsPipe.h"></File>
-				<File RelativePath="..\panda\src\display\frameBufferProperties.I"></File>
-				<File RelativePath="..\panda\src\display\displayRegionDrawCallbackData.cxx"></File>
-				<File RelativePath="..\panda\src\display\graphicsWindowInputDevice.cxx"></File>
-				<File RelativePath="..\panda\src\display\graphicsPipe.cxx"></File>
-				<File RelativePath="..\panda\src\display\graphicsStateGuardian.I"></File>
-				<File RelativePath="..\panda\src\display\graphicsWindow.h"></File>
-				<File RelativePath="..\panda\src\display\graphicsDevice.h"></File>
-				<File RelativePath="..\panda\src\display\displaySearchParameters.cxx"></File>
-				<File RelativePath="..\panda\src\display\displayRegionDrawCallbackData.I"></File>
-			</Filter>
-			<Filter Name="audio">
-				<File RelativePath="..\panda\src\audio\audioSound.I"></File>
-				<File RelativePath="..\panda\src\audio\config_audio.h"></File>
-				<File RelativePath="..\panda\src\audio\nullAudioSound.cxx"></File>
-				<File RelativePath="..\panda\src\audio\audio_composite1.cxx"></File>
-				<File RelativePath="..\panda\src\audio\filterProperties.h"></File>
-				<File RelativePath="..\panda\src\audio\nullAudioManager.cxx"></File>
-				<File RelativePath="..\panda\src\audio\audio_composite.cxx"></File>
-				<File RelativePath="..\panda\src\audio\filterProperties.I"></File>
-				<File RelativePath="..\panda\src\audio\test_audio.cxx"></File>
-				<File RelativePath="..\panda\src\audio\nullAudioManager.h"></File>
-				<File RelativePath="..\panda\src\audio\audioSound.cxx"></File>
-				<File RelativePath="..\panda\src\audio\config_audio.cxx"></File>
-				<File RelativePath="..\panda\src\audio\nullAudioSound.h"></File>
-				<File RelativePath="..\panda\src\audio\filterProperties.cxx"></File>
-				<File RelativePath="..\panda\src\audio\audioManager.h"></File>
-				<File RelativePath="..\panda\src\audio\audioLoadRequest.I"></File>
-				<File RelativePath="..\panda\src\audio\audioManager.cxx"></File>
-				<File RelativePath="..\panda\src\audio\audioLoadRequest.cxx"></File>
-				<File RelativePath="..\panda\src\audio\audio.h"></File>
-				<File RelativePath="..\panda\src\audio\audioManager.I"></File>
-				<File RelativePath="..\panda\src\audio\audioSound.h"></File>
-				<File RelativePath="..\panda\src\audio\audioLoadRequest.h"></File>
-			</Filter>
-			<Filter Name="recorder">
-				<File RelativePath="..\panda\src\recorder\socketStreamRecorder.I"></File>
-				<File RelativePath="..\panda\src\recorder\mouseRecorder.cxx"></File>
-				<File RelativePath="..\panda\src\recorder\socketStreamRecorder.h"></File>
-				<File RelativePath="..\panda\src\recorder\recorderTable.I"></File>
-				<File RelativePath="..\panda\src\recorder\recorderBase.cxx"></File>
-				<File RelativePath="..\panda\src\recorder\socketStreamRecorder.cxx"></File>
-				<File RelativePath="..\panda\src\recorder\recorderFrame.I"></File>
-				<File RelativePath="..\panda\src\recorder\recorderFrame.h"></File>
-				<File RelativePath="..\panda\src\recorder\recorderBase.h"></File>
-				<File RelativePath="..\panda\src\recorder\config_recorder.h"></File>
-				<File RelativePath="..\panda\src\recorder\recorderHeader.cxx"></File>
-				<File RelativePath="..\panda\src\recorder\recorderController.I"></File>
-				<File RelativePath="..\panda\src\recorder\recorder_composite1.cxx"></File>
-				<File RelativePath="..\panda\src\recorder\recorderController.cxx"></File>
-				<File RelativePath="..\panda\src\recorder\recorder_composite2.cxx"></File>
-				<File RelativePath="..\panda\src\recorder\recorderHeader.I"></File>
-				<File RelativePath="..\panda\src\recorder\config_recorder.cxx"></File>
-				<File RelativePath="..\panda\src\recorder\recorder_composite.cxx"></File>
-				<File RelativePath="..\panda\src\recorder\recorderController.h"></File>
-				<File RelativePath="..\panda\src\recorder\recorderFrame.cxx"></File>
-				<File RelativePath="..\panda\src\recorder\recorderHeader.h"></File>
-				<File RelativePath="..\panda\src\recorder\mouseRecorder.h"></File>
-				<File RelativePath="..\panda\src\recorder\recorderTable.h"></File>
-				<File RelativePath="..\panda\src\recorder\recorderTable.cxx"></File>
-				<File RelativePath="..\panda\src\recorder\recorderBase.I"></File>
-			</Filter>
-			<Filter Name="distort">
-				<File RelativePath="..\panda\src\distort\pSphereLens.I"></File>
-				<File RelativePath="..\panda\src\distort\cylindricalLens.cxx"></File>
-				<File RelativePath="..\panda\src\distort\fisheyeLens.h"></File>
-				<File RelativePath="..\panda\src\distort\fisheyeLens.cxx"></File>
-				<File RelativePath="..\panda\src\distort\distort_composite1.cxx"></File>
-				<File RelativePath="..\panda\src\distort\distort_composite.cxx"></File>
-				<File RelativePath="..\panda\src\distort\pSphereLens.h"></File>
-				<File RelativePath="..\panda\src\distort\projectionScreen.cxx"></File>
-				<File RelativePath="..\panda\src\distort\pSphereLens.cxx"></File>
-				<File RelativePath="..\panda\src\distort\projectionScreen.h"></File>
-				<File RelativePath="..\panda\src\distort\config_distort.cxx"></File>
-				<File RelativePath="..\panda\src\distort\nonlinearImager.cxx"></File>
-				<File RelativePath="..\panda\src\distort\cylindricalLens.h"></File>
-				<File RelativePath="..\panda\src\distort\cylindricalLens.I"></File>
-				<File RelativePath="..\panda\src\distort\config_distort.h"></File>
-				<File RelativePath="..\panda\src\distort\nonlinearImager.I"></File>
-				<File RelativePath="..\panda\src\distort\projectionScreen.I"></File>
-				<File RelativePath="..\panda\src\distort\fisheyeLens.I"></File>
-				<File RelativePath="..\panda\src\distort\nonlinearImager.h"></File>
-			</Filter>
-			<Filter Name="helix">
-				<File RelativePath="..\panda\src\helix\fivemmap.h"></File>
-				<File RelativePath="..\panda\src\helix\fivemmap.cxx"></File>
-				<File RelativePath="..\panda\src\helix\main.cpp"></File>
-				<File RelativePath="..\panda\src\helix\HxSiteSupplier.h"></File>
-				<File RelativePath="..\panda\src\helix\HxAuthenticationManager.h"></File>
-				<File RelativePath="..\panda\src\helix\config_helix.h"></File>
-				<File RelativePath="..\panda\src\helix\print.cxx"></File>
-				<File RelativePath="..\panda\src\helix\HelixDefs.h"></File>
-				<File RelativePath="..\panda\src\helix\HxAdviseSink.h"></File>
-				<File RelativePath="..\panda\src\helix\HxSiteSupplier.cxx"></File>
-				<File RelativePath="..\panda\src\helix\HxClientContext.cxx"></File>
-				<File RelativePath="..\panda\src\helix\print.h"></File>
-				<File RelativePath="..\panda\src\helix\HelixClient.cxx"></File>
-				<File RelativePath="..\panda\src\helix\HxErrorSink.h"></File>
-				<File RelativePath="..\panda\src\helix\HxClientContext.h"></File>
-				<File RelativePath="..\panda\src\helix\HxAuthenticationManager.cxx"></File>
-				<File RelativePath="..\panda\src\helix\HxErrorSink.cxx"></File>
-				<File RelativePath="..\panda\src\helix\HelixClient.h"></File>
-				<File RelativePath="..\panda\src\helix\MainHelix.h"></File>
-				<File RelativePath="..\panda\src\helix\iids.cxx"></File>
-				<File RelativePath="..\panda\src\helix\config_helix.cxx"></File>
-				<File RelativePath="..\panda\src\helix\HxAdviseSink.cxx"></File>
-			</Filter>
-			<Filter Name="wgldisplay">
-				<File RelativePath="..\panda\src\wgldisplay\wglGraphicsWindow.cxx"></File>
-				<File RelativePath="..\panda\src\wgldisplay\wglGraphicsBuffer.I"></File>
-				<File RelativePath="..\panda\src\wgldisplay\wglGraphicsWindow.h"></File>
-				<File RelativePath="..\panda\src\wgldisplay\wglGraphicsBuffer.cxx"></File>
-				<File RelativePath="..\panda\src\wgldisplay\config_wgldisplay.cxx"></File>
-				<File RelativePath="..\panda\src\wgldisplay\wglGraphicsPipe.h"></File>
-				<File RelativePath="..\panda\src\wgldisplay\wglGraphicsPipe.cxx"></File>
-				<File RelativePath="..\panda\src\wgldisplay\wglGraphicsPipe.I"></File>
-				<File RelativePath="..\panda\src\wgldisplay\wglext.h"></File>
-				<File RelativePath="..\panda\src\wgldisplay\wglGraphicsBuffer.h"></File>
-				<File RelativePath="..\panda\src\wgldisplay\wglGraphicsWindow.I"></File>
-				<File RelativePath="..\panda\src\wgldisplay\wglGraphicsStateGuardian.I"></File>
-				<File RelativePath="..\panda\src\wgldisplay\wgldisplay_composite.cxx"></File>
-				<File RelativePath="..\panda\src\wgldisplay\config_wgldisplay.h"></File>
-				<File RelativePath="..\panda\src\wgldisplay\wglGraphicsStateGuardian.cxx"></File>
-				<File RelativePath="..\panda\src\wgldisplay\wgldisplay_composite1.cxx"></File>
-				<File RelativePath="..\panda\src\wgldisplay\wglGraphicsStateGuardian.h"></File>
-			</Filter>
-			<Filter Name="glgsg">
-				<File RelativePath="..\panda\src\glgsg\glgsg.cxx"></File>
-				<File RelativePath="..\panda\src\glgsg\glgsg_composite1.cxx"></File>
-				<File RelativePath="..\panda\src\glgsg\config_glgsg.h"></File>
-				<File RelativePath="..\panda\src\glgsg\glgsg.h"></File>
-				<File RelativePath="..\panda\src\glgsg\glgsg_composite.cxx"></File>
-				<File RelativePath="..\panda\src\glgsg\config_glgsg.cxx"></File>
-			</Filter>
-			<Filter Name="dgraph">
-				<File RelativePath="..\panda\src\dgraph\dataNode.cxx"></File>
-				<File RelativePath="..\panda\src\dgraph\dataNodeTransmit.I"></File>
-				<File RelativePath="..\panda\src\dgraph\dataNodeTransmit.cxx"></File>
-				<File RelativePath="..\panda\src\dgraph\dataGraphTraverser.cxx"></File>
-				<File RelativePath="..\panda\src\dgraph\dataNode.h"></File>
-				<File RelativePath="..\panda\src\dgraph\dgraph_composite2.cxx"></File>
-				<File RelativePath="..\panda\src\dgraph\dgraph_composite1.cxx"></File>
-				<File RelativePath="..\panda\src\dgraph\config_dgraph.cxx"></File>
-				<File RelativePath="..\panda\src\dgraph\dataNodeTransmit.h"></File>
-				<File RelativePath="..\panda\src\dgraph\dataGraphTraverser.h"></File>
-				<File RelativePath="..\panda\src\dgraph\dgraph_composite.cxx"></File>
-				<File RelativePath="..\panda\src\dgraph\dataGraphTraverser.I"></File>
-				<File RelativePath="..\panda\src\dgraph\config_dgraph.h"></File>
-				<File RelativePath="..\panda\src\dgraph\dataNode.I"></File>
-			</Filter>
-			<Filter Name="glxdisplay">
-				<File RelativePath="..\panda\src\glxdisplay\glxGraphicsPixmap.I"></File>
-				<File RelativePath="..\panda\src\glxdisplay\glxGraphicsBuffer.h"></File>
-				<File RelativePath="..\panda\src\glxdisplay\glxGraphicsPixmap.h"></File>
-				<File RelativePath="..\panda\src\glxdisplay\glxGraphicsStateGuardian.h"></File>
-				<File RelativePath="..\panda\src\glxdisplay\glxGraphicsPixmap.cxx"></File>
-				<File RelativePath="..\panda\src\glxdisplay\glxext.h"></File>
-				<File RelativePath="..\panda\src\glxdisplay\glxGraphicsPipe.I"></File>
-				<File RelativePath="..\panda\src\glxdisplay\glxGraphicsWindow.cxx"></File>
-				<File RelativePath="..\panda\src\glxdisplay\glxdisplay_composite.cxx"></File>
-				<File RelativePath="..\panda\src\glxdisplay\glxdisplay_composite1.cxx"></File>
-				<File RelativePath="..\panda\src\glxdisplay\glxGraphicsPipe.h"></File>
-				<File RelativePath="..\panda\src\glxdisplay\config_glxdisplay.cxx"></File>
-				<File RelativePath="..\panda\src\glxdisplay\glxGraphicsStateGuardian.cxx"></File>
-				<File RelativePath="..\panda\src\glxdisplay\config_glxdisplay.h"></File>
-				<File RelativePath="..\panda\src\glxdisplay\glxGraphicsPipe.cxx"></File>
-				<File RelativePath="..\panda\src\glxdisplay\glxGraphicsBuffer.I"></File>
-				<File RelativePath="..\panda\src\glxdisplay\glxGraphicsStateGuardian.I"></File>
-				<File RelativePath="..\panda\src\glxdisplay\glxGraphicsWindow.I"></File>
-				<File RelativePath="..\panda\src\glxdisplay\glxGraphicsWindow.h"></File>
-				<File RelativePath="..\panda\src\glxdisplay\glxGraphicsBuffer.cxx"></File>
-			</Filter>
-			<Filter Name="tinydisplay">
-				<File RelativePath="..\panda\src\tinydisplay\ztriangle_1.cxx"></File>
-				<File RelativePath="..\panda\src\tinydisplay\tinyGraphicsBuffer.I"></File>
-				<File RelativePath="..\panda\src\tinydisplay\zmath.cxx"></File>
-				<File RelativePath="..\panda\src\tinydisplay\zdither.cxx"></File>
-				<File RelativePath="..\panda\src\tinydisplay\zbuffer.cxx"></File>
-				<File RelativePath="..\panda\src\tinydisplay\tinyOsxGraphicsPipe.cxx"></File>
-				<File RelativePath="..\panda\src\tinydisplay\tinydisplay_composite2.cxx"></File>
-				<File RelativePath="..\panda\src\tinydisplay\tinySDLGraphicsWindow.I"></File>
-				<File RelativePath="..\panda\src\tinydisplay\tinyOffscreenGraphicsPipe.cxx"></File>
-				<File RelativePath="..\panda\src\tinydisplay\error.cxx"></File>
-				<File RelativePath="..\panda\src\tinydisplay\tinyOffscreenGraphicsPipe.I"></File>
-				<File RelativePath="..\panda\src\tinydisplay\tinyWinGraphicsWindow.h"></File>
-				<File RelativePath="..\panda\src\tinydisplay\image_util.cxx"></File>
-				<File RelativePath="..\panda\src\tinydisplay\tinyOsxGraphicsPipe.I"></File>
-				<File RelativePath="..\panda\src\tinydisplay\tinyGeomMunger.h"></File>
-				<File RelativePath="..\panda\src\tinydisplay\tinyGeomMunger.cxx"></File>
-				<File RelativePath="..\panda\src\tinydisplay\tinyWinGraphicsPipe.cxx"></File>
-				<File RelativePath="..\panda\src\tinydisplay\td_texture.cxx"></File>
-				<File RelativePath="..\panda\src\tinydisplay\tinyWinGraphicsWindow.cxx"></File>
-				<File RelativePath="..\panda\src\tinydisplay\tinyOsxGraphicsWindow.h"></File>
-				<File RelativePath="..\panda\src\tinydisplay\config_tinydisplay.cxx"></File>
-				<File RelativePath="..\panda\src\tinydisplay\tinySDLGraphicsPipe.h"></File>
-				<File RelativePath="..\panda\src\tinydisplay\ztriangle_code_3.h"></File>
-				<File RelativePath="..\panda\src\tinydisplay\ztriangle_code_2.h"></File>
-				<File RelativePath="..\panda\src\tinydisplay\msghandling.cxx"></File>
-				<File RelativePath="..\panda\src\tinydisplay\tinyWinGraphicsPipe.h"></File>
-				<File RelativePath="..\panda\src\tinydisplay\ztriangle_code_4.h"></File>
-				<File RelativePath="..\panda\src\tinydisplay\specbuf.cxx"></File>
-				<File RelativePath="..\panda\src\tinydisplay\msghandling.h"></File>
-				<File RelativePath="..\panda\src\tinydisplay\ztriangle_table.h"></File>
-				<File RelativePath="..\panda\src\tinydisplay\tinydisplay_composite1.cxx"></File>
-				<File RelativePath="..\panda\src\tinydisplay\td_light.cxx"></File>
-				<File RelativePath="..\panda\src\tinydisplay\tinyXGraphicsWindow.cxx"></File>
-				<File RelativePath="..\panda\src\tinydisplay\config_tinydisplay.h"></File>
-				<File RelativePath="..\panda\src\tinydisplay\tinySDLGraphicsWindow.h"></File>
-				<File RelativePath="..\panda\src\tinydisplay\store_pixel.h"></File>
-				<File RelativePath="..\panda\src\tinydisplay\ztriangle.h"></File>
-				<File RelativePath="..\panda\src\tinydisplay\clip.cxx"></File>
-				<File RelativePath="..\panda\src\tinydisplay\tinyTextureContext.cxx"></File>
-				<File RelativePath="..\panda\src\tinydisplay\tinyGraphicsBuffer.h"></File>
-				<File RelativePath="..\panda\src\tinydisplay\zfeatures.h"></File>
-				<File RelativePath="..\panda\src\tinydisplay\store_pixel.cxx"></File>
-				<File RelativePath="..\panda\src\tinydisplay\tinyXGraphicsPipe.I"></File>
-				<File RelativePath="..\panda\src\tinydisplay\tinySDLGraphicsPipe.I"></File>
-				<File RelativePath="..\panda\src\tinydisplay\zgl.h"></File>
-				<File RelativePath="..\panda\src\tinydisplay\ztriangle_table.cxx"></File>
-				<File RelativePath="..\panda\src\tinydisplay\ztriangle_two.h"></File>
-				<File RelativePath="..\panda\src\tinydisplay\tinyTextureContext.I"></File>
-				<File RelativePath="..\panda\src\tinydisplay\store_pixel_code.h"></File>
-				<File RelativePath="..\panda\src\tinydisplay\tinySDLGraphicsWindow.cxx"></File>
-				<File RelativePath="..\panda\src\tinydisplay\tinyGeomMunger.I"></File>
-				<File RelativePath="..\panda\src\tinydisplay\tinyXGraphicsPipe.cxx"></File>
-				<File RelativePath="..\panda\src\tinydisplay\tinyGraphicsBuffer.cxx"></File>
-				<File RelativePath="..\panda\src\tinydisplay\tinyWinGraphicsPipe.I"></File>
-				<File RelativePath="..\panda\src\tinydisplay\store_pixel_table.h"></File>
-				<File RelativePath="..\panda\src\tinydisplay\tinyGraphicsStateGuardian.h"></File>
-				<File RelativePath="..\panda\src\tinydisplay\tinyTextureContext.h"></File>
-				<File RelativePath="..\panda\src\tinydisplay\zline.cxx"></File>
-				<File RelativePath="..\panda\src\tinydisplay\tinyOffscreenGraphicsPipe.h"></File>
-				<File RelativePath="..\panda\src\tinydisplay\ztriangle_4.cxx"></File>
-				<File RelativePath="..\panda\src\tinydisplay\ztriangle_code_1.h"></File>
-				<File RelativePath="..\panda\src\tinydisplay\tinyXGraphicsWindow.h"></File>
-				<File RelativePath="..\panda\src\tinydisplay\ztriangle_2.cxx"></File>
-				<File RelativePath="..\panda\src\tinydisplay\tinyOsxGraphicsWindow.I"></File>
-				<File RelativePath="..\panda\src\tinydisplay\ztriangle_3.cxx"></File>
-				<File RelativePath="..\panda\src\tinydisplay\init.cxx"></File>
-				<File RelativePath="..\panda\src\tinydisplay\zbuffer.h"></File>
-				<File RelativePath="..\panda\src\tinydisplay\vertex.cxx"></File>
-				<File RelativePath="..\panda\src\tinydisplay\tinyOsxGraphicsPipe.h"></File>
-				<File RelativePath="..\panda\src\tinydisplay\tinyWinGraphicsWindow.I"></File>
-				<File RelativePath="..\panda\src\tinydisplay\tinyGraphicsStateGuardian.cxx"></File>
-				<File RelativePath="..\panda\src\tinydisplay\tinyXGraphicsPipe.h"></File>
-				<File RelativePath="..\panda\src\tinydisplay\zmath.h"></File>
-				<File RelativePath="..\panda\src\tinydisplay\tinyGraphicsStateGuardian.I"></File>
-				<File RelativePath="..\panda\src\tinydisplay\tinySDLGraphicsPipe.cxx"></File>
-				<File RelativePath="..\panda\src\tinydisplay\tinyXGraphicsWindow.I"></File>
-				<File RelativePath="..\panda\src\tinydisplay\memory.cxx"></File>
-				<File RelativePath="..\panda\src\tinydisplay\zline.h"></File>
-			</Filter>
-			<Filter Name="event">
-				<File RelativePath="..\panda\src\event\asyncTaskChain.h"></File>
-				<File RelativePath="..\panda\src\event\asyncTaskCollection.h"></File>
-				<File RelativePath="..\panda\src\event\test_task.cxx"></File>
-				<File RelativePath="..\panda\src\event\buttonEvent.cxx"></File>
-				<File RelativePath="..\panda\src\event\event.I"></File>
-				<File RelativePath="..\panda\src\event\event_composite.cxx"></File>
-				<File RelativePath="..\panda\src\event\eventParameter.cxx"></File>
-				<File RelativePath="..\panda\src\event\eventHandler.I"></File>
-				<File RelativePath="..\panda\src\event\buttonEventList.cxx"></File>
-				<File RelativePath="..\panda\src\event\pointerEventList.cxx"></File>
-				<File RelativePath="..\panda\src\event\event_composite1.cxx"></File>
-				<File RelativePath="..\panda\src\event\asyncTask.cxx"></File>
-				<File RelativePath="..\panda\src\event\event_composite2.cxx"></File>
-				<File RelativePath="..\panda\src\event\config_event.h"></File>
-				<File RelativePath="..\panda\src\event\asyncTaskSequence.cxx"></File>
-				<File RelativePath="..\panda\src\event\asyncTaskPause.h"></File>
-				<File RelativePath="..\panda\src\event\pointerEventList.I"></File>
-				<File RelativePath="..\panda\src\event\genericAsyncTask.I"></File>
-				<File RelativePath="..\panda\src\event\asyncTaskPause.cxx"></File>
-				<File RelativePath="..\panda\src\event\asyncTask.h"></File>
-				<File RelativePath="..\panda\src\event\asyncTaskManager.cxx"></File>
-				<File RelativePath="..\panda\src\event\buttonEventList.I"></File>
-				<File RelativePath="..\panda\src\event\eventQueue.I"></File>
-				<File RelativePath="..\panda\src\event\buttonEvent.I"></File>
-				<File RelativePath="..\panda\src\event\genericAsyncTask.h"></File>
-				<File RelativePath="..\panda\src\event\pt_Event.h"></File>
-				<File RelativePath="..\panda\src\event\pythonTask.cxx"></File>
-				<File RelativePath="..\panda\src\event\eventHandler.h"></File>
-				<File RelativePath="..\panda\src\event\pythonTask.I"></File>
-				<File RelativePath="..\panda\src\event\buttonEvent.h"></File>
-				<File RelativePath="..\panda\src\event\asyncTaskChain.I"></File>
-				<File RelativePath="..\panda\src\event\genericAsyncTask.cxx"></File>
-				<File RelativePath="..\panda\src\event\eventQueue.h"></File>
-				<File RelativePath="..\panda\src\event\eventParameter.I"></File>
-				<File RelativePath="..\panda\src\event\asyncTaskSequence.h"></File>
-				<File RelativePath="..\panda\src\event\asyncTaskManager.I"></File>
-				<File RelativePath="..\panda\src\event\eventReceiver.cxx"></File>
-				<File RelativePath="..\panda\src\event\event.h"></File>
-				<File RelativePath="..\panda\src\event\config_event.cxx"></File>
-				<File RelativePath="..\panda\src\event\asyncTaskManager.h"></File>
-				<File RelativePath="..\panda\src\event\asyncTaskChain.cxx"></File>
-				<File RelativePath="..\panda\src\event\event.cxx"></File>
-				<File RelativePath="..\panda\src\event\eventHandler.cxx"></File>
-				<File RelativePath="..\panda\src\event\throw_event.I"></File>
-				<File RelativePath="..\panda\src\event\buttonEventList.h"></File>
-				<File RelativePath="..\panda\src\event\pythonTask.h"></File>
-				<File RelativePath="..\panda\src\event\pointerEvent.cxx"></File>
-				<File RelativePath="..\panda\src\event\pt_Event.cxx"></File>
-				<File RelativePath="..\panda\src\event\asyncTaskCollection.cxx"></File>
-				<File RelativePath="..\panda\src\event\eventParameter.h"></File>
-				<File RelativePath="..\panda\src\event\pointerEvent.I"></File>
-				<File RelativePath="..\panda\src\event\pointerEventList.h"></File>
-				<File RelativePath="..\panda\src\event\asyncTaskSequence.I"></File>
-				<File RelativePath="..\panda\src\event\eventReceiver.h"></File>
-				<File RelativePath="..\panda\src\event\asyncTask.I"></File>
-				<File RelativePath="..\panda\src\event\pointerEvent.h"></File>
-				<File RelativePath="..\panda\src\event\throw_event.h"></File>
-				<File RelativePath="..\panda\src\event\asyncTaskPause.I"></File>
-				<File RelativePath="..\panda\src\event\asyncTaskCollection.I"></File>
-				<File RelativePath="..\panda\src\event\eventQueue.cxx"></File>
-			</Filter>
-			<Filter Name="downloader">
-				<File RelativePath="..\panda\src\downloader\httpDigestAuthorization.I"></File>
-				<File RelativePath="..\panda\src\downloader\httpBasicAuthorization.h"></File>
-				<File RelativePath="..\panda\src\downloader\multiplexStreamBuf.I"></File>
-				<File RelativePath="..\panda\src\downloader\httpDate.h"></File>
-				<File RelativePath="..\panda\src\downloader\bioPtr.cxx"></File>
-				<File RelativePath="..\panda\src\downloader\virtualFileMountHTTP.h"></File>
-				<File RelativePath="..\panda\src\downloader\decompressor.h"></File>
-				<File RelativePath="..\panda\src\downloader\extractor.I"></File>
-				<File RelativePath="..\panda\src\downloader\socketStream.cxx"></File>
-				<File RelativePath="..\panda\src\downloader\urlSpec.cxx"></File>
-				<File RelativePath="..\panda\src\downloader\socketStream.h"></File>
-				<File RelativePath="..\panda\src\downloader\httpCookie.h"></File>
-				<File RelativePath="..\panda\src\downloader\download_utils.cxx"></File>
-				<File RelativePath="..\panda\src\downloader\identityStream.h"></File>
-				<File RelativePath="..\panda\src\downloader\decompressor.I"></File>
-				<File RelativePath="..\panda\src\downloader\httpCookie.cxx"></File>
-				<File RelativePath="..\panda\src\downloader\identityStreamBuf.h"></File>
-				<File RelativePath="..\panda\src\downloader\downloadDb.h"></File>
-				<File RelativePath="..\panda\src\downloader\httpChannel.h"></File>
-				<File RelativePath="..\panda\src\downloader\chunkedStreamBuf.I"></File>
-				<File RelativePath="..\panda\src\downloader\httpAuthorization.cxx"></File>
-				<File RelativePath="..\panda\src\downloader\virtualFileMountHTTP.cxx"></File>
-				<File RelativePath="..\panda\src\downloader\virtualFileHTTP.h"></File>
-				<File RelativePath="..\panda\src\downloader\virtualFileMountHTTP.I"></File>
-				<File RelativePath="..\panda\src\downloader\ssl_utils.cxx"></File>
-				<File RelativePath="..\panda\src\downloader\extractor.cxx"></File>
-				<File RelativePath="..\panda\src\downloader\documentSpec.cxx"></File>
-				<File RelativePath="..\panda\src\downloader\decompressor.cxx"></File>
-				<File RelativePath="..\panda\src\downloader\bioStreamBuf.cxx"></File>
-				<File RelativePath="..\panda\src\downloader\patcher.cxx"></File>
-				<File RelativePath="..\panda\src\downloader\extractor.h"></File>
-				<File RelativePath="..\panda\src\downloader\patcher.h"></File>
-				<File RelativePath="..\panda\src\downloader\bioPtr.I"></File>
-				<File RelativePath="..\panda\src\downloader\config_downloader.h"></File>
-				<File RelativePath="..\panda\src\downloader\config_downloader.cxx"></File>
-				<File RelativePath="..\panda\src\downloader\httpClient.I"></File>
-				<File RelativePath="..\panda\src\downloader\chunkedStreamBuf.h"></File>
-				<File RelativePath="..\panda\src\downloader\httpEnum.cxx"></File>
-				<File RelativePath="..\panda\src\downloader\virtualFileHTTP.cxx"></File>
-				<File RelativePath="..\panda\src\downloader\stringStream.h"></File>
-				<File RelativePath="..\panda\src\downloader\identityStreamBuf.I"></File>
-				<File RelativePath="..\panda\src\downloader\socketStream.I"></File>
-				<File RelativePath="..\panda\src\downloader\patcher.I"></File>
-				<File RelativePath="..\panda\src\downloader\multiplexStream.I"></File>
-				<File RelativePath="..\panda\src\downloader\identityStreamBuf.cxx"></File>
-				<File RelativePath="..\panda\src\downloader\bioStreamPtr.I"></File>
-				<File RelativePath="..\panda\src\downloader\httpAuthorization.I"></File>
-				<File RelativePath="..\panda\src\downloader\downloader_composite.cxx"></File>
-				<File RelativePath="..\panda\src\downloader\httpClient.h"></File>
-				<File RelativePath="..\panda\src\downloader\downloadDb.cxx"></File>
-				<File RelativePath="..\panda\src\downloader\stringStreamBuf.cxx"></File>
-				<File RelativePath="..\panda\src\downloader\urlSpec.I"></File>
-				<File RelativePath="..\panda\src\downloader\virtualFileHTTP.I"></File>
-				<File RelativePath="..\panda\src\downloader\chunkedStream.h"></File>
-				<File RelativePath="..\panda\src\downloader\bioStreamBuf.h"></File>
-				<File RelativePath="..\panda\src\downloader\chunkedStream.I"></File>
-				<File RelativePath="..\panda\src\downloader\ssl_utils.h"></File>
-				<File RelativePath="..\panda\src\downloader\download_utils.h"></File>
-				<File RelativePath="..\panda\src\downloader\multiplexStream.h"></File>
-				<File RelativePath="..\panda\src\downloader\httpEntityTag.cxx"></File>
-				<File RelativePath="..\panda\src\downloader\identityStream.I"></File>
-				<File RelativePath="..\panda\src\downloader\bioStream.I"></File>
-				<File RelativePath="..\panda\src\downloader\bioPtr.h"></File>
-				<File RelativePath="..\panda\src\downloader\multiplexStreamBuf.cxx"></File>
-				<File RelativePath="..\panda\src\downloader\identityStream.cxx"></File>
-				<File RelativePath="..\panda\src\downloader\httpEnum.h"></File>
-				<File RelativePath="..\panda\src\downloader\stringStream.I"></File>
-				<File RelativePath="..\panda\src\downloader\bioStream.h"></File>
-				<File RelativePath="..\panda\src\downloader\chunkedStream.cxx"></File>
-				<File RelativePath="..\panda\src\downloader\bioStreamPtr.h"></File>
-				<File RelativePath="..\panda\src\downloader\httpChannel.cxx"></File>
-				<File RelativePath="..\panda\src\downloader\downloader_composite2.cxx"></File>
-				<File RelativePath="..\panda\src\downloader\stringStreamBuf.I"></File>
-				<File RelativePath="..\panda\src\downloader\httpClient.cxx"></File>
-				<File RelativePath="..\panda\src\downloader\bioStream.cxx"></File>
-				<File RelativePath="..\panda\src\downloader\httpCookie.I"></File>
-				<File RelativePath="..\panda\src\downloader\httpAuthorization.h"></File>
-				<File RelativePath="..\panda\src\downloader\httpDate.cxx"></File>
-				<File RelativePath="..\panda\src\downloader\downloader_composite1.cxx"></File>
-				<File RelativePath="..\panda\src\downloader\httpDigestAuthorization.h"></File>
-				<File RelativePath="..\panda\src\downloader\httpDate.I"></File>
-				<File RelativePath="..\panda\src\downloader\multiplexStreamBuf.h"></File>
-				<File RelativePath="..\panda\src\downloader\stringStream.cxx"></File>
-				<File RelativePath="..\panda\src\downloader\bioStreamPtr.cxx"></File>
-				<File RelativePath="..\panda\src\downloader\httpEntityTag.h"></File>
-				<File RelativePath="..\panda\src\downloader\httpBasicAuthorization.I"></File>
-				<File RelativePath="..\panda\src\downloader\stringStreamBuf.h"></File>
-				<File RelativePath="..\panda\src\downloader\urlSpec.h"></File>
-				<File RelativePath="..\panda\src\downloader\httpDigestAuthorization.cxx"></File>
-				<File RelativePath="..\panda\src\downloader\multiplexStream.cxx"></File>
-				<File RelativePath="..\panda\src\downloader\documentSpec.I"></File>
-				<File RelativePath="..\panda\src\downloader\httpEntityTag.I"></File>
-				<File RelativePath="..\panda\src\downloader\chunkedStreamBuf.cxx"></File>
-				<File RelativePath="..\panda\src\downloader\downloadDb.I"></File>
-				<File RelativePath="..\panda\src\downloader\httpBasicAuthorization.cxx"></File>
-				<File RelativePath="..\panda\src\downloader\documentSpec.h"></File>
-				<File RelativePath="..\panda\src\downloader\httpChannel.I"></File>
-			</Filter>
-			<Filter Name="chan">
-				<File RelativePath="..\panda\src\chan\partSubset.I"></File>
-				<File RelativePath="..\panda\src\chan\animChannelFixed.I"></File>
-				<File RelativePath="..\panda\src\chan\animChannelScalarTable.cxx"></File>
-				<File RelativePath="..\panda\src\chan\config_chan.cxx"></File>
-				<File RelativePath="..\panda\src\chan\partBundleNode.h"></File>
-				<File RelativePath="..\panda\src\chan\animControl.I"></File>
-				<File RelativePath="..\panda\src\chan\movingPartScalar.I"></File>
-				<File RelativePath="..\panda\src\chan\movingPartBase.cxx"></File>
-				<File RelativePath="..\panda\src\chan\movingPartMatrix.I"></File>
-				<File RelativePath="..\panda\src\chan\config_chan.h"></File>
-				<File RelativePath="..\panda\src\chan\animChannelMatrixXfmTable.cxx"></File>
-				<File RelativePath="..\panda\src\chan\animChannelScalarDynamic.cxx"></File>
-				<File RelativePath="..\panda\src\chan\partGroup.I"></File>
-				<File RelativePath="..\panda\src\chan\animBundleNode.I"></File>
-				<File RelativePath="..\panda\src\chan\partBundleHandle.h"></File>
-				<File RelativePath="..\panda\src\chan\animGroup.cxx"></File>
-				<File RelativePath="..\panda\src\chan\partSubset.h"></File>
-				<File RelativePath="..\panda\src\chan\chan_composite.cxx"></File>
-				<File RelativePath="..\panda\src\chan\animBundleNode.cxx"></File>
-				<File RelativePath="..\panda\src\chan\partBundleNode.cxx"></File>
-				<File RelativePath="..\panda\src\chan\auto_bind.h"></File>
-				<File RelativePath="..\panda\src\chan\movingPartBase.I"></File>
-				<File RelativePath="..\panda\src\chan\partBundleNode.I"></File>
-				<File RelativePath="..\panda\src\chan\animChannelScalarTable.h"></File>
-				<File RelativePath="..\panda\src\chan\auto_bind.cxx"></File>
-				<File RelativePath="..\panda\src\chan\movingPart.I"></File>
-				<File RelativePath="..\panda\src\chan\partBundle.h"></File>
-				<File RelativePath="..\panda\src\chan\animBundleNode.h"></File>
-				<File RelativePath="..\panda\src\chan\vector_PartGroupStar.cxx"></File>
-				<File RelativePath="..\panda\src\chan\animChannelMatrixDynamic.cxx"></File>
-				<File RelativePath="..\panda\src\chan\animControlCollection.I"></File>
-				<File RelativePath="..\panda\src\chan\vector_PartGroupStar.h"></File>
-				<File RelativePath="..\panda\src\chan\animGroup.I"></File>
-				<File RelativePath="..\panda\src\chan\bindAnimRequest.h"></File>
-				<File RelativePath="..\panda\src\chan\animChannelBase.cxx"></File>
-				<File RelativePath="..\panda\src\chan\partBundle.I"></File>
-				<File RelativePath="..\panda\src\chan\animControl.h"></File>
-				<File RelativePath="..\panda\src\chan\animBundle.cxx"></File>
-				<File RelativePath="..\panda\src\chan\movingPartScalar.h"></File>
-				<File RelativePath="..\panda\src\chan\animChannelScalarDynamic.I"></File>
-				<File RelativePath="..\panda\src\chan\bindAnimRequest.cxx"></File>
-				<File RelativePath="..\panda\src\chan\animChannelMatrixXfmTable.I"></File>
-				<File RelativePath="..\panda\src\chan\animGroup.h"></File>
-				<File RelativePath="..\panda\src\chan\animControl.cxx"></File>
-				<File RelativePath="..\panda\src\chan\animChannel.I"></File>
-				<File RelativePath="..\panda\src\chan\animControlCollection.cxx"></File>
-				<File RelativePath="..\panda\src\chan\animPreloadTable.h"></File>
-				<File RelativePath="..\panda\src\chan\movingPartBase.h"></File>
-				<File RelativePath="..\panda\src\chan\partBundle.cxx"></File>
-				<File RelativePath="..\panda\src\chan\movingPartScalar.cxx"></File>
-				<File RelativePath="..\panda\src\chan\animPreloadTable.cxx"></File>
-				<File RelativePath="..\panda\src\chan\animChannelBase.h"></File>
-				<File RelativePath="..\panda\src\chan\partBundleHandle.cxx"></File>
-				<File RelativePath="..\panda\src\chan\animChannelMatrixFixed.h"></File>
-				<File RelativePath="..\panda\src\chan\partGroup.h"></File>
-				<File RelativePath="..\panda\src\chan\animBundle.I"></File>
-				<File RelativePath="..\panda\src\chan\partGroup.cxx"></File>
-				<File RelativePath="..\panda\src\chan\bindAnimRequest.I"></File>
-				<File RelativePath="..\panda\src\chan\animControlCollection.h"></File>
-				<File RelativePath="..\panda\src\chan\animChannel.h"></File>
-				<File RelativePath="..\panda\src\chan\partSubset.cxx"></File>
-				<File RelativePath="..\panda\src\chan\movingPartMatrix.cxx"></File>
-				<File RelativePath="..\panda\src\chan\animChannelMatrixDynamic.I"></File>
-				<File RelativePath="..\panda\src\chan\animChannelMatrixXfmTable.h"></File>
-				<File RelativePath="..\panda\src\chan\animChannelScalarDynamic.h"></File>
-				<File RelativePath="..\panda\src\chan\animBundle.h"></File>
-				<File RelativePath="..\panda\src\chan\chan_composite1.cxx"></File>
-				<File RelativePath="..\panda\src\chan\movingPart.h"></File>
-				<File RelativePath="..\panda\src\chan\animChannelMatrixDynamic.h"></File>
-				<File RelativePath="..\panda\src\chan\partBundleHandle.I"></File>
-				<File RelativePath="..\panda\src\chan\animChannelMatrixFixed.I"></File>
-				<File RelativePath="..\panda\src\chan\chan_composite2.cxx"></File>
-				<File RelativePath="..\panda\src\chan\animPreloadTable.I"></File>
-				<File RelativePath="..\panda\src\chan\animChannelBase.I"></File>
-				<File RelativePath="..\panda\src\chan\animChannelMatrixFixed.cxx"></File>
-				<File RelativePath="..\panda\src\chan\animChannel.cxx"></File>
-				<File RelativePath="..\panda\src\chan\animChannelFixed.h"></File>
-				<File RelativePath="..\panda\src\chan\animChannelScalarTable.I"></File>
-				<File RelativePath="..\panda\src\chan\movingPartMatrix.h"></File>
-			</Filter>
-			<Filter Name="doc">
-				<File RelativePath="..\panda\src\doc\sampleClass.I"></File>
-				<File RelativePath="..\panda\src\doc\sampleClass.h"></File>
-				<File RelativePath="..\panda\src\doc\sampleClass.cxx"></File>
-			</Filter>
-			<Filter Name="ode">
-				<File RelativePath="..\panda\src\ode\odeSurfaceParameters.cxx"></File>
-				<File RelativePath="..\panda\src\ode\odeSpace.h"></File>
-				<File RelativePath="..\panda\src\ode\odeCollisionEntry.I"></File>
-				<File RelativePath="..\panda\src\ode\odeJointCollection.cxx"></File>
-				<File RelativePath="..\panda\src\ode\odeJointGroup.cxx"></File>
-				<File RelativePath="..\panda\src\ode\odeAMotorJoint.cxx"></File>
-				<File RelativePath="..\panda\src\ode\odeHinge2Joint.h"></File>
-				<File RelativePath="..\panda\src\ode\odeContactCollection.h"></File>
-				<File RelativePath="..\panda\src\ode\odeJointGroup.h"></File>
-				<File RelativePath="..\panda\src\ode\odeGeom.h"></File>
-				<File RelativePath="..\panda\src\ode\odeFixedJoint.I"></File>
-				<File RelativePath="..\panda\src\ode\odeTriMeshData.h"></File>
-				<File RelativePath="..\panda\src\ode\odeSurfaceParameters.h"></File>
-				<File RelativePath="..\panda\src\ode\odeJoint.I"></File>
-				<File RelativePath="..\panda\src\ode\odeSphereGeom.h"></File>
-				<File RelativePath="..\panda\src\ode\odeCylinderGeom.h"></File>
-				<File RelativePath="..\panda\src\ode\odeHingeJoint.cxx"></File>
-				<File RelativePath="..\panda\src\ode\odeSurfaceParameters.I"></File>
-				<File RelativePath="..\panda\src\ode\odeCylinderGeom.cxx"></File>
-				<File RelativePath="..\panda\src\ode\odeContactJoint.h"></File>
-				<File RelativePath="..\panda\src\ode\odeSphereGeom.cxx"></File>
-				<File RelativePath="..\panda\src\ode\odeContactGeom.I"></File>
-				<File RelativePath="..\panda\src\ode\pode_composite3.cxx"></File>
-				<File RelativePath="..\panda\src\ode\odeCappedCylinderGeom.I"></File>
-				<File RelativePath="..\panda\src\ode\odeUniversalJoint.I"></File>
-				<File RelativePath="..\panda\src\ode\odeLMotorJoint.cxx"></File>
-				<File RelativePath="..\panda\src\ode\odeBallJoint.cxx"></File>
-				<File RelativePath="..\panda\src\ode\config_ode.cxx"></File>
-				<File RelativePath="..\panda\src\ode\odeJointGroup.I"></File>
-				<File RelativePath="..\panda\src\ode\odeConvexGeom.h"></File>
-				<File RelativePath="..\panda\src\ode\odeUtil.h"></File>
-				<File RelativePath="..\panda\src\ode\odeAMotorJoint.I"></File>
-				<File RelativePath="..\panda\src\ode\odeConvexGeom.I"></File>
-				<File RelativePath="..\panda\src\ode\odeTriMeshGeom.cxx"></File>
-				<File RelativePath="..\panda\src\ode\odeHashSpace.h"></File>
-				<File RelativePath="..\panda\src\ode\odeBody.h"></File>
-				<File RelativePath="..\panda\src\ode\odeRayGeom.cxx"></File>
-				<File RelativePath="..\panda\src\ode\odeSliderJoint.I"></File>
-				<File RelativePath="..\panda\src\ode\odeJointCollection.I"></File>
-				<File RelativePath="..\panda\src\ode\odeContactCollection.cxx"></File>
-				<File RelativePath="..\panda\src\ode\odeQuadTreeSpace.I"></File>
-				<File RelativePath="..\panda\src\ode\odeTriMeshData.I"></File>
-				<File RelativePath="..\panda\src\ode\odePlaneGeom.I"></File>
-				<File RelativePath="..\panda\src\ode\odeCappedCylinderGeom.cxx"></File>
-				<File RelativePath="..\panda\src\ode\odeBallJoint.h"></File>
-				<File RelativePath="..\panda\src\ode\odeQuadTreeSpace.h"></File>
-				<File RelativePath="..\panda\src\ode\odeSphereGeom.I"></File>
-				<File RelativePath="..\panda\src\ode\odeCollisionEntry.cxx"></File>
-				<File RelativePath="..\panda\src\ode\odeSpace.I"></File>
-				<File RelativePath="..\panda\src\ode\odeSimpleSpace.I"></File>
-				<File RelativePath="..\panda\src\ode\odeQuadTreeSpace.cxx"></File>
-				<File RelativePath="..\panda\src\ode\pode_composite1.cxx"></File>
-				<File RelativePath="..\panda\src\ode\odeGeom.cxx"></File>
-				<File RelativePath="..\panda\src\ode\odeHeightFieldGeom.h"></File>
-				<File RelativePath="..\panda\src\ode\odePlane2dJoint.h"></File>
-				<File RelativePath="..\panda\src\ode\odeSliderJoint.cxx"></File>
-				<File RelativePath="..\panda\src\ode\odeCappedCylinderGeom.h"></File>
-				<File RelativePath="..\panda\src\ode\odeTriMeshGeom.h"></File>
-				<File RelativePath="..\panda\src\ode\odeCollisionEntry.h"></File>
-				<File RelativePath="..\panda\src\ode\config_ode.h"></File>
-				<File RelativePath="..\panda\src\ode\odeHingeJoint.I"></File>
-				<File RelativePath="..\panda\src\ode\odeConvexGeom.cxx"></File>
-				<File RelativePath="..\panda\src\ode\odeBody.cxx"></File>
-				<File RelativePath="..\panda\src\ode\odeSliderJoint.h"></File>
-				<File RelativePath="..\panda\src\ode\odeUniversalJoint.h"></File>
-				<File RelativePath="..\panda\src\ode\odeNullJoint.cxx"></File>
-				<File RelativePath="..\panda\src\ode\odePlane2dJoint.I"></File>
-				<File RelativePath="..\panda\src\ode\odeContactGeom.cxx"></File>
-				<File RelativePath="..\panda\src\ode\odeWorld.I"></File>
-				<File RelativePath="..\panda\src\ode\odeJoint.cxx"></File>
-				<File RelativePath="..\panda\src\ode\odeSpace.cxx"></File>
-				<File RelativePath="..\panda\src\ode\odeLMotorJoint.h"></File>
-				<File RelativePath="..\panda\src\ode\odeGeom.I"></File>
-				<File RelativePath="..\panda\src\ode\odeRayGeom.I"></File>
-				<File RelativePath="..\panda\src\ode\odeTriMeshGeom.I"></File>
-				<File RelativePath="..\panda\src\ode\odeMass.h"></File>
-				<File RelativePath="..\panda\src\ode\odeMass.I"></File>
-				<File RelativePath="..\panda\src\ode\odeWorld.h"></File>
-				<File RelativePath="..\panda\src\ode\odeContact.I"></File>
-				<File RelativePath="..\panda\src\ode\odePlaneGeom.h"></File>
-				<File RelativePath="..\panda\src\ode\odeBody.I"></File>
-				<File RelativePath="..\panda\src\ode\odeBallJoint.I"></File>
-				<File RelativePath="..\panda\src\ode\odeAMotorJoint.h"></File>
-				<File RelativePath="..\panda\src\ode\odeJointCollection.h"></File>
-				<File RelativePath="..\panda\src\ode\odeSimpleSpace.h"></File>
-				<File RelativePath="..\panda\src\ode\odeHashSpace.I"></File>
-				<File RelativePath="..\panda\src\ode\odeBoxGeom.I"></File>
-				<File RelativePath="..\panda\src\ode\odeUniversalJoint.cxx"></File>
-				<File RelativePath="..\panda\src\ode\odeContactJoint.I"></File>
-				<File RelativePath="..\panda\src\ode\odeWorld.cxx"></File>
-				<File RelativePath="..\panda\src\ode\odeContactJoint.cxx"></File>
-				<File RelativePath="..\panda\src\ode\odeContact.cxx"></File>
-				<File RelativePath="..\panda\src\ode\odePlaneGeom.cxx"></File>
-				<File RelativePath="..\panda\src\ode\odeHingeJoint.h"></File>
-				<File RelativePath="..\panda\src\ode\odeNullJoint.I"></File>
-				<File RelativePath="..\panda\src\ode\odeHelperStructs.h"></File>
-				<File RelativePath="..\panda\src\ode\odeRayGeom.h"></File>
-				<File RelativePath="..\panda\src\ode\odePlane2dJoint.cxx"></File>
-				<File RelativePath="..\panda\src\ode\odeHinge2Joint.I"></File>
-				<File RelativePath="..\panda\src\ode\pode_composite2.cxx"></File>
-				<File RelativePath="..\panda\src\ode\odeCylinderGeom.I"></File>
-				<File RelativePath="..\panda\src\ode\odeTriMeshData.cxx"></File>
-				<File RelativePath="..\panda\src\ode\odeMass.cxx"></File>
-				<File RelativePath="..\panda\src\ode\odeLMotorJoint.I"></File>
-				<File RelativePath="..\panda\src\ode\odeJoint.h"></File>
-				<File RelativePath="..\panda\src\ode\odeFixedJoint.cxx"></File>
-				<File RelativePath="..\panda\src\ode\odeContactGeom.h"></File>
-				<File RelativePath="..\panda\src\ode\odeSimpleSpace.cxx"></File>
-				<File RelativePath="..\panda\src\ode\odeContact.h"></File>
-				<File RelativePath="..\panda\src\ode\odeHinge2Joint.cxx"></File>
-				<File RelativePath="..\panda\src\ode\odeNullJoint.h"></File>
-				<File RelativePath="..\panda\src\ode\ode_includes.h"></File>
-				<File RelativePath="..\panda\src\ode\odeHashSpace.cxx"></File>
-				<File RelativePath="..\panda\src\ode\odeFixedJoint.h"></File>
-				<File RelativePath="..\panda\src\ode\odeBoxGeom.cxx"></File>
-				<File RelativePath="..\panda\src\ode\odeBoxGeom.h"></File>
-				<File RelativePath="..\panda\src\ode\odeUtil.cxx"></File>
-				<File RelativePath="..\panda\src\ode\odeContactCollection.I"></File>
-			</Filter>
-			<Filter Name="pnmimagetypes">
-				<File RelativePath="..\panda\src\pnmimagetypes\pnmFileTypeTGA.cxx"></File>
-				<File RelativePath="..\panda\src\pnmimagetypes\pnmFileTypeSGI.h"></File>
-				<File RelativePath="..\panda\src\pnmimagetypes\pnmimagetypes_composite1.cxx"></File>
-				<File RelativePath="..\panda\src\pnmimagetypes\pnmFileTypeSoftImage.h"></File>
-				<File RelativePath="..\panda\src\pnmimagetypes\pnmFileTypePNG.h"></File>
-				<File RelativePath="..\panda\src\pnmimagetypes\pnmFileTypeTGA.h"></File>
-				<File RelativePath="..\panda\src\pnmimagetypes\sgi.h"></File>
-				<File RelativePath="..\panda\src\pnmimagetypes\pnmFileTypeIMG.h"></File>
-				<File RelativePath="..\panda\src\pnmimagetypes\pnmFileTypeJPG.cxx"></File>
-				<File RelativePath="..\panda\src\pnmimagetypes\pnmFileTypeAlias.cxx"></File>
-				<File RelativePath="..\panda\src\pnmimagetypes\config_pnmimagetypes.h"></File>
-				<File RelativePath="..\panda\src\pnmimagetypes\pnmFileTypeBMP.cxx"></File>
-				<File RelativePath="..\panda\src\pnmimagetypes\pnmimagetypes_composite2.cxx"></File>
-				<File RelativePath="..\panda\src\pnmimagetypes\pnmFileTypeTIFF.cxx"></File>
-				<File RelativePath="..\panda\src\pnmimagetypes\pnmFileTypeJPGReader.cxx"></File>
-				<File RelativePath="..\panda\src\pnmimagetypes\pnmFileTypeSGIReader.cxx"></File>
-				<File RelativePath="..\panda\src\pnmimagetypes\pnmFileTypeJPGWriter.cxx"></File>
-				<File RelativePath="..\panda\src\pnmimagetypes\bmp.h"></File>
-				<File RelativePath="..\panda\src\pnmimagetypes\pnmFileTypeSGI.cxx"></File>
-				<File RelativePath="..\panda\src\pnmimagetypes\pnmFileTypeJPG.h"></File>
-				<File RelativePath="..\panda\src\pnmimagetypes\pnmFileTypeSGIWriter.cxx"></File>
-				<File RelativePath="..\panda\src\pnmimagetypes\pnmFileTypePNM.cxx"></File>
-				<File RelativePath="..\panda\src\pnmimagetypes\config_pnmimagetypes.cxx"></File>
-				<File RelativePath="..\panda\src\pnmimagetypes\pnmFileTypeTIFF.h"></File>
-				<File RelativePath="..\panda\src\pnmimagetypes\pnmFileTypeBMPReader.cxx"></File>
-				<File RelativePath="..\panda\src\pnmimagetypes\pnmFileTypeSoftImage.cxx"></File>
-				<File RelativePath="..\panda\src\pnmimagetypes\pnmFileTypeAlias.h"></File>
-				<File RelativePath="..\panda\src\pnmimagetypes\pnmFileTypeBMP.h"></File>
-				<File RelativePath="..\panda\src\pnmimagetypes\pnmimagetypes_composite.cxx"></File>
-				<File RelativePath="..\panda\src\pnmimagetypes\pnmFileTypePNM.h"></File>
-				<File RelativePath="..\panda\src\pnmimagetypes\pnmFileTypeIMG.cxx"></File>
-				<File RelativePath="..\panda\src\pnmimagetypes\pnmFileTypeBMPWriter.cxx"></File>
-				<File RelativePath="..\panda\src\pnmimagetypes\pnmFileTypePNG.cxx"></File>
-				<File RelativePath="..\panda\src\pnmimagetypes\colrops.c"></File>
-			</Filter>
-			<Filter Name="downloadertools">
-				<File RelativePath="..\panda\src\downloadertools\show_ddb.cxx"></File>
-				<File RelativePath="..\panda\src\downloadertools\pencrypt.cxx"></File>
-				<File RelativePath="..\panda\src\downloadertools\check_adler.cxx"></File>
-				<File RelativePath="..\panda\src\downloadertools\pdecrypt.cxx"></File>
-				<File RelativePath="..\panda\src\downloadertools\pzip.cxx"></File>
-				<File RelativePath="..\panda\src\downloadertools\multify.cxx"></File>
-				<File RelativePath="..\panda\src\downloadertools\check_md5.cxx"></File>
-				<File RelativePath="..\panda\src\downloadertools\check_crc.cxx"></File>
-				<File RelativePath="..\panda\src\downloadertools\apply_patch.cxx"></File>
-				<File RelativePath="..\panda\src\downloadertools\build_patch.cxx"></File>
-				<File RelativePath="..\panda\src\downloadertools\punzip.cxx"></File>
-			</Filter>
-			<Filter Name="express">
-				<File RelativePath="..\panda\src\express\nodePointerTo.h"></File>
-				<File RelativePath="..\panda\src\express\encrypt_string.cxx"></File>
-				<File RelativePath="..\panda\src\express\nodeReferenceCount.h"></File>
-				<File RelativePath="..\panda\src\express\virtualFileSimple.I"></File>
-				<File RelativePath="..\panda\src\express\zStream.cxx"></File>
-				<File RelativePath="..\panda\src\express\memoryUsagePointerCounts.h"></File>
-				<File RelativePath="..\panda\src\express\weakReferenceList.I"></File>
-				<File RelativePath="..\panda\src\express\pointerToBase.h"></File>
-				<File RelativePath="..\panda\src\express\zStreamBuf.cxx"></File>
-				<File RelativePath="..\panda\src\express\pointerToArrayBase.h"></File>
-				<File RelativePath="..\panda\src\express\buffer.cxx"></File>
-				<File RelativePath="..\panda\src\express\pta_uchar.h"></File>
-				<File RelativePath="..\panda\src\express\virtualFileMountMultifile.h"></File>
-				<File RelativePath="..\panda\src\express\config_express.h"></File>
-				<File RelativePath="..\panda\src\express\hashVal.h"></File>
-				<File RelativePath="..\panda\src\express\export_dtool.h"></File>
-				<File RelativePath="..\panda\src\express\nodeReferenceCount.cxx"></File>
-				<File RelativePath="..\panda\src\express\weakPointerTo.cxx"></File>
-				<File RelativePath="..\panda\src\express\encrypt_string.h"></File>
-				<File RelativePath="..\panda\src\express\weakPointerToVoid.I"></File>
-				<File RelativePath="..\panda\src\express\pta_uchar.cxx"></File>
-				<File RelativePath="..\panda\src\express\express_composite2.cxx"></File>
-				<File RelativePath="..\panda\src\express\indirectLess.h"></File>
-				<File RelativePath="..\panda\src\express\memoryInfo.I"></File>
-				<File RelativePath="..\panda\src\express\circBuffer.h"></File>
-				<File RelativePath="..\panda\src\express\memoryUsage.cxx"></File>
-				<File RelativePath="..\panda\src\express\ordered_vector.h"></File>
-				<File RelativePath="..\panda\src\express\multifile.h"></File>
-				<File RelativePath="..\panda\src\express\virtualFileMountSystem.cxx"></File>
-				<File RelativePath="..\panda\src\express\error_utils.cxx"></File>
-				<File RelativePath="..\panda\src\express\pta_float.h"></File>
-				<File RelativePath="..\panda\src\express\zStream.h"></File>
-				<File RelativePath="..\panda\src\express\checksumHashGenerator.h"></File>
-				<File RelativePath="..\panda\src\express\memoryInfo.h"></File>
-				<File RelativePath="..\panda\src\express\textEncoder.I"></File>
-				<File RelativePath="..\panda\src\express\virtualFileMount.h"></File>
-				<File RelativePath="..\panda\src\express\typedReferenceCount.cxx"></File>
-				<File RelativePath="..\panda\src\express\test_types.cxx"></File>
-				<File RelativePath="..\panda\src\express\weakPointerTo.I"></File>
-				<File RelativePath="..\panda\src\express\threadSafePointerToBase.I"></File>
-				<File RelativePath="..\panda\src\express\namable.I"></File>
-				<File RelativePath="..\panda\src\express\vector_float.cxx"></File>
-				<File RelativePath="..\panda\src\express\pointerTo.h"></File>
-				<File RelativePath="..\panda\src\express\datagramSink.h"></File>
-				<File RelativePath="..\panda\src\express\datagramSink.I"></File>
-				<File RelativePath="..\panda\src\express\nodePointerTo.cxx"></File>
-				<File RelativePath="..\panda\src\express\subStream.cxx"></File>
-				<File RelativePath="..\panda\src\express\virtualFileList.cxx"></File>
-				<File RelativePath="..\panda\src\express\zStreamBuf.h"></File>
-				<File RelativePath="..\panda\src\express\memoryUsage.h"></File>
-				<File RelativePath="..\panda\src\express\virtualFileMount.I"></File>
-				<File RelativePath="..\panda\src\express\virtualFileSystem.h"></File>
-				<File RelativePath="..\panda\src\express\pointerTo.cxx"></File>
-				<File RelativePath="..\panda\src\express\pStatCollectorForwardBase.h"></File>
-				<File RelativePath="..\panda\src\express\weakPointerToBase.h"></File>
-				<File RelativePath="..\panda\src\express\hashGeneratorBase.I"></File>
-				<File RelativePath="..\panda\src\express\hashGeneratorBase.cxx"></File>
-				<File RelativePath="..\panda\src\express\stringDecoder.cxx"></File>
-				<File RelativePath="..\panda\src\express\pointerToBase.I"></File>
-				<File RelativePath="..\panda\src\express\trueClock.cxx"></File>
-				<File RelativePath="..\panda\src\express\dcast.cxx"></File>
-				<File RelativePath="..\panda\src\express\datagramGenerator.h"></File>
-				<File RelativePath="..\panda\src\express\weakPointerToVoid.h"></File>
-				<File RelativePath="..\panda\src\express\datagram.I"></File>
-				<File RelativePath="..\panda\src\express\threadSafePointerTo.h"></File>
-				<File RelativePath="..\panda\src\express\weakPointerCallback.h"></File>
-				<File RelativePath="..\panda\src\express\datagram.h"></File>
-				<File RelativePath="..\panda\src\express\textEncoder.h"></File>
-				<File RelativePath="..\panda\src\express\multifile.cxx"></File>
-				<File RelativePath="..\panda\src\express\memoryUsagePointerCounts.I"></File>
-				<File RelativePath="..\panda\src\express\stringDecoder.I"></File>
-				<File RelativePath="..\panda\src\express\unicodeLatinMap.cxx"></File>
-				<File RelativePath="..\panda\src\express\pointerToBase.cxx"></File>
-				<File RelativePath="..\panda\src\express\pointerToVoid.cxx"></File>
-				<File RelativePath="..\panda\src\express\virtualFileSimple.h"></File>
-				<File RelativePath="..\panda\src\express\virtualFileMountMultifile.cxx"></File>
-				<File RelativePath="..\panda\src\express\windowsRegistry.cxx"></File>
-				<File RelativePath="..\panda\src\express\ramfile.cxx"></File>
-				<File RelativePath="..\panda\src\express\checksumHashGenerator.I"></File>
-				<File RelativePath="..\panda\src\express\checksumHashGenerator.cxx"></File>
-				<File RelativePath="..\panda\src\express\windowsRegistry.h"></File>
-				<File RelativePath="..\panda\src\express\typedReferenceCount.I"></File>
-				<File RelativePath="..\panda\src\express\weakPointerCallback.cxx"></File>
-				<File RelativePath="..\panda\src\express\stringDecoder.h"></File>
-				<File RelativePath="..\panda\src\express\memoryUsagePointers.cxx"></File>
-				<File RelativePath="..\panda\src\express\nodeReferenceCount.I"></File>
-				<File RelativePath="..\panda\src\express\buffer.I"></File>
-				<File RelativePath="..\panda\src\express\datagram.cxx"></File>
-				<File RelativePath="..\panda\src\express\dcast.h"></File>
-				<File RelativePath="..\panda\src\express\pointerToArray.cxx"></File>
-				<File RelativePath="..\panda\src\express\typedef.h"></File>
-				<File RelativePath="..\panda\src\express\virtualFileMountSystem.h"></File>
-				<File RelativePath="..\panda\src\express\typedReferenceCount.h"></File>
-				<File RelativePath="..\panda\src\express\virtualFileMountSystem.I"></File>
-				<File RelativePath="..\panda\src\express\nodePointerTo.I"></File>
-				<File RelativePath="..\panda\src\express\profileTimer.I"></File>
-				<File RelativePath="..\panda\src\express\hashVal.I"></File>
-				<File RelativePath="..\panda\src\express\pta_float.cxx"></File>
-				<File RelativePath="..\panda\src\express\weakPointerTo.h"></File>
-				<File RelativePath="..\panda\src\express\ramfile.h"></File>
-				<File RelativePath="..\panda\src\express\hashVal.cxx"></File>
-				<File RelativePath="..\panda\src\express\pointerToArrayBase.I"></File>
-				<File RelativePath="..\panda\src\express\datagramIterator.I"></File>
-				<File RelativePath="..\panda\src\express\vector_uchar.h"></File>
-				<File RelativePath="..\panda\src\express\profileTimer.h"></File>
-				<File RelativePath="..\panda\src\express\datagramIterator.h"></File>
-				<File RelativePath="..\panda\src\express\threadSafePointerTo.cxx"></File>
-				<File RelativePath="..\panda\src\express\profileTimer.cxx"></File>
-				<File RelativePath="..\panda\src\express\datagramGenerator.cxx"></File>
-				<File RelativePath="..\panda\src\express\hashGeneratorBase.h"></File>
-				<File RelativePath="..\panda\src\express\patchfile.cxx"></File>
-				<File RelativePath="..\panda\src\express\test_ordered_vector.cxx"></File>
-				<File RelativePath="..\panda\src\express\nodePointerToBase.h"></File>
-				<File RelativePath="..\panda\src\express\virtualFile.h"></File>
-				<File RelativePath="..\panda\src\express\zStream.I"></File>
-				<File RelativePath="..\panda\src\express\subStreamBuf.h"></File>
-				<File RelativePath="..\panda\src\express\virtualFile.cxx"></File>
-				<File RelativePath="..\panda\src\express\password_hash.cxx"></File>
-				<File RelativePath="..\panda\src\express\datagramSink.cxx"></File>
-				<File RelativePath="..\panda\src\express\pointerTo.I"></File>
-				<File RelativePath="..\panda\src\express\virtualFileSystem.I"></File>
-				<File RelativePath="..\panda\src\express\referenceCount.I"></File>
-				<File RelativePath="..\panda\src\express\patchfile.h"></File>
-				<File RelativePath="..\panda\src\express\ordered_vector.I"></File>
-				<File RelativePath="..\panda\src\express\pointerToVoid.h"></File>
-				<File RelativePath="..\panda\src\express\weakPointerToBase.cxx"></File>
-				<File RelativePath="..\panda\src\express\virtualFileMountMultifile.I"></File>
-				<File RelativePath="..\panda\src\express\memoryUsagePointers.h"></File>
-				<File RelativePath="..\panda\src\express\memoryUsage.I"></File>
-				<File RelativePath="..\panda\src\express\referenceCount.h"></File>
-				<File RelativePath="..\panda\src\express\ordered_vector.cxx"></File>
-				<File RelativePath="..\panda\src\express\virtualFileList.I"></File>
-				<File RelativePath="..\panda\src\express\circBuffer.I"></File>
-				<File RelativePath="..\panda\src\express\weakReferenceList.cxx"></File>
-				<File RelativePath="..\panda\src\express\weakPointerToBase.I"></File>
-				<File RelativePath="..\panda\src\express\textEncoder.cxx"></File>
-				<File RelativePath="..\panda\src\express\referenceCount.cxx"></File>
-				<File RelativePath="..\panda\src\express\buffer.h"></File>
-				<File RelativePath="..\panda\src\express\weakReferenceList.h"></File>
-				<File RelativePath="..\panda\src\express\unicodeLatinMap.h"></File>
-				<File RelativePath="..\panda\src\express\namable.h"></File>
-				<File RelativePath="..\panda\src\express\indirectLess.I"></File>
-				<File RelativePath="..\panda\src\express\memoryUsagePointers.I"></File>
-				<File RelativePath="..\panda\src\express\trueClock.h"></File>
-				<File RelativePath="..\panda\src\express\memoryInfo.cxx"></File>
-				<File RelativePath="..\panda\src\express\virtualFileSystem.cxx"></File>
-				<File RelativePath="..\panda\src\express\namable.cxx"></File>
-				<File RelativePath="..\panda\src\express\trueClock.I"></File>
-				<File RelativePath="..\panda\src\express\config_express.cxx"></File>
-				<File RelativePath="..\panda\src\express\threadSafePointerToBase.cxx"></File>
-				<File RelativePath="..\panda\src\express\pointerToVoid.I"></File>
-				<File RelativePath="..\panda\src\express\vector_uchar.cxx"></File>
-				<File RelativePath="..\panda\src\express\vector_float.h"></File>
-				<File RelativePath="..\panda\src\express\express_composite1.cxx"></File>
-				<File RelativePath="..\panda\src\express\virtualFileSimple.cxx"></File>
-				<File RelativePath="..\panda\src\express\pointerToArray.h"></File>
-				<File RelativePath="..\panda\src\express\memoryUsagePointerCounts.cxx"></File>
-				<File RelativePath="..\panda\src\express\datagramIterator.cxx"></File>
-				<File RelativePath="..\panda\src\express\nodePointerToBase.cxx"></File>
-				<File RelativePath="..\panda\src\express\subStream.h"></File>
-				<File RelativePath="..\panda\src\express\subStream.I"></File>
-				<File RelativePath="..\panda\src\express\password_hash.h"></File>
-				<File RelativePath="..\panda\src\express\pStatCollectorForwardBase.cxx"></File>
-				<File RelativePath="..\panda\src\express\pointerToArray.I"></File>
-				<File RelativePath="..\panda\src\express\error_utils.h"></File>
-				<File RelativePath="..\panda\src\express\ramfile.I"></File>
-				<File RelativePath="..\panda\src\express\virtualFileComposite.cxx"></File>
-				<File RelativePath="..\panda\src\express\weakPointerToVoid.cxx"></File>
-				<File RelativePath="..\panda\src\express\test_zstream.cxx"></File>
-				<File RelativePath="..\panda\src\express\virtualFileMount.cxx"></File>
-				<File RelativePath="..\panda\src\express\nodePointerToBase.I"></File>
-				<File RelativePath="..\panda\src\express\virtualFileComposite.h"></File>
-				<File RelativePath="..\panda\src\express\datagramGenerator.I"></File>
-				<File RelativePath="..\panda\src\express\subStreamBuf.cxx"></File>
-				<File RelativePath="..\panda\src\express\threadSafePointerToBase.h"></File>
-				<File RelativePath="..\panda\src\express\pointerToArrayBase.cxx"></File>
-				<File RelativePath="..\panda\src\express\express_composite.cxx"></File>
-				<File RelativePath="..\panda\src\express\virtualFileComposite.I"></File>
-				<File RelativePath="..\panda\src\express\weakPointerCallback.I"></File>
-				<File RelativePath="..\panda\src\express\multifile.I"></File>
-				<File RelativePath="..\panda\src\express\virtualFile.I"></File>
-				<File RelativePath="..\panda\src\express\patchfile.I"></File>
-				<File RelativePath="..\panda\src\express\threadSafePointerTo.I"></File>
-				<File RelativePath="..\panda\src\express\virtualFileList.h"></File>
-			</Filter>
-			<Filter Name="pstatclient">
-				<File RelativePath="..\panda\src\pstatclient\pStatServerControlMessage.cxx"></File>
-				<File RelativePath="..\panda\src\pstatclient\pStatCollectorForward.h"></File>
-				<File RelativePath="..\panda\src\pstatclient\pStatClientControlMessage.h"></File>
-				<File RelativePath="..\panda\src\pstatclient\pStatServerControlMessage.h"></File>
-				<File RelativePath="..\panda\src\pstatclient\config_pstats.h"></File>
-				<File RelativePath="..\panda\src\pstatclient\config_pstats.cxx"></File>
-				<File RelativePath="..\panda\src\pstatclient\pStatClient.cxx"></File>
-				<File RelativePath="..\panda\src\pstatclient\pStatFrameData.I"></File>
-				<File RelativePath="..\panda\src\pstatclient\test_client.cxx"></File>
-				<File RelativePath="..\panda\src\pstatclient\pStatThread.cxx"></File>
-				<File RelativePath="..\panda\src\pstatclient\pStatClient.I"></File>
-				<File RelativePath="..\panda\src\pstatclient\pstatclient_composite1.cxx"></File>
-				<File RelativePath="..\panda\src\pstatclient\pStatClientImpl.cxx"></File>
-				<File RelativePath="..\panda\src\pstatclient\pstatclient_composite.cxx"></File>
-				<File RelativePath="..\panda\src\pstatclient\pStatTimer.I"></File>
-				<File RelativePath="..\panda\src\pstatclient\pStatClient.h"></File>
-				<File RelativePath="..\panda\src\pstatclient\pStatProperties.h"></File>
-				<File RelativePath="..\panda\src\pstatclient\pStatClientImpl.I"></File>
-				<File RelativePath="..\panda\src\pstatclient\pStatClientVersion.h"></File>
-				<File RelativePath="..\panda\src\pstatclient\pStatCollectorForward.cxx"></File>
-				<File RelativePath="..\panda\src\pstatclient\pStatFrameData.cxx"></File>
-				<File RelativePath="..\panda\src\pstatclient\pStatThread.I"></File>
-				<File RelativePath="..\panda\src\pstatclient\pStatCollectorDef.cxx"></File>
-				<File RelativePath="..\panda\src\pstatclient\pStatClientImpl.h"></File>
-				<File RelativePath="..\panda\src\pstatclient\pstatclient_composite2.cxx"></File>
-				<File RelativePath="..\panda\src\pstatclient\pStatClientVersion.I"></File>
-				<File RelativePath="..\panda\src\pstatclient\pStatClientControlMessage.cxx"></File>
-				<File RelativePath="..\panda\src\pstatclient\pStatCollectorDef.h"></File>
-				<File RelativePath="..\panda\src\pstatclient\pStatTimer.h"></File>
-				<File RelativePath="..\panda\src\pstatclient\pStatClientVersion.cxx"></File>
-				<File RelativePath="..\panda\src\pstatclient\pStatCollector.I"></File>
-				<File RelativePath="..\panda\src\pstatclient\pStatProperties.cxx"></File>
-				<File RelativePath="..\panda\src\pstatclient\pStatCollectorForward.I"></File>
-				<File RelativePath="..\panda\src\pstatclient\pStatCollector.h"></File>
-				<File RelativePath="..\panda\src\pstatclient\pStatThread.h"></File>
-				<File RelativePath="..\panda\src\pstatclient\pStatFrameData.h"></File>
-			</Filter>
-			<Filter Name="framework">
-				<File RelativePath="..\panda\src\framework\rock_floor.rgb.c"></File>
-				<File RelativePath="..\panda\src\framework\framework_composite1.cxx"></File>
-				<File RelativePath="..\panda\src\framework\windowFramework.I"></File>
-				<File RelativePath="..\panda\src\framework\pandaFramework.I"></File>
-				<File RelativePath="..\panda\src\framework\shuttle_controls.bam.c"></File>
-				<File RelativePath="..\panda\src\framework\config_framework.h"></File>
-				<File RelativePath="..\panda\src\framework\windowFramework.h"></File>
-				<File RelativePath="..\panda\src\framework\windowFramework.cxx"></File>
-				<File RelativePath="..\panda\src\framework\config_framework.cxx"></File>
-				<File RelativePath="..\panda\src\framework\pandaFramework.h"></File>
-				<File RelativePath="..\panda\src\framework\pandaFramework.cxx"></File>
-				<File RelativePath="..\panda\src\framework\framework_composite.cxx"></File>
-			</Filter>
-			<Filter Name="gsgbase">
-				<File RelativePath="..\panda\src\gsgbase\displayRegionBase.h"></File>
-				<File RelativePath="..\panda\src\gsgbase\displayRegionBase.I"></File>
-				<File RelativePath="..\panda\src\gsgbase\gsgbase_composite.cxx"></File>
-				<File RelativePath="..\panda\src\gsgbase\config_gsgbase.cxx"></File>
-				<File RelativePath="..\panda\src\gsgbase\displayRegionBase.cxx"></File>
-				<File RelativePath="..\panda\src\gsgbase\gsgbase_composite1.cxx"></File>
-				<File RelativePath="..\panda\src\gsgbase\config_gsgbase.h"></File>
-				<File RelativePath="..\panda\src\gsgbase\test_gsgbase.cxx"></File>
-				<File RelativePath="..\panda\src\gsgbase\graphicsStateGuardianBase.h"></File>
-				<File RelativePath="..\panda\src\gsgbase\graphicsStateGuardianBase.cxx"></File>
-			</Filter>
-			<Filter Name="lerp">
-				<File RelativePath="..\panda\src\lerp\lerpchans.h"></File>
-				<File RelativePath="..\panda\src\lerp\lerpblend.cxx"></File>
-				<File RelativePath="..\panda\src\lerp\lerp_composite1.cxx"></File>
-				<File RelativePath="..\panda\src\lerp\lerpfunctor.h"></File>
-				<File RelativePath="..\panda\src\lerp\lerpfunctor.cxx"></File>
-				<File RelativePath="..\panda\src\lerp\config_lerp.h"></File>
-				<File RelativePath="..\panda\src\lerp\config_lerp.cxx"></File>
-				<File RelativePath="..\panda\src\lerp\lerpblend.h"></File>
-				<File RelativePath="..\panda\src\lerp\lerp.h"></File>
-				<File RelativePath="..\panda\src\lerp\lerp.cxx"></File>
-				<File RelativePath="..\panda\src\lerp\lerp_composite.cxx"></File>
-			</Filter>
-			<Filter Name="effects">
-				<File RelativePath="..\panda\src\effects\config_effects.cxx"></File>
-				<File RelativePath="..\panda\src\effects\lensFlareNode.I"></File>
-				<File RelativePath="..\panda\src\effects\effects_composite1.cxx"></File>
-				<File RelativePath="..\panda\src\effects\effects_composite.cxx"></File>
-				<File RelativePath="..\panda\src\effects\lensFlareNode.cxx"></File>
-				<File RelativePath="..\panda\src\effects\lensFlareNode.h"></File>
-				<File RelativePath="..\panda\src\effects\config_effects.h"></File>
-			</Filter>
-			<Filter Name="mesadisplay">
-				<File RelativePath="..\panda\src\mesadisplay\mesadisplay_composite.cxx"></File>
-				<File RelativePath="..\panda\src\mesadisplay\osMesaGraphicsPipe.cxx"></File>
-				<File RelativePath="..\panda\src\mesadisplay\osMesaGraphicsBuffer.h"></File>
-				<File RelativePath="..\panda\src\mesadisplay\osMesaGraphicsStateGuardian.I"></File>
-				<File RelativePath="..\panda\src\mesadisplay\mesagsg.cxx"></File>
-				<File RelativePath="..\panda\src\mesadisplay\mesagsg.h"></File>
-				<File RelativePath="..\panda\src\mesadisplay\osMesaGraphicsPipe.I"></File>
-				<File RelativePath="..\panda\src\mesadisplay\mesadisplay_composite1.cxx"></File>
-				<File RelativePath="..\panda\src\mesadisplay\osMesaGraphicsStateGuardian.h"></File>
-				<File RelativePath="..\panda\src\mesadisplay\config_mesadisplay.cxx"></File>
-				<File RelativePath="..\panda\src\mesadisplay\osMesaGraphicsBuffer.I"></File>
-				<File RelativePath="..\panda\src\mesadisplay\osMesaGraphicsBuffer.cxx"></File>
-				<File RelativePath="..\panda\src\mesadisplay\osMesaGraphicsPipe.h"></File>
-				<File RelativePath="..\panda\src\mesadisplay\config_mesadisplay.h"></File>
-				<File RelativePath="..\panda\src\mesadisplay\osMesaGraphicsStateGuardian.cxx"></File>
-			</Filter>
-			<Filter Name="egg2pg">
-				<File RelativePath="..\panda\src\egg2pg\eggLoader.h"></File>
-				<File RelativePath="..\panda\src\egg2pg\load_egg_file.cxx"></File>
-				<File RelativePath="..\panda\src\egg2pg\egg2pg_composite1.cxx"></File>
-				<File RelativePath="..\panda\src\egg2pg\eggLoader.cxx"></File>
-				<File RelativePath="..\panda\src\egg2pg\eggRenderState.h"></File>
-				<File RelativePath="..\panda\src\egg2pg\deferredNodeProperty.cxx"></File>
-				<File RelativePath="..\panda\src\egg2pg\eggBinner.h"></File>
-				<File RelativePath="..\panda\src\egg2pg\characterMaker.cxx"></File>
-				<File RelativePath="..\panda\src\egg2pg\eggRenderState.I"></File>
-				<File RelativePath="..\panda\src\egg2pg\egg_parametrics.h"></File>
-				<File RelativePath="..\panda\src\egg2pg\config_egg2pg.cxx"></File>
-				<File RelativePath="..\panda\src\egg2pg\loaderFileTypeEgg.h"></File>
-				<File RelativePath="..\panda\src\egg2pg\eggBinner.cxx"></File>
-				<File RelativePath="..\panda\src\egg2pg\animBundleMaker.h"></File>
-				<File RelativePath="..\panda\src\egg2pg\load_egg_file.h"></File>
-				<File RelativePath="..\panda\src\egg2pg\characterMaker.h"></File>
-				<File RelativePath="..\panda\src\egg2pg\egg2pg_composite2.cxx"></File>
-				<File RelativePath="..\panda\src\egg2pg\loaderFileTypeEgg.cxx"></File>
-				<File RelativePath="..\panda\src\egg2pg\config_egg2pg.h"></File>
-				<File RelativePath="..\panda\src\egg2pg\deferredNodeProperty.h"></File>
-				<File RelativePath="..\panda\src\egg2pg\eggRenderState.cxx"></File>
-				<File RelativePath="..\panda\src\egg2pg\egg_parametrics.cxx"></File>
-				<File RelativePath="..\panda\src\egg2pg\egg2pg_composite.cxx"></File>
-				<File RelativePath="..\panda\src\egg2pg\eggLoader.I"></File>
-				<File RelativePath="..\panda\src\egg2pg\animBundleMaker.cxx"></File>
-			</Filter>
-			<Filter Name="windisplay">
-				<File RelativePath="..\panda\src\windisplay\winGraphicsPipe.cxx"></File>
-				<File RelativePath="..\panda\src\windisplay\config_windisplay.h"></File>
-				<File RelativePath="..\panda\src\windisplay\winGraphicsWindow.h"></File>
-				<File RelativePath="..\panda\src\windisplay\windisplay_composite1.cxx"></File>
-				<File RelativePath="..\panda\src\windisplay\winGraphicsWindow.cxx"></File>
-				<File RelativePath="..\panda\src\windisplay\winGraphicsWindow.I"></File>
-				<File RelativePath="..\panda\src\windisplay\winGraphicsPipe.I"></File>
-				<File RelativePath="..\panda\src\windisplay\windisplay_composite.cxx"></File>
-				<File RelativePath="..\panda\src\windisplay\winDetectDx9.cxx"></File>
-				<File RelativePath="..\panda\src\windisplay\config_windisplay.cxx"></File>
-				<File RelativePath="..\panda\src\windisplay\winGraphicsPipe.h"></File>
-				<File RelativePath="..\panda\src\windisplay\winDetectDx8.cxx"></File>
-				<File RelativePath="..\panda\src\windisplay\winDetectDx.h"></File>
-			</Filter>
-			<Filter Name="pgraph">
-				<File RelativePath="..\panda\src\pgraph\lensNode.I"></File>
-				<File RelativePath="..\panda\src\pgraph\portalNode.h"></File>
-				<File RelativePath="..\panda\src\pgraph\pandaNodeChain.I"></File>
-				<File RelativePath="..\panda\src\pgraph\shaderAttrib.cxx"></File>
-				<File RelativePath="..\panda\src\pgraph\auxBitplaneAttrib.cxx"></File>
-				<File RelativePath="..\panda\src\pgraph\workingNodePath.I"></File>
-				<File RelativePath="..\panda\src\pgraph\renderEffect.I"></File>
-				<File RelativePath="..\panda\src\pgraph\polylightNode.h"></File>
-				<File RelativePath="..\panda\src\pgraph\shaderPool.cxx"></File>
-				<File RelativePath="..\panda\src\pgraph\cullBinManager.I"></File>
-				<File RelativePath="..\panda\src\pgraph\nodePathLerps.h"></File>
-				<File RelativePath="..\panda\src\pgraph\attribNodeRegistry.h"></File>
-				<File RelativePath="..\panda\src\pgraph\fog.cxx"></File>
-				<File RelativePath="..\panda\src\pgraph\scissorEffect.cxx"></File>
-				<File RelativePath="..\panda\src\pgraph\clipPlaneAttrib.I"></File>
-				<File RelativePath="..\panda\src\pgraph\fadeLodNode.I"></File>
-				<File RelativePath="..\panda\src\pgraph\modelPool.cxx"></File>
-				<File RelativePath="..\panda\src\pgraph\stencilAttrib.I"></File>
-				<File RelativePath="..\panda\src\pgraph\colorWriteAttrib.cxx"></File>
-				<File RelativePath="..\panda\src\pgraph\depthTestAttrib.I"></File>
-				<File RelativePath="..\panda\src\pgraph\nodePathLerps.cxx"></File>
-				<File RelativePath="..\panda\src\pgraph\renderEffect.cxx"></File>
-				<File RelativePath="..\panda\src\pgraph\modelNode.h"></File>
-				<File RelativePath="..\panda\src\pgraph\loader.cxx"></File>
-				<File RelativePath="..\panda\src\pgraph\shaderPool.I"></File>
-				<File RelativePath="..\panda\src\pgraph\light.cxx"></File>
-				<File RelativePath="..\panda\src\pgraph\decalEffect.cxx"></File>
-				<File RelativePath="..\panda\src\pgraph\polylightEffect.h"></File>
-				<File RelativePath="..\panda\src\pgraph\modelRoot.cxx"></File>
-				<File RelativePath="..\panda\src\pgraph\shadeModelAttrib.I"></File>
-				<File RelativePath="..\panda\src\pgraph\cullHandler.h"></File>
-				<File RelativePath="..\panda\src\pgraph\colorBlendAttrib.cxx"></File>
-				<File RelativePath="..\panda\src\pgraph\sceneGraphAnalyzer.I"></File>
-				<File RelativePath="..\panda\src\pgraph\texMatrixAttrib.h"></File>
-				<File RelativePath="..\panda\src\pgraph\cullBinManager.cxx"></File>
-				<File RelativePath="..\panda\src\pgraph\test_pgraph.cxx"></File>
-				<File RelativePath="..\panda\src\pgraph\billboardEffect.I"></File>
-				<File RelativePath="..\panda\src\pgraph\transparencyAttrib.h"></File>
-				<File RelativePath="..\panda\src\pgraph\materialAttrib.I"></File>
-				<File RelativePath="..\panda\src\pgraph\geomTransformer.h"></File>
-				<File RelativePath="..\panda\src\pgraph\geomDrawCallbackData.h"></File>
-				<File RelativePath="..\panda\src\pgraph\loader.I"></File>
-				<File RelativePath="..\panda\src\pgraph\transformState.h"></File>
-				<File RelativePath="..\panda\src\pgraph\texMatrixAttrib.cxx"></File>
-				<File RelativePath="..\panda\src\pgraph\portalNode.I"></File>
-				<File RelativePath="..\panda\src\pgraph\colorScaleAttrib.cxx"></File>
-				<File RelativePath="..\panda\src\pgraph\fadeLodNode.cxx"></File>
-				<File RelativePath="..\panda\src\pgraph\clipPlaneAttrib.h"></File>
-				<File RelativePath="..\panda\src\pgraph\billboardEffect.h"></File>
-				<File RelativePath="..\panda\src\pgraph\compassEffect.cxx"></File>
-				<File RelativePath="..\panda\src\pgraph\shaderAttrib.h"></File>
-				<File RelativePath="..\panda\src\pgraph\renderEffects.h"></File>
-				<File RelativePath="..\panda\src\pgraph\nodePathComponent.h"></File>
-				<File RelativePath="..\panda\src\pgraph\light.I"></File>
-				<File RelativePath="..\panda\src\pgraph\colorWriteAttrib.h"></File>
-				<File RelativePath="..\panda\src\pgraph\materialCollection.h"></File>
-				<File RelativePath="..\panda\src\pgraph\loaderFileType.h"></File>
-				<File RelativePath="..\panda\src\pgraph\transformState.cxx"></File>
-				<File RelativePath="..\panda\src\pgraph\depthOffsetAttrib.cxx"></File>
-				<File RelativePath="..\panda\src\pgraph\rescaleNormalAttrib.I"></File>
-				<File RelativePath="..\panda\src\pgraph\depthTestAttrib.h"></File>
-				<File RelativePath="..\panda\src\pgraph\texGenAttrib.h"></File>
-				<File RelativePath="..\panda\src\pgraph\showBoundsEffect.I"></File>
-				<File RelativePath="..\panda\src\pgraph\shaderGeneratorBase.cxx"></File>
-				<File RelativePath="..\panda\src\pgraph\fogAttrib.h"></File>
-				<File RelativePath="..\panda\src\pgraph\loaderFileTypeRegistry.cxx"></File>
-				<File RelativePath="..\panda\src\pgraph\colorScaleAttrib.I"></File>
-				<File RelativePath="..\panda\src\pgraph\light.h"></File>
-				<File RelativePath="..\panda\src\pgraph\modelFlattenRequest.cxx"></File>
-				<File RelativePath="..\panda\src\pgraph\nodePathComponent.cxx"></File>
-				<File RelativePath="..\panda\src\pgraph\cullTraverser.h"></File>
-				<File RelativePath="..\panda\src\pgraph\camera.cxx"></File>
-				<File RelativePath="..\panda\src\pgraph\bamFile.I"></File>
-				<File RelativePath="..\panda\src\pgraph\decalEffect.I"></File>
-				<File RelativePath="..\panda\src\pgraph\cullableObject.cxx"></File>
-				<File RelativePath="..\panda\src\pgraph\cullHandler.cxx"></File>
-				<File RelativePath="..\panda\src\pgraph\renderAttrib.h"></File>
-				<File RelativePath="..\panda\src\pgraph\antialiasAttrib.cxx"></File>
-				<File RelativePath="..\panda\src\pgraph\cullTraverserData.h"></File>
-				<File RelativePath="..\panda\src\pgraph\cacheStats.cxx"></File>
-				<File RelativePath="..\panda\src\pgraph\lodNode.I"></File>
-				<File RelativePath="..\panda\src\pgraph\cullBinAttrib.I"></File>
-				<File RelativePath="..\panda\src\pgraph\weakNodePath.h"></File>
-				<File RelativePath="..\panda\src\pgraph\attribNodeRegistry.I"></File>
-				<File RelativePath="..\panda\src\pgraph\scissorAttrib.cxx"></File>
-				<File RelativePath="..\panda\src\pgraph\geomNode.I"></File>
-				<File RelativePath="..\panda\src\pgraph\workingNodePath.cxx"></File>
-				<File RelativePath="..\panda\src\pgraph\pgraph_composite4.cxx"></File>
-				<File RelativePath="..\panda\src\pgraph\pgraph_composite3.cxx"></File>
-				<File RelativePath="..\panda\src\pgraph\lightAttrib.cxx"></File>
-				<File RelativePath="..\panda\src\pgraph\pandaNodeChain.cxx"></File>
-				<File RelativePath="..\panda\src\pgraph\renderState.cxx"></File>
-				<File RelativePath="..\panda\src\pgraph\depthOffsetAttrib.h"></File>
-				<File RelativePath="..\panda\src\pgraph\stateMunger.I"></File>
-				<File RelativePath="..\panda\src\pgraph\findApproxPath.cxx"></File>
-				<File RelativePath="..\panda\src\pgraph\stencilAttrib.h"></File>
-				<File RelativePath="..\panda\src\pgraph\lightAttrib.h"></File>
-				<File RelativePath="..\panda\src\pgraph\renderModeAttrib.I"></File>
-				<File RelativePath="..\panda\src\pgraph\pandaNodeChain.h"></File>
-				<File RelativePath="..\panda\src\pgraph\shaderPool.h"></File>
-				<File RelativePath="..\panda\src\pgraph\cullBinAttrib.h"></File>
-				<File RelativePath="..\panda\src\pgraph\textureStageCollection.I"></File>
-				<File RelativePath="..\panda\src\pgraph\camera.h"></File>
-				<File RelativePath="..\panda\src\pgraph\fadeLodNodeData.cxx"></File>
-				<File RelativePath="..\panda\src\pgraph\sceneGraphReducer.h"></File>
-				<File RelativePath="..\panda\src\pgraph\texMatrixAttrib.I"></File>
-				<File RelativePath="..\panda\src\pgraph\findApproxPath.h"></File>
-				<File RelativePath="..\panda\src\pgraph\textureStageCollection.cxx"></File>
-				<File RelativePath="..\panda\src\pgraph\audioVolumeAttrib.I"></File>
-				<File RelativePath="..\panda\src\pgraph\portalClipper.I"></File>
-				<File RelativePath="..\panda\src\pgraph\billboardEffect.cxx"></File>
-				<File RelativePath="..\panda\src\pgraph\cullResult.cxx"></File>
-				<File RelativePath="..\panda\src\pgraph\fogAttrib.I"></File>
-				<File RelativePath="..\panda\src\pgraph\eventStorePandaNode.h"></File>
-				<File RelativePath="..\panda\src\pgraph\colorBlendAttrib.h"></File>
-				<File RelativePath="..\panda\src\pgraph\sceneGraphReducer.I"></File>
-				<File RelativePath="..\panda\src\pgraph\pandaNode.cxx"></File>
-				<File RelativePath="..\panda\src\pgraph\scissorAttrib.I"></File>
-				<File RelativePath="..\panda\src\pgraph\sceneGraphReducer.cxx"></File>
-				<File RelativePath="..\panda\src\pgraph\cullPlanes.I"></File>
-				<File RelativePath="..\panda\src\pgraph\accumulatedAttribs.cxx"></File>
-				<File RelativePath="..\panda\src\pgraph\modelPool.h"></File>
-				<File RelativePath="..\panda\src\pgraph\antialiasAttrib.h"></File>
-				<File RelativePath="..\panda\src\pgraph\geomDrawCallbackData.I"></File>
-				<File RelativePath="..\panda\src\pgraph\loaderFileTypeBam.cxx"></File>
-				<File RelativePath="..\panda\src\pgraph\depthTestAttrib.cxx"></File>
-				<File RelativePath="..\panda\src\pgraph\polylightEffect.I"></File>
-				<File RelativePath="..\panda\src\pgraph\modelFlattenRequest.I"></File>
-				<File RelativePath="..\panda\src\pgraph\transparencyAttrib.I"></File>
-				<File RelativePath="..\panda\src\pgraph\depthWriteAttrib.cxx"></File>
-				<File RelativePath="..\panda\src\pgraph\alphaTestAttrib.I"></File>
-				<File RelativePath="..\panda\src\pgraph\auxBitplaneAttrib.I"></File>
-				<File RelativePath="..\panda\src\pgraph\internalNameCollection.cxx"></File>
-				<File RelativePath="..\panda\src\pgraph\modelNode.cxx"></File>
-				<File RelativePath="..\panda\src\pgraph\nodePathCollection.I"></File>
-				<File RelativePath="..\panda\src\pgraph\transparencyAttrib.cxx"></File>
-				<File RelativePath="..\panda\src\pgraph\config_pgraph.h"></File>
-				<File RelativePath="..\panda\src\pgraph\renderState.I"></File>
-				<File RelativePath="..\panda\src\pgraph\modelLoadRequest.h"></File>
-				<File RelativePath="..\panda\src\pgraph\cacheStats.h"></File>
-				<File RelativePath="..\panda\src\pgraph\stateMunger.h"></File>
-				<File RelativePath="..\panda\src\pgraph\cullFaceAttrib.I"></File>
-				<File RelativePath="..\panda\src\pgraph\texGenAttrib.cxx"></File>
-				<File RelativePath="..\panda\src\pgraph\sceneSetup.cxx"></File>
-				<File RelativePath="..\panda\src\pgraph\planeNode.cxx"></File>
-				<File RelativePath="..\panda\src\pgraph\weakNodePath.cxx"></File>
-				<File RelativePath="..\panda\src\pgraph\nodePath.h"></File>
-				<File RelativePath="..\panda\src\pgraph\geomNode.h"></File>
-				<File RelativePath="..\panda\src\pgraph\fadeLodNode.h"></File>
-				<File RelativePath="..\panda\src\pgraph\findApproxLevelEntry.I"></File>
-				<File RelativePath="..\panda\src\pgraph\pgraph_composite.cxx"></File>
-				<File RelativePath="..\panda\src\pgraph\lodNodeType.h"></File>
-				<File RelativePath="..\panda\src\pgraph\fog.I"></File>
-				<File RelativePath="..\panda\src\pgraph\shaderGeneratorBase.h"></File>
-				<File RelativePath="..\panda\src\pgraph\nodePath.cxx"></File>
-				<File RelativePath="..\panda\src\pgraph\planeNode.I"></File>
-				<File RelativePath="..\panda\src\pgraph\cullTraverserData.I"></File>
-				<File RelativePath="..\panda\src\pgraph\renderEffects.cxx"></File>
-				<File RelativePath="..\panda\src\pgraph\geomDrawCallbackData.cxx"></File>
-				<File RelativePath="..\panda\src\pgraph\renderEffects.I"></File>
-				<File RelativePath="..\panda\src\pgraph\cullFaceAttrib.cxx"></File>
-				<File RelativePath="..\panda\src\pgraph\sceneSetup.h"></File>
-				<File RelativePath="..\panda\src\pgraph\auxSceneData.h"></File>
-				<File RelativePath="..\panda\src\pgraph\textureStageCollection.h"></File>
-				<File RelativePath="..\panda\src\pgraph\eventStorePandaNode.I"></File>
-				<File RelativePath="..\panda\src\pgraph\cullBinManager.h"></File>
-				<File RelativePath="..\panda\src\pgraph\cullHandler.I"></File>
-				<File RelativePath="..\panda\src\pgraph\scissorEffect.h"></File>
-				<File RelativePath="..\panda\src\pgraph\nodePathComponent.I"></File>
-				<File RelativePath="..\panda\src\pgraph\auxSceneData.cxx"></File>
-				<File RelativePath="..\panda\src\pgraph\fadeLodNodeData.h"></File>
-				<File RelativePath="..\panda\src\pgraph\clipPlaneAttrib.cxx"></File>
-				<File RelativePath="..\panda\src\pgraph\lightRampAttrib.cxx"></File>
-				<File RelativePath="..\panda\src\pgraph\accumulatedAttribs.h"></File>
-				<File RelativePath="..\panda\src\pgraph\stencilAttrib.cxx"></File>
-				<File RelativePath="..\panda\src\pgraph\lodNodeType.cxx"></File>
-				<File RelativePath="..\panda\src\pgraph\depthOffsetAttrib.I"></File>
-				<File RelativePath="..\panda\src\pgraph\rescaleNormalAttrib.h"></File>
-				<File RelativePath="..\panda\src\pgraph\cullBinAttrib.cxx"></File>
-				<File RelativePath="..\panda\src\pgraph\colorAttrib.I"></File>
-				<File RelativePath="..\panda\src\pgraph\auxBitplaneAttrib.h"></File>
-				<File RelativePath="..\panda\src\pgraph\loaderFileTypeRegistry.h"></File>
-				<File RelativePath="..\panda\src\pgraph\portalClipper.h"></File>
-				<File RelativePath="..\panda\src\pgraph\modelRoot.I"></File>
-				<File RelativePath="..\panda\src\pgraph\compassEffect.I"></File>
-				<File RelativePath="..\panda\src\pgraph\bamFile.h"></File>
-				<File RelativePath="..\panda\src\pgraph\sceneGraphAnalyzer.h"></File>
-				<File RelativePath="..\panda\src\pgraph\cullBin.I"></File>
-				<File RelativePath="..\panda\src\pgraph\config_pgraph.cxx"></File>
-				<File RelativePath="..\panda\src\pgraph\sceneGraphAnalyzer.cxx"></File>
-				<File RelativePath="..\panda\src\pgraph\internalNameCollection.h"></File>
-				<File RelativePath="..\panda\src\pgraph\shadeModelAttrib.h"></File>
-				<File RelativePath="..\panda\src\pgraph\texProjectorEffect.h"></File>
-				<File RelativePath="..\panda\src\pgraph\modelLoadRequest.cxx"></File>
-				<File RelativePath="..\panda\src\pgraph\renderModeAttrib.cxx"></File>
-				<File RelativePath="..\panda\src\pgraph\nodePathCollection.cxx"></File>
-				<File RelativePath="..\panda\src\pgraph\compassEffect.h"></File>
-				<File RelativePath="..\panda\src\pgraph\camera.I"></File>
-				<File RelativePath="..\panda\src\pgraph\polylightNode.I"></File>
-				<File RelativePath="..\panda\src\pgraph\alphaTestAttrib.cxx"></File>
-				<File RelativePath="..\panda\src\pgraph\nodePathCollection.h"></File>
-				<File RelativePath="..\panda\src\pgraph\cullableObject.h"></File>
-				<File RelativePath="..\panda\src\pgraph\loader.h"></File>
-				<File RelativePath="..\panda\src\pgraph\bamFile.cxx"></File>
-				<File RelativePath="..\panda\src\pgraph\materialCollection.I"></File>
-				<File RelativePath="..\panda\src\pgraph\showBoundsEffect.h"></File>
-				<File RelativePath="..\panda\src\pgraph\materialAttrib.h"></File>
-				<File RelativePath="..\panda\src\pgraph\lodNode.h"></File>
-				<File RelativePath="..\panda\src\pgraph\textureAttrib.h"></File>
-				<File RelativePath="..\panda\src\pgraph\cullPlanes.cxx"></File>
-				<File RelativePath="..\panda\src\pgraph\colorBlendAttrib.I"></File>
-				<File RelativePath="..\panda\src\pgraph\lightRampAttrib.I"></File>
-				<File RelativePath="..\panda\src\pgraph\fog.h"></File>
-				<File RelativePath="..\panda\src\pgraph\colorAttrib.h"></File>
-				<File RelativePath="..\panda\src\pgraph\renderModeAttrib.h"></File>
-				<File RelativePath="..\panda\src\pgraph\shaderAttrib.I"></File>
-				<File RelativePath="..\panda\src\pgraph\geomNode.cxx"></File>
-				<File RelativePath="..\panda\src\pgraph\shadeModelAttrib.cxx"></File>
-				<File RelativePath="..\panda\src\pgraph\cullFaceAttrib.h"></File>
-				<File RelativePath="..\panda\src\pgraph\depthWriteAttrib.I"></File>
-				<File RelativePath="..\panda\src\pgraph\findApproxPath.I"></File>
-				<File RelativePath="..\panda\src\pgraph\modelLoadRequest.I"></File>
-				<File RelativePath="..\panda\src\pgraph\renderAttribRegistry.I"></File>
-				<File RelativePath="..\panda\src\pgraph\rescaleNormalAttrib.cxx"></File>
-				<File RelativePath="..\panda\src\pgraph\cullPlanes.h"></File>
-				<File RelativePath="..\panda\src\pgraph\stateMunger.cxx"></File>
-				<File RelativePath="..\panda\src\pgraph\planeNode.h"></File>
-				<File RelativePath="..\panda\src\pgraph\loaderFileType.cxx"></File>
-				<File RelativePath="..\panda\src\pgraph\cullBinEnums.h"></File>
-				<File RelativePath="..\panda\src\pgraph\shaderInput.h"></File>
-				<File RelativePath="..\panda\src\pgraph\lightAttrib.I"></File>
-				<File RelativePath="..\panda\src\pgraph\lensNode.h"></File>
-				<File RelativePath="..\panda\src\pgraph\cullTraverserData.cxx"></File>
-				<File RelativePath="..\panda\src\pgraph\lodNode.cxx"></File>
-				<File RelativePath="..\panda\src\pgraph\polylightEffect.cxx"></File>
-				<File RelativePath="..\panda\src\pgraph\modelNode.I"></File>
-				<File RelativePath="..\panda\src\pgraph\auxSceneData.I"></File>
-				<File RelativePath="..\panda\src\pgraph\loaderFileTypeBam.h"></File>
-				<File RelativePath="..\panda\src\pgraph\sceneSetup.I"></File>
-				<File RelativePath="..\panda\src\pgraph\textureAttrib.cxx"></File>
-				<File RelativePath="..\panda\src\pgraph\modelRoot.h"></File>
-				<File RelativePath="..\panda\src\pgraph\cullTraverser.cxx"></File>
-				<File RelativePath="..\panda\src\pgraph\cullBin.cxx"></File>
-				<File RelativePath="..\panda\src\pgraph\lensNode.cxx"></File>
-				<File RelativePath="..\panda\src\pgraph\renderAttribRegistry.cxx"></File>
-				<File RelativePath="..\panda\src\pgraph\renderEffect.h"></File>
-				<File RelativePath="..\panda\src\pgraph\nodePath.I"></File>
-				<File RelativePath="..\panda\src\pgraph\showBoundsEffect.cxx"></File>
-				<File RelativePath="..\panda\src\pgraph\findApproxLevelEntry.cxx"></File>
-				<File RelativePath="..\panda\src\pgraph\decalEffect.h"></File>
-				<File RelativePath="..\panda\src\pgraph\colorAttrib.cxx"></File>
-				<File RelativePath="..\panda\src\pgraph\pgraph_composite1.cxx"></File>
-				<File RelativePath="..\panda\src\pgraph\modelFlattenRequest.h"></File>
-				<File RelativePath="..\panda\src\pgraph\weakNodePath.I"></File>
-				<File RelativePath="..\panda\src\pgraph\materialAttrib.cxx"></File>
-				<File RelativePath="..\panda\src\pgraph\shaderInput.cxx"></File>
-				<File RelativePath="..\panda\src\pgraph\renderAttrib.I"></File>
-				<File RelativePath="..\panda\src\pgraph\accumulatedAttribs.I"></File>
-				<File RelativePath="..\panda\src\pgraph\portalClipper.cxx"></File>
-				<File RelativePath="..\panda\src\pgraph\audioVolumeAttrib.h"></File>
-				<File RelativePath="..\panda\src\pgraph\eventStorePandaNode.cxx"></File>
-				<File RelativePath="..\panda\src\pgraph\shaderGeneratorBase.I"></File>
-				<File RelativePath="..\panda\src\pgraph\colorWriteAttrib.I"></File>
-				<File RelativePath="..\panda\src\pgraph\fogAttrib.cxx"></File>
-				<File RelativePath="..\panda\src\pgraph\materialCollection.cxx"></File>
-				<File RelativePath="..\panda\src\pgraph\attribNodeRegistry.cxx"></File>
-				<File RelativePath="..\panda\src\pgraph\polylightNode.cxx"></File>
-				<File RelativePath="..\panda\src\pgraph\textureAttrib.I"></File>
-				<File RelativePath="..\panda\src\pgraph\cullBin.h"></File>
-				<File RelativePath="..\panda\src\pgraph\scissorEffect.I"></File>
-				<File RelativePath="..\panda\src\pgraph\renderState.h"></File>
-				<File RelativePath="..\panda\src\pgraph\antialiasAttrib.I"></File>
-				<File RelativePath="..\panda\src\pgraph\pandaNode.I"></File>
-				<File RelativePath="..\panda\src\pgraph\pgraph_composite2.cxx"></File>
-				<File RelativePath="..\panda\src\pgraph\texProjectorEffect.cxx"></File>
-				<File RelativePath="..\panda\src\pgraph\depthWriteAttrib.h"></File>
-				<File RelativePath="..\panda\src\pgraph\cullableObject.I"></File>
-				<File RelativePath="..\panda\src\pgraph\pandaNode.h"></File>
-				<File RelativePath="..\panda\src\pgraph\renderAttrib.cxx"></File>
-				<File RelativePath="..\panda\src\pgraph\portalNode.cxx"></File>
-				<File RelativePath="..\panda\src\pgraph\texProjectorEffect.I"></File>
-				<File RelativePath="..\panda\src\pgraph\cullResult.I"></File>
-				<File RelativePath="..\panda\src\pgraph\findApproxLevelEntry.h"></File>
-				<File RelativePath="..\panda\src\pgraph\renderAttribRegistry.h"></File>
-				<File RelativePath="..\panda\src\pgraph\modelPool.I"></File>
-				<File RelativePath="..\panda\src\pgraph\shaderInput.I"></File>
-				<File RelativePath="..\panda\src\pgraph\texGenAttrib.I"></File>
-				<File RelativePath="..\panda\src\pgraph\alphaTestAttrib.h"></File>
-				<File RelativePath="..\panda\src\pgraph\cullResult.h"></File>
-				<File RelativePath="..\panda\src\pgraph\cullTraverser.I"></File>
-				<File RelativePath="..\panda\src\pgraph\workingNodePath.h"></File>
-				<File RelativePath="..\panda\src\pgraph\geomTransformer.cxx"></File>
-				<File RelativePath="..\panda\src\pgraph\internalNameCollection.I"></File>
-				<File RelativePath="..\panda\src\pgraph\geomTransformer.I"></File>
-				<File RelativePath="..\panda\src\pgraph\transformState.I"></File>
-				<File RelativePath="..\panda\src\pgraph\cacheStats.I"></File>
-				<File RelativePath="..\panda\src\pgraph\scissorAttrib.h"></File>
-				<File RelativePath="..\panda\src\pgraph\lightRampAttrib.h"></File>
-				<File RelativePath="..\panda\src\pgraph\colorScaleAttrib.h"></File>
-				<File RelativePath="..\panda\src\pgraph\audioVolumeAttrib.cxx"></File>
-			</Filter>
-			<Filter Name="dxgsg8">
-				<File RelativePath="..\panda\src\dxgsg8\wdxGraphicsPipe8.cxx"></File>
-				<File RelativePath="..\panda\src\dxgsg8\dxGraphicsStateGuardian8.cxx"></File>
-				<File RelativePath="..\panda\src\dxgsg8\dxIndexBufferContext8.cxx"></File>
-				<File RelativePath="..\panda\src\dxgsg8\wdxGraphicsBuffer8.cxx"></File>
-				<File RelativePath="..\panda\src\dxgsg8\dxgsg8base.h"></File>
-				<File RelativePath="..\panda\src\dxgsg8\dxIndexBufferContext8.I"></File>
-				<File RelativePath="..\panda\src\dxgsg8\dxVertexBufferContext8.cxx"></File>
-				<File RelativePath="..\panda\src\dxgsg8\dxTextureContext8.I"></File>
-				<File RelativePath="..\panda\src\dxgsg8\dxGeomMunger8.cxx"></File>
-				<File RelativePath="..\panda\src\dxgsg8\dxIndexBufferContext8.h"></File>
-				<File RelativePath="..\panda\src\dxgsg8\config_dxgsg8.h"></File>
-				<File RelativePath="..\panda\src\dxgsg8\dxgsg8_composite1.cxx"></File>
-				<File RelativePath="..\panda\src\dxgsg8\wdxGraphicsWindow8.h"></File>
-				<File RelativePath="..\panda\src\dxgsg8\dxGeomMunger8.h"></File>
-				<File RelativePath="..\panda\src\dxgsg8\wdxGraphicsPipe8.h"></File>
-				<File RelativePath="..\panda\src\dxgsg8\wdxGraphicsWindow8.I"></File>
-				<File RelativePath="..\panda\src\dxgsg8\dxGeomMunger8.I"></File>
-				<File RelativePath="..\panda\src\dxgsg8\dxGraphicsDevice8.cxx"></File>
-				<File RelativePath="..\panda\src\dxgsg8\dxGraphicsStateGuardian8.I"></File>
-				<File RelativePath="..\panda\src\dxgsg8\dxInput8.h"></File>
-				<File RelativePath="..\panda\src\dxgsg8\dxTextureContext8.h"></File>
-				<File RelativePath="..\panda\src\dxgsg8\wdxGraphicsPipe8.I"></File>
-				<File RelativePath="..\panda\src\dxgsg8\config_dxgsg8.cxx"></File>
-				<File RelativePath="..\panda\src\dxgsg8\dxInput8.cxx"></File>
-				<File RelativePath="..\panda\src\dxgsg8\dxTextureContext8.cxx"></File>
-				<File RelativePath="..\panda\src\dxgsg8\dxgsg8_composite.cxx"></File>
-				<File RelativePath="..\panda\src\dxgsg8\dxGraphicsStateGuardian8.h"></File>
-				<File RelativePath="..\panda\src\dxgsg8\dxVertexBufferContext8.I"></File>
-				<File RelativePath="..\panda\src\dxgsg8\dxGraphicsDevice8.h"></File>
-				<File RelativePath="..\panda\src\dxgsg8\dxVertexBufferContext8.h"></File>
-				<File RelativePath="..\panda\src\dxgsg8\wdxGraphicsWindow8.cxx"></File>
-				<File RelativePath="..\panda\src\dxgsg8\wdxGraphicsBuffer8.h"></File>
-			</Filter>
-			<Filter Name="pnmtext">
-				<File RelativePath="..\panda\src\pnmtext\pnmTextMaker.h"></File>
-				<File RelativePath="..\panda\src\pnmtext\freetypeFont.cxx"></File>
-				<File RelativePath="..\panda\src\pnmtext\pnmTextGlyph.h"></File>
-				<File RelativePath="..\panda\src\pnmtext\pnmTextGlyph.I"></File>
-				<File RelativePath="..\panda\src\pnmtext\pnmTextMaker.I"></File>
-				<File RelativePath="..\panda\src\pnmtext\config_pnmtext.cxx"></File>
-				<File RelativePath="..\panda\src\pnmtext\pnmTextMaker.cxx"></File>
-				<File RelativePath="..\panda\src\pnmtext\pnmTextGlyph.cxx"></File>
-				<File RelativePath="..\panda\src\pnmtext\pnmtext_composite1.cxx"></File>
-				<File RelativePath="..\panda\src\pnmtext\config_pnmtext.h"></File>
-				<File RelativePath="..\panda\src\pnmtext\pnmtext_composite.cxx"></File>
-				<File RelativePath="..\panda\src\pnmtext\freetypeFont.I"></File>
-				<File RelativePath="..\panda\src\pnmtext\freetypeFont.h"></File>
-			</Filter>
-			<Filter Name="skel">
-				<File RelativePath="..\panda\src\skel\typedSkel.h"></File>
-				<File RelativePath="..\panda\src\skel\basicSkel.cxx"></File>
-				<File RelativePath="..\panda\src\skel\config_skel.cxx"></File>
-				<File RelativePath="..\panda\src\skel\config_skel.h"></File>
-				<File RelativePath="..\panda\src\skel\basicSkel.I"></File>
-				<File RelativePath="..\panda\src\skel\typedSkel.I"></File>
-				<File RelativePath="..\panda\src\skel\skel_composite1.cxx"></File>
-				<File RelativePath="..\panda\src\skel\basicSkel.h"></File>
-				<File RelativePath="..\panda\src\skel\skel_composite.cxx"></File>
-				<File RelativePath="..\panda\src\skel\typedSkel.cxx"></File>
-			</Filter>
-			<Filter Name="tform">
-				<File RelativePath="..\panda\src\tform\mouseWatcherRegion.I"></File>
-				<File RelativePath="..\panda\src\tform\tform_composite1.cxx"></File>
-				<File RelativePath="..\panda\src\tform\transform2sg.cxx"></File>
-				<File RelativePath="..\panda\src\tform\trackball.h"></File>
-				<File RelativePath="..\panda\src\tform\mouseWatcherRegion.cxx"></File>
-				<File RelativePath="..\panda\src\tform\mouseWatcherGroup.h"></File>
-				<File RelativePath="..\panda\src\tform\mouseWatcherParameter.h"></File>
-				<File RelativePath="..\panda\src\tform\driveInterface.I"></File>
-				<File RelativePath="..\panda\src\tform\mouseWatcher.h"></File>
-				<File RelativePath="..\panda\src\tform\mouseWatcherRegion.h"></File>
-				<File RelativePath="..\panda\src\tform\tform_composite.cxx"></File>
-				<File RelativePath="..\panda\src\tform\mouseInterfaceNode.cxx"></File>
-				<File RelativePath="..\panda\src\tform\config_tform.cxx"></File>
-				<File RelativePath="..\panda\src\tform\mouseInterfaceNode.h"></File>
-				<File RelativePath="..\panda\src\tform\driveInterface.h"></File>
-				<File RelativePath="..\panda\src\tform\buttonThrower.cxx"></File>
-				<File RelativePath="..\panda\src\tform\mouseWatcher.cxx"></File>
-				<File RelativePath="..\panda\src\tform\mouseWatcher.I"></File>
-				<File RelativePath="..\panda\src\tform\transform2sg.h"></File>
-				<File RelativePath="..\panda\src\tform\tform_composite2.cxx"></File>
-				<File RelativePath="..\panda\src\tform\mouseWatcherParameter.cxx"></File>
-				<File RelativePath="..\panda\src\tform\config_tform.h"></File>
-				<File RelativePath="..\panda\src\tform\mouseWatcherGroup.cxx"></File>
-				<File RelativePath="..\panda\src\tform\buttonThrower.I"></File>
-				<File RelativePath="..\panda\src\tform\buttonThrower.h"></File>
-				<File RelativePath="..\panda\src\tform\trackball.cxx"></File>
-				<File RelativePath="..\panda\src\tform\mouseInterfaceNode.I"></File>
-				<File RelativePath="..\panda\src\tform\mouseSubregion.cxx"></File>
-				<File RelativePath="..\panda\src\tform\mouseSubregion.I"></File>
-				<File RelativePath="..\panda\src\tform\mouseSubregion.h"></File>
-				<File RelativePath="..\panda\src\tform\mouseWatcherParameter.I"></File>
-				<File RelativePath="..\panda\src\tform\driveInterface.cxx"></File>
-			</Filter>
-			<Filter Name="egg">
-				<File RelativePath="..\panda\src\egg\eggGroup.h"></File>
-				<File RelativePath="..\panda\src\egg\eggNameUniquifier.h"></File>
-				<File RelativePath="..\panda\src\egg\eggGroup.I"></File>
-				<File RelativePath="..\panda\src\egg\eggCoordinateSystem.cxx"></File>
-				<File RelativePath="..\panda\src\egg\eggNurbsCurve.h"></File>
-				<File RelativePath="..\panda\src\egg\eggMaterialCollection.h"></File>
-				<File RelativePath="..\panda\src\egg\eggLine.h"></File>
-				<File RelativePath="..\panda\src\egg\eggPoint.h"></File>
-				<File RelativePath="..\panda\src\egg\eggBinMaker.h"></File>
-				<File RelativePath="..\panda\src\egg\eggPoint.I"></File>
-				<File RelativePath="..\panda\src\egg\eggFilenameNode.h"></File>
-				<File RelativePath="..\panda\src\egg\eggUtilities.h"></File>
-				<File RelativePath="..\panda\src\egg\eggVertexPool.h"></File>
-				<File RelativePath="..\panda\src\egg\eggBin.h"></File>
-				<File RelativePath="..\panda\src\egg\eggSAnimData.I"></File>
-				<File RelativePath="..\panda\src\egg\eggVertexPool.cxx"></File>
-				<File RelativePath="..\panda\src\egg\eggMorphList.cxx"></File>
-				<File RelativePath="..\panda\src\egg\eggTable.cxx"></File>
-				<File RelativePath="..\panda\src\egg\eggMesherFanMaker.cxx"></File>
-				<File RelativePath="..\panda\src\egg\eggNurbsCurve.cxx"></File>
-				<File RelativePath="..\panda\src\egg\eggSurface.I"></File>
-				<File RelativePath="..\panda\src\egg\eggMesherEdge.I"></File>
-				<File RelativePath="..\panda\src\egg\eggMesher.h"></File>
-				<File RelativePath="..\panda\src\egg\eggPoint.cxx"></File>
-				<File RelativePath="..\panda\src\egg\eggMaterial.I"></File>
-				<File RelativePath="..\panda\src\egg\eggMiscFuncs.cxx"></File>
-				<File RelativePath="..\panda\src\egg\eggVertexUV.I"></File>
-				<File RelativePath="..\panda\src\egg\eggXfmAnimData.cxx"></File>
-				<File RelativePath="..\panda\src\egg\eggTable.I"></File>
-				<File RelativePath="..\panda\src\egg\eggMaterial.cxx"></File>
-				<File RelativePath="..\panda\src\egg\eggExternalReference.h"></File>
-				<File RelativePath="..\panda\src\egg\eggTransform.h"></File>
-				<File RelativePath="..\panda\src\egg\vector_PT_EggVertex.h"></File>
-				<File RelativePath="..\panda\src\egg\vector_PT_EggMaterial.cxx"></File>
-				<File RelativePath="..\panda\src\egg\eggAnimData.h"></File>
-				<File RelativePath="..\panda\src\egg\eggNurbsCurve.I"></File>
-				<File RelativePath="..\panda\src\egg\eggExternalReference.I"></File>
-				<File RelativePath="..\panda\src\egg\eggPoolUniquifier.cxx"></File>
-				<File RelativePath="..\panda\src\egg\eggSurface.h"></File>
-				<File RelativePath="..\panda\src\egg\eggMesherStrip.h"></File>
-				<File RelativePath="..\panda\src\egg\eggPolygon.cxx"></File>
-				<File RelativePath="..\panda\src\egg\eggXfmSAnim.I"></File>
-				<File RelativePath="..\panda\src\egg\vector_PT_EggMaterial.h"></File>
-				<File RelativePath="..\panda\src\egg\eggObject.h"></File>
-				<File RelativePath="..\panda\src\egg\eggRenderMode.I"></File>
-				<File RelativePath="..\panda\src\egg\eggCurve.I"></File>
-				<File RelativePath="..\panda\src\egg\eggSAnimData.cxx"></File>
-				<File RelativePath="..\panda\src\egg\eggMiscFuncs.h"></File>
-				<File RelativePath="..\panda\src\egg\eggMesher.cxx"></File>
-				<File RelativePath="..\panda\src\egg\eggPolysetMaker.h"></File>
-				<File RelativePath="..\panda\src\egg\lexerDefs.h"></File>
-				<File RelativePath="..\panda\src\egg\eggNamedObject.cxx"></File>
-				<File RelativePath="..\panda\src\egg\eggAttributes.cxx"></File>
-				<File RelativePath="..\panda\src\egg\test_egg.cxx"></File>
-				<File RelativePath="..\panda\src\egg\eggComment.I"></File>
-				<File RelativePath="..\panda\src\egg\eggVertex.h"></File>
-				<File RelativePath="..\panda\src\egg\eggSwitchCondition.cxx"></File>
-				<File RelativePath="..\panda\src\egg\eggCoordinateSystem.I"></File>
-				<File RelativePath="..\panda\src\egg\eggNurbsSurface.I"></File>
-				<File RelativePath="..\panda\src\egg\config_egg.h"></File>
-				<File RelativePath="..\panda\src\egg\eggVertex.I"></File>
-				<File RelativePath="..\panda\src\egg\eggMesherEdge.h"></File>
-				<File RelativePath="..\panda\src\egg\eggFilenameNode.I"></File>
-				<File RelativePath="..\panda\src\egg\eggTransform.cxx"></File>
-				<File RelativePath="..\panda\src\egg\eggMorph.I"></File>
-				<File RelativePath="..\panda\src\egg\pt_EggMaterial.h"></File>
-				<File RelativePath="..\panda\src\egg\eggVertexUV.h"></File>
-				<File RelativePath="..\panda\src\egg\egg_composite2.cxx"></File>
-				<File RelativePath="..\panda\src\egg\eggParameters.h"></File>
-				<File RelativePath="..\panda\src\egg\eggUtilities.I"></File>
-				<File RelativePath="..\panda\src\egg\eggMaterial.h"></File>
-				<File RelativePath="..\panda\src\egg\eggSwitchCondition.h"></File>
-				<File RelativePath="..\panda\src\egg\eggTriangleFan.h"></File>
-				<File RelativePath="..\panda\src\egg\eggObject.cxx"></File>
-				<File RelativePath="..\panda\src\egg\eggMesherEdge.cxx"></File>
-				<File RelativePath="..\panda\src\egg\eggMesherFanMaker.I"></File>
-				<File RelativePath="..\panda\src\egg\eggGroupNode.I"></File>
-				<File RelativePath="..\panda\src\egg\eggAttributes.I"></File>
-				<File RelativePath="..\panda\src\egg\eggUtilities.cxx"></File>
-				<File RelativePath="..\panda\src\egg\eggExternalReference.cxx"></File>
-				<File RelativePath="..\panda\src\egg\eggTexture.cxx"></File>
-				<File RelativePath="..\panda\src\egg\eggPrimitive.I"></File>
-				<File RelativePath="..\panda\src\egg\eggNode.I"></File>
-				<File RelativePath="..\panda\src\egg\egg_composite.cxx"></File>
-				<File RelativePath="..\panda\src\egg\eggNode.cxx"></File>
-				<File RelativePath="..\panda\src\egg\eggTriangleFan.cxx"></File>
-				<File RelativePath="..\panda\src\egg\eggTextureCollection.h"></File>
-				<File RelativePath="..\panda\src\egg\eggNameUniquifier.cxx"></File>
-				<File RelativePath="..\panda\src\egg\eggAnimPreload.I"></File>
-				<File RelativePath="..\panda\src\egg\eggTriangleStrip.cxx"></File>
-				<File RelativePath="..\panda\src\egg\eggVertexUV.cxx"></File>
-				<File RelativePath="..\panda\src\egg\eggComment.cxx"></File>
-				<File RelativePath="..\panda\src\egg\eggMorphList.h"></File>
-				<File RelativePath="..\panda\src\egg\eggMaterialCollection.cxx"></File>
-				<File RelativePath="..\panda\src\egg\eggCurve.h"></File>
-				<File RelativePath="..\panda\src\egg\eggMesherStrip.I"></File>
-				<File RelativePath="..\panda\src\egg\eggComment.h"></File>
-				<File RelativePath="..\panda\src\egg\eggCompositePrimitive.h"></File>
-				<File RelativePath="..\panda\src\egg\eggGroupNode.h"></File>
-				<File RelativePath="..\panda\src\egg\eggVertexPool.I"></File>
-				<File RelativePath="..\panda\src\egg\egg_composite1.cxx"></File>
-				<File RelativePath="..\panda\src\egg\eggSAnimData.h"></File>
-				<File RelativePath="..\panda\src\egg\eggUserData.cxx"></File>
-				<File RelativePath="..\panda\src\egg\eggAnimData.I"></File>
-				<File RelativePath="..\panda\src\egg\pt_EggMaterial.cxx"></File>
-				<File RelativePath="..\panda\src\egg\eggTriangleStrip.I"></File>
-				<File RelativePath="..\panda\src\egg\eggPolygon.I"></File>
-				<File RelativePath="..\panda\src\egg\vector_PT_EggVertex.cxx"></File>
-				<File RelativePath="..\panda\src\egg\eggTriangleStrip.h"></File>
-				<File RelativePath="..\panda\src\egg\eggRenderMode.h"></File>
-				<File RelativePath="..\panda\src\egg\pt_EggTexture.h"></File>
-				<File RelativePath="..\panda\src\egg\eggGroupNode.cxx"></File>
-				<File RelativePath="..\panda\src\egg\eggUserData.h"></File>
-				<File RelativePath="..\panda\src\egg\eggNurbsSurface.cxx"></File>
-				<File RelativePath="..\panda\src\egg\parserDefs.h"></File>
-				<File RelativePath="..\panda\src\egg\eggAnimPreload.h"></File>
-				<File RelativePath="..\panda\src\egg\eggRenderMode.cxx"></File>
-				<File RelativePath="..\panda\src\egg\eggCurve.cxx"></File>
-				<File RelativePath="..\panda\src\egg\eggPoolUniquifier.h"></File>
-				<File RelativePath="..\panda\src\egg\eggTextureCollection.cxx"></File>
-				<File RelativePath="..\panda\src\egg\eggMiscFuncs.I"></File>
-				<File RelativePath="..\panda\src\egg\eggBin.cxx"></File>
-				<File RelativePath="..\panda\src\egg\eggMorphList.I"></File>
-				<File RelativePath="..\panda\src\egg\eggMaterialCollection.I"></File>
-				<File RelativePath="..\panda\src\egg\eggCoordinateSystem.h"></File>
-				<File RelativePath="..\panda\src\egg\eggLine.cxx"></File>
-				<File RelativePath="..\panda\src\egg\eggNamedObject.I"></File>
-				<File RelativePath="..\panda\src\egg\eggUserData.I"></File>
-				<File RelativePath="..\panda\src\egg\eggBinMaker.cxx"></File>
-				<File RelativePath="..\panda\src\egg\config_egg.cxx"></File>
-				<File RelativePath="..\panda\src\egg\eggPolysetMaker.cxx"></File>
-				<File RelativePath="..\panda\src\egg\pt_EggVertex.h"></File>
-				<File RelativePath="..\panda\src\egg\eggParameters.cxx"></File>
-				<File RelativePath="..\panda\src\egg\pt_EggTexture.cxx"></File>
-				<File RelativePath="..\panda\src\egg\eggCompositePrimitive.I"></File>
-				<File RelativePath="..\panda\src\egg\eggTexture.I"></File>
-				<File RelativePath="..\panda\src\egg\eggTransform.I"></File>
-				<File RelativePath="..\panda\src\egg\eggNode.h"></File>
-				<File RelativePath="..\panda\src\egg\eggAnimPreload.cxx"></File>
-				<File RelativePath="..\panda\src\egg\eggNamedObject.h"></File>
-				<File RelativePath="..\panda\src\egg\eggXfmSAnim.h"></File>
-				<File RelativePath="..\panda\src\egg\pt_EggVertex.cxx"></File>
-				<File RelativePath="..\panda\src\egg\eggTexture.h"></File>
-				<File RelativePath="..\panda\src\egg\eggXfmAnimData.I"></File>
-				<File RelativePath="..\panda\src\egg\eggData.h"></File>
-				<File RelativePath="..\panda\src\egg\eggPrimitive.cxx"></File>
-				<File RelativePath="..\panda\src\egg\eggVertex.cxx"></File>
-				<File RelativePath="..\panda\src\egg\eggMorph.h"></File>
-				<File RelativePath="..\panda\src\egg\eggMesherFanMaker.h"></File>
-				<File RelativePath="..\panda\src\egg\eggTextureCollection.I"></File>
-				<File RelativePath="..\panda\src\egg\eggFilenameNode.cxx"></File>
-				<File RelativePath="..\panda\src\egg\parser.h"></File>
-				<File RelativePath="..\panda\src\egg\eggCompositePrimitive.cxx"></File>
-				<File RelativePath="..\panda\src\egg\eggPrimitive.h"></File>
-				<File RelativePath="..\panda\src\egg\lexer.cxx"></File>
-				<File RelativePath="..\panda\src\egg\parser.cxx"></File>
-				<File RelativePath="..\panda\src\egg\eggNurbsSurface.h"></File>
-				<File RelativePath="..\panda\src\egg\eggData.cxx"></File>
-				<File RelativePath="..\panda\src\egg\eggData.I"></File>
-				<File RelativePath="..\panda\src\egg\eggTriangleFan.I"></File>
-				<File RelativePath="..\panda\src\egg\eggGroupUniquifier.cxx"></File>
-				<File RelativePath="..\panda\src\egg\eggSurface.cxx"></File>
-				<File RelativePath="..\panda\src\egg\vector_PT_EggTexture.cxx"></File>
-				<File RelativePath="..\panda\src\egg\eggGroup.cxx"></File>
-				<File RelativePath="..\panda\src\egg\eggXfmAnimData.h"></File>
-				<File RelativePath="..\panda\src\egg\eggLine.I"></File>
-				<File RelativePath="..\panda\src\egg\eggMesherStrip.cxx"></File>
-				<File RelativePath="..\panda\src\egg\eggTable.h"></File>
-				<File RelativePath="..\panda\src\egg\eggAnimData.cxx"></File>
-				<File RelativePath="..\panda\src\egg\eggMesher.I"></File>
-				<File RelativePath="..\panda\src\egg\eggAttributes.h"></File>
-				<File RelativePath="..\panda\src\egg\eggXfmSAnim.cxx"></File>
-				<File RelativePath="..\panda\src\egg\eggObject.I"></File>
-				<File RelativePath="..\panda\src\egg\vector_PT_EggTexture.h"></File>
-				<File RelativePath="..\panda\src\egg\eggGroupUniquifier.h"></File>
-				<File RelativePath="..\panda\src\egg\eggPolygon.h"></File>
-			</Filter>
-			<Filter Name="grutil">
-				<File RelativePath="..\panda\src\grutil\geoMipZone.I"></File>
-				<File RelativePath="..\panda\src\grutil\geoMipTerrain.cxx"></File>
-				<File RelativePath="..\panda\src\grutil\rigidBodyCombiner.h"></File>
-				<File RelativePath="..\panda\src\grutil\pipeOcclusionCullTraverser.cxx"></File>
-				<File RelativePath="..\panda\src\grutil\lineSegs.cxx"></File>
-				<File RelativePath="..\panda\src\grutil\rigidBodyCombiner.cxx"></File>
-				<File RelativePath="..\panda\src\grutil\movieTexture.cxx"></File>
-				<File RelativePath="..\panda\src\grutil\pagedGeoMipTerrain.h"></File>
-				<File RelativePath="..\panda\src\grutil\grutil_composite1.cxx"></File>
-				<File RelativePath="..\panda\src\grutil\nodeVertexTransform.cxx"></File>
-				<File RelativePath="..\panda\src\grutil\pipeOcclusionCullTraverser.h"></File>
-				<File RelativePath="..\panda\src\grutil\frameRateMeter.I"></File>
-				<File RelativePath="..\panda\src\grutil\multitexReducer.h"></File>
-				<File RelativePath="..\panda\src\grutil\grutil_composite.cxx"></File>
-				<File RelativePath="..\panda\src\grutil\nodeVertexTransform.I"></File>
-				<File RelativePath="..\panda\src\grutil\movieTexture.h"></File>
-				<File RelativePath="..\panda\src\grutil\openCVTexture.cxx"></File>
-				<File RelativePath="..\panda\src\grutil\ffmpegTexture.I"></File>
-				<File RelativePath="..\panda\src\grutil\multitexReducer.cxx"></File>
-				<File RelativePath="..\panda\src\grutil\fisheyeMaker.h"></File>
-				<File RelativePath="..\panda\src\grutil\pipeOcclusionCullTraverser.I"></File>
-				<File RelativePath="..\panda\src\grutil\geoMipTerrain.h"></File>
-				<File RelativePath="..\panda\src\grutil\arToolKit.h"></File>
-				<File RelativePath="..\panda\src\grutil\geoMipZone.h"></File>
-				<File RelativePath="..\panda\src\grutil\geoMipTerrain.I"></File>
-				<File RelativePath="..\panda\src\grutil\movieTexture.I"></File>
-				<File RelativePath="..\panda\src\grutil\arToolKit.I"></File>
-				<File RelativePath="..\panda\src\grutil\cardMaker.h"></File>
-				<File RelativePath="..\panda\src\grutil\meshDrawer.cxx"></File>
-				<File RelativePath="..\panda\src\grutil\grutil_composite2.cxx"></File>
-				<File RelativePath="..\panda\src\grutil\openCVTexture.I"></File>
-				<File RelativePath="..\panda\src\grutil\fisheyeMaker.cxx"></File>
-				<File RelativePath="..\panda\src\grutil\lineSegs.h"></File>
-				<File RelativePath="..\panda\src\grutil\geoMipZone.cxx"></File>
-				<File RelativePath="..\panda\src\grutil\config_grutil.cxx"></File>
-				<File RelativePath="..\panda\src\grutil\fisheyeMaker.I"></File>
-				<File RelativePath="..\panda\src\grutil\openCVTexture.h"></File>
-				<File RelativePath="..\panda\src\grutil\meshDrawer.I"></File>
-				<File RelativePath="..\panda\src\grutil\lineSegs.I"></File>
-				<File RelativePath="..\panda\src\grutil\rigidBodyCombiner.I"></File>
-				<File RelativePath="..\panda\src\grutil\pagedGeoMipTerrain.I"></File>
-				<File RelativePath="..\panda\src\grutil\arToolKit.cxx"></File>
-				<File RelativePath="..\panda\src\grutil\cardMaker.cxx"></File>
-				<File RelativePath="..\panda\src\grutil\heightfieldTesselator.h"></File>
-				<File RelativePath="..\panda\src\grutil\pagedGeoMipTerrain.cxx"></File>
-				<File RelativePath="..\panda\src\grutil\frameRateMeter.h"></File>
-				<File RelativePath="..\panda\src\grutil\heightfieldTesselator.cxx"></File>
-				<File RelativePath="..\panda\src\grutil\meshDrawer.h"></File>
-				<File RelativePath="..\panda\src\grutil\multitexReducer.I"></File>
-				<File RelativePath="..\panda\src\grutil\ffmpegTexture.h"></File>
-				<File RelativePath="..\panda\src\grutil\nodeVertexTransform.h"></File>
-				<File RelativePath="..\panda\src\grutil\config_grutil.h"></File>
-				<File RelativePath="..\panda\src\grutil\heightfieldTesselator.I"></File>
-				<File RelativePath="..\panda\src\grutil\ffmpegTexture.cxx"></File>
-				<File RelativePath="..\panda\src\grutil\frameRateMeter.cxx"></File>
-				<File RelativePath="..\panda\src\grutil\cardMaker.I"></File>
-			</Filter>
-			<Filter Name="glstuff">
-				<File RelativePath="..\panda\src\glstuff\glGraphicsBuffer_src.cxx"></File>
-				<File RelativePath="..\panda\src\glstuff\glmisc_src.h"></File>
-				<File RelativePath="..\panda\src\glstuff\glIndexBufferContext_src.cxx"></File>
-				<File RelativePath="..\panda\src\glstuff\glShaderContext_src.I"></File>
-				<File RelativePath="..\panda\src\glstuff\panda_glext.h"></File>
-				<File RelativePath="..\panda\src\glstuff\glImmediateModeSender_src.cxx"></File>
-				<File RelativePath="..\panda\src\glstuff\glstuff_undef_src.h"></File>
-				<File RelativePath="..\panda\src\glstuff\glTextureContext_src.I"></File>
-				<File RelativePath="..\panda\src\glstuff\glGeomContext_src.cxx"></File>
-				<File RelativePath="..\panda\src\glstuff\glOcclusionQueryContext_src.h"></File>
-				<File RelativePath="..\panda\src\glstuff\glGraphicsBuffer_src.I"></File>
-				<File RelativePath="..\panda\src\glstuff\glGeomMunger_src.h"></File>
-				<File RelativePath="..\panda\src\glstuff\glGeomMunger_src.cxx"></File>
-				<File RelativePath="..\panda\src\glstuff\glGeomContext_src.h"></File>
-				<File RelativePath="..\panda\src\glstuff\glOcclusionQueryContext_src.I"></File>
-				<File RelativePath="..\panda\src\glstuff\glVertexBufferContext_src.cxx"></File>
-				<File RelativePath="..\panda\src\glstuff\glShaderContext_src.cxx"></File>
-				<File RelativePath="..\panda\src\glstuff\glGeomContext_src.I"></File>
-				<File RelativePath="..\panda\src\glstuff\glShaderContext_src.h"></File>
-				<File RelativePath="..\panda\src\glstuff\glIndexBufferContext_src.h"></File>
-				<File RelativePath="..\panda\src\glstuff\glIndexBufferContext_src.I"></File>
-				<File RelativePath="..\panda\src\glstuff\glGraphicsStateGuardian_src.cxx"></File>
-				<File RelativePath="..\panda\src\glstuff\glVertexBufferContext_src.h"></File>
-				<File RelativePath="..\panda\src\glstuff\glOcclusionQueryContext_src.cxx"></File>
-				<File RelativePath="..\panda\src\glstuff\glstuff_src.cxx"></File>
-				<File RelativePath="..\panda\src\glstuff\glTextureContext_src.h"></File>
-				<File RelativePath="..\panda\src\glstuff\glTextureContext_src.cxx"></File>
-				<File RelativePath="..\panda\src\glstuff\glImmediateModeSender_src.I"></File>
-				<File RelativePath="..\panda\src\glstuff\glVertexBufferContext_src.I"></File>
-				<File RelativePath="..\panda\src\glstuff\glGraphicsBuffer_src.h"></File>
-				<File RelativePath="..\panda\src\glstuff\glGraphicsStateGuardian_src.h"></File>
-				<File RelativePath="..\panda\src\glstuff\glGeomMunger_src.I"></File>
-				<File RelativePath="..\panda\src\glstuff\glmisc_src.cxx"></File>
-				<File RelativePath="..\panda\src\glstuff\glstuff_src.h"></File>
-				<File RelativePath="..\panda\src\glstuff\glpure.cxx"></File>
-				<File RelativePath="..\panda\src\glstuff\glImmediateModeSender_src.h"></File>
-				<File RelativePath="..\panda\src\glstuff\glGraphicsStateGuardian_src.I"></File>
-			</Filter>
-			<Filter Name="pandabase">
-				<File RelativePath="..\panda\src\pandabase\pandabase.h"></File>
-				<File RelativePath="..\panda\src\pandabase\pandabase.cxx"></File>
-				<File RelativePath="..\panda\src\pandabase\pandasymbols.h"></File>
-			</Filter>
-			<Filter Name="vrpn">
-				<File RelativePath="..\panda\src\vrpn\vrpnButtonDevice.I"></File>
-				<File RelativePath="..\panda\src\vrpn\config_vrpn.cxx"></File>
-				<File RelativePath="..\panda\src\vrpn\vrpnDial.I"></File>
-				<File RelativePath="..\panda\src\vrpn\vrpnButton.I"></File>
-				<File RelativePath="..\panda\src\vrpn\vrpnButton.cxx"></File>
-				<File RelativePath="..\panda\src\vrpn\vrpnAnalog.cxx"></File>
-				<File RelativePath="..\panda\src\vrpn\vrpnTracker.cxx"></File>
-				<File RelativePath="..\panda\src\vrpn\vrpnTrackerDevice.h"></File>
-				<File RelativePath="..\panda\src\vrpn\vrpnDialDevice.cxx"></File>
-				<File RelativePath="..\panda\src\vrpn\vrpn_interface.h"></File>
-				<File RelativePath="..\panda\src\vrpn\vrpnDial.cxx"></File>
-				<File RelativePath="..\panda\src\vrpn\vrpnTrackerDevice.I"></File>
-				<File RelativePath="..\panda\src\vrpn\vrpnDialDevice.h"></File>
-				<File RelativePath="..\panda\src\vrpn\vrpnAnalogDevice.h"></File>
-				<File RelativePath="..\panda\src\vrpn\vrpnTracker.h"></File>
-				<File RelativePath="..\panda\src\vrpn\vrpn_composite1.cxx"></File>
-				<File RelativePath="..\panda\src\vrpn\vrpn_composite.cxx"></File>
-				<File RelativePath="..\panda\src\vrpn\vrpnButton.h"></File>
-				<File RelativePath="..\panda\src\vrpn\vrpnButtonDevice.h"></File>
-				<File RelativePath="..\panda\src\vrpn\config_vrpn.h"></File>
-				<File RelativePath="..\panda\src\vrpn\vrpnTracker.I"></File>
-				<File RelativePath="..\panda\src\vrpn\vrpnClient.h"></File>
-				<File RelativePath="..\panda\src\vrpn\vrpnButtonDevice.cxx"></File>
-				<File RelativePath="..\panda\src\vrpn\vrpnTrackerDevice.cxx"></File>
-				<File RelativePath="..\panda\src\vrpn\vrpnAnalog.h"></File>
-				<File RelativePath="..\panda\src\vrpn\vrpnAnalog.I"></File>
-				<File RelativePath="..\panda\src\vrpn\vrpnDialDevice.I"></File>
-				<File RelativePath="..\panda\src\vrpn\vrpnAnalogDevice.I"></File>
-				<File RelativePath="..\panda\src\vrpn\vrpnAnalogDevice.cxx"></File>
-				<File RelativePath="..\panda\src\vrpn\vrpnDial.h"></File>
-				<File RelativePath="..\panda\src\vrpn\vrpnClient.cxx"></File>
-				<File RelativePath="..\panda\src\vrpn\vrpnClient.I"></File>
-			</Filter>
-			<Filter Name="osxdisplay">
-				<File RelativePath="..\panda\src\osxdisplay\osxGraphicsBuffer.h"></File>
-				<File RelativePath="..\panda\src\osxdisplay\osxGraphicsWindow.I"></File>
-				<File RelativePath="..\panda\src\osxdisplay\osxGraphicsPipe.cxx"></File>
-				<File RelativePath="..\panda\src\osxdisplay\osxGraphicsBuffer.cxx"></File>
-				<File RelativePath="..\panda\src\osxdisplay\config_osxdisplay.h"></File>
-				<File RelativePath="..\panda\src\osxdisplay\resize_box.rgb.c"></File>
-				<File RelativePath="..\panda\src\osxdisplay\osxGraphicsStateGuardian.h"></File>
-				<File RelativePath="..\panda\src\osxdisplay\osxGraphicsWindow.h"></File>
-				<File RelativePath="..\panda\src\osxdisplay\config_osxdisplay.cxx"></File>
-				<File RelativePath="..\panda\src\osxdisplay\osxGraphicsPipe.h"></File>
-				<File RelativePath="..\panda\src\osxdisplay\osxGraphicsStateGuardian.cxx"></File>
-			</Filter>
-			<Filter Name="net">
-				<File RelativePath="..\panda\src\net\queuedConnectionReader.cxx"></File>
-				<File RelativePath="..\panda\src\net\datagramGeneratorNet.I"></File>
-				<File RelativePath="..\panda\src\net\datagramSinkNet.cxx"></File>
-				<File RelativePath="..\panda\src\net\connectionReader.h"></File>
-				<File RelativePath="..\panda\src\net\config_net.cxx"></File>
-				<File RelativePath="..\panda\src\net\net_composite1.cxx"></File>
-				<File RelativePath="..\panda\src\net\test_udp.cxx"></File>
-				<File RelativePath="..\panda\src\net\datagramGeneratorNet.cxx"></File>
-				<File RelativePath="..\panda\src\net\queuedReturn.I"></File>
-				<File RelativePath="..\panda\src\net\netAddress.h"></File>
-				<File RelativePath="..\panda\src\net\queuedReturn.h"></File>
-				<File RelativePath="..\panda\src\net\datagramSinkNet.I"></File>
-				<File RelativePath="..\panda\src\net\connection.h"></File>
-				<File RelativePath="..\panda\src\net\test_spam_client.cxx"></File>
-				<File RelativePath="..\panda\src\net\datagramQueue.h"></File>
-				<File RelativePath="..\panda\src\net\datagramUDPHeader.I"></File>
-				<File RelativePath="..\panda\src\net\datagramUDPHeader.cxx"></File>
-				<File RelativePath="..\panda\src\net\net_composite2.cxx"></File>
-				<File RelativePath="..\panda\src\net\config_net.h"></File>
-				<File RelativePath="..\panda\src\net\connectionListener.h"></File>
-				<File RelativePath="..\panda\src\net\test_datagram.cxx"></File>
-				<File RelativePath="..\panda\src\net\datagramTCPHeader.cxx"></File>
-				<File RelativePath="..\panda\src\net\test_tcp_client.cxx"></File>
-				<File RelativePath="..\panda\src\net\datagramSinkNet.h"></File>
-				<File RelativePath="..\panda\src\net\datagramTCPHeader.h"></File>
-				<File RelativePath="..\panda\src\net\connectionWriter.cxx"></File>
-				<File RelativePath="..\panda\src\net\netDatagram.cxx"></File>
-				<File RelativePath="..\panda\src\net\queuedConnectionListener.cxx"></File>
-				<File RelativePath="..\panda\src\net\test_tcp_server.cxx"></File>
-				<File RelativePath="..\panda\src\net\test_spam_server.cxx"></File>
-				<File RelativePath="..\panda\src\net\connectionManager.h"></File>
-				<File RelativePath="..\panda\src\net\connectionManager.cxx"></File>
-				<File RelativePath="..\panda\src\net\netDatagram.I"></File>
-				<File RelativePath="..\panda\src\net\connectionReader.cxx"></File>
-				<File RelativePath="..\panda\src\net\recentConnectionReader.cxx"></File>
-				<File RelativePath="..\panda\src\net\datagramGeneratorNet.h"></File>
-				<File RelativePath="..\panda\src\net\connectionWriter.h"></File>
-				<File RelativePath="..\panda\src\net\connectionListener.cxx"></File>
-				<File RelativePath="..\panda\src\net\netDatagram.h"></File>
-				<File RelativePath="..\panda\src\net\connectionReader.I"></File>
-				<File RelativePath="..\panda\src\net\net_composite.cxx"></File>
-				<File RelativePath="..\panda\src\net\queuedConnectionListener.h"></File>
-				<File RelativePath="..\panda\src\net\test_raw_server.cxx"></File>
-				<File RelativePath="..\panda\src\net\queuedConnectionManager.h"></File>
-				<File RelativePath="..\panda\src\net\fake_http_server.cxx"></File>
-				<File RelativePath="..\panda\src\net\queuedConnectionListener.I"></File>
-				<File RelativePath="..\panda\src\net\datagramUDPHeader.h"></File>
-				<File RelativePath="..\panda\src\net\connection.cxx"></File>
-				<File RelativePath="..\panda\src\net\datagramQueue.cxx"></File>
-				<File RelativePath="..\panda\src\net\queuedConnectionManager.cxx"></File>
-				<File RelativePath="..\panda\src\net\datagramTCPHeader.I"></File>
-				<File RelativePath="..\panda\src\net\queuedConnectionReader.h"></File>
-				<File RelativePath="..\panda\src\net\datagram_ui.h"></File>
-				<File RelativePath="..\panda\src\net\recentConnectionReader.h"></File>
-				<File RelativePath="..\panda\src\net\datagram_ui.cxx"></File>
-				<File RelativePath="..\panda\src\net\netAddress.cxx"></File>
-			</Filter>
-			<Filter Name="movies">
-				<File RelativePath="..\panda\src\movies\ffmpegVideoCursor.h"></File>
-				<File RelativePath="..\panda\src\movies\movies_composite.cxx"></File>
-				<File RelativePath="..\panda\src\movies\ffmpegVirtualFile.I"></File>
-				<File RelativePath="..\panda\src\movies\ffmpegVirtualFile.cxx"></File>
-				<File RelativePath="..\panda\src\movies\userDataAudio.cxx"></File>
-				<File RelativePath="..\panda\src\movies\ffmpegVideo.I"></File>
-				<File RelativePath="..\panda\src\movies\movieAudio.cxx"></File>
-				<File RelativePath="..\panda\src\movies\movies_composite1.cxx"></File>
-				<File RelativePath="..\panda\src\movies\ffmpegAudioCursor.cxx"></File>
-				<File RelativePath="..\panda\src\movies\movieVideoCursor.h"></File>
-				<File RelativePath="..\panda\src\movies\userDataAudioCursor.cxx"></File>
-				<File RelativePath="..\panda\src\movies\userDataAudio.h"></File>
-				<File RelativePath="..\panda\src\movies\userDataAudio.I"></File>
-				<File RelativePath="..\panda\src\movies\inkblotVideo.cxx"></File>
-				<File RelativePath="..\panda\src\movies\inkblotVideoCursor.cxx"></File>
-				<File RelativePath="..\panda\src\movies\movieAudio.I"></File>
-				<File RelativePath="..\panda\src\movies\inkblotVideoCursor.I"></File>
-				<File RelativePath="..\panda\src\movies\webcamVideo.I"></File>
-				<File RelativePath="..\panda\src\movies\ffmpegVideo.h"></File>
-				<File RelativePath="..\panda\src\movies\config_movies.cxx"></File>
-				<File RelativePath="..\panda\src\movies\inkblotVideo.h"></File>
-				<File RelativePath="..\panda\src\movies\config_movies.h"></File>
-				<File RelativePath="..\panda\src\movies\movieAudioCursor.cxx"></File>
-				<File RelativePath="..\panda\src\movies\microphoneAudio.I"></File>
-				<File RelativePath="..\panda\src\movies\ffmpegAudioCursor.h"></File>
-				<File RelativePath="..\panda\src\movies\webcamVideoDS.cxx"></File>
-				<File RelativePath="..\panda\src\movies\ffmpegVirtualFile.h"></File>
-				<File RelativePath="..\panda\src\movies\movieAudioCursor.h"></File>
-				<File RelativePath="..\panda\src\movies\movieAudio.h"></File>
-				<File RelativePath="..\panda\src\movies\webcamVideo.h"></File>
-				<File RelativePath="..\panda\src\movies\movieVideoCursor.I"></File>
-				<File RelativePath="..\panda\src\movies\ffmpegVideoCursor.cxx"></File>
-				<File RelativePath="..\panda\src\movies\ffmpegAudio.I"></File>
-				<File RelativePath="..\panda\src\movies\movieVideo.I"></File>
-				<File RelativePath="..\panda\src\movies\inkblotVideoCursor.h"></File>
-				<File RelativePath="..\panda\src\movies\ffmpegAudioCursor.I"></File>
-				<File RelativePath="..\panda\src\movies\webcamVideo.cxx"></File>
-				<File RelativePath="..\panda\src\movies\movieVideo.h"></File>
-				<File RelativePath="..\panda\src\movies\microphoneAudioDS.cxx"></File>
-				<File RelativePath="..\panda\src\movies\ffmpegVideoCursor.I"></File>
-				<File RelativePath="..\panda\src\movies\ffmpegVideo.cxx"></File>
-				<File RelativePath="..\panda\src\movies\microphoneAudio.h"></File>
-				<File RelativePath="..\panda\src\movies\ffmpegAudio.h"></File>
-				<File RelativePath="..\panda\src\movies\ffmpegAudio.cxx"></File>
-				<File RelativePath="..\panda\src\movies\inkblotVideo.I"></File>
-				<File RelativePath="..\panda\src\movies\userDataAudioCursor.I"></File>
-				<File RelativePath="..\panda\src\movies\movieVideo.cxx"></File>
-				<File RelativePath="..\panda\src\movies\microphoneAudio.cxx"></File>
-				<File RelativePath="..\panda\src\movies\movieAudioCursor.I"></File>
-				<File RelativePath="..\panda\src\movies\userDataAudioCursor.h"></File>
-				<File RelativePath="..\panda\src\movies\movieVideoCursor.cxx"></File>
-			</Filter>
-			<Filter Name="text">
-				<File RelativePath="..\panda\src\text\textAssembler.I"></File>
-				<File RelativePath="..\panda\src\text\text_composite1.cxx"></File>
-				<File RelativePath="..\panda\src\text\textNode.h"></File>
-				<File RelativePath="..\panda\src\text\textProperties.I"></File>
-				<File RelativePath="..\panda\src\text\default_font.h"></File>
-				<File RelativePath="..\panda\src\text\textGraphic.cxx"></File>
-				<File RelativePath="..\panda\src\text\dynamicTextGlyph.I"></File>
-				<File RelativePath="..\panda\src\text\dynamicTextPage.h"></File>
-				<File RelativePath="..\panda\src\text\textProperties.h"></File>
-				<File RelativePath="..\panda\src\text\config_text.cxx"></File>
-				<File RelativePath="..\panda\src\text\textFont.h"></File>
-				<File RelativePath="..\panda\src\text\geomTextGlyph.I"></File>
-				<File RelativePath="..\panda\src\text\staticTextFont.h"></File>
-				<File RelativePath="..\panda\src\text\fontPool.I"></File>
-				<File RelativePath="..\panda\src\text\textGlyph.I"></File>
-				<File RelativePath="..\panda\src\text\staticTextFont.cxx"></File>
-				<File RelativePath="..\panda\src\text\textGraphic.h"></File>
-				<File RelativePath="..\panda\src\text\fontPool.cxx"></File>
-				<File RelativePath="..\panda\src\text\textGraphic.I"></File>
-				<File RelativePath="..\panda\src\text\dynamicTextPage.I"></File>
-				<File RelativePath="..\panda\src\text\config_text.h"></File>
-				<File RelativePath="..\panda\src\text\textGlyph.h"></File>
-				<File RelativePath="..\panda\src\text\textFont.cxx"></File>
-				<File RelativePath="..\panda\src\text\dynamicTextFont.I"></File>
-				<File RelativePath="..\panda\src\text\textProperties.cxx"></File>
-				<File RelativePath="..\panda\src\text\dynamicTextGlyph.cxx"></File>
-				<File RelativePath="..\panda\src\text\uhvr8ac.pfb.c"></File>
-				<File RelativePath="..\panda\src\text\geomTextGlyph.h"></File>
-				<File RelativePath="..\panda\src\text\default_font.cxx"></File>
-				<File RelativePath="..\panda\src\text\text_composite.cxx"></File>
-				<File RelativePath="..\panda\src\text\dynamicTextFont.cxx"></File>
-				<File RelativePath="..\panda\src\text\textGlyph.cxx"></File>
-				<File RelativePath="..\panda\src\text\textAssembler.h"></File>
-				<File RelativePath="..\panda\src\text\staticTextFont.I"></File>
-				<File RelativePath="..\panda\src\text\text_composite2.cxx"></File>
-				<File RelativePath="..\panda\src\text\dynamicTextGlyph.h"></File>
-				<File RelativePath="..\panda\src\text\fontPool.h"></File>
-				<File RelativePath="..\panda\src\text\textFont.I"></File>
-				<File RelativePath="..\panda\src\text\cmss12.bam.c"></File>
-				<File RelativePath="..\panda\src\text\dynamicTextFont.h"></File>
-				<File RelativePath="..\panda\src\text\geomTextGlyph.cxx"></File>
-				<File RelativePath="..\panda\src\text\textAssembler.cxx"></File>
-				<File RelativePath="..\panda\src\text\dynamicTextPage.cxx"></File>
-				<File RelativePath="..\panda\src\text\cmss12.bam.pz.c"></File>
-				<File RelativePath="..\panda\src\text\textNode.cxx"></File>
-				<File RelativePath="..\panda\src\text\textPropertiesManager.cxx"></File>
-				<File RelativePath="..\panda\src\text\textPropertiesManager.I"></File>
-				<File RelativePath="..\panda\src\text\textPropertiesManager.h"></File>
-				<File RelativePath="..\panda\src\text\textNode.I"></File>
-			</Filter>
-			<Filter Name="testbed">
-				<File RelativePath="..\panda\src\testbed\test_texmem.cxx"></File>
-				<File RelativePath="..\panda\src\testbed\test_lod.cxx"></File>
-				<File RelativePath="..\panda\src\testbed\test_map.cxx"></File>
-				<File RelativePath="..\panda\src\testbed\pgrid.cxx"></File>
-				<File RelativePath="..\panda\src\testbed\pview.cxx"></File>
-				<File RelativePath="..\panda\src\testbed\text_test.cxx"></File>
-			</Filter>
-			<Filter Name="cull">
-				<File RelativePath="..\panda\src\cull\config_cull.cxx"></File>
-				<File RelativePath="..\panda\src\cull\drawCullHandler.cxx"></File>
-				<File RelativePath="..\panda\src\cull\drawCullHandler.h"></File>
-				<File RelativePath="..\panda\src\cull\cullBinUnsorted.cxx"></File>
-				<File RelativePath="..\panda\src\cull\cullBinFrontToBack.I"></File>
-				<File RelativePath="..\panda\src\cull\binCullHandler.cxx"></File>
-				<File RelativePath="..\panda\src\cull\cullBinBackToFront.h"></File>
-				<File RelativePath="..\panda\src\cull\binCullHandler.I"></File>
-				<File RelativePath="..\panda\src\cull\cullBinFixed.I"></File>
-				<File RelativePath="..\panda\src\cull\binCullHandler.h"></File>
-				<File RelativePath="..\panda\src\cull\cullBinBackToFront.I"></File>
-				<File RelativePath="..\panda\src\cull\cullBinFixed.h"></File>
-				<File RelativePath="..\panda\src\cull\cull_composite1.cxx"></File>
-				<File RelativePath="..\panda\src\cull\cullBinStateSorted.I"></File>
-				<File RelativePath="..\panda\src\cull\cullBinStateSorted.cxx"></File>
-				<File RelativePath="..\panda\src\cull\cullBinUnsorted.h"></File>
-				<File RelativePath="..\panda\src\cull\drawCullHandler.I"></File>
-				<File RelativePath="..\panda\src\cull\cullBinUnsorted.I"></File>
-				<File RelativePath="..\panda\src\cull\cullBinFixed.cxx"></File>
-				<File RelativePath="..\panda\src\cull\cull_composite.cxx"></File>
-				<File RelativePath="..\panda\src\cull\cullBinBackToFront.cxx"></File>
-				<File RelativePath="..\panda\src\cull\cullBinFrontToBack.h"></File>
-				<File RelativePath="..\panda\src\cull\cullBinStateSorted.h"></File>
-				<File RelativePath="..\panda\src\cull\cull_composite2.cxx"></File>
-				<File RelativePath="..\panda\src\cull\cullBinFrontToBack.cxx"></File>
-				<File RelativePath="..\panda\src\cull\config_cull.h"></File>
-			</Filter>
-			<Filter Name="audiotraits">
-				<File RelativePath="..\panda\src\audiotraits\milesAudioSequence.cxx"></File>
-				<File RelativePath="..\panda\src\audiotraits\milesAudioStream.I"></File>
-				<File RelativePath="..\panda\src\audiotraits\config_milesAudio.cxx"></File>
-				<File RelativePath="..\panda\src\audiotraits\fmod_audio_composite.cxx"></File>
-				<File RelativePath="..\panda\src\audiotraits\config_openalAudio.h"></File>
-				<File RelativePath="..\panda\src\audiotraits\openalAudioSound.cxx"></File>
-				<File RelativePath="..\panda\src\audiotraits\fmodAudioSound.h"></File>
-				<File RelativePath="..\panda\src\audiotraits\openalAudioManager.cxx"></File>
-				<File RelativePath="..\panda\src\audiotraits\milesAudioStream.cxx"></File>
-				<File RelativePath="..\panda\src\audiotraits\milesAudioSample.cxx"></File>
-				<File RelativePath="..\panda\src\audiotraits\milesAudioSequence.I"></File>
-				<File RelativePath="..\panda\src\audiotraits\milesAudioSound.h"></File>
-				<File RelativePath="..\panda\src\audiotraits\config_fmodAudio.h"></File>
-				<File RelativePath="..\panda\src\audiotraits\openal_audio_composite.cxx"></File>
-				<File RelativePath="..\panda\src\audiotraits\milesAudioSound.cxx"></File>
-				<File RelativePath="..\panda\src\audiotraits\config_openalAudio.cxx"></File>
-				<File RelativePath="..\panda\src\audiotraits\fmodAudioManager.cxx"></File>
-				<File RelativePath="..\panda\src\audiotraits\fmodAudioManager.h"></File>
-				<File RelativePath="..\panda\src\audiotraits\fmodAudioSound.cxx"></File>
-				<File RelativePath="..\panda\src\audiotraits\config_fmodAudio.cxx"></File>
-				<File RelativePath="..\panda\src\audiotraits\milesAudioManager.h"></File>
-				<File RelativePath="..\panda\src\audiotraits\miles_audio_composite.cxx"></File>
-				<File RelativePath="..\panda\src\audiotraits\openal_audio_composite1.cxx"></File>
-				<File RelativePath="..\panda\src\audiotraits\milesAudioStream.h"></File>
-				<File RelativePath="..\panda\src\audiotraits\fmodAudioSound.I"></File>
-				<File RelativePath="..\panda\src\audiotraits\milesAudioSequence.h"></File>
-				<File RelativePath="..\panda\src\audiotraits\globalMilesManager.I"></File>
-				<File RelativePath="..\panda\src\audiotraits\config_milesAudio.h"></File>
-				<File RelativePath="..\panda\src\audiotraits\milesAudioManager.cxx"></File>
-				<File RelativePath="..\panda\src\audiotraits\globalMilesManager.cxx"></File>
-				<File RelativePath="..\panda\src\audiotraits\openalAudioSound.I"></File>
-				<File RelativePath="..\panda\src\audiotraits\milesAudioSample.h"></File>
-				<File RelativePath="..\panda\src\audiotraits\openalAudioSound.h"></File>
-				<File RelativePath="..\panda\src\audiotraits\miles_audio_composite1.cxx"></File>
-				<File RelativePath="..\panda\src\audiotraits\globalMilesManager.h"></File>
-				<File RelativePath="..\panda\src\audiotraits\milesAudioSound.I"></File>
-				<File RelativePath="..\panda\src\audiotraits\fmod_audio_composite1.cxx"></File>
-				<File RelativePath="..\panda\src\audiotraits\openalAudioManager.h"></File>
-				<File RelativePath="..\panda\src\audiotraits\milesAudioSample.I"></File>
-			</Filter>
-			<Filter Name="mathutil">
-				<File RelativePath="..\panda\src\mathutil\config_mathutil.cxx"></File>
-				<File RelativePath="..\panda\src\mathutil\geometricBoundingVolume.I"></File>
-				<File RelativePath="..\panda\src\mathutil\parabola_src.cxx"></File>
-				<File RelativePath="..\panda\src\mathutil\stackedPerlinNoise2.cxx"></File>
-				<File RelativePath="..\panda\src\mathutil\perlinNoise3.h"></File>
-				<File RelativePath="..\panda\src\mathutil\mersenne.cxx"></File>
-				<File RelativePath="..\panda\src\mathutil\perlinNoise2.I"></File>
-				<File RelativePath="..\panda\src\mathutil\stackedPerlinNoise2.I"></File>
-				<File RelativePath="..\panda\src\mathutil\parabola_src.h"></File>
-				<File RelativePath="..\panda\src\mathutil\triangulator.I"></File>
-				<File RelativePath="..\panda\src\mathutil\perlinNoise2.cxx"></File>
-				<File RelativePath="..\panda\src\mathutil\omniBoundingVolume.cxx"></File>
-				<File RelativePath="..\panda\src\mathutil\boundingBox.cxx"></File>
-				<File RelativePath="..\panda\src\mathutil\stackedPerlinNoise3.I"></File>
-				<File RelativePath="..\panda\src\mathutil\plane_src.cxx"></File>
-				<File RelativePath="..\panda\src\mathutil\triangulator.cxx"></File>
-				<File RelativePath="..\panda\src\mathutil\boundingLine.h"></File>
-				<File RelativePath="..\panda\src\mathutil\perlinNoise2.h"></File>
-				<File RelativePath="..\panda\src\mathutil\omniBoundingVolume.h"></File>
-				<File RelativePath="..\panda\src\mathutil\config_mathutil.h"></File>
-				<File RelativePath="..\panda\src\mathutil\rotate_to.h"></File>
-				<File RelativePath="..\panda\src\mathutil\look_at_src.cxx"></File>
-				<File RelativePath="..\panda\src\mathutil\boundingVolume.cxx"></File>
-				<File RelativePath="..\panda\src\mathutil\parabola_src.I"></File>
-				<File RelativePath="..\panda\src\mathutil\boundingSphere.I"></File>
-				<File RelativePath="..\panda\src\mathutil\rotate_to.cxx"></File>
-				<File RelativePath="..\panda\src\mathutil\plane_src.h"></File>
-				<File RelativePath="..\panda\src\mathutil\geometricBoundingVolume.h"></File>
-				<File RelativePath="..\panda\src\mathutil\boundingHexahedron.cxx"></File>
-				<File RelativePath="..\panda\src\mathutil\finiteBoundingVolume.cxx"></File>
-				<File RelativePath="..\panda\src\mathutil\randomizer.h"></File>
-				<File RelativePath="..\panda\src\mathutil\look_at.h"></File>
-				<File RelativePath="..\panda\src\mathutil\mathutil_composite1.cxx"></File>
-				<File RelativePath="..\panda\src\mathutil\perlinNoise.I"></File>
-				<File RelativePath="..\panda\src\mathutil\plane.h"></File>
-				<File RelativePath="..\panda\src\mathutil\parabola.h"></File>
-				<File RelativePath="..\panda\src\mathutil\triangulator.h"></File>
-				<File RelativePath="..\panda\src\mathutil\boundingVolume.I"></File>
-				<File RelativePath="..\panda\src\mathutil\boundingPlane.I"></File>
-				<File RelativePath="..\panda\src\mathutil\boundingBox.h"></File>
-				<File RelativePath="..\panda\src\mathutil\boundingBox.I"></File>
-				<File RelativePath="..\panda\src\mathutil\omniBoundingVolume.I"></File>
-				<File RelativePath="..\panda\src\mathutil\boundingSphere.h"></File>
-				<File RelativePath="..\panda\src\mathutil\linmath_events.cxx"></File>
-				<File RelativePath="..\panda\src\mathutil\finiteBoundingVolume.h"></File>
-				<File RelativePath="..\panda\src\mathutil\stackedPerlinNoise3.cxx"></File>
-				<File RelativePath="..\panda\src\mathutil\test_mathutil.cxx"></File>
-				<File RelativePath="..\panda\src\mathutil\frustum.h"></File>
-				<File RelativePath="..\panda\src\mathutil\boundingLine.I"></File>
-				<File RelativePath="..\panda\src\mathutil\randomizer.cxx"></File>
-				<File RelativePath="..\panda\src\mathutil\linmath_events.h"></File>
-				<File RelativePath="..\panda\src\mathutil\boundingPlane.h"></File>
-				<File RelativePath="..\panda\src\mathutil\frustum_src.h"></File>
-				<File RelativePath="..\panda\src\mathutil\boundingHexahedron.I"></File>
-				<File RelativePath="..\panda\src\mathutil\look_at.cxx"></File>
-				<File RelativePath="..\panda\src\mathutil\mersenne.h"></File>
-				<File RelativePath="..\panda\src\mathutil\perlinNoise3.cxx"></File>
-				<File RelativePath="..\panda\src\mathutil\mathutil_composite2.cxx"></File>
-				<File RelativePath="..\panda\src\mathutil\randomizer.I"></File>
-				<File RelativePath="..\panda\src\mathutil\fftCompressor.cxx"></File>
-				<File RelativePath="..\panda\src\mathutil\boundingSphere.cxx"></File>
-				<File RelativePath="..\panda\src\mathutil\plane_src.I"></File>
-				<File RelativePath="..\panda\src\mathutil\boundingVolume.h"></File>
-				<File RelativePath="..\panda\src\mathutil\perlinNoise3.I"></File>
-				<File RelativePath="..\panda\src\mathutil\stackedPerlinNoise2.h"></File>
-				<File RelativePath="..\panda\src\mathutil\boundingPlane.cxx"></File>
-				<File RelativePath="..\panda\src\mathutil\look_at_src.h"></File>
-				<File RelativePath="..\panda\src\mathutil\mathutil_composite.cxx"></File>
-				<File RelativePath="..\panda\src\mathutil\plane.cxx"></File>
-				<File RelativePath="..\panda\src\mathutil\look_at_src.I"></File>
-				<File RelativePath="..\panda\src\mathutil\rotate_to_src.cxx"></File>
-				<File RelativePath="..\panda\src\mathutil\test_tri.cxx"></File>
-				<File RelativePath="..\panda\src\mathutil\perlinNoise.h"></File>
-				<File RelativePath="..\panda\src\mathutil\stackedPerlinNoise3.h"></File>
-				<File RelativePath="..\panda\src\mathutil\geometricBoundingVolume.cxx"></File>
-				<File RelativePath="..\panda\src\mathutil\parabola.cxx"></File>
-				<File RelativePath="..\panda\src\mathutil\frustum_src.I"></File>
-				<File RelativePath="..\panda\src\mathutil\boundingHexahedron.h"></File>
-				<File RelativePath="..\panda\src\mathutil\fftCompressor.h"></File>
-				<File RelativePath="..\panda\src\mathutil\boundingLine.cxx"></File>
-				<File RelativePath="..\panda\src\mathutil\perlinNoise.cxx"></File>
-			</Filter>
-			<Filter Name="pipeline">
-				<File RelativePath="..\panda\src\pipeline\conditionVarDebug.I"></File>
-				<File RelativePath="..\panda\src\pipeline\mutexDebug.h"></File>
-				<File RelativePath="..\panda\src\pipeline\conditionVarDirect.I"></File>
-				<File RelativePath="..\panda\src\pipeline\cycleDataStageReader.I"></File>
-				<File RelativePath="..\panda\src\pipeline\pipeline.h"></File>
-				<File RelativePath="..\panda\src\pipeline\test_diners.cxx"></File>
-				<File RelativePath="..\panda\src\pipeline\mutexSimpleImpl.cxx"></File>
-				<File RelativePath="..\panda\src\pipeline\threadPriority.h"></File>
-				<File RelativePath="..\panda\src\pipeline\cycleDataLockedReader.h"></File>
-				<File RelativePath="..\panda\src\pipeline\semaphore.h"></File>
-				<File RelativePath="..\panda\src\pipeline\externalThread.h"></File>
-				<File RelativePath="..\panda\src\pipeline\test_mutex.cxx"></File>
-				<File RelativePath="..\panda\src\pipeline\pipeline_composite2.cxx"></File>
-				<File RelativePath="..\panda\src\pipeline\thread.h"></File>
-				<File RelativePath="..\panda\src\pipeline\conditionVarDebug.h"></File>
-				<File RelativePath="..\panda\src\pipeline\reMutexDirect.I"></File>
-				<File RelativePath="..\panda\src\pipeline\reMutexHolder.I"></File>
-				<File RelativePath="..\panda\src\pipeline\pipelineCycler.cxx"></File>
-				<File RelativePath="..\panda\src\pipeline\cycleDataStageWriter.h"></File>
-				<File RelativePath="..\panda\src\pipeline\reMutexHolder.cxx"></File>
-				<File RelativePath="..\panda\src\pipeline\lightMutexDirect.cxx"></File>
-				<File RelativePath="..\panda\src\pipeline\pipelineCyclerTrueImpl.cxx"></File>
-				<File RelativePath="..\panda\src\pipeline\pipelineCyclerTrivialImpl.h"></File>
-				<File RelativePath="..\panda\src\pipeline\conditionVarDirect.h"></File>
-				<File RelativePath="..\panda\src\pipeline\conditionVarWin32Impl.I"></File>
-				<File RelativePath="..\panda\src\pipeline\pythonThread.cxx"></File>
-				<File RelativePath="..\panda\src\pipeline\pipeline.I"></File>
-				<File RelativePath="..\panda\src\pipeline\threadSimpleManager.cxx"></File>
-				<File RelativePath="..\panda\src\pipeline\cycleDataReader.I"></File>
-				<File RelativePath="..\panda\src\pipeline\mutexDirect.I"></File>
-				<File RelativePath="..\panda\src\pipeline\cycleDataReader.cxx"></File>
-				<File RelativePath="..\panda\src\pipeline\conditionVarFull.h"></File>
-				<File RelativePath="..\panda\src\pipeline\conditionVarFullDirect.h"></File>
-				<File RelativePath="..\panda\src\pipeline\threadWin32Impl.h"></File>
-				<File RelativePath="..\panda\src\pipeline\lightReMutex.I"></File>
-				<File RelativePath="..\panda\src\pipeline\conditionVarFullDirect.I"></File>
-				<File RelativePath="..\panda\src\pipeline\lightMutex.h"></File>
-				<File RelativePath="..\panda\src\pipeline\conditionVarSpinlockImpl.I"></File>
-				<File RelativePath="..\panda\src\pipeline\pmutex.h"></File>
-				<File RelativePath="..\panda\src\pipeline\threadWin32Impl.I"></File>
-				<File RelativePath="..\panda\src\pipeline\cycleDataReader.h"></File>
-				<File RelativePath="..\panda\src\pipeline\pipelineCycler.I"></File>
-				<File RelativePath="..\panda\src\pipeline\lightReMutexHolder.I"></File>
-				<File RelativePath="..\panda\src\pipeline\cycleData.cxx"></File>
-				<File RelativePath="..\panda\src\pipeline\conditionVarPosixImpl.h"></File>
-				<File RelativePath="..\panda\src\pipeline\threadSimpleImpl.cxx"></File>
-				<File RelativePath="..\panda\src\pipeline\cycleData.I"></File>
-				<File RelativePath="..\panda\src\pipeline\reMutex.I"></File>
-				<File RelativePath="..\panda\src\pipeline\test_concurrency.cxx"></File>
-				<File RelativePath="..\panda\src\pipeline\conditionVarWin32Impl.h"></File>
-				<File RelativePath="..\panda\src\pipeline\mutexHolder.cxx"></File>
-				<File RelativePath="..\panda\src\pipeline\semaphore.I"></File>
-				<File RelativePath="..\panda\src\pipeline\threadSimpleManager.h"></File>
-				<File RelativePath="..\panda\src\pipeline\lightReMutexHolder.h"></File>
-				<File RelativePath="..\panda\src\pipeline\threadDummyImpl.I"></File>
-				<File RelativePath="..\panda\src\pipeline\cycleDataLockedStageReader.h"></File>
-				<File RelativePath="..\panda\src\pipeline\lightMutex.cxx"></File>
-				<File RelativePath="..\panda\src\pipeline\contextSwitch.c"></File>
-				<File RelativePath="..\panda\src\pipeline\test_threaddata.cxx"></File>
-				<File RelativePath="..\panda\src\pipeline\cycleDataLockedStageReader.cxx"></File>
-				<File RelativePath="..\panda\src\pipeline\lightReMutex.cxx"></File>
-				<File RelativePath="..\panda\src\pipeline\lightMutex.I"></File>
-				<File RelativePath="..\panda\src\pipeline\conditionVarFullWin32Impl.I"></File>
-				<File RelativePath="..\panda\src\pipeline\conditionVar.h"></File>
-				<File RelativePath="..\panda\src\pipeline\lightMutexDirect.I"></File>
-				<File RelativePath="..\panda\src\pipeline\threadImpl.h"></File>
-				<File RelativePath="..\panda\src\pipeline\mutexDebug.cxx"></File>
-				<File RelativePath="..\panda\src\pipeline\conditionVarFullDebug.cxx"></File>
-				<File RelativePath="..\panda\src\pipeline\threadPosixImpl.I"></File>
-				<File RelativePath="..\panda\src\pipeline\semaphore.cxx"></File>
-				<File RelativePath="..\panda\src\pipeline\conditionVarSimpleImpl.h"></File>
-				<File RelativePath="..\panda\src\pipeline\pipelineCyclerDummyImpl.h"></File>
-				<File RelativePath="..\panda\src\pipeline\thread.I"></File>
-				<File RelativePath="..\panda\src\pipeline\reMutex.cxx"></File>
-				<File RelativePath="..\panda\src\pipeline\conditionVarSimpleImpl.I"></File>
-				<File RelativePath="..\panda\src\pipeline\cycleDataStageReader.cxx"></File>
-				<File RelativePath="..\panda\src\pipeline\cyclerHolder.h"></File>
-				<File RelativePath="..\panda\src\pipeline\pipeline_composite1.cxx"></File>
-				<File RelativePath="..\panda\src\pipeline\cycleData.h"></File>
-				<File RelativePath="..\panda\src\pipeline\test_setjmp.cxx"></File>
-				<File RelativePath="..\panda\src\pipeline\lightReMutexDirect.cxx"></File>
-				<File RelativePath="..\panda\src\pipeline\conditionVarSpinlockImpl.cxx"></File>
-				<File RelativePath="..\panda\src\pipeline\threadPosixImpl.cxx"></File>
-				<File RelativePath="..\panda\src\pipeline\lightReMutexDirect.h"></File>
-				<File RelativePath="..\panda\src\pipeline\pipelineCyclerTrueImpl.h"></File>
-				<File RelativePath="..\panda\src\pipeline\conditionVarDummyImpl.h"></File>
-				<File RelativePath="..\panda\src\pipeline\reMutex.h"></File>
-				<File RelativePath="..\panda\src\pipeline\cycleDataStageWriter.cxx"></File>
-				<File RelativePath="..\panda\src\pipeline\mutexDirect.h"></File>
-				<File RelativePath="..\panda\src\pipeline\pipelineCyclerTrueImpl.I"></File>
-				<File RelativePath="..\panda\src\pipeline\externalThread.cxx"></File>
-				<File RelativePath="..\panda\src\pipeline\conditionVar.I"></File>
-				<File RelativePath="..\panda\src\pipeline\lightReMutexDirect.I"></File>
-				<File RelativePath="..\panda\src\pipeline\pipelineCyclerLinks.I"></File>
-				<File RelativePath="..\panda\src\pipeline\mutexDirect.cxx"></File>
-				<File RelativePath="..\panda\src\pipeline\threadDummyImpl.h"></File>
-				<File RelativePath="..\panda\src\pipeline\cyclerHolder.I"></File>
-				<File RelativePath="..\panda\src\pipeline\conditionVarDirect.cxx"></File>
-				<File RelativePath="..\panda\src\pipeline\conditionVarDummyImpl.I"></File>
-				<File RelativePath="..\panda\src\pipeline\conditionVarFullDebug.I"></File>
-				<File RelativePath="..\panda\src\pipeline\cycleDataStageWriter.I"></File>
-				<File RelativePath="..\panda\src\pipeline\mutexSimpleImpl.I"></File>
-				<File RelativePath="..\panda\src\pipeline\lightMutexHolder.I"></File>
-				<File RelativePath="..\panda\src\pipeline\conditionVarSpinlockImpl.h"></File>
-				<File RelativePath="..\panda\src\pipeline\lightMutexHolder.h"></File>
-				<File RelativePath="..\panda\src\pipeline\blockerSimple.h"></File>
-				<File RelativePath="..\panda\src\pipeline\mutexSimpleImpl.h"></File>
-				<File RelativePath="..\panda\src\pipeline\pipelineCyclerTrivialImpl.cxx"></File>
-				<File RelativePath="..\panda\src\pipeline\mainThread.h"></File>
-				<File RelativePath="..\panda\src\pipeline\conditionVar.cxx"></File>
-				<File RelativePath="..\panda\src\pipeline\pmutex.cxx"></File>
-				<File RelativePath="..\panda\src\pipeline\threadDummyImpl.cxx"></File>
-				<File RelativePath="..\panda\src\pipeline\conditionVarDebug.cxx"></File>
-				<File RelativePath="..\panda\src\pipeline\pipelineCycler.h"></File>
-				<File RelativePath="..\panda\src\pipeline\pipelineCyclerLinks.h"></File>
-				<File RelativePath="..\panda\src\pipeline\cycleDataLockedStageReader.I"></File>
-				<File RelativePath="..\panda\src\pipeline\threadPriority.cxx"></File>
-				<File RelativePath="..\panda\src\pipeline\pipeline.cxx"></File>
-				<File RelativePath="..\panda\src\pipeline\conditionVarSimpleImpl.cxx"></File>
-				<File RelativePath="..\panda\src\pipeline\conditionVarFullDirect.cxx"></File>
-				<File RelativePath="..\panda\src\pipeline\reMutexDirect.cxx"></File>
-				<File RelativePath="..\panda\src\pipeline\conditionVarFullWin32Impl.cxx"></File>
-				<File RelativePath="..\panda\src\pipeline\conditionVarWin32Impl.cxx"></File>
-				<File RelativePath="..\panda\src\pipeline\conditionVarFull.I"></File>
-				<File RelativePath="..\panda\src\pipeline\reMutexHolder.h"></File>
-				<File RelativePath="..\panda\src\pipeline\pythonThread.h"></File>
-				<File RelativePath="..\panda\src\pipeline\pipelineCyclerBase.h"></File>
-				<File RelativePath="..\panda\src\pipeline\test_atomic.cxx"></File>
-				<File RelativePath="..\panda\src\pipeline\pipelineCyclerTrivialImpl.I"></File>
-				<File RelativePath="..\panda\src\pipeline\thread.cxx"></File>
-				<File RelativePath="..\panda\src\pipeline\lightReMutexHolder.cxx"></File>
-				<File RelativePath="..\panda\src\pipeline\cyclerHolder.cxx"></File>
-				<File RelativePath="..\panda\src\pipeline\cycleDataWriter.cxx"></File>
-				<File RelativePath="..\panda\src\pipeline\pipeline_composite.cxx"></File>
-				<File RelativePath="..\panda\src\pipeline\conditionVarPosixImpl.cxx"></File>
-				<File RelativePath="..\panda\src\pipeline\reMutexDirect.h"></File>
-				<File RelativePath="..\panda\src\pipeline\test_delete.cxx"></File>
-				<File RelativePath="..\panda\src\pipeline\threadPosixImpl.h"></File>
-				<File RelativePath="..\panda\src\pipeline\contextSwitch.h"></File>
-				<File RelativePath="..\panda\src\pipeline\cycleDataStageReader.h"></File>
-				<File RelativePath="..\panda\src\pipeline\mutexHolder.I"></File>
-				<File RelativePath="..\panda\src\pipeline\threadSimpleManager.I"></File>
-				<File RelativePath="..\panda\src\pipeline\pipelineCyclerDummyImpl.I"></File>
-				<File RelativePath="..\panda\src\pipeline\config_pipeline.h"></File>
-				<File RelativePath="..\panda\src\pipeline\threadWin32Impl.cxx"></File>
-				<File RelativePath="..\panda\src\pipeline\pmutex.I"></File>
-				<File RelativePath="..\panda\src\pipeline\conditionVarFullDebug.h"></File>
-				<File RelativePath="..\panda\src\pipeline\blockerSimple.I"></File>
-				<File RelativePath="..\panda\src\pipeline\threadSimpleImpl.h"></File>
-				<File RelativePath="..\panda\src\pipeline\cycleDataLockedReader.cxx"></File>
-				<File RelativePath="..\panda\src\pipeline\conditionVarFull.cxx"></File>
-				<File RelativePath="..\panda\src\pipeline\config_pipeline.cxx"></File>
-				<File RelativePath="..\panda\src\pipeline\cycleDataWriter.I"></File>
-				<File RelativePath="..\panda\src\pipeline\lightReMutex.h"></File>
-				<File RelativePath="..\panda\src\pipeline\pipelineCyclerDummyImpl.cxx"></File>
-				<File RelativePath="..\panda\src\pipeline\mutexHolder.h"></File>
-				<File RelativePath="..\panda\src\pipeline\mutexTrueImpl.h"></File>
-				<File RelativePath="..\panda\src\pipeline\conditionVarPosixImpl.I"></File>
-				<File RelativePath="..\panda\src\pipeline\mutexDebug.I"></File>
-				<File RelativePath="..\panda\src\pipeline\mainThread.cxx"></File>
-				<File RelativePath="..\panda\src\pipeline\conditionVarDummyImpl.cxx"></File>
-				<File RelativePath="..\panda\src\pipeline\lightMutexHolder.cxx"></File>
-				<File RelativePath="..\panda\src\pipeline\cycleDataWriter.h"></File>
-				<File RelativePath="..\panda\src\pipeline\threadSimpleImpl.I"></File>
-				<File RelativePath="..\panda\src\pipeline\conditionVarFullWin32Impl.h"></File>
-				<File RelativePath="..\panda\src\pipeline\lightMutexDirect.h"></File>
-				<File RelativePath="..\panda\src\pipeline\cycleDataLockedReader.I"></File>
-				<File RelativePath="..\panda\src\pipeline\conditionVarImpl.h"></File>
-			</Filter>
-			<Filter Name="pnmimage">
-				<File RelativePath="..\panda\src\pnmimage\pnmWriter.cxx"></File>
-				<File RelativePath="..\panda\src\pnmimage\config_pnmimage.cxx"></File>
-				<File RelativePath="..\panda\src\pnmimage\pnmimage_composite2.cxx"></File>
-				<File RelativePath="..\panda\src\pnmimage\pnmFileType.cxx"></File>
-				<File RelativePath="..\panda\src\pnmimage\pnmimage_composite1.cxx"></File>
-				<File RelativePath="..\panda\src\pnmimage\pnmBrush.h"></File>
-				<File RelativePath="..\panda\src\pnmimage\pnmimage_composite.cxx"></File>
-				<File RelativePath="..\panda\src\pnmimage\pnmBrush.I"></File>
-				<File RelativePath="..\panda\src\pnmimage\pnmWriter.h"></File>
-				<File RelativePath="..\panda\src\pnmimage\pnmImageHeader.h"></File>
-				<File RelativePath="..\panda\src\pnmimage\pnmFileType.h"></File>
-				<File RelativePath="..\panda\src\pnmimage\pnmPainter.I"></File>
-				<File RelativePath="..\panda\src\pnmimage\pnmPainter.cxx"></File>
-				<File RelativePath="..\panda\src\pnmimage\pnm-image-filter.cxx"></File>
-				<File RelativePath="..\panda\src\pnmimage\pnmimage_base.cxx"></File>
-				<File RelativePath="..\panda\src\pnmimage\pnm-image-filter-core.cxx"></File>
-				<File RelativePath="..\panda\src\pnmimage\pnmReader.h"></File>
-				<File RelativePath="..\panda\src\pnmimage\pnmPainter.h"></File>
-				<File RelativePath="..\panda\src\pnmimage\ppmcmap.h"></File>
-				<File RelativePath="..\panda\src\pnmimage\pnmImage.cxx"></File>
-				<File RelativePath="..\panda\src\pnmimage\pnmImageHeader.cxx"></File>
-				<File RelativePath="..\panda\src\pnmimage\pnmImage.h"></File>
-				<File RelativePath="..\panda\src\pnmimage\config_pnmimage.h"></File>
-				<File RelativePath="..\panda\src\pnmimage\ppmcmap.cxx"></File>
-				<File RelativePath="..\panda\src\pnmimage\pnmImage.I"></File>
-				<File RelativePath="..\panda\src\pnmimage\pnmimage_base.h"></File>
-				<File RelativePath="..\panda\src\pnmimage\pnmReader.I"></File>
-				<File RelativePath="..\panda\src\pnmimage\pnmFileTypeRegistry.cxx"></File>
-				<File RelativePath="..\panda\src\pnmimage\pnmImageHeader.I"></File>
-				<File RelativePath="..\panda\src\pnmimage\pnmWriter.I"></File>
-				<File RelativePath="..\panda\src\pnmimage\pnmbitio.h"></File>
-				<File RelativePath="..\panda\src\pnmimage\pnmBrush.cxx"></File>
-				<File RelativePath="..\panda\src\pnmimage\pnmFileTypeRegistry.h"></File>
-				<File RelativePath="..\panda\src\pnmimage\pnmReader.cxx"></File>
-				<File RelativePath="..\panda\src\pnmimage\pnmbitio.cxx"></File>
-			</Filter>
-			<Filter Name="particlesystem">
-				<File RelativePath="..\panda\src\particlesystem\geomParticleRenderer.h"></File>
-				<File RelativePath="..\panda\src\particlesystem\tangentRingEmitter.cxx"></File>
-				<File RelativePath="..\panda\src\particlesystem\baseParticleFactory.I"></File>
-				<File RelativePath="..\panda\src\particlesystem\ringEmitter.I"></File>
-				<File RelativePath="..\panda\src\particlesystem\tangentRingEmitter.h"></File>
-				<File RelativePath="..\panda\src\particlesystem\baseParticle.cxx"></File>
-				<File RelativePath="..\panda\src\particlesystem\particleCommonFuncs.h"></File>
-				<File RelativePath="..\panda\src\particlesystem\baseParticleRenderer.I"></File>
-				<File RelativePath="..\panda\src\particlesystem\orientedParticle.cxx"></File>
-				<File RelativePath="..\panda\src\particlesystem\spriteParticleRenderer.cxx"></File>
-				<File RelativePath="..\panda\src\particlesystem\discEmitter.I"></File>
-				<File RelativePath="..\panda\src\particlesystem\particleSystemManager.h"></File>
-				<File RelativePath="..\panda\src\particlesystem\boxEmitter.h"></File>
-				<File RelativePath="..\panda\src\particlesystem\zSpinParticleFactory.h"></File>
-				<File RelativePath="..\panda\src\particlesystem\orientedParticleFactory.h"></File>
-				<File RelativePath="..\panda\src\particlesystem\particleSystemManager.I"></File>
-				<File RelativePath="..\panda\src\particlesystem\zSpinParticle.cxx"></File>
-				<File RelativePath="..\panda\src\particlesystem\rectangleEmitter.h"></File>
-				<File RelativePath="..\panda\src\particlesystem\lineEmitter.I"></File>
-				<File RelativePath="..\panda\src\particlesystem\spriteParticleRenderer.I"></File>
-				<File RelativePath="..\panda\src\particlesystem\lineEmitter.cxx"></File>
-				<File RelativePath="..\panda\src\particlesystem\ringEmitter.cxx"></File>
-				<File RelativePath="..\panda\src\particlesystem\orientedParticleFactory.I"></File>
-				<File RelativePath="..\panda\src\particlesystem\geomParticleRenderer.cxx"></File>
-				<File RelativePath="..\panda\src\particlesystem\colorInterpolationManager.I"></File>
-				<File RelativePath="..\panda\src\particlesystem\particleSystem.cxx"></File>
-				<File RelativePath="..\panda\src\particlesystem\boxEmitter.I"></File>
-				<File RelativePath="..\panda\src\particlesystem\orientedParticleFactory.cxx"></File>
-				<File RelativePath="..\panda\src\particlesystem\discEmitter.h"></File>
-				<File RelativePath="..\panda\src\particlesystem\sphereVolumeEmitter.h"></File>
-				<File RelativePath="..\panda\src\particlesystem\sphereSurfaceEmitter.h"></File>
-				<File RelativePath="..\panda\src\particlesystem\pointParticle.cxx"></File>
-				<File RelativePath="..\panda\src\particlesystem\orientedParticle.h"></File>
-				<File RelativePath="..\panda\src\particlesystem\baseParticle.h"></File>
-				<File RelativePath="..\panda\src\particlesystem\baseParticleFactory.cxx"></File>
-				<File RelativePath="..\panda\src\particlesystem\lineEmitter.h"></File>
-				<File RelativePath="..\panda\src\particlesystem\pointEmitter.h"></File>
-				<File RelativePath="..\panda\src\particlesystem\arcEmitter.I"></File>
-				<File RelativePath="..\panda\src\particlesystem\particleSystemManager.cxx"></File>
-				<File RelativePath="..\panda\src\particlesystem\baseParticle.I"></File>
-				<File RelativePath="..\panda\src\particlesystem\pointParticle.h"></File>
-				<File RelativePath="..\panda\src\particlesystem\baseParticleEmitter.I"></File>
-				<File RelativePath="..\panda\src\particlesystem\sparkleParticleRenderer.I"></File>
-				<File RelativePath="..\panda\src\particlesystem\baseParticleEmitter.h"></File>
-				<File RelativePath="..\panda\src\particlesystem\pointParticleFactory.h"></File>
-				<File RelativePath="..\panda\src\particlesystem\baseParticleFactory.h"></File>
-				<File RelativePath="..\panda\src\particlesystem\zSpinParticleFactory.cxx"></File>
-				<File RelativePath="..\panda\src\particlesystem\arcEmitter.h"></File>
-				<File RelativePath="..\panda\src\particlesystem\pointParticleFactory.cxx"></File>
-				<File RelativePath="..\panda\src\particlesystem\colorInterpolationManager.h"></File>
-				<File RelativePath="..\panda\src\particlesystem\particlefactories.h"></File>
-				<File RelativePath="..\panda\src\particlesystem\particleSystem.h"></File>
-				<File RelativePath="..\panda\src\particlesystem\tangentRingEmitter.I"></File>
-				<File RelativePath="..\panda\src\particlesystem\pointParticleRenderer.cxx"></File>
-				<File RelativePath="..\panda\src\particlesystem\config_particlesystem.cxx"></File>
-				<File RelativePath="..\panda\src\particlesystem\rectangleEmitter.I"></File>
-				<File RelativePath="..\panda\src\particlesystem\ringEmitter.h"></File>
-				<File RelativePath="..\panda\src\particlesystem\baseParticleRenderer.cxx"></File>
-				<File RelativePath="..\panda\src\particlesystem\zSpinParticle.I"></File>
-				<File RelativePath="..\panda\src\particlesystem\spriteParticleRenderer.h"></File>
-				<File RelativePath="..\panda\src\particlesystem\particlesystem_composite1.cxx"></File>
-				<File RelativePath="..\panda\src\particlesystem\particlesystem_composite2.cxx"></File>
-				<File RelativePath="..\panda\src\particlesystem\orientedParticle.I"></File>
-				<File RelativePath="..\panda\src\particlesystem\config_particlesystem.h"></File>
-				<File RelativePath="..\panda\src\particlesystem\baseParticleEmitter.cxx"></File>
-				<File RelativePath="..\panda\src\particlesystem\colorInterpolationManager.cxx"></File>
-				<File RelativePath="..\panda\src\particlesystem\zSpinParticleFactory.I"></File>
-				<File RelativePath="..\panda\src\particlesystem\sphereSurfaceEmitter.I"></File>
-				<File RelativePath="..\panda\src\particlesystem\sparkleParticleRenderer.cxx"></File>
-				<File RelativePath="..\panda\src\particlesystem\particleSystem.I"></File>
-				<File RelativePath="..\panda\src\particlesystem\particlesystem_composite.cxx"></File>
-				<File RelativePath="..\panda\src\particlesystem\sphereVolumeEmitter.I"></File>
-				<File RelativePath="..\panda\src\particlesystem\arcEmitter.cxx"></File>
-				<File RelativePath="..\panda\src\particlesystem\lineParticleRenderer.I"></File>
-				<File RelativePath="..\panda\src\particlesystem\zSpinParticle.h"></File>
-				<File RelativePath="..\panda\src\particlesystem\lineParticleRenderer.h"></File>
-				<File RelativePath="..\panda\src\particlesystem\particles.h"></File>
-				<File RelativePath="..\panda\src\particlesystem\emitters.h"></File>
-				<File RelativePath="..\panda\src\particlesystem\sphereVolumeEmitter.cxx"></File>
-				<File RelativePath="..\panda\src\particlesystem\pointEmitter.cxx"></File>
-				<File RelativePath="..\panda\src\particlesystem\pointParticleRenderer.h"></File>
-				<File RelativePath="..\panda\src\particlesystem\sphereSurfaceEmitter.cxx"></File>
-				<File RelativePath="..\panda\src\particlesystem\pointEmitter.I"></File>
-				<File RelativePath="..\panda\src\particlesystem\rectangleEmitter.cxx"></File>
-				<File RelativePath="..\panda\src\particlesystem\pointParticleRenderer.I"></File>
-				<File RelativePath="..\panda\src\particlesystem\boxEmitter.cxx"></File>
-				<File RelativePath="..\panda\src\particlesystem\baseParticleRenderer.h"></File>
-				<File RelativePath="..\panda\src\particlesystem\geomParticleRenderer.I"></File>
-				<File RelativePath="..\panda\src\particlesystem\sparkleParticleRenderer.h"></File>
-				<File RelativePath="..\panda\src\particlesystem\discEmitter.cxx"></File>
-				<File RelativePath="..\panda\src\particlesystem\lineParticleRenderer.cxx"></File>
-			</Filter>
-			<Filter Name="pgraphnodes">
-				<File RelativePath="..\panda\src\pgraphnodes\lightNode.cxx"></File>
-				<File RelativePath="..\panda\src\pgraphnodes\selectiveChildNode.cxx"></File>
-				<File RelativePath="..\panda\src\pgraphnodes\pgraphnodes_composite1.cxx"></File>
-				<File RelativePath="..\panda\src\pgraphnodes\selectiveChildNode.I"></File>
-				<File RelativePath="..\panda\src\pgraphnodes\lightNode.h"></File>
-				<File RelativePath="..\panda\src\pgraphnodes\config_pgraphnodes.cxx"></File>
-				<File RelativePath="..\panda\src\pgraphnodes\ambientLight.h"></File>
-				<File RelativePath="..\panda\src\pgraphnodes\sequenceNode.I"></File>
-				<File RelativePath="..\panda\src\pgraphnodes\pointLight.cxx"></File>
-				<File RelativePath="..\panda\src\pgraphnodes\callbackNode.cxx"></File>
-				<File RelativePath="..\panda\src\pgraphnodes\sequenceNode.h"></File>
-				<File RelativePath="..\panda\src\pgraphnodes\directionalLight.I"></File>
-				<File RelativePath="..\panda\src\pgraphnodes\shaderGenerator.h"></File>
-				<File RelativePath="..\panda\src\pgraphnodes\callbackNode.h"></File>
-				<File RelativePath="..\panda\src\pgraphnodes\nodeCullCallbackData.h"></File>
-				<File RelativePath="..\panda\src\pgraphnodes\sequenceNode.cxx"></File>
-				<File RelativePath="..\panda\src\pgraphnodes\pgraphnodes_composite.cxx"></File>
-				<File RelativePath="..\panda\src\pgraphnodes\selectiveChildNode.h"></File>
-				<File RelativePath="..\panda\src\pgraphnodes\config_pgraphnodes.h"></File>
-				<File RelativePath="..\panda\src\pgraphnodes\ambientLight.I"></File>
-				<File RelativePath="..\panda\src\pgraphnodes\switchNode.cxx"></File>
-				<File RelativePath="..\panda\src\pgraphnodes\ambientLight.cxx"></File>
-				<File RelativePath="..\panda\src\pgraphnodes\directionalLight.cxx"></File>
-				<File RelativePath="..\panda\src\pgraphnodes\switchNode.h"></File>
-				<File RelativePath="..\panda\src\pgraphnodes\pointLight.h"></File>
-				<File RelativePath="..\panda\src\pgraphnodes\shaderGenerator.I"></File>
-				<File RelativePath="..\panda\src\pgraphnodes\lightLensNode.cxx"></File>
-				<File RelativePath="..\panda\src\pgraphnodes\lightLensNode.h"></File>
-				<File RelativePath="..\panda\src\pgraphnodes\nodeCullCallbackData.I"></File>
-				<File RelativePath="..\panda\src\pgraphnodes\pointLight.I"></File>
-				<File RelativePath="..\panda\src\pgraphnodes\spotlight.I"></File>
-				<File RelativePath="..\panda\src\pgraphnodes\shaderGenerator.cxx"></File>
-				<File RelativePath="..\panda\src\pgraphnodes\switchNode.I"></File>
-				<File RelativePath="..\panda\src\pgraphnodes\directionalLight.h"></File>
-				<File RelativePath="..\panda\src\pgraphnodes\nodeCullCallbackData.cxx"></File>
-				<File RelativePath="..\panda\src\pgraphnodes\lightLensNode.I"></File>
-				<File RelativePath="..\panda\src\pgraphnodes\spotlight.cxx"></File>
-				<File RelativePath="..\panda\src\pgraphnodes\lightNode.I"></File>
-				<File RelativePath="..\panda\src\pgraphnodes\pgraphnodes_composite2.cxx"></File>
-				<File RelativePath="..\panda\src\pgraphnodes\callbackNode.I"></File>
-				<File RelativePath="..\panda\src\pgraphnodes\spotlight.h"></File>
-			</Filter>
-			<Filter Name="nativenet">
-				<File RelativePath="..\panda\src\nativenet\socket_fdset.h"></File>
-				<File RelativePath="..\panda\src\nativenet\socket_base.h"></File>
-				<File RelativePath="..\panda\src\nativenet\socket_udp.h"></File>
-				<File RelativePath="..\panda\src\nativenet\time_general.h"></File>
-				<File RelativePath="..\panda\src\nativenet\buffered_datagramconnection.cxx"></File>
-				<File RelativePath="..\panda\src\nativenet\socket_udp_incoming.cxx"></File>
-				<File RelativePath="..\panda\src\nativenet\socket_tcp.cxx"></File>
-				<File RelativePath="..\panda\src\nativenet\time_base.h"></File>
-				<File RelativePath="..\panda\src\nativenet\buffered_datagramwriter.h"></File>
-				<File RelativePath="..\panda\src\nativenet\socket_udp_outgoing.h"></File>
-				<File RelativePath="..\panda\src\nativenet\nativenet_composite1.cxx"></File>
-				<File RelativePath="..\panda\src\nativenet\buffered_datagramreader.h"></File>
-				<File RelativePath="..\panda\src\nativenet\socket_ip.cxx"></File>
-				<File RelativePath="..\panda\src\nativenet\time_span.h"></File>
-				<File RelativePath="..\panda\src\nativenet\socket_portable.h"></File>
-				<File RelativePath="..\panda\src\nativenet\socket_tcp_listen.h"></File>
-				<File RelativePath="..\panda\src\nativenet\socket_udp_outgoing.cxx"></File>
-				<File RelativePath="..\panda\src\nativenet\config_nativenet.cxx"></File>
-				<File RelativePath="..\panda\src\nativenet\socket_address.h"></File>
-				<File RelativePath="..\panda\src\nativenet\socket_udp_incoming.h"></File>
-				<File RelativePath="..\panda\src\nativenet\socket_tcp.h"></File>
-				<File RelativePath="..\panda\src\nativenet\buffered_datagramconnection.h"></File>
-				<File RelativePath="..\panda\src\nativenet\socket_tcp_listen.cxx"></File>
-				<File RelativePath="..\panda\src\nativenet\buffered_datagramreader.i"></File>
-				<File RelativePath="..\panda\src\nativenet\socket_tcp_ssl.h"></File>
-				<File RelativePath="..\panda\src\nativenet\ringbuffer.i"></File>
-				<File RelativePath="..\panda\src\nativenet\membuffer.h"></File>
-				<File RelativePath="..\panda\src\nativenet\time_accumulator.h"></File>
-				<File RelativePath="..\panda\src\nativenet\socket_selector.h"></File>
-				<File RelativePath="..\panda\src\nativenet\socket_ip.h"></File>
-				<File RelativePath="..\panda\src\nativenet\membuffer.i"></File>
-				<File RelativePath="..\panda\src\nativenet\time_clock.h"></File>
-				<File RelativePath="..\panda\src\nativenet\config_nativenet.h"></File>
-				<File RelativePath="..\panda\src\nativenet\socket_udp.cxx"></File>
-				<File RelativePath="..\panda\src\nativenet\ringbuffer.h"></File>
-				<File RelativePath="..\panda\src\nativenet\socket_tcp_ssl.cxx"></File>
-				<File RelativePath="..\panda\src\nativenet\time_out.h"></File>
-			</Filter>
-			<Filter Name="physics">
-				<File RelativePath="..\panda\src\physics\baseForce.I"></File>
-				<File RelativePath="..\panda\src\physics\linearUserDefinedForce.I"></File>
-				<File RelativePath="..\panda\src\physics\angularVectorForce.h"></File>
-				<File RelativePath="..\panda\src\physics\angularEulerIntegrator.h"></File>
-				<File RelativePath="..\panda\src\physics\linearCylinderVortexForce.cxx"></File>
-				<File RelativePath="..\panda\src\physics\physical.cxx"></File>
-				<File RelativePath="..\panda\src\physics\angularVectorForce.cxx"></File>
-				<File RelativePath="..\panda\src\physics\linearVectorForce.h"></File>
-				<File RelativePath="..\panda\src\physics\physics_composite2.cxx"></File>
-				<File RelativePath="..\panda\src\physics\linearVectorForce.cxx"></File>
-				<File RelativePath="..\panda\src\physics\linearIntegrator.h"></File>
-				<File RelativePath="..\panda\src\physics\angularForce.cxx"></File>
-				<File RelativePath="..\panda\src\physics\physicsObjectCollection.I"></File>
-				<File RelativePath="..\panda\src\physics\linearFrictionForce.cxx"></File>
-				<File RelativePath="..\panda\src\physics\linearNoiseForce.h"></File>
-				<File RelativePath="..\panda\src\physics\linearDistanceForce.I"></File>
-				<File RelativePath="..\panda\src\physics\linearCylinderVortexForce.I"></File>
-				<File RelativePath="..\panda\src\physics\angularIntegrator.cxx"></File>
-				<File RelativePath="..\panda\src\physics\linearRandomForce.I"></File>
-				<File RelativePath="..\panda\src\physics\physicsCollisionHandler.I"></File>
-				<File RelativePath="..\panda\src\physics\config_physics.cxx"></File>
-				<File RelativePath="..\panda\src\physics\baseForce.h"></File>
-				<File RelativePath="..\panda\src\physics\linearSourceForce.h"></File>
-				<File RelativePath="..\panda\src\physics\linearForce.I"></File>
-				<File RelativePath="..\panda\src\physics\linearControlForce.cxx"></File>
-				<File RelativePath="..\panda\src\physics\linearFrictionForce.h"></File>
-				<File RelativePath="..\panda\src\physics\linearDistanceForce.h"></File>
-				<File RelativePath="..\panda\src\physics\linearSinkForce.h"></File>
-				<File RelativePath="..\panda\src\physics\physicsManager.I"></File>
-				<File RelativePath="..\panda\src\physics\forceNode.I"></File>
-				<File RelativePath="..\panda\src\physics\physicsCollisionHandler.cxx"></File>
-				<File RelativePath="..\panda\src\physics\physicsManager.h"></File>
-				<File RelativePath="..\panda\src\physics\physicsCollisionHandler.h"></File>
-				<File RelativePath="..\panda\src\physics\actorNode.cxx"></File>
-				<File RelativePath="..\panda\src\physics\physics_composite.cxx"></File>
-				<File RelativePath="..\panda\src\physics\forces.h"></File>
-				<File RelativePath="..\panda\src\physics\linearRandomForce.h"></File>
-				<File RelativePath="..\panda\src\physics\linearCylinderVortexForce.h"></File>
-				<File RelativePath="..\panda\src\physics\forceNode.cxx"></File>
-				<File RelativePath="..\panda\src\physics\baseIntegrator.h"></File>
-				<File RelativePath="..\panda\src\physics\linearSinkForce.cxx"></File>
-				<File RelativePath="..\panda\src\physics\baseIntegrator.cxx"></File>
-				<File RelativePath="..\panda\src\physics\forceNode.h"></File>
-				<File RelativePath="..\panda\src\physics\physical.h"></File>
-				<File RelativePath="..\panda\src\physics\physicsObjectCollection.h"></File>
-				<File RelativePath="..\panda\src\physics\baseIntegrator.I"></File>
-				<File RelativePath="..\panda\src\physics\physicsObject.I"></File>
-				<File RelativePath="..\panda\src\physics\linearUserDefinedForce.cxx"></File>
-				<File RelativePath="..\panda\src\physics\linearSourceForce.cxx"></File>
-				<File RelativePath="..\panda\src\physics\linearIntegrator.cxx"></File>
-				<File RelativePath="..\panda\src\physics\baseForce.cxx"></File>
-				<File RelativePath="..\panda\src\physics\linearVectorForce.I"></File>
-				<File RelativePath="..\panda\src\physics\linearNoiseForce.I"></File>
-				<File RelativePath="..\panda\src\physics\linearDistanceForce.cxx"></File>
-				<File RelativePath="..\panda\src\physics\physical.I"></File>
-				<File RelativePath="..\panda\src\physics\physicsObjectCollection.cxx"></File>
-				<File RelativePath="..\panda\src\physics\physicalNode.I"></File>
-				<File RelativePath="..\panda\src\physics\physicsManager.cxx"></File>
-				<File RelativePath="..\panda\src\physics\angularForce.h"></File>
-				<File RelativePath="..\panda\src\physics\physicsObject.cxx"></File>
-				<File RelativePath="..\panda\src\physics\linearFrictionForce.I"></File>
-				<File RelativePath="..\panda\src\physics\linearControlForce.h"></File>
-				<File RelativePath="..\panda\src\physics\linearUserDefinedForce.h"></File>
-				<File RelativePath="..\panda\src\physics\linearJitterForce.cxx"></File>
-				<File RelativePath="..\panda\src\physics\linearForce.cxx"></File>
-				<File RelativePath="..\panda\src\physics\linearJitterForce.h"></File>
-				<File RelativePath="..\panda\src\physics\physics_composite1.cxx"></File>
-				<File RelativePath="..\panda\src\physics\linearNoiseForce.cxx"></File>
-				<File RelativePath="..\panda\src\physics\linearForce.h"></File>
-				<File RelativePath="..\panda\src\physics\physicsObject.h"></File>
-				<File RelativePath="..\panda\src\physics\linearRandomForce.cxx"></File>
-				<File RelativePath="..\panda\src\physics\actorNode.I"></File>
-				<File RelativePath="..\panda\src\physics\actorNode.h"></File>
-				<File RelativePath="..\panda\src\physics\physicalNode.cxx"></File>
-				<File RelativePath="..\panda\src\physics\angularEulerIntegrator.cxx"></File>
-				<File RelativePath="..\panda\src\physics\linearEulerIntegrator.cxx"></File>
-				<File RelativePath="..\panda\src\physics\test_physics.cxx"></File>
-				<File RelativePath="..\panda\src\physics\config_physics.h"></File>
-				<File RelativePath="..\panda\src\physics\angularVectorForce.I"></File>
-				<File RelativePath="..\panda\src\physics\angularIntegrator.h"></File>
-				<File RelativePath="..\panda\src\physics\linearEulerIntegrator.h"></File>
-				<File RelativePath="..\panda\src\physics\linearControlForce.I"></File>
-				<File RelativePath="..\panda\src\physics\physicalNode.h"></File>
-			</Filter>
-			<Filter Name="pgui">
-				<File RelativePath="..\panda\src\pgui\pgSliderBarNotify.h"></File>
-				<File RelativePath="..\panda\src\pgui\pgTop.I"></File>
-				<File RelativePath="..\panda\src\pgui\pgFrameStyle.I"></File>
-				<File RelativePath="..\panda\src\pgui\pgMouseWatcherGroup.cxx"></File>
-				<File RelativePath="..\panda\src\pgui\pgMouseWatcherBackground.h"></File>
-				<File RelativePath="..\panda\src\pgui\pgScrollFrame.h"></File>
-				<File RelativePath="..\panda\src\pgui\pgSliderBar.cxx"></File>
-				<File RelativePath="..\panda\src\pgui\test_pgentry.cxx"></File>
-				<File RelativePath="..\panda\src\pgui\pgEntry.cxx"></File>
-				<File RelativePath="..\panda\src\pgui\pgMouseWatcherRegion.cxx"></File>
-				<File RelativePath="..\panda\src\pgui\pgMouseWatcherBackground.cxx"></File>
-				<File RelativePath="..\panda\src\pgui\pgEntry.I"></File>
-				<File RelativePath="..\panda\src\pgui\pgItemNotify.cxx"></File>
-				<File RelativePath="..\panda\src\pgui\pgButton.cxx"></File>
-				<File RelativePath="..\panda\src\pgui\pgui_composite.cxx"></File>
-				<File RelativePath="..\panda\src\pgui\pgItem.h"></File>
-				<File RelativePath="..\panda\src\pgui\pgMouseWatcherGroup.h"></File>
-				<File RelativePath="..\panda\src\pgui\pgMouseWatcherRegion.h"></File>
-				<File RelativePath="..\panda\src\pgui\pgSliderBarNotify.I"></File>
-				<File RelativePath="..\panda\src\pgui\pgSliderBar.I"></File>
-				<File RelativePath="..\panda\src\pgui\pgFrameStyle.h"></File>
-				<File RelativePath="..\panda\src\pgui\pgItem.I"></File>
-				<File RelativePath="..\panda\src\pgui\pgTop.cxx"></File>
-				<File RelativePath="..\panda\src\pgui\config_pgui.cxx"></File>
-				<File RelativePath="..\panda\src\pgui\pgCullTraverser.h"></File>
-				<File RelativePath="..\panda\src\pgui\pgItem.cxx"></File>
-				<File RelativePath="..\panda\src\pgui\pgScrollFrame.I"></File>
-				<File RelativePath="..\panda\src\pgui\pgSliderBarNotify.cxx"></File>
-				<File RelativePath="..\panda\src\pgui\pgSliderBar.h"></File>
-				<File RelativePath="..\panda\src\pgui\pgItemNotify.h"></File>
-				<File RelativePath="..\panda\src\pgui\pgMouseWatcherParameter.cxx"></File>
-				<File RelativePath="..\panda\src\pgui\pgWaitBar.h"></File>
-				<File RelativePath="..\panda\src\pgui\pgMouseWatcherParameter.I"></File>
-				<File RelativePath="..\panda\src\pgui\pgVirtualFrame.h"></File>
-				<File RelativePath="..\panda\src\pgui\pgFrameStyle.cxx"></File>
-				<File RelativePath="..\panda\src\pgui\pgMouseWatcherParameter.h"></File>
-				<File RelativePath="..\panda\src\pgui\pgButton.h"></File>
-				<File RelativePath="..\panda\src\pgui\pgWaitBar.cxx"></File>
-				<File RelativePath="..\panda\src\pgui\pgMouseWatcherGroup.I"></File>
-				<File RelativePath="..\panda\src\pgui\pgWaitBar.I"></File>
-				<File RelativePath="..\panda\src\pgui\pgCullTraverser.cxx"></File>
-				<File RelativePath="..\panda\src\pgui\pgTop.h"></File>
-				<File RelativePath="..\panda\src\pgui\pgItemNotify.I"></File>
-				<File RelativePath="..\panda\src\pgui\pgVirtualFrame.I"></File>
-				<File RelativePath="..\panda\src\pgui\pgCullTraverser.I"></File>
-				<File RelativePath="..\panda\src\pgui\pgButtonNotify.I"></File>
-				<File RelativePath="..\panda\src\pgui\pgEntry.h"></File>
-				<File RelativePath="..\panda\src\pgui\pgVirtualFrame.cxx"></File>
-				<File RelativePath="..\panda\src\pgui\pgui_composite1.cxx"></File>
-				<File RelativePath="..\panda\src\pgui\pgButton.I"></File>
-				<File RelativePath="..\panda\src\pgui\pgButtonNotify.cxx"></File>
-				<File RelativePath="..\panda\src\pgui\pgui_composite2.cxx"></File>
-				<File RelativePath="..\panda\src\pgui\config_pgui.h"></File>
-				<File RelativePath="..\panda\src\pgui\pgMouseWatcherRegion.I"></File>
-				<File RelativePath="..\panda\src\pgui\pgScrollFrame.cxx"></File>
-				<File RelativePath="..\panda\src\pgui\pgButtonNotify.h"></File>
-			</Filter>
-			<Filter Name="device">
-				<File RelativePath="..\panda\src\device\virtualMouse.h"></File>
-				<File RelativePath="..\panda\src\device\clientBase.h"></File>
-				<File RelativePath="..\panda\src\device\device_composite2.cxx"></File>
-				<File RelativePath="..\panda\src\device\clientTrackerDevice.I"></File>
-				<File RelativePath="..\panda\src\device\buttonNode.I"></File>
-				<File RelativePath="..\panda\src\device\mouseAndKeyboard.cxx"></File>
-				<File RelativePath="..\panda\src\device\trackerData.h"></File>
-				<File RelativePath="..\panda\src\device\clientBase.I"></File>
-				<File RelativePath="..\panda\src\device\clientDevice.cxx"></File>
-				<File RelativePath="..\panda\src\device\clientDevice.I"></File>
-				<File RelativePath="..\panda\src\device\trackerNode.h"></File>
-				<File RelativePath="..\panda\src\device\config_device.cxx"></File>
-				<File RelativePath="..\panda\src\device\config_device.h"></File>
-				<File RelativePath="..\panda\src\device\clientBase.cxx"></File>
-				<File RelativePath="..\panda\src\device\virtualMouse.cxx"></File>
-				<File RelativePath="..\panda\src\device\clientAnalogDevice.h"></File>
-				<File RelativePath="..\panda\src\device\trackerData.I"></File>
-				<File RelativePath="..\panda\src\device\clientDialDevice.cxx"></File>
-				<File RelativePath="..\panda\src\device\clientAnalogDevice.I"></File>
-				<File RelativePath="..\panda\src\device\clientButtonDevice.I"></File>
-				<File RelativePath="..\panda\src\device\device_composite1.cxx"></File>
-				<File RelativePath="..\panda\src\device\clientButtonDevice.h"></File>
-				<File RelativePath="..\panda\src\device\dialNode.h"></File>
-				<File RelativePath="..\panda\src\device\clientButtonDevice.cxx"></File>
-				<File RelativePath="..\panda\src\device\buttonNode.h"></File>
-				<File RelativePath="..\panda\src\device\clientDialDevice.I"></File>
-				<File RelativePath="..\panda\src\device\analogNode.I"></File>
-				<File RelativePath="..\panda\src\device\clientTrackerDevice.cxx"></File>
-				<File RelativePath="..\panda\src\device\clientDevice.h"></File>
-				<File RelativePath="..\panda\src\device\mouseAndKeyboard.h"></File>
-				<File RelativePath="..\panda\src\device\device_composite.cxx"></File>
-				<File RelativePath="..\panda\src\device\trackerData.cxx"></File>
-				<File RelativePath="..\panda\src\device\trackerNode.cxx"></File>
-				<File RelativePath="..\panda\src\device\clientTrackerDevice.h"></File>
-				<File RelativePath="..\panda\src\device\clientDialDevice.h"></File>
-				<File RelativePath="..\panda\src\device\dialNode.I"></File>
-				<File RelativePath="..\panda\src\device\trackerNode.I"></File>
-				<File RelativePath="..\panda\src\device\analogNode.h"></File>
-				<File RelativePath="..\panda\src\device\buttonNode.cxx"></File>
-				<File RelativePath="..\panda\src\device\dialNode.cxx"></File>
-				<File RelativePath="..\panda\src\device\clientAnalogDevice.cxx"></File>
-				<File RelativePath="..\panda\src\device\analogNode.cxx"></File>
-			</Filter>
-		</Filter>
-		<Filter Name="pandatool">
-			<Filter Name="mayaegg">
-				<File RelativePath="..\pandatool\src\mayaegg\mayaToEggConverter.cxx"></File>
-				<File RelativePath="..\pandatool\src\mayaegg\mayaEggGroupUserData.cxx"></File>
-				<File RelativePath="..\pandatool\src\mayaegg\config_mayaegg.h"></File>
-				<File RelativePath="..\pandatool\src\mayaegg\mayaegg_composite1.cxx"></File>
-				<File RelativePath="..\pandatool\src\mayaegg\mayaEggLoader.cxx"></File>
-				<File RelativePath="..\pandatool\src\mayaegg\mayaNodeTree.h"></File>
-				<File RelativePath="..\pandatool\src\mayaegg\mayaEggGroupUserData.h"></File>
-				<File RelativePath="..\pandatool\src\mayaegg\mayaNodeTree.cxx"></File>
-				<File RelativePath="..\pandatool\src\mayaegg\mayaEggGroupUserData.I"></File>
-				<File RelativePath="..\pandatool\src\mayaegg\mayaEggLoader.h"></File>
-				<File RelativePath="..\pandatool\src\mayaegg\mayaNodeDesc.h"></File>
-				<File RelativePath="..\pandatool\src\mayaegg\mayaNodeDesc.cxx"></File>
-				<File RelativePath="..\pandatool\src\mayaegg\mayaToEggConverter.h"></File>
-				<File RelativePath="..\pandatool\src\mayaegg\config_mayaegg.cxx"></File>
-				<File RelativePath="..\pandatool\src\mayaegg\mayaBlendDesc.cxx"></File>
-				<File RelativePath="..\pandatool\src\mayaegg\mayaBlendDesc.h"></File>
-			</Filter>
-			<Filter Name="xfileegg">
-				<File RelativePath="..\pandatool\src\xfileegg\xFileNormal.h"></File>
-				<File RelativePath="..\pandatool\src\xfileegg\xFileMaker.cxx"></File>
-				<File RelativePath="..\pandatool\src\xfileegg\xFileMaterial.h"></File>
-				<File RelativePath="..\pandatool\src\xfileegg\xFileMesh.cxx"></File>
-				<File RelativePath="..\pandatool\src\xfileegg\xFileMesh.h"></File>
-				<File RelativePath="..\pandatool\src\xfileegg\xFileAnimationSet.I"></File>
-				<File RelativePath="..\pandatool\src\xfileegg\xFileToEggConverter.cxx"></File>
-				<File RelativePath="..\pandatool\src\xfileegg\xFileMaterial.cxx"></File>
-				<File RelativePath="..\pandatool\src\xfileegg\xFileVertexPool.h"></File>
-				<File RelativePath="..\pandatool\src\xfileegg\xFileAnimationSet.h"></File>
-				<File RelativePath="..\pandatool\src\xfileegg\xFileVertex.h"></File>
-				<File RelativePath="..\pandatool\src\xfileegg\xFileAnimationSet.cxx"></File>
-				<File RelativePath="..\pandatool\src\xfileegg\xFileNormal.cxx"></File>
-				<File RelativePath="..\pandatool\src\xfileegg\xFileVertex.cxx"></File>
-				<File RelativePath="..\pandatool\src\xfileegg\xFileToEggConverter.h"></File>
-				<File RelativePath="..\pandatool\src\xfileegg\xFileMaker.h"></File>
-				<File RelativePath="..\pandatool\src\xfileegg\xFileFace.cxx"></File>
-				<File RelativePath="..\pandatool\src\xfileegg\xFileFace.h"></File>
-				<File RelativePath="..\pandatool\src\xfileegg\xfileegg_composite1.cxx"></File>
-			</Filter>
-			<Filter Name="egg-mkfont">
-				<File RelativePath="..\pandatool\src\egg-mkfont\rangeIterator.I"></File>
-				<File RelativePath="..\pandatool\src\egg-mkfont\rangeDescription.I"></File>
-				<File RelativePath="..\pandatool\src\egg-mkfont\rangeDescription.h"></File>
-				<File RelativePath="..\pandatool\src\egg-mkfont\egg-mkfont_composite1.cxx"></File>
-				<File RelativePath="..\pandatool\src\egg-mkfont\eggMakeFont.h"></File>
-				<File RelativePath="..\pandatool\src\egg-mkfont\rangeIterator.cxx"></File>
-				<File RelativePath="..\pandatool\src\egg-mkfont\rangeDescription.cxx"></File>
-				<File RelativePath="..\pandatool\src\egg-mkfont\eggMakeFont.cxx"></File>
-				<File RelativePath="..\pandatool\src\egg-mkfont\rangeIterator.h"></File>
-			</Filter>
-			<Filter Name="progbase">
-				<File RelativePath="..\pandatool\src\progbase\programBase.h"></File>
-				<File RelativePath="..\pandatool\src\progbase\programBase.I"></File>
-				<File RelativePath="..\pandatool\src\progbase\withOutputFile.h"></File>
-				<File RelativePath="..\pandatool\src\progbase\progbase_composite1.cxx"></File>
-				<File RelativePath="..\pandatool\src\progbase\programBase.cxx"></File>
-				<File RelativePath="..\pandatool\src\progbase\wordWrapStreamBuf.h"></File>
-				<File RelativePath="..\pandatool\src\progbase\wordWrapStream.cxx"></File>
-				<File RelativePath="..\pandatool\src\progbase\wordWrapStreamBuf.I"></File>
-				<File RelativePath="..\pandatool\src\progbase\wordWrapStream.h"></File>
-				<File RelativePath="..\pandatool\src\progbase\withOutputFile.I"></File>
-				<File RelativePath="..\pandatool\src\progbase\withOutputFile.cxx"></File>
-				<File RelativePath="..\pandatool\src\progbase\wordWrapStreamBuf.cxx"></File>
-				<File RelativePath="..\pandatool\src\progbase\test_prog.cxx"></File>
-			</Filter>
-			<Filter Name="eggcharbase">
-				<File RelativePath="..\pandatool\src\eggcharbase\eggMatrixTablePointer.cxx"></File>
-				<File RelativePath="..\pandatool\src\eggcharbase\eggSliderData.cxx"></File>
-				<File RelativePath="..\pandatool\src\eggcharbase\eggJointPointer.cxx"></File>
-				<File RelativePath="..\pandatool\src\eggcharbase\eggcharbase_composite1.cxx"></File>
-				<File RelativePath="..\pandatool\src\eggcharbase\eggCharacterCollection.cxx"></File>
-				<File RelativePath="..\pandatool\src\eggcharbase\eggCharacterData.I"></File>
-				<File RelativePath="..\pandatool\src\eggcharbase\eggMatrixTablePointer.h"></File>
-				<File RelativePath="..\pandatool\src\eggcharbase\eggJointPointer.I"></File>
-				<File RelativePath="..\pandatool\src\eggcharbase\eggJointNodePointer.cxx"></File>
-				<File RelativePath="..\pandatool\src\eggcharbase\eggCharacterData.cxx"></File>
-				<File RelativePath="..\pandatool\src\eggcharbase\eggJointPointer.h"></File>
-				<File RelativePath="..\pandatool\src\eggcharbase\config_eggcharbase.h"></File>
-				<File RelativePath="..\pandatool\src\eggcharbase\eggBackPointer.cxx"></File>
-				<File RelativePath="..\pandatool\src\eggcharbase\eggVertexPointer.cxx"></File>
-				<File RelativePath="..\pandatool\src\eggcharbase\eggVertexPointer.h"></File>
-				<File RelativePath="..\pandatool\src\eggcharbase\eggCharacterDb.h"></File>
-				<File RelativePath="..\pandatool\src\eggcharbase\eggBackPointer.h"></File>
-				<File RelativePath="..\pandatool\src\eggcharbase\eggComponentData.h"></File>
-				<File RelativePath="..\pandatool\src\eggcharbase\eggSliderData.I"></File>
-				<File RelativePath="..\pandatool\src\eggcharbase\eggJointData.h"></File>
-				<File RelativePath="..\pandatool\src\eggcharbase\eggCharacterFilter.cxx"></File>
-				<File RelativePath="..\pandatool\src\eggcharbase\eggCharacterCollection.h"></File>
-				<File RelativePath="..\pandatool\src\eggcharbase\eggSliderData.h"></File>
-				<File RelativePath="..\pandatool\src\eggcharbase\eggJointNodePointer.h"></File>
-				<File RelativePath="..\pandatool\src\eggcharbase\eggCharacterDb.I"></File>
-				<File RelativePath="..\pandatool\src\eggcharbase\eggCharacterData.h"></File>
-				<File RelativePath="..\pandatool\src\eggcharbase\eggSliderPointer.h"></File>
-				<File RelativePath="..\pandatool\src\eggcharbase\eggComponentData.I"></File>
-				<File RelativePath="..\pandatool\src\eggcharbase\eggSliderPointer.cxx"></File>
-				<File RelativePath="..\pandatool\src\eggcharbase\eggJointData.I"></File>
-				<File RelativePath="..\pandatool\src\eggcharbase\eggCharacterFilter.h"></File>
-				<File RelativePath="..\pandatool\src\eggcharbase\eggJointData.cxx"></File>
-				<File RelativePath="..\pandatool\src\eggcharbase\eggScalarTablePointer.cxx"></File>
-				<File RelativePath="..\pandatool\src\eggcharbase\eggCharacterDb.cxx"></File>
-				<File RelativePath="..\pandatool\src\eggcharbase\eggScalarTablePointer.h"></File>
-				<File RelativePath="..\pandatool\src\eggcharbase\eggCharacterCollection.I"></File>
-				<File RelativePath="..\pandatool\src\eggcharbase\config_eggcharbase.cxx"></File>
-				<File RelativePath="..\pandatool\src\eggcharbase\eggComponentData.cxx"></File>
-			</Filter>
-			<Filter Name="eggbase">
-				<File RelativePath="..\pandatool\src\eggbase\somethingToEgg.cxx"></File>
-				<File RelativePath="..\pandatool\src\eggbase\eggBase.cxx"></File>
-				<File RelativePath="..\pandatool\src\eggbase\eggConverter.cxx"></File>
-				<File RelativePath="..\pandatool\src\eggbase\eggFilter.cxx"></File>
-				<File RelativePath="..\pandatool\src\eggbase\eggConverter.h"></File>
-				<File RelativePath="..\pandatool\src\eggbase\eggMakeSomething.cxx"></File>
-				<File RelativePath="..\pandatool\src\eggbase\eggbase_composite1.cxx"></File>
-				<File RelativePath="..\pandatool\src\eggbase\eggWriter.cxx"></File>
-				<File RelativePath="..\pandatool\src\eggbase\eggMultiBase.cxx"></File>
-				<File RelativePath="..\pandatool\src\eggbase\eggReader.h"></File>
-				<File RelativePath="..\pandatool\src\eggbase\eggMultiFilter.h"></File>
-				<File RelativePath="..\pandatool\src\eggbase\eggMultiFilter.cxx"></File>
-				<File RelativePath="..\pandatool\src\eggbase\eggMakeSomething.h"></File>
-				<File RelativePath="..\pandatool\src\eggbase\eggWriter.h"></File>
-				<File RelativePath="..\pandatool\src\eggbase\eggReader.cxx"></File>
-				<File RelativePath="..\pandatool\src\eggbase\eggFilter.h"></File>
-				<File RelativePath="..\pandatool\src\eggbase\eggSingleBase.cxx"></File>
-				<File RelativePath="..\pandatool\src\eggbase\eggToSomething.h"></File>
-				<File RelativePath="..\pandatool\src\eggbase\eggMultiBase.h"></File>
-				<File RelativePath="..\pandatool\src\eggbase\eggSingleBase.h"></File>
-				<File RelativePath="..\pandatool\src\eggbase\somethingToEgg.h"></File>
-				<File RelativePath="..\pandatool\src\eggbase\eggBase.h"></File>
-				<File RelativePath="..\pandatool\src\eggbase\eggToSomething.cxx"></File>
-			</Filter>
-			<Filter Name="converter">
-				<File RelativePath="..\pandatool\src\converter\somethingToEggConverter.I"></File>
-				<File RelativePath="..\pandatool\src\converter\somethingToEggConverter.h"></File>
-				<File RelativePath="..\pandatool\src\converter\somethingToEggConverter.cxx"></File>
-			</Filter>
-			<Filter Name="lwoprogs">
-				<File RelativePath="..\pandatool\src\lwoprogs\lwoToEgg.h"></File>
-				<File RelativePath="..\pandatool\src\lwoprogs\lwoToEgg.cxx"></File>
-				<File RelativePath="..\pandatool\src\lwoprogs\lwoScan.h"></File>
-				<File RelativePath="..\pandatool\src\lwoprogs\lwoScan.cxx"></File>
-			</Filter>
-			<Filter Name="cvscopy">
-				<File RelativePath="..\pandatool\src\cvscopy\cvscopy_composite1.cxx"></File>
-				<File RelativePath="..\pandatool\src\cvscopy\testCopy.cxx"></File>
-				<File RelativePath="..\pandatool\src\cvscopy\cvsSourceDirectory.h"></File>
-				<File RelativePath="..\pandatool\src\cvscopy\testCopy.h"></File>
-				<File RelativePath="..\pandatool\src\cvscopy\cvsSourceDirectory.cxx"></File>
-				<File RelativePath="..\pandatool\src\cvscopy\cvsCopy.cxx"></File>
-				<File RelativePath="..\pandatool\src\cvscopy\cvsCopy.h"></File>
-				<File RelativePath="..\pandatool\src\cvscopy\cvsSourceTree.cxx"></File>
-				<File RelativePath="..\pandatool\src\cvscopy\cvsSourceTree.h"></File>
-			</Filter>
-			<Filter Name="maxeggimport">
-				<File RelativePath="..\pandatool\src\maxeggimport\maxEggLoader.h"></File>
-				<File RelativePath="..\pandatool\src\maxeggimport\maxImportRes.h"></File>
-				<File RelativePath="..\pandatool\src\maxeggimport\maxEggLoader.cxx"></File>
-				<File RelativePath="..\pandatool\src\maxeggimport\maxEggImport.cxx"></File>
-			</Filter>
-			<Filter Name="pandatoolbase">
-				<File RelativePath="..\pandatool\src\pandatoolbase\animationConvert.cxx"></File>
-				<File RelativePath="..\pandatool\src\pandatoolbase\pathReplace.I"></File>
-				<File RelativePath="..\pandatool\src\pandatoolbase\config_pandatoolbase.cxx"></File>
-				<File RelativePath="..\pandatool\src\pandatoolbase\pathReplace.h"></File>
-				<File RelativePath="..\pandatool\src\pandatoolbase\pandatoolsymbols.h"></File>
-				<File RelativePath="..\pandatool\src\pandatoolbase\animationConvert.h"></File>
-				<File RelativePath="..\pandatool\src\pandatoolbase\distanceUnit.cxx"></File>
-				<File RelativePath="..\pandatool\src\pandatoolbase\config_pandatoolbase.h"></File>
-				<File RelativePath="..\pandatool\src\pandatoolbase\pandatoolbase.cxx"></File>
-				<File RelativePath="..\pandatool\src\pandatoolbase\pathReplace.cxx"></File>
-				<File RelativePath="..\pandatool\src\pandatoolbase\pathStore.h"></File>
-				<File RelativePath="..\pandatool\src\pandatoolbase\pathStore.cxx"></File>
-				<File RelativePath="..\pandatool\src\pandatoolbase\distanceUnit.h"></File>
-				<File RelativePath="..\pandatool\src\pandatoolbase\pandatoolbase.h"></File>
-				<File RelativePath="..\pandatool\src\pandatoolbase\pandatoolbase_composite1.cxx"></File>
-			</Filter>
-			<Filter Name="imagebase">
-				<File RelativePath="..\pandatool\src\imagebase\imageFilter.h"></File>
-				<File RelativePath="..\pandatool\src\imagebase\imageWriter.cxx"></File>
-				<File RelativePath="..\pandatool\src\imagebase\imageWriter.h"></File>
-				<File RelativePath="..\pandatool\src\imagebase\imageWriter.I"></File>
-				<File RelativePath="..\pandatool\src\imagebase\imageBase.h"></File>
-				<File RelativePath="..\pandatool\src\imagebase\imageFilter.cxx"></File>
-				<File RelativePath="..\pandatool\src\imagebase\imagebase_composite1.cxx"></File>
-				<File RelativePath="..\pandatool\src\imagebase\imageReader.cxx"></File>
-				<File RelativePath="..\pandatool\src\imagebase\imageReader.h"></File>
-				<File RelativePath="..\pandatool\src\imagebase\imageBase.cxx"></File>
-			</Filter>
-			<Filter Name="text-stats">
-				<File RelativePath="..\pandatool\src\text-stats\textMonitor.h"></File>
-				<File RelativePath="..\pandatool\src\text-stats\textStats.h"></File>
-				<File RelativePath="..\pandatool\src\text-stats\textMonitor.cxx"></File>
-				<File RelativePath="..\pandatool\src\text-stats\textMonitor.I"></File>
-				<File RelativePath="..\pandatool\src\text-stats\textStats.cxx"></File>
-			</Filter>
-			<Filter Name="flt">
-				<File RelativePath="..\pandatool\src\flt\fltPackedColor.h"></File>
-				<File RelativePath="..\pandatool\src\flt\fltTransformRecord.cxx"></File>
-				<File RelativePath="..\pandatool\src\flt\fltMesh.cxx"></File>
-				<File RelativePath="..\pandatool\src\flt\config_flt.cxx"></File>
-				<File RelativePath="..\pandatool\src\flt\fltTransformRotateAboutPoint.h"></File>
-				<File RelativePath="..\pandatool\src\flt\fltVertex.h"></File>
-				<File RelativePath="..\pandatool\src\flt\fltMeshPrimitive.cxx"></File>
-				<File RelativePath="..\pandatool\src\flt\fltLocalVertexPool.I"></File>
-				<File RelativePath="..\pandatool\src\flt\fltInstanceRef.cxx"></File>
-				<File RelativePath="..\pandatool\src\flt\fltMesh.I"></File>
-				<File RelativePath="..\pandatool\src\flt\fltRecord.cxx"></File>
-				<File RelativePath="..\pandatool\src\flt\fltGroup.h"></File>
-				<File RelativePath="..\pandatool\src\flt\fltTransformRotateAboutEdge.h"></File>
-				<File RelativePath="..\pandatool\src\flt\fltLightSourceDefinition.h"></File>
-				<File RelativePath="..\pandatool\src\flt\fltRecordWriter.cxx"></File>
-				<File RelativePath="..\pandatool\src\flt\fltRecord.I"></File>
-				<File RelativePath="..\pandatool\src\flt\fltGroup.cxx"></File>
-				<File RelativePath="..\pandatool\src\flt\fltVectorRecord.h"></File>
-				<File RelativePath="..\pandatool\src\flt\fltUnsupportedRecord.cxx"></File>
-				<File RelativePath="..\pandatool\src\flt\fltFace.h"></File>
-				<File RelativePath="..\pandatool\src\flt\fltGeometry.h"></File>
-				<File RelativePath="..\pandatool\src\flt\fltBead.cxx"></File>
-				<File RelativePath="..\pandatool\src\flt\fltVertex.I"></File>
-				<File RelativePath="..\pandatool\src\flt\fltTexture.h"></File>
-				<File RelativePath="..\pandatool\src\flt\config_flt.h"></File>
-				<File RelativePath="..\pandatool\src\flt\fltPackedColor.cxx"></File>
-				<File RelativePath="..\pandatool\src\flt\fltMeshPrimitive.h"></File>
-				<File RelativePath="..\pandatool\src\flt\fltGeometry.cxx"></File>
-				<File RelativePath="..\pandatool\src\flt\fltHeader.h"></File>
-				<File RelativePath="..\pandatool\src\flt\fltRecordReader.cxx"></File>
-				<File RelativePath="..\pandatool\src\flt\fltTransformGeneralMatrix.h"></File>
-				<File RelativePath="..\pandatool\src\flt\fltRecordWriter.h"></File>
-				<File RelativePath="..\pandatool\src\flt\fltVertex.cxx"></File>
-				<File RelativePath="..\pandatool\src\flt\fltExternalReference.h"></File>
-				<File RelativePath="..\pandatool\src\flt\fltEyepoint.h"></File>
-				<File RelativePath="..\pandatool\src\flt\fltInstanceRef.h"></File>
-				<File RelativePath="..\pandatool\src\flt\fltTrackplane.cxx"></File>
-				<File RelativePath="..\pandatool\src\flt\fltRecord.h"></File>
-				<File RelativePath="..\pandatool\src\flt\fltLocalVertexPool.cxx"></File>
-				<File RelativePath="..\pandatool\src\flt\fltTransformPut.h"></File>
-				<File RelativePath="..\pandatool\src\flt\fltTransformRotateAboutPoint.cxx"></File>
-				<File RelativePath="..\pandatool\src\flt\fltBeadID.cxx"></File>
-				<File RelativePath="..\pandatool\src\flt\fltCurve.I"></File>
-				<File RelativePath="..\pandatool\src\flt\fltGeometry.I"></File>
-				<File RelativePath="..\pandatool\src\flt\fltLOD.cxx"></File>
-				<File RelativePath="..\pandatool\src\flt\fltOpcode.h"></File>
-				<File RelativePath="..\pandatool\src\flt\fltRecordReader.h"></File>
-				<File RelativePath="..\pandatool\src\flt\fltCurve.cxx"></File>
-				<File RelativePath="..\pandatool\src\flt\fltUnsupportedRecord.h"></File>
-				<File RelativePath="..\pandatool\src\flt\fltBead.h"></File>
-				<File RelativePath="..\pandatool\src\flt\fltObject.cxx"></File>
-				<File RelativePath="..\pandatool\src\flt\fltBeadID.h"></File>
-				<File RelativePath="..\pandatool\src\flt\flt_composite1.cxx"></File>
-				<File RelativePath="..\pandatool\src\flt\fltInstanceDefinition.cxx"></File>
-				<File RelativePath="..\pandatool\src\flt\fltExternalReference.cxx"></File>
-				<File RelativePath="..\pandatool\src\flt\fltTexture.cxx"></File>
-				<File RelativePath="..\pandatool\src\flt\fltLOD.h"></File>
-				<File RelativePath="..\pandatool\src\flt\fltTransformRotateScale.h"></File>
-				<File RelativePath="..\pandatool\src\flt\fltHeader.cxx"></File>
-				<File RelativePath="..\pandatool\src\flt\fltPackedColor.I"></File>
-				<File RelativePath="..\pandatool\src\flt\fltCurve.h"></File>
-				<File RelativePath="..\pandatool\src\flt\fltTransformRotateAboutEdge.cxx"></File>
-				<File RelativePath="..\pandatool\src\flt\fltLocalVertexPool.h"></File>
-				<File RelativePath="..\pandatool\src\flt\fltLightSourceDefinition.cxx"></File>
-				<File RelativePath="..\pandatool\src\flt\fltTransformScale.cxx"></File>
-				<File RelativePath="..\pandatool\src\flt\fltVertexList.cxx"></File>
-				<File RelativePath="..\pandatool\src\flt\fltMeshPrimitive.I"></File>
-				<File RelativePath="..\pandatool\src\flt\fltMaterial.h"></File>
-				<File RelativePath="..\pandatool\src\flt\fltTransformGeneralMatrix.cxx"></File>
-				<File RelativePath="..\pandatool\src\flt\fltVectorRecord.cxx"></File>
-				<File RelativePath="..\pandatool\src\flt\fltTransformScale.h"></File>
-				<File RelativePath="..\pandatool\src\flt\fltTransformRotateScale.cxx"></File>
-				<File RelativePath="..\pandatool\src\flt\fltTransformTranslate.cxx"></File>
-				<File RelativePath="..\pandatool\src\flt\fltVertexList.h"></File>
-				<File RelativePath="..\pandatool\src\flt\fltInstanceDefinition.h"></File>
-				<File RelativePath="..\pandatool\src\flt\fltTrackplane.h"></File>
-				<File RelativePath="..\pandatool\src\flt\fltTransformPut.cxx"></File>
-				<File RelativePath="..\pandatool\src\flt\fltObject.h"></File>
-				<File RelativePath="..\pandatool\src\flt\fltOpcode.cxx"></File>
-				<File RelativePath="..\pandatool\src\flt\fltEyepoint.cxx"></File>
-				<File RelativePath="..\pandatool\src\flt\fltFace.cxx"></File>
-				<File RelativePath="..\pandatool\src\flt\fltFace.I"></File>
-				<File RelativePath="..\pandatool\src\flt\fltTransformTranslate.h"></File>
-				<File RelativePath="..\pandatool\src\flt\fltTransformRecord.h"></File>
-				<File RelativePath="..\pandatool\src\flt\fltError.cxx"></File>
-				<File RelativePath="..\pandatool\src\flt\fltError.h"></File>
-				<File RelativePath="..\pandatool\src\flt\fltMaterial.cxx"></File>
-				<File RelativePath="..\pandatool\src\flt\fltMesh.h"></File>
-			</Filter>
-			<Filter Name="vrml">
-				<File RelativePath="..\pandatool\src\vrml\standard_nodes.cxx"></File>
-				<File RelativePath="..\pandatool\src\vrml\vrmlNode.h"></File>
-				<File RelativePath="..\pandatool\src\vrml\vrmlParser.h"></File>
-				<File RelativePath="..\pandatool\src\vrml\parse_vrml.h"></File>
-				<File RelativePath="..\pandatool\src\vrml\vrmlNodeType.h"></File>
-				<File RelativePath="..\pandatool\src\vrml\vrmlNode.cxx"></File>
-				<File RelativePath="..\pandatool\src\vrml\vrmlParserDefs.h"></File>
-				<File RelativePath="..\pandatool\src\vrml\vrmlLexerDefs.h"></File>
-				<File RelativePath="..\pandatool\src\vrml\vrmlLexer.cxx"></File>
-				<File RelativePath="..\pandatool\src\vrml\vrmlParser.cxx"></File>
-				<File RelativePath="..\pandatool\src\vrml\standardNodes.wrl.pz.c"></File>
-				<File RelativePath="..\pandatool\src\vrml\standard_nodes.h"></File>
-				<File RelativePath="..\pandatool\src\vrml\parse_vrml.cxx"></File>
-				<File RelativePath="..\pandatool\src\vrml\standardNodes.wrl.c"></File>
-				<File RelativePath="..\pandatool\src\vrml\vrmlNodeType.cxx"></File>
-			</Filter>
-			<Filter Name="ptloader">
-				<File RelativePath="..\pandatool\src\ptloader\config_ptloader.cxx"></File>
-				<File RelativePath="..\pandatool\src\ptloader\loaderFileTypePandatool.cxx"></File>
-				<File RelativePath="..\pandatool\src\ptloader\config_ptloader.h"></File>
-				<File RelativePath="..\pandatool\src\ptloader\loaderFileTypePandatool.h"></File>
-			</Filter>
-			<Filter Name="softprogs">
-				<File RelativePath="..\pandatool\src\softprogs\softCVS.cxx"></File>
-				<File RelativePath="..\pandatool\src\softprogs\softFilename.h"></File>
-				<File RelativePath="..\pandatool\src\softprogs\softCVS.h"></File>
-				<File RelativePath="..\pandatool\src\softprogs\softFilename.cxx"></File>
-			</Filter>
-			<Filter Name="imageprogs">
-				<File RelativePath="..\pandatool\src\imageprogs\imageTrans.h"></File>
-				<File RelativePath="..\pandatool\src\imageprogs\imageTransformColors.cxx"></File>
-				<File RelativePath="..\pandatool\src\imageprogs\imageTransformColors.h"></File>
-				<File RelativePath="..\pandatool\src\imageprogs\imageResize.h"></File>
-				<File RelativePath="..\pandatool\src\imageprogs\imageFixHiddenColor.I"></File>
-				<File RelativePath="..\pandatool\src\imageprogs\imageResize.cxx"></File>
-				<File RelativePath="..\pandatool\src\imageprogs\imageFixHiddenColor.cxx"></File>
-				<File RelativePath="..\pandatool\src\imageprogs\imageInfo.h"></File>
-				<File RelativePath="..\pandatool\src\imageprogs\imageFixHiddenColor.h"></File>
-				<File RelativePath="..\pandatool\src\imageprogs\imageTransformColors.I"></File>
-				<File RelativePath="..\pandatool\src\imageprogs\imageTrans.cxx"></File>
-				<File RelativePath="..\pandatool\src\imageprogs\imageInfo.cxx"></File>
-				<File RelativePath="..\pandatool\src\imageprogs\imageResize.I"></File>
-			</Filter>
-			<Filter Name="fltprogs">
-				<File RelativePath="..\pandatool\src\fltprogs\fltToEgg.cxx"></File>
-				<File RelativePath="..\pandatool\src\fltprogs\eggToFlt.cxx"></File>
-				<File RelativePath="..\pandatool\src\fltprogs\fltCopy.h"></File>
-				<File RelativePath="..\pandatool\src\fltprogs\fltTrans.h"></File>
-				<File RelativePath="..\pandatool\src\fltprogs\fltInfo.h"></File>
-				<File RelativePath="..\pandatool\src\fltprogs\fltInfo.cxx"></File>
-				<File RelativePath="..\pandatool\src\fltprogs\fltCopy.cxx"></File>
-				<File RelativePath="..\pandatool\src\fltprogs\fltTrans.cxx"></File>
-				<File RelativePath="..\pandatool\src\fltprogs\fltToEgg.h"></File>
-				<File RelativePath="..\pandatool\src\fltprogs\eggToFlt.h"></File>
-			</Filter>
-			<Filter Name="fltegg">
-				<File RelativePath="..\pandatool\src\fltegg\fltToEggConverter.I"></File>
-				<File RelativePath="..\pandatool\src\fltegg\fltToEggLevelState.I"></File>
-				<File RelativePath="..\pandatool\src\fltegg\fltToEggLevelState.cxx"></File>
-				<File RelativePath="..\pandatool\src\fltegg\fltToEggConverter.cxx"></File>
-				<File RelativePath="..\pandatool\src\fltegg\fltToEggConverter.h"></File>
-				<File RelativePath="..\pandatool\src\fltegg\fltToEggLevelState.h"></File>
-			</Filter>
-			<Filter Name="eggprogs">
-				<File RelativePath="..\pandatool\src\eggprogs\eggRetargetAnim.h"></File>
-				<File RelativePath="..\pandatool\src\eggprogs\eggTrans.cxx"></File>
-				<File RelativePath="..\pandatool\src\eggprogs\eggRetargetAnim.cxx"></File>
-				<File RelativePath="..\pandatool\src\eggprogs\eggTrans.h"></File>
-				<File RelativePath="..\pandatool\src\eggprogs\eggRename.h"></File>
-				<File RelativePath="..\pandatool\src\eggprogs\eggRename.cxx"></File>
-				<File RelativePath="..\pandatool\src\eggprogs\eggCrop.cxx"></File>
-				<File RelativePath="..\pandatool\src\eggprogs\eggTopstrip.h"></File>
-				<File RelativePath="..\pandatool\src\eggprogs\eggTextureCards.h"></File>
-				<File RelativePath="..\pandatool\src\eggprogs\eggMakeTube.h"></File>
-				<File RelativePath="..\pandatool\src\eggprogs\eggMakeTube.cxx"></File>
-				<File RelativePath="..\pandatool\src\eggprogs\eggCrop.h"></File>
-				<File RelativePath="..\pandatool\src\eggprogs\eggTopstrip.cxx"></File>
-				<File RelativePath="..\pandatool\src\eggprogs\eggListTextures.cxx"></File>
-				<File RelativePath="..\pandatool\src\eggprogs\eggToC.h"></File>
-				<File RelativePath="..\pandatool\src\eggprogs\eggTextureCards.cxx"></File>
-				<File RelativePath="..\pandatool\src\eggprogs\eggToC.cxx"></File>
-				<File RelativePath="..\pandatool\src\eggprogs\eggListTextures.h"></File>
-			</Filter>
-			<Filter Name="maya">
-				<File RelativePath="..\pandatool\src\maya\mayaApi.h"></File>
-				<File RelativePath="..\pandatool\src\maya\mayaShaders.h"></File>
-				<File RelativePath="..\pandatool\src\maya\post_maya_include.h"></File>
-				<File RelativePath="..\pandatool\src\maya\maya_composite1.cxx"></File>
-				<File RelativePath="..\pandatool\src\maya\config_maya.h"></File>
-				<File RelativePath="..\pandatool\src\maya\maya_funcs.cxx"></File>
-				<File RelativePath="..\pandatool\src\maya\mayaShader.cxx"></File>
-				<File RelativePath="..\pandatool\src\maya\mayaShader.h"></File>
-				<File RelativePath="..\pandatool\src\maya\maya_funcs.h"></File>
-				<File RelativePath="..\pandatool\src\maya\mayaShaders.cxx"></File>
-				<File RelativePath="..\pandatool\src\maya\pre_maya_include.h"></File>
-				<File RelativePath="..\pandatool\src\maya\mayaShaderColorDef.h"></File>
-				<File RelativePath="..\pandatool\src\maya\maya_funcs.I"></File>
-				<File RelativePath="..\pandatool\src\maya\mayaApi.cxx"></File>
-				<File RelativePath="..\pandatool\src\maya\mayaShaderColorDef.cxx"></File>
-				<File RelativePath="..\pandatool\src\maya\config_maya.cxx"></File>
-			</Filter>
-			<Filter Name="lwoegg">
-				<File RelativePath="..\pandatool\src\lwoegg\cLwoPolygons.cxx"></File>
-				<File RelativePath="..\pandatool\src\lwoegg\cLwoClip.h"></File>
-				<File RelativePath="..\pandatool\src\lwoegg\cLwoSurface.cxx"></File>
-				<File RelativePath="..\pandatool\src\lwoegg\lwoToEggConverter.h"></File>
-				<File RelativePath="..\pandatool\src\lwoegg\cLwoSurfaceBlock.h"></File>
-				<File RelativePath="..\pandatool\src\lwoegg\cLwoPoints.I"></File>
-				<File RelativePath="..\pandatool\src\lwoegg\cLwoPolygons.I"></File>
-				<File RelativePath="..\pandatool\src\lwoegg\cLwoSurfaceBlock.I"></File>
-				<File RelativePath="..\pandatool\src\lwoegg\cLwoSurfaceBlockTMap.I"></File>
-				<File RelativePath="..\pandatool\src\lwoegg\cLwoClip.cxx"></File>
-				<File RelativePath="..\pandatool\src\lwoegg\lwoegg_composite1.cxx"></File>
-				<File RelativePath="..\pandatool\src\lwoegg\cLwoLayer.h"></File>
-				<File RelativePath="..\pandatool\src\lwoegg\cLwoLayer.cxx"></File>
-				<File RelativePath="..\pandatool\src\lwoegg\cLwoSurfaceBlockTMap.h"></File>
-				<File RelativePath="..\pandatool\src\lwoegg\cLwoSurfaceBlock.cxx"></File>
-				<File RelativePath="..\pandatool\src\lwoegg\cLwoPoints.h"></File>
-				<File RelativePath="..\pandatool\src\lwoegg\cLwoSurfaceBlockTMap.cxx"></File>
-				<File RelativePath="..\pandatool\src\lwoegg\cLwoLayer.I"></File>
-				<File RelativePath="..\pandatool\src\lwoegg\cLwoClip.I"></File>
-				<File RelativePath="..\pandatool\src\lwoegg\cLwoPoints.cxx"></File>
-				<File RelativePath="..\pandatool\src\lwoegg\cLwoSurface.h"></File>
-				<File RelativePath="..\pandatool\src\lwoegg\lwoToEggConverter.I"></File>
-				<File RelativePath="..\pandatool\src\lwoegg\cLwoPolygons.h"></File>
-				<File RelativePath="..\pandatool\src\lwoegg\cLwoSurface.I"></File>
-				<File RelativePath="..\pandatool\src\lwoegg\lwoToEggConverter.cxx"></File>
-			</Filter>
-			<Filter Name="dxfprogs">
-				<File RelativePath="..\pandatool\src\dxfprogs\eggToDXF.cxx"></File>
-				<File RelativePath="..\pandatool\src\dxfprogs\eggToDXFLayer.cxx"></File>
-				<File RelativePath="..\pandatool\src\dxfprogs\dxfToEgg.cxx"></File>
-				<File RelativePath="..\pandatool\src\dxfprogs\dxfToEgg.h"></File>
-				<File RelativePath="..\pandatool\src\dxfprogs\dxfPoints.cxx"></File>
-				<File RelativePath="..\pandatool\src\dxfprogs\eggToDXF.h"></File>
-				<File RelativePath="..\pandatool\src\dxfprogs\eggToDXFLayer.h"></File>
-				<File RelativePath="..\pandatool\src\dxfprogs\dxfPoints.h"></File>
-			</Filter>
-			<Filter Name="daeegg">
-				<File RelativePath="..\pandatool\src\daeegg\pre_fcollada_include.h"></File>
-				<File RelativePath="..\pandatool\src\daeegg\daeToEggConverter.cxx"></File>
-				<File RelativePath="..\pandatool\src\daeegg\fcollada_utils.h"></File>
-				<File RelativePath="..\pandatool\src\daeegg\daeCharacter.h"></File>
-				<File RelativePath="..\pandatool\src\daeegg\daeegg_composite1.cxx"></File>
-				<File RelativePath="..\pandatool\src\daeegg\config_daeegg.cxx"></File>
-				<File RelativePath="..\pandatool\src\daeegg\daeMaterials.h"></File>
-				<File RelativePath="..\pandatool\src\daeegg\daeMaterials.cxx"></File>
-				<File RelativePath="..\pandatool\src\daeegg\daeToEggConverter.h"></File>
-				<File RelativePath="..\pandatool\src\daeegg\config_daeegg.h"></File>
-				<File RelativePath="..\pandatool\src\daeegg\daeCharacter.cxx"></File>
-			</Filter>
-			<Filter Name="daeprogs">
-				<File RelativePath="..\pandatool\src\daeprogs\eggToDAE.h"></File>
-				<File RelativePath="..\pandatool\src\daeprogs\eggToDAE.cxx"></File>
-				<File RelativePath="..\pandatool\src\daeprogs\daeToEgg.cxx"></File>
-				<File RelativePath="..\pandatool\src\daeprogs\daeToEgg.h"></File>
-			</Filter>
-			<Filter Name="win-stats">
-				<File RelativePath="..\pandatool\src\win-stats\winStatsLabelStack.cxx"></File>
-				<File RelativePath="..\pandatool\src\win-stats\winStatsStripChart.cxx"></File>
-				<File RelativePath="..\pandatool\src\win-stats\winStatsMonitor.cxx"></File>
-				<File RelativePath="..\pandatool\src\win-stats\winStats.cxx"></File>
-				<File RelativePath="..\pandatool\src\win-stats\winStatsChartMenu.cxx"></File>
-				<File RelativePath="..\pandatool\src\win-stats\winStatsGraph.cxx"></File>
-				<File RelativePath="..\pandatool\src\win-stats\winstats_composite1.cxx"></File>
-				<File RelativePath="..\pandatool\src\win-stats\winStatsLabel.h"></File>
-				<File RelativePath="..\pandatool\src\win-stats\winStatsChartMenu.h"></File>
-				<File RelativePath="..\pandatool\src\win-stats\winStatsLabelStack.h"></File>
-				<File RelativePath="..\pandatool\src\win-stats\winStatsGraph.h"></File>
-				<File RelativePath="..\pandatool\src\win-stats\winStatsMonitor.h"></File>
-				<File RelativePath="..\pandatool\src\win-stats\winStats.h"></File>
-				<File RelativePath="..\pandatool\src\win-stats\winStatsPianoRoll.h"></File>
-				<File RelativePath="..\pandatool\src\win-stats\winStatsMonitor.I"></File>
-				<File RelativePath="..\pandatool\src\win-stats\winStatsStripChart.h"></File>
-				<File RelativePath="..\pandatool\src\win-stats\winStatsPianoRoll.cxx"></File>
-				<File RelativePath="..\pandatool\src\win-stats\winStatsServer.cxx"></File>
-				<File RelativePath="..\pandatool\src\win-stats\winStatsMenuId.h"></File>
-				<File RelativePath="..\pandatool\src\win-stats\winStatsLabel.cxx"></File>
-				<File RelativePath="..\pandatool\src\win-stats\winStatsServer.h"></File>
-			</Filter>
-			<Filter Name="dxfegg">
-				<File RelativePath="..\pandatool\src\dxfegg\dxfToEggConverter.cxx"></File>
-				<File RelativePath="..\pandatool\src\dxfegg\dxfToEggLayer.cxx"></File>
-				<File RelativePath="..\pandatool\src\dxfegg\dxfToEggConverter.h"></File>
-				<File RelativePath="..\pandatool\src\dxfegg\dxfToEggLayer.h"></File>
-			</Filter>
-			<Filter Name="maxprogs">
-				<File RelativePath="..\pandatool\src\maxprogs\maxImportRes.h"></File>
-				<File RelativePath="..\pandatool\src\maxprogs\maxEggImport.cxx"></File>
-			</Filter>
-			<Filter Name="egg-palettize">
-				<File RelativePath="..\pandatool\src\egg-palettize\eggPalettize.h"></File>
-				<File RelativePath="..\pandatool\src\egg-palettize\txaFileFilter.cxx"></File>
-				<File RelativePath="..\pandatool\src\egg-palettize\eggPalettize.cxx"></File>
-				<File RelativePath="..\pandatool\src\egg-palettize\txaFileFilter.h"></File>
-				<File RelativePath="..\pandatool\src\egg-palettize\txaFileFilter.I"></File>
-			</Filter>
-			<Filter Name="bam">
-				<File RelativePath="..\pandatool\src\bam\eggToBam.h"></File>
-				<File RelativePath="..\pandatool\src\bam\bamToEgg.cxx"></File>
-				<File RelativePath="..\pandatool\src\bam\bamInfo.cxx"></File>
-				<File RelativePath="..\pandatool\src\bam\eggToBam.cxx"></File>
-				<File RelativePath="..\pandatool\src\bam\bamToEgg.h"></File>
-				<File RelativePath="..\pandatool\src\bam\bamInfo.h"></File>
-			</Filter>
-			<Filter Name="miscprogs">
-				<File RelativePath="..\pandatool\src\miscprogs\binToC.h"></File>
-				<File RelativePath="..\pandatool\src\miscprogs\binToC.cxx"></File>
-			</Filter>
-			<Filter Name="mayaprogs">
-				<File RelativePath="..\pandatool\src\mayaprogs\mayaPview.h"></File>
-				<File RelativePath="..\pandatool\src\mayaprogs\config_mayaloader.cxx"></File>
-				<File RelativePath="..\pandatool\src\mayaprogs\mayaPview.cxx"></File>
-				<File RelativePath="..\pandatool\src\mayaprogs\blend_test.cxx"></File>
-				<File RelativePath="..\pandatool\src\mayaprogs\mayaCopy.h"></File>
-				<File RelativePath="..\pandatool\src\mayaprogs\eggToMaya.h"></File>
-				<File RelativePath="..\pandatool\src\mayaprogs\mayaSavePview.h"></File>
-				<File RelativePath="..\pandatool\src\mayaprogs\mayaCopy.cxx"></File>
-				<File RelativePath="..\pandatool\src\mayaprogs\eggToMaya.cxx"></File>
-				<File RelativePath="..\pandatool\src\mayaprogs\normal_test.cxx"></File>
-				<File RelativePath="..\pandatool\src\mayaprogs\mayaSavePview.cxx"></File>
-				<File RelativePath="..\pandatool\src\mayaprogs\mayaToEgg.cxx"></File>
-				<File RelativePath="..\pandatool\src\mayaprogs\mayaToEgg.h"></File>
-				<File RelativePath="..\pandatool\src\mayaprogs\mayaWrapper.cxx"></File>
-				<File RelativePath="..\pandatool\src\mayaprogs\mayapath.cxx"></File>
-				<File RelativePath="..\pandatool\src\mayaprogs\mayaEggImport.cxx"></File>
-			</Filter>
-			<Filter Name="vrmlprogs">
-				<File RelativePath="..\pandatool\src\vrmlprogs\vrmlToEgg.cxx"></File>
-				<File RelativePath="..\pandatool\src\vrmlprogs\vrmlToEgg.h"></File>
-				<File RelativePath="..\pandatool\src\vrmlprogs\vrmlTrans.h"></File>
-				<File RelativePath="..\pandatool\src\vrmlprogs\vrmlTrans.cxx"></File>
-			</Filter>
-			<Filter Name="egg-optchar">
-				<File RelativePath="..\pandatool\src\egg-optchar\eggOptcharUserData.cxx"></File>
-				<File RelativePath="..\pandatool\src\egg-optchar\config_egg_optchar.cxx"></File>
-				<File RelativePath="..\pandatool\src\egg-optchar\eggOptcharUserData.I"></File>
-				<File RelativePath="..\pandatool\src\egg-optchar\vertexMembership.I"></File>
-				<File RelativePath="..\pandatool\src\egg-optchar\eggOptchar.cxx"></File>
-				<File RelativePath="..\pandatool\src\egg-optchar\vertexMembership.cxx"></File>
-				<File RelativePath="..\pandatool\src\egg-optchar\config_egg_optchar.h"></File>
-				<File RelativePath="..\pandatool\src\egg-optchar\eggOptchar.h"></File>
-				<File RelativePath="..\pandatool\src\egg-optchar\eggOptcharUserData.h"></File>
-				<File RelativePath="..\pandatool\src\egg-optchar\vertexMembership.h"></File>
-			</Filter>
-			<Filter Name="pstatserver">
-				<File RelativePath="..\pandatool\src\pstatserver\pStatThreadData.h"></File>
-				<File RelativePath="..\pandatool\src\pstatserver\pStatListener.h"></File>
-				<File RelativePath="..\pandatool\src\pstatserver\pStatGraph.h"></File>
-				<File RelativePath="..\pandatool\src\pstatserver\pStatMonitor.h"></File>
-				<File RelativePath="..\pandatool\src\pstatserver\pStatViewLevel.I"></File>
-				<File RelativePath="..\pandatool\src\pstatserver\pStatThreadData.cxx"></File>
-				<File RelativePath="..\pandatool\src\pstatserver\pStatServer.h"></File>
-				<File RelativePath="..\pandatool\src\pstatserver\pStatReader.h"></File>
-				<File RelativePath="..\pandatool\src\pstatserver\pStatViewLevel.h"></File>
-				<File RelativePath="..\pandatool\src\pstatserver\pStatPianoRoll.I"></File>
-				<File RelativePath="..\pandatool\src\pstatserver\pStatStripChart.h"></File>
-				<File RelativePath="..\pandatool\src\pstatserver\pStatPianoRoll.h"></File>
-				<File RelativePath="..\pandatool\src\pstatserver\pStatView.cxx"></File>
-				<File RelativePath="..\pandatool\src\pstatserver\pstatserver_composite1.cxx"></File>
-				<File RelativePath="..\pandatool\src\pstatserver\pStatViewLevel.cxx"></File>
-				<File RelativePath="..\pandatool\src\pstatserver\pStatMonitor.I"></File>
-				<File RelativePath="..\pandatool\src\pstatserver\pStatListener.cxx"></File>
-				<File RelativePath="..\pandatool\src\pstatserver\pStatStripChart.cxx"></File>
-				<File RelativePath="..\pandatool\src\pstatserver\pStatPianoRoll.cxx"></File>
-				<File RelativePath="..\pandatool\src\pstatserver\pStatClientData.h"></File>
-				<File RelativePath="..\pandatool\src\pstatserver\pStatServer.cxx"></File>
-				<File RelativePath="..\pandatool\src\pstatserver\pStatGraph.I"></File>
-				<File RelativePath="..\pandatool\src\pstatserver\pStatGraph.cxx"></File>
-				<File RelativePath="..\pandatool\src\pstatserver\pStatMonitor.cxx"></File>
-				<File RelativePath="..\pandatool\src\pstatserver\pStatStripChart.I"></File>
-				<File RelativePath="..\pandatool\src\pstatserver\pStatThreadData.I"></File>
-				<File RelativePath="..\pandatool\src\pstatserver\pStatReader.cxx"></File>
-				<File RelativePath="..\pandatool\src\pstatserver\pStatView.h"></File>
-				<File RelativePath="..\pandatool\src\pstatserver\pStatView.I"></File>
-				<File RelativePath="..\pandatool\src\pstatserver\pStatClientData.cxx"></File>
-			</Filter>
-			<Filter Name="gtk-stats">
-				<File RelativePath="..\pandatool\src\gtk-stats\gtkStatsLabel.cxx"></File>
-				<File RelativePath="..\pandatool\src\gtk-stats\gtkStatsGraph.cxx"></File>
-				<File RelativePath="..\pandatool\src\gtk-stats\gtkStatsMonitor.I"></File>
-				<File RelativePath="..\pandatool\src\gtk-stats\gtkStatsGraph.h"></File>
-				<File RelativePath="..\pandatool\src\gtk-stats\gtkStatsMonitor.cxx"></File>
-				<File RelativePath="..\pandatool\src\gtk-stats\gtkStatsStripChart.cxx"></File>
-				<File RelativePath="..\pandatool\src\gtk-stats\gtkStats.cxx"></File>
-				<File RelativePath="..\pandatool\src\gtk-stats\gtkStatsStripChart.h"></File>
-				<File RelativePath="..\pandatool\src\gtk-stats\gtkStatsPianoRoll.h"></File>
-				<File RelativePath="..\pandatool\src\gtk-stats\gtkStatsServer.cxx"></File>
-				<File RelativePath="..\pandatool\src\gtk-stats\gtkStatsLabel.h"></File>
-				<File RelativePath="..\pandatool\src\gtk-stats\gtkStatsMenuId.h"></File>
-				<File RelativePath="..\pandatool\src\gtk-stats\gtkStatsLabelStack.h"></File>
-				<File RelativePath="..\pandatool\src\gtk-stats\gtkStatsPianoRoll.cxx"></File>
-				<File RelativePath="..\pandatool\src\gtk-stats\gtkstats_composite1.cxx"></File>
-				<File RelativePath="..\pandatool\src\gtk-stats\gtkStatsChartMenu.cxx"></File>
-				<File RelativePath="..\pandatool\src\gtk-stats\gtkStats.h"></File>
-				<File RelativePath="..\pandatool\src\gtk-stats\gtkStatsMonitor.h"></File>
-				<File RelativePath="..\pandatool\src\gtk-stats\gtkStatsChartMenu.h"></File>
-				<File RelativePath="..\pandatool\src\gtk-stats\gtkStatsLabelStack.cxx"></File>
-				<File RelativePath="..\pandatool\src\gtk-stats\gtkStatsServer.h"></File>
-			</Filter>
-			<Filter Name="xfile">
-				<File RelativePath="..\pandatool\src\xfile\xFile.I"></File>
-				<File RelativePath="..\pandatool\src\xfile\xFileDataDef.I"></File>
-				<File RelativePath="..\pandatool\src\xfile\standard_templates.cxx"></File>
-				<File RelativePath="..\pandatool\src\xfile\xFileArrayDef.cxx"></File>
-				<File RelativePath="..\pandatool\src\xfile\xFileNode.I"></File>
-				<File RelativePath="..\pandatool\src\xfile\xFileDataNodeReference.cxx"></File>
-				<File RelativePath="..\pandatool\src\xfile\xFile.cxx"></File>
-				<File RelativePath="..\pandatool\src\xfile\xFileDataNodeTemplate.h"></File>
-				<File RelativePath="..\pandatool\src\xfile\xFileTemplate.I"></File>
-				<File RelativePath="..\pandatool\src\xfile\xLexerDefs.h"></File>
-				<File RelativePath="..\pandatool\src\xfile\windowsGuid.h"></File>
-				<File RelativePath="..\pandatool\src\xfile\xFileNode.cxx"></File>
-				<File RelativePath="..\pandatool\src\xfile\xFileDataNode.cxx"></File>
-				<File RelativePath="..\pandatool\src\xfile\xFileDataNodeTemplate.cxx"></File>
-				<File RelativePath="..\pandatool\src\xfile\xFileDataObjectArray.I"></File>
-				<File RelativePath="..\pandatool\src\xfile\xFileTemplate.h"></File>
-				<File RelativePath="..\pandatool\src\xfile\config_xfile.h"></File>
-				<File RelativePath="..\pandatool\src\xfile\xFileDataObjectInteger.I"></File>
-				<File RelativePath="..\pandatool\src\xfile\xFileDataObjectDouble.I"></File>
-				<File RelativePath="..\pandatool\src\xfile\standardTemplates.x.pz.c"></File>
-				<File RelativePath="..\pandatool\src\xfile\xLexer.cxx"></File>
-				<File RelativePath="..\pandatool\src\xfile\xFileDataNodeTemplate.I"></File>
-				<File RelativePath="..\pandatool\src\xfile\xFileArrayDef.I"></File>
-				<File RelativePath="..\pandatool\src\xfile\xFileDataObjectDouble.h"></File>
-				<File RelativePath="..\pandatool\src\xfile\xFileDataObjectInteger.cxx"></File>
-				<File RelativePath="..\pandatool\src\xfile\xFileParseData.cxx"></File>
-				<File RelativePath="..\pandatool\src\xfile\xFileDataObjectArray.cxx"></File>
-				<File RelativePath="..\pandatool\src\xfile\xFileDataNode.I"></File>
-				<File RelativePath="..\pandatool\src\xfile\xFileDataObjectArray.h"></File>
-				<File RelativePath="..\pandatool\src\xfile\windowsGuid.I"></File>
-				<File RelativePath="..\pandatool\src\xfile\windowsGuid.cxx"></File>
-				<File RelativePath="..\pandatool\src\xfile\xFileDataObject.cxx"></File>
-				<File RelativePath="..\pandatool\src\xfile\xFileParseData.h"></File>
-				<File RelativePath="..\pandatool\src\xfile\xFileDataObject.I"></File>
-				<File RelativePath="..\pandatool\src\xfile\xFileDataObjectInteger.h"></File>
-				<File RelativePath="..\pandatool\src\xfile\xFileDataNode.h"></File>
-				<File RelativePath="..\pandatool\src\xfile\xParser.cxx"></File>
-				<File RelativePath="..\pandatool\src\xfile\xFileDataDef.cxx"></File>
-				<File RelativePath="..\pandatool\src\xfile\xFileDataObjectString.cxx"></File>
-				<File RelativePath="..\pandatool\src\xfile\xFileDataNodeReference.I"></File>
-				<File RelativePath="..\pandatool\src\xfile\xFileNode.h"></File>
-				<File RelativePath="..\pandatool\src\xfile\xFileParseData.I"></File>
-				<File RelativePath="..\pandatool\src\xfile\xFileTemplate.cxx"></File>
-				<File RelativePath="..\pandatool\src\xfile\config_xfile.cxx"></File>
-				<File RelativePath="..\pandatool\src\xfile\xFileArrayDef.h"></File>
-				<File RelativePath="..\pandatool\src\xfile\xFileDataNodeReference.h"></File>
-				<File RelativePath="..\pandatool\src\xfile\xFileDataObjectDouble.cxx"></File>
-				<File RelativePath="..\pandatool\src\xfile\xfile_composite1.cxx"></File>
-				<File RelativePath="..\pandatool\src\xfile\xParser.h"></File>
-				<File RelativePath="..\pandatool\src\xfile\standard_templates.h"></File>
-				<File RelativePath="..\pandatool\src\xfile\xFileDataObjectString.I"></File>
-				<File RelativePath="..\pandatool\src\xfile\xFileDataObjectString.h"></File>
-				<File RelativePath="..\pandatool\src\xfile\standardTemplates.x.c"></File>
-				<File RelativePath="..\pandatool\src\xfile\xFile.h"></File>
-				<File RelativePath="..\pandatool\src\xfile\xFileDataObject.h"></File>
-				<File RelativePath="..\pandatool\src\xfile\xFileDataDef.h"></File>
-				<File RelativePath="..\pandatool\src\xfile\xParserDefs.h"></File>
-			</Filter>
-			<Filter Name="egg-qtess">
-				<File RelativePath="..\pandatool\src\egg-qtess\subdivSegment.cxx"></File>
-				<File RelativePath="..\pandatool\src\egg-qtess\qtessGlobals.h"></File>
-				<File RelativePath="..\pandatool\src\egg-qtess\config_egg_qtess.h"></File>
-				<File RelativePath="..\pandatool\src\egg-qtess\qtessSurface.h"></File>
-				<File RelativePath="..\pandatool\src\egg-qtess\qtessInputFile.h"></File>
-				<File RelativePath="..\pandatool\src\egg-qtess\isoPlacer.h"></File>
-				<File RelativePath="..\pandatool\src\egg-qtess\qtessInputFile.cxx"></File>
-				<File RelativePath="..\pandatool\src\egg-qtess\qtessGlobals.cxx"></File>
-				<File RelativePath="..\pandatool\src\egg-qtess\qtessInputEntry.I"></File>
-				<File RelativePath="..\pandatool\src\egg-qtess\qtessSurface.cxx"></File>
-				<File RelativePath="..\pandatool\src\egg-qtess\eggQtess.h"></File>
-				<File RelativePath="..\pandatool\src\egg-qtess\qtessInputFile.I"></File>
-				<File RelativePath="..\pandatool\src\egg-qtess\qtessSurface.I"></File>
-				<File RelativePath="..\pandatool\src\egg-qtess\subdivSegment.h"></File>
-				<File RelativePath="..\pandatool\src\egg-qtess\config_egg_qtess.cxx"></File>
-				<File RelativePath="..\pandatool\src\egg-qtess\egg-qtess_composite1.cxx"></File>
-				<File RelativePath="..\pandatool\src\egg-qtess\isoPlacer.cxx"></File>
-				<File RelativePath="..\pandatool\src\egg-qtess\isoPlacer.I"></File>
-				<File RelativePath="..\pandatool\src\egg-qtess\qtessInputEntry.h"></File>
-				<File RelativePath="..\pandatool\src\egg-qtess\qtessInputEntry.cxx"></File>
-				<File RelativePath="..\pandatool\src\egg-qtess\subdivSegment.I"></File>
-				<File RelativePath="..\pandatool\src\egg-qtess\eggQtess.cxx"></File>
-			</Filter>
-			<Filter Name="vrmlegg">
-				<File RelativePath="..\pandatool\src\vrmlegg\vrmlAppearance.h"></File>
-				<File RelativePath="..\pandatool\src\vrmlegg\indexedFaceSet.h"></File>
-				<File RelativePath="..\pandatool\src\vrmlegg\vrmlToEggConverter.cxx"></File>
-				<File RelativePath="..\pandatool\src\vrmlegg\indexedFaceSet.cxx"></File>
-				<File RelativePath="..\pandatool\src\vrmlegg\vrmlToEggConverter.h"></File>
-				<File RelativePath="..\pandatool\src\vrmlegg\vrmlAppearance.cxx"></File>
-			</Filter>
-			<Filter Name="palettizer">
-				<File RelativePath="..\pandatool\src\palettizer\paletteGroups.h"></File>
-				<File RelativePath="..\pandatool\src\palettizer\eggFile.cxx"></File>
-				<File RelativePath="..\pandatool\src\palettizer\omitReason.cxx"></File>
-				<File RelativePath="..\pandatool\src\palettizer\filenameUnifier.h"></File>
-				<File RelativePath="..\pandatool\src\palettizer\palettizer.cxx"></File>
-				<File RelativePath="..\pandatool\src\palettizer\textureReference.cxx"></File>
-				<File RelativePath="..\pandatool\src\palettizer\pal_string_utils.cxx"></File>
-				<File RelativePath="..\pandatool\src\palettizer\palettizer.h"></File>
-				<File RelativePath="..\pandatool\src\palettizer\sourceTextureImage.cxx"></File>
-				<File RelativePath="..\pandatool\src\palettizer\pal_string_utils.h"></File>
-				<File RelativePath="..\pandatool\src\palettizer\textureRequest.h"></File>
-				<File RelativePath="..\pandatool\src\palettizer\texturePosition.h"></File>
-				<File RelativePath="..\pandatool\src\palettizer\destTextureImage.h"></File>
-				<File RelativePath="..\pandatool\src\palettizer\paletteGroup.cxx"></File>
-				<File RelativePath="..\pandatool\src\palettizer\paletteImage.h"></File>
-				<File RelativePath="..\pandatool\src\palettizer\paletteImage.cxx"></File>
-				<File RelativePath="..\pandatool\src\palettizer\textureRequest.cxx"></File>
-				<File RelativePath="..\pandatool\src\palettizer\texturePlacement.cxx"></File>
-				<File RelativePath="..\pandatool\src\palettizer\eggFile.h"></File>
-				<File RelativePath="..\pandatool\src\palettizer\texturePlacement.h"></File>
-				<File RelativePath="..\pandatool\src\palettizer\texturePosition.cxx"></File>
-				<File RelativePath="..\pandatool\src\palettizer\txaFile.cxx"></File>
-				<File RelativePath="..\pandatool\src\palettizer\sourceTextureImage.h"></File>
-				<File RelativePath="..\pandatool\src\palettizer\palettizer_composite1.cxx"></File>
-				<File RelativePath="..\pandatool\src\palettizer\textureMemoryCounter.h"></File>
-				<File RelativePath="..\pandatool\src\palettizer\palettePage.cxx"></File>
-				<File RelativePath="..\pandatool\src\palettizer\txaFile.h"></File>
-				<File RelativePath="..\pandatool\src\palettizer\omitReason.h"></File>
-				<File RelativePath="..\pandatool\src\palettizer\txaLine.h"></File>
-				<File RelativePath="..\pandatool\src\palettizer\textureReference.h"></File>
-				<File RelativePath="..\pandatool\src\palettizer\textureProperties.h"></File>
-				<File RelativePath="..\pandatool\src\palettizer\imageFile.cxx"></File>
-				<File RelativePath="..\pandatool\src\palettizer\txaLine.cxx"></File>
-				<File RelativePath="..\pandatool\src\palettizer\textureProperties.cxx"></File>
-				<File RelativePath="..\pandatool\src\palettizer\palettePage.h"></File>
-				<File RelativePath="..\pandatool\src\palettizer\config_palettizer.cxx"></File>
-				<File RelativePath="..\pandatool\src\palettizer\textureMemoryCounter.cxx"></File>
-				<File RelativePath="..\pandatool\src\palettizer\filenameUnifier.cxx"></File>
-				<File RelativePath="..\pandatool\src\palettizer\textureImage.cxx"></File>
-				<File RelativePath="..\pandatool\src\palettizer\config_palettizer.h"></File>
-				<File RelativePath="..\pandatool\src\palettizer\paletteGroups.cxx"></File>
-				<File RelativePath="..\pandatool\src\palettizer\destTextureImage.cxx"></File>
-				<File RelativePath="..\pandatool\src\palettizer\paletteGroup.h"></File>
-				<File RelativePath="..\pandatool\src\palettizer\textureImage.h"></File>
-				<File RelativePath="..\pandatool\src\palettizer\imageFile.h"></File>
-			</Filter>
-			<Filter Name="dxf">
-				<File RelativePath="..\pandatool\src\dxf\dxf_composite1.cxx"></File>
-				<File RelativePath="..\pandatool\src\dxf\dxfLayer.h"></File>
-				<File RelativePath="..\pandatool\src\dxf\dxfVertex.cxx"></File>
-				<File RelativePath="..\pandatool\src\dxf\dxfLayerMap.cxx"></File>
-				<File RelativePath="..\pandatool\src\dxf\dxfFile.cxx"></File>
-				<File RelativePath="..\pandatool\src\dxf\dxfLayer.cxx"></File>
-				<File RelativePath="..\pandatool\src\dxf\dxfFile.h"></File>
-				<File RelativePath="..\pandatool\src\dxf\dxfLayerMap.h"></File>
-				<File RelativePath="..\pandatool\src\dxf\dxfVertex.h"></File>
-			</Filter>
-			<Filter Name="maxegg">
-				<File RelativePath="..\pandatool\src\maxegg\maxOptionsDialog.cxx"></File>
-				<File RelativePath="..\pandatool\src\maxegg\maxEggLoader.h"></File>
-				<File RelativePath="..\pandatool\src\maxegg\maxNodeDesc.h"></File>
-				<File RelativePath="..\pandatool\src\maxegg\maxNodeDesc.cxx"></File>
-				<File RelativePath="..\pandatool\src\maxegg\maxEgg.cxx"></File>
-				<File RelativePath="..\pandatool\src\maxegg\maxResource.h"></File>
-				<File RelativePath="..\pandatool\src\maxegg\maxEggLoader.cxx"></File>
-				<File RelativePath="..\pandatool\src\maxegg\maxEgg.h"></File>
-				<File RelativePath="..\pandatool\src\maxegg\maxNodeTree.cxx"></File>
-				<File RelativePath="..\pandatool\src\maxegg\maxOptionsDialog.h"></File>
-				<File RelativePath="..\pandatool\src\maxegg\maxNodeTree.h"></File>
-				<File RelativePath="..\pandatool\src\maxegg\maxegg_composite1.cxx"></File>
-				<File RelativePath="..\pandatool\src\maxegg\maxToEggConverter.h"></File>
-				<File RelativePath="..\pandatool\src\maxegg\maxToEggConverter.cxx"></File>
-			</Filter>
-			<Filter Name="lwo">
-				<File RelativePath="..\pandatool\src\lwo\lwoSurfaceBlockTMap.h"></File>
-				<File RelativePath="..\pandatool\src\lwo\iffId.I"></File>
-				<File RelativePath="..\pandatool\src\lwo\lwoPolygonTags.cxx"></File>
-				<File RelativePath="..\pandatool\src\lwo\lwoPolygons.h"></File>
-				<File RelativePath="..\pandatool\src\lwo\lwoVertexMap.cxx"></File>
-				<File RelativePath="..\pandatool\src\lwo\iffGenericChunk.h"></File>
-				<File RelativePath="..\pandatool\src\lwo\iffInputFile.cxx"></File>
-				<File RelativePath="..\pandatool\src\lwo\lwoSurfaceBlock.h"></File>
-				<File RelativePath="..\pandatool\src\lwo\lwoHeader.I"></File>
-				<File RelativePath="..\pandatool\src\lwo\lwoHeader.cxx"></File>
-				<File RelativePath="..\pandatool\src\lwo\lwoSurfaceBlock.cxx"></File>
-				<File RelativePath="..\pandatool\src\lwo\lwoSurfaceColor.cxx"></File>
-				<File RelativePath="..\pandatool\src\lwo\lwoClip.cxx"></File>
-				<File RelativePath="..\pandatool\src\lwo\lwoLayer.cxx"></File>
-				<File RelativePath="..\pandatool\src\lwo\lwoSurfaceSmoothingAngle.cxx"></File>
-				<File RelativePath="..\pandatool\src\lwo\lwoChunk.cxx"></File>
-				<File RelativePath="..\pandatool\src\lwo\lwoLayer.h"></File>
-				<File RelativePath="..\pandatool\src\lwo\lwoSurfaceParameter.cxx"></File>
-				<File RelativePath="..\pandatool\src\lwo\lwoSurface.h"></File>
-				<File RelativePath="..\pandatool\src\lwo\lwoSurfaceBlockWrap.cxx"></File>
-				<File RelativePath="..\pandatool\src\lwo\lwoSurfaceParameter.h"></File>
-				<File RelativePath="..\pandatool\src\lwo\lwoChunk.h"></File>
-				<File RelativePath="..\pandatool\src\lwo\lwoSurfaceBlockProjection.cxx"></File>
-				<File RelativePath="..\pandatool\src\lwo\iffId.cxx"></File>
-				<File RelativePath="..\pandatool\src\lwo\lwoSurfaceBlockImage.cxx"></File>
-				<File RelativePath="..\pandatool\src\lwo\lwoSurfaceBlockOpacity.h"></File>
-				<File RelativePath="..\pandatool\src\lwo\lwoSurface.cxx"></File>
-				<File RelativePath="..\pandatool\src\lwo\lwoSurfaceSidedness.cxx"></File>
-				<File RelativePath="..\pandatool\src\lwo\lwoBoundingBox.h"></File>
-				<File RelativePath="..\pandatool\src\lwo\lwoSurfaceBlockRefObj.h"></File>
-				<File RelativePath="..\pandatool\src\lwo\lwoPolygons.cxx"></File>
-				<File RelativePath="..\pandatool\src\lwo\lwoSurfaceBlockRepeat.h"></File>
-				<File RelativePath="..\pandatool\src\lwo\lwoGroupChunk.h"></File>
-				<File RelativePath="..\pandatool\src\lwo\lwoClip.h"></File>
-				<File RelativePath="..\pandatool\src\lwo\lwoSurfaceBlockChannel.h"></File>
-				<File RelativePath="..\pandatool\src\lwo\lwoStillImage.h"></File>
-				<File RelativePath="..\pandatool\src\lwo\lwoSurfaceBlockTransform.h"></File>
-				<File RelativePath="..\pandatool\src\lwo\lwoGroupChunk.cxx"></File>
-				<File RelativePath="..\pandatool\src\lwo\lwoSurfaceBlockHeader.h"></File>
-				<File RelativePath="..\pandatool\src\lwo\lwoInputFile.cxx"></File>
-				<File RelativePath="..\pandatool\src\lwo\config_lwo.cxx"></File>
-				<File RelativePath="..\pandatool\src\lwo\test_lwo.cxx"></File>
-				<File RelativePath="..\pandatool\src\lwo\lwoVertexMap.h"></File>
-				<File RelativePath="..\pandatool\src\lwo\lwoSurfaceBlockProjection.h"></File>
-				<File RelativePath="..\pandatool\src\lwo\iffChunk.cxx"></File>
-				<File RelativePath="..\pandatool\src\lwo\lwoSurfaceBlockVMapName.h"></File>
-				<File RelativePath="..\pandatool\src\lwo\lwoSurfaceBlockChannel.cxx"></File>
-				<File RelativePath="..\pandatool\src\lwo\lwoPoints.h"></File>
-				<File RelativePath="..\pandatool\src\lwo\iffInputFile.h"></File>
-				<File RelativePath="..\pandatool\src\lwo\lwoDiscontinuousVertexMap.h"></File>
-				<File RelativePath="..\pandatool\src\lwo\lwoSurfaceBlockRefObj.cxx"></File>
-				<File RelativePath="..\pandatool\src\lwo\lwoSurfaceBlockAxis.cxx"></File>
-				<File RelativePath="..\pandatool\src\lwo\lwoTags.h"></File>
-				<File RelativePath="..\pandatool\src\lwo\lwoSurfaceBlockTransform.cxx"></File>
-				<File RelativePath="..\pandatool\src\lwo\lwoBoundingBox.cxx"></File>
-				<File RelativePath="..\pandatool\src\lwo\lwoPoints.cxx"></File>
-				<File RelativePath="..\pandatool\src\lwo\lwoSurfaceSmoothingAngle.h"></File>
-				<File RelativePath="..\pandatool\src\lwo\lwoStillImage.cxx"></File>
-				<File RelativePath="..\pandatool\src\lwo\lwoSurfaceSidedness.h"></File>
-				<File RelativePath="..\pandatool\src\lwo\lwo_composite1.cxx"></File>
-				<File RelativePath="..\pandatool\src\lwo\lwoSurfaceBlockVMapName.cxx"></File>
-				<File RelativePath="..\pandatool\src\lwo\lwoInputFile.h"></File>
-				<File RelativePath="..\pandatool\src\lwo\lwoSurfaceBlockTMap.cxx"></File>
-				<File RelativePath="..\pandatool\src\lwo\lwoInputFile.I"></File>
-				<File RelativePath="..\pandatool\src\lwo\lwoTags.cxx"></File>
-				<File RelativePath="..\pandatool\src\lwo\iffGenericChunk.cxx"></File>
-				<File RelativePath="..\pandatool\src\lwo\lwoSurfaceBlockEnabled.h"></File>
-				<File RelativePath="..\pandatool\src\lwo\lwoSurfaceBlockRepeat.cxx"></File>
-				<File RelativePath="..\pandatool\src\lwo\lwoSurfaceBlockCoordSys.h"></File>
-				<File RelativePath="..\pandatool\src\lwo\config_lwo.h"></File>
-				<File RelativePath="..\pandatool\src\lwo\lwoSurfaceBlockEnabled.cxx"></File>
-				<File RelativePath="..\pandatool\src\lwo\lwoSurfaceBlockAxis.h"></File>
-				<File RelativePath="..\pandatool\src\lwo\lwoSurfaceBlockHeader.cxx"></File>
-				<File RelativePath="..\pandatool\src\lwo\iffChunk.h"></File>
-				<File RelativePath="..\pandatool\src\lwo\lwoHeader.h"></File>
-				<File RelativePath="..\pandatool\src\lwo\lwoDiscontinuousVertexMap.cxx"></File>
-				<File RelativePath="..\pandatool\src\lwo\lwoSurfaceBlockOpacity.cxx"></File>
-				<File RelativePath="..\pandatool\src\lwo\iffId.h"></File>
-				<File RelativePath="..\pandatool\src\lwo\lwoSurfaceColor.h"></File>
-				<File RelativePath="..\pandatool\src\lwo\lwoPolygonTags.h"></File>
-				<File RelativePath="..\pandatool\src\lwo\lwoSurfaceBlockWrap.h"></File>
-				<File RelativePath="..\pandatool\src\lwo\iffInputFile.I"></File>
-				<File RelativePath="..\pandatool\src\lwo\iffGenericChunk.I"></File>
-				<File RelativePath="..\pandatool\src\lwo\iffChunk.I"></File>
-				<File RelativePath="..\pandatool\src\lwo\lwoSurfaceBlockImage.h"></File>
-				<File RelativePath="..\pandatool\src\lwo\lwoSurfaceBlockCoordSys.cxx"></File>
-			</Filter>
-			<Filter Name="softegg">
-				<File RelativePath="..\pandatool\src\softegg\soft2Egg.c"></File>
-				<File RelativePath="..\pandatool\src\softegg\softNodeTree.cxx"></File>
-				<File RelativePath="..\pandatool\src\softegg\softNodeDesc.h"></File>
-				<File RelativePath="..\pandatool\src\softegg\softEggGroupUserData.cxx"></File>
-				<File RelativePath="..\pandatool\src\softegg\softEggGroupUserData.I"></File>
-				<File RelativePath="..\pandatool\src\softegg\config_softegg.cxx"></File>
-				<File RelativePath="..\pandatool\src\softegg\softToEggConverter.cxx"></File>
-				<File RelativePath="..\pandatool\src\softegg\softNodeTree.h"></File>
-				<File RelativePath="..\pandatool\src\softegg\config_softegg.h"></File>
-				<File RelativePath="..\pandatool\src\softegg\softNodeDesc.cxx"></File>
-				<File RelativePath="..\pandatool\src\softegg\softToEggConverter.h"></File>
-				<File RelativePath="..\pandatool\src\softegg\softEggGroupUserData.h"></File>
-			</Filter>
-			<Filter Name="xfileprogs">
-				<File RelativePath="..\pandatool\src\xfileprogs\eggToX.cxx"></File>
-				<File RelativePath="..\pandatool\src\xfileprogs\xFileTrans.cxx"></File>
-				<File RelativePath="..\pandatool\src\xfileprogs\xFileToEgg.cxx"></File>
-				<File RelativePath="..\pandatool\src\xfileprogs\xFileTrans.h"></File>
-				<File RelativePath="..\pandatool\src\xfileprogs\eggToX.h"></File>
-				<File RelativePath="..\pandatool\src\xfileprogs\xFileToEgg.h"></File>
-			</Filter>
-		</Filter>
-		<Filter Name="direct">
-			<Filter Name="directbase">
-				<File RelativePath="..\direct\src\directbase\ppython.cxx"></File>
-				<File RelativePath="..\direct\src\directbase\directbase.cxx"></File>
-				<File RelativePath="..\direct\src\directbase\directsymbols.h"></File>
-				<File RelativePath="..\direct\src\directbase\directbase.h"></File>
-			</Filter>
-			<Filter Name="dcparse">
-				<File RelativePath="..\direct\src\dcparse\dcparse.cxx"></File>
-			</Filter>
-			<Filter Name="interval">
-				<File RelativePath="..\direct\src\interval\cLerpAnimEffectInterval.h"></File>
-				<File RelativePath="..\direct\src\interval\cMetaInterval.cxx"></File>
-				<File RelativePath="..\direct\src\interval\cIntervalManager.h"></File>
-				<File RelativePath="..\direct\src\interval\showInterval.h"></File>
-				<File RelativePath="..\direct\src\interval\config_interval.h"></File>
-				<File RelativePath="..\direct\src\interval\cLerpNodePathInterval.h"></File>
-				<File RelativePath="..\direct\src\interval\cLerpAnimEffectInterval.cxx"></File>
-				<File RelativePath="..\direct\src\interval\cLerpAnimEffectInterval.I"></File>
-				<File RelativePath="..\direct\src\interval\cMetaInterval.I"></File>
-				<File RelativePath="..\direct\src\interval\hideInterval.cxx"></File>
-				<File RelativePath="..\direct\src\interval\cInterval.h"></File>
-				<File RelativePath="..\direct\src\interval\hideInterval.I"></File>
-				<File RelativePath="..\direct\src\interval\interval_composite1.cxx"></File>
-				<File RelativePath="..\direct\src\interval\cIntervalManager.cxx"></File>
-				<File RelativePath="..\direct\src\interval\showInterval.I"></File>
-				<File RelativePath="..\direct\src\interval\cMetaInterval.h"></File>
-				<File RelativePath="..\direct\src\interval\cLerpInterval.cxx"></File>
-				<File RelativePath="..\direct\src\interval\cLerpInterval.I"></File>
-				<File RelativePath="..\direct\src\interval\cIntervalManager.I"></File>
-				<File RelativePath="..\direct\src\interval\showInterval.cxx"></File>
-				<File RelativePath="..\direct\src\interval\cLerpInterval.h"></File>
-				<File RelativePath="..\direct\src\interval\interval_composite.cxx"></File>
-				<File RelativePath="..\direct\src\interval\hideInterval.h"></File>
-				<File RelativePath="..\direct\src\interval\lerp_helpers.h"></File>
-				<File RelativePath="..\direct\src\interval\config_interval.cxx"></File>
-				<File RelativePath="..\direct\src\interval\cInterval.I"></File>
-				<File RelativePath="..\direct\src\interval\cInterval.cxx"></File>
-				<File RelativePath="..\direct\src\interval\waitInterval.cxx"></File>
-				<File RelativePath="..\direct\src\interval\waitInterval.h"></File>
-				<File RelativePath="..\direct\src\interval\cLerpNodePathInterval.cxx"></File>
-				<File RelativePath="..\direct\src\interval\waitInterval.I"></File>
-				<File RelativePath="..\direct\src\interval\cLerpNodePathInterval.I"></File>
-			</Filter>
-			<Filter Name="showbase">
-				<File RelativePath="..\direct\src\showbase\showBase.cxx"></File>
-				<File RelativePath="..\direct\src\showbase\showBase.h"></File>
-			</Filter>
-			<Filter Name="autorestart">
-				<File RelativePath="..\direct\src\autorestart\autorestart.c"></File>
-			</Filter>
-			<Filter Name="dcparser">
-				<File RelativePath="..\direct\src\dcparser\dcFile.h"></File>
-				<File RelativePath="..\direct\src\dcparser\dcArrayParameter.h"></File>
-				<File RelativePath="..\direct\src\dcparser\primeNumberGenerator.h"></File>
-				<File RelativePath="..\direct\src\dcparser\dcPackerCatalog.h"></File>
-				<File RelativePath="..\direct\src\dcparser\dcMolecularField.h"></File>
-				<File RelativePath="..\direct\src\dcparser\dcParser.cxx"></File>
-				<File RelativePath="..\direct\src\dcparser\dcLexerDefs.h"></File>
-				<File RelativePath="..\direct\src\dcparser\dcClass.I"></File>
-				<File RelativePath="..\direct\src\dcparser\dcKeyword.h"></File>
-				<File RelativePath="..\direct\src\dcparser\dcTypedef.cxx"></File>
-				<File RelativePath="..\direct\src\dcparser\dcPackData.cxx"></File>
-				<File RelativePath="..\direct\src\dcparser\dcPacker.cxx"></File>
-				<File RelativePath="..\direct\src\dcparser\dcKeyword.cxx"></File>
-				<File RelativePath="..\direct\src\dcparser\dcKeywordList.cxx"></File>
-				<File RelativePath="..\direct\src\dcparser\dcSwitchParameter.h"></File>
-				<File RelativePath="..\direct\src\dcparser\dcSubatomicType.cxx"></File>
-				<File RelativePath="..\direct\src\dcparser\dcFile.cxx"></File>
-				<File RelativePath="..\direct\src\dcparser\dcArrayParameter.cxx"></File>
-				<File RelativePath="..\direct\src\dcparser\dcPacker.h"></File>
-				<File RelativePath="..\direct\src\dcparser\dcindent.cxx"></File>
-				<File RelativePath="..\direct\src\dcparser\dcClass.h"></File>
-				<File RelativePath="..\direct\src\dcparser\dcParserDefs.h"></File>
-				<File RelativePath="..\direct\src\dcparser\dcClass.cxx"></File>
-				<File RelativePath="..\direct\src\dcparser\dcindent.h"></File>
-				<File RelativePath="..\direct\src\dcparser\dcPacker.I"></File>
-				<File RelativePath="..\direct\src\dcparser\dcSwitch.h"></File>
-				<File RelativePath="..\direct\src\dcparser\dcLexer.cxx"></File>
-				<File RelativePath="..\direct\src\dcparser\dcParser.h"></File>
-				<File RelativePath="..\direct\src\dcparser\dcparser_composite1.cxx"></File>
-				<File RelativePath="..\direct\src\dcparser\dcParameter.h"></File>
-				<File RelativePath="..\direct\src\dcparser\hashGenerator.cxx"></File>
-				<File RelativePath="..\direct\src\dcparser\dcParameter.cxx"></File>
-				<File RelativePath="..\direct\src\dcparser\dcbase.h"></File>
-				<File RelativePath="..\direct\src\dcparser\dcparser_composite.cxx"></File>
-				<File RelativePath="..\direct\src\dcparser\dcNumericRange.h"></File>
-				<File RelativePath="..\direct\src\dcparser\primeNumberGenerator.cxx"></File>
-				<File RelativePath="..\direct\src\dcparser\dcPackerCatalog.cxx"></File>
-				<File RelativePath="..\direct\src\dcparser\dcPackerInterface.I"></File>
-				<File RelativePath="..\direct\src\dcparser\dcSwitchParameter.cxx"></File>
-				<File RelativePath="..\direct\src\dcparser\dcparser_composite2.cxx"></File>
-				<File RelativePath="..\direct\src\dcparser\dcDeclaration.cxx"></File>
-				<File RelativePath="..\direct\src\dcparser\dcPackerInterface.cxx"></File>
-				<File RelativePath="..\direct\src\dcparser\dcTypedef.h"></File>
-				<File RelativePath="..\direct\src\dcparser\dcClassParameter.h"></File>
-				<File RelativePath="..\direct\src\dcparser\dcField.I"></File>
-				<File RelativePath="..\direct\src\dcparser\dcPackerCatalog.I"></File>
-				<File RelativePath="..\direct\src\dcparser\dcAtomicField.I"></File>
-				<File RelativePath="..\direct\src\dcparser\dcAtomicField.cxx"></File>
-				<File RelativePath="..\direct\src\dcparser\dcKeywordList.h"></File>
-				<File RelativePath="..\direct\src\dcparser\dcmsgtypes.h"></File>
-				<File RelativePath="..\direct\src\dcparser\dcPython.h"></File>
-				<File RelativePath="..\direct\src\dcparser\dcPackData.I"></File>
-				<File RelativePath="..\direct\src\dcparser\dcSwitch.cxx"></File>
-				<File RelativePath="..\direct\src\dcparser\dcAtomicField.h"></File>
-				<File RelativePath="..\direct\src\dcparser\dcClassParameter.cxx"></File>
-				<File RelativePath="..\direct\src\dcparser\dcMolecularField.cxx"></File>
-				<File RelativePath="..\direct\src\dcparser\dcSimpleParameter.cxx"></File>
-				<File RelativePath="..\direct\src\dcparser\dcNumericRange.I"></File>
-				<File RelativePath="..\direct\src\dcparser\dcSimpleParameter.h"></File>
-				<File RelativePath="..\direct\src\dcparser\hashGenerator.h"></File>
-				<File RelativePath="..\direct\src\dcparser\dcFile.I"></File>
-				<File RelativePath="..\direct\src\dcparser\dcField.h"></File>
-				<File RelativePath="..\direct\src\dcparser\dcPackerInterface.h"></File>
-				<File RelativePath="..\direct\src\dcparser\dcField.cxx"></File>
-				<File RelativePath="..\direct\src\dcparser\dcPackData.h"></File>
-				<File RelativePath="..\direct\src\dcparser\dcSubatomicType.h"></File>
-				<File RelativePath="..\direct\src\dcparser\dcDeclaration.h"></File>
-			</Filter>
-			<Filter Name="motiontrail">
-				<File RelativePath="..\direct\src\motiontrail\config_motiontrail.cxx"></File>
-				<File RelativePath="..\direct\src\motiontrail\cMotionTrail.cxx"></File>
-				<File RelativePath="..\direct\src\motiontrail\cMotionTrail.h"></File>
-				<File RelativePath="..\direct\src\motiontrail\config_motiontrail.h"></File>
-			</Filter>
-			<Filter Name="heapq">
-				<File RelativePath="..\direct\src\heapq\heapq.cxx"></File>
-			</Filter>
-			<Filter Name="task">
-				<File RelativePath="..\direct\src\task\config_task.cxx"></File>
-				<File RelativePath="..\direct\src\task\config_task.h"></File>
-			</Filter>
-			<Filter Name="http">
-				<File RelativePath="..\direct\src\http\application_log.h"></File>
-				<File RelativePath="..\direct\src\http\baseincomingset.i"></File>
-				<File RelativePath="..\direct\src\http\strtargetbuffer.h"></File>
-				<File RelativePath="..\direct\src\http\parsedhttprequest.h"></File>
-				<File RelativePath="..\direct\src\http\ringbuffer_slide.i"></File>
-				<File RelativePath="..\direct\src\http\http_request.cxx"></File>
-				<File RelativePath="..\direct\src\http\baseincomingset.h"></File>
-				<File RelativePath="..\direct\src\http\http_bufferedreader.h"></File>
-				<File RelativePath="..\direct\src\http\http_composite1.cxx"></File>
-				<File RelativePath="..\direct\src\http\config_http.cxx"></File>
-				<File RelativePath="..\direct\src\http\config_http.h"></File>
-				<File RelativePath="..\direct\src\http\http_bufferedreader.i"></File>
-				<File RelativePath="..\direct\src\http\ringbuffer_slide.h"></File>
-				<File RelativePath="..\direct\src\http\bufferedwriter_growable.h"></File>
-				<File RelativePath="..\direct\src\http\http_connection.cxx"></File>
-				<File RelativePath="..\direct\src\http\http_connection.h"></File>
-				<File RelativePath="..\direct\src\http\http_request.h"></File>
-				<File RelativePath="..\direct\src\http\parsedhttprequest.cxx"></File>
-			</Filter>
-			<Filter Name="directdServer">
-				<File RelativePath="..\direct\src\directdServer\directdClient.cxx"></File>
-				<File RelativePath="..\direct\src\directdServer\directdServer.h"></File>
-				<File RelativePath="..\direct\src\directdServer\directdClient.h"></File>
-				<File RelativePath="..\direct\src\directdServer\directdServer.cxx"></File>
-			</Filter>
-			<Filter Name="directd">
-				<File RelativePath="..\direct\src\directd\directd.cxx"></File>
-				<File RelativePath="..\direct\src\directd\directd.h"></File>
-			</Filter>
-			<Filter Name="distributed">
-				<File RelativePath="..\direct\src\distributed\cDistributedSmoothNodeBase.cxx"></File>
-				<File RelativePath="..\direct\src\distributed\cConnectionRepository.cxx"></File>
-				<File RelativePath="..\direct\src\distributed\config_distributed.cxx"></File>
-				<File RelativePath="..\direct\src\distributed\cDistributedSmoothNodeBase.h"></File>
-				<File RelativePath="..\direct\src\distributed\cConnectionRepository.I"></File>
-				<File RelativePath="..\direct\src\distributed\cConnectionRepository.h"></File>
-				<File RelativePath="..\direct\src\distributed\cDistributedSmoothNodeBase.I"></File>
-				<File RelativePath="..\direct\src\distributed\config_distributed.h"></File>
-			</Filter>
-			<Filter Name="deadrec">
-				<File RelativePath="..\direct\src\deadrec\config_deadrec.h"></File>
-				<File RelativePath="..\direct\src\deadrec\deadrec_composite.cxx"></File>
-				<File RelativePath="..\direct\src\deadrec\config_deadrec.cxx"></File>
-				<File RelativePath="..\direct\src\deadrec\smoothMover.I"></File>
-				<File RelativePath="..\direct\src\deadrec\smoothMover.cxx"></File>
-				<File RelativePath="..\direct\src\deadrec\deadrec_composite1.cxx"></File>
-				<File RelativePath="..\direct\src\deadrec\smoothMover.h"></File>
-			</Filter>
-		</Filter>
-		<Filter Name="contrib">
-		</Filter>
-	</Files>
-	<Globals>
-	</Globals>
-</VisualStudioProject>

+ 0 - 1220
doc/makepanda/makepandacore.py

@@ -1,1220 +0,0 @@
-########################################################################
-##
-## Caution: there are two separate, independent build systems:
-## 'makepanda', and 'ppremake'.  Use one or the other, do not attempt
-## to use both.  This file is part of the 'makepanda' system.
-##
-## This file, makepandacore, contains all the global state and
-## global functions for the makepanda system.
-##
-########################################################################
-
-import sys,os,time,stat,string,re,getopt,cPickle,fnmatch,threading,Queue,signal,shutil,platform
-
-SUFFIX_INC=[".cxx",".c",".h",".I",".yxx",".lxx",".mm"]
-SUFFIX_DLL=[".dll",".dlo",".dle",".dli",".dlm",".mll",".exe"]
-SUFFIX_LIB=[".lib",".ilb"]
-STARTTIME=time.time()
-MAINTHREAD=threading.currentThread()
-OUTPUTDIR="built"
-
-########################################################################
-##
-## Maya and Max Version List (with registry keys)
-##
-########################################################################
-
-MAYAVERSIONINFO=[("MAYA6",   "6.0"),
-                 ("MAYA65",  "6.5"),
-                 ("MAYA7",   "7.0"),
-                 ("MAYA8",   "8.0"),
-                 ("MAYA85",  "8.5"),
-                 ("MAYA2008","2008"),
-                 ("MAYA2009","2009"),
-]
-
-MAXVERSIONINFO = [("MAX6", "SOFTWARE\\Autodesk\\3DSMAX\\6.0", "installdir", "maxsdk\\cssdk\\include"),
-                  ("MAX7", "SOFTWARE\\Autodesk\\3DSMAX\\7.0", "Installdir", "maxsdk\\include\\CS"),
-                  ("MAX8", "SOFTWARE\\Autodesk\\3DSMAX\\8.0", "Installdir", "maxsdk\\include\\CS"),
-                  ("MAX9", "SOFTWARE\\Autodesk\\3DSMAX\\9.0", "Installdir", "maxsdk\\include\\CS"),
-                  ("MAX2009", "SOFTWARE\\Autodesk\\3DSMAX\\11.0", "Installdir", "maxsdk\\include\\CS"),
-]
-
-MAYAVERSIONS=[]
-MAXVERSIONS=[]
-DXVERSIONS=["DX8","DX9"]
-
-for (ver,key) in MAYAVERSIONINFO:
-    MAYAVERSIONS.append(ver)
-
-for (ver,key1,key2,subdir) in MAXVERSIONINFO:
-    MAXVERSIONS.append(ver)
-
-########################################################################
-##
-## The exit routine will normally
-##
-## - print a message
-## - save the dependency cache
-## - exit
-##
-## However, if it is invoked inside a thread, it instead:
-##
-## - prints a message
-## - raises the "initiate-exit" exception
-##
-## If you create a thread, you must be prepared to catch this
-## exception, save the dependency cache, and exit.
-##
-########################################################################
-
-WARNINGS=[]
-
-def PrettyTime(t):
-    t = int(t)
-    hours = t/3600
-    t -= hours*3600
-    minutes = t/60
-    t -= minutes*60
-    seconds = t
-    if (hours): return str(hours)+" hours "+str(minutes)+" min"
-    if (minutes): return str(minutes)+" min "+str(seconds)+" sec"
-    return str(seconds)+" sec"
-
-def exit(msg):
-    if (threading.currentThread() == MAINTHREAD):
-        SaveDependencyCache()
-        # Move any files we've moved away back.
-        if os.path.isfile("dtool/src/dtoolutil/pandaVersion.h.moved"):
-          os.rename("dtool/src/dtoolutil/pandaVersion.h.moved", "dtool/src/dtoolutil/pandaVersion.h")
-        if os.path.isfile("dtool/src/dtoolutil/checkPandaVersion.h.moved"):
-          os.rename("dtool/src/dtoolutil/checkPandaVersion.h.moved", "dtool/src/dtoolutil/checkPandaVersion.h")
-        if os.path.isfile("dtool/src/dtoolutil/checkPandaVersion.cxx.moved"):
-          os.rename("dtool/src/dtoolutil/checkPandaVersion.cxx.moved", "dtool/src/dtoolutil/checkPandaVersion.cxx")
-        print "Elapsed Time: "+PrettyTime(time.time() - STARTTIME)
-        print msg
-        sys.stdout.flush()
-        sys.stderr.flush()
-        os._exit(1)
-    else:
-        print msg
-        raise "initiate-exit"
-
-########################################################################
-##
-## Run a command.
-##
-########################################################################
-
-def oscmd(cmd, ignoreError = False):
-    print cmd
-    sys.stdout.flush()
-    if sys.platform == "win32":
-        exe = cmd.split()[0]+".exe"
-        if os.path.isfile(exe)==0:
-            for i in os.environ["PATH"].split(";"):
-                if os.path.isfile(os.path.join(i, exe)):
-                    exe = os.path.join(i, exe)
-                    break
-            if os.path.isfile(exe)==0:
-                exit("Cannot find "+exe+" on search path")
-        res = os.spawnl(os.P_WAIT, exe, cmd)
-    else:
-        res = os.system(cmd)
-    if res != 0 and not ignoreError:
-        exit("")
-
-########################################################################
-##
-## GetDirectoryContents
-##
-## At times, makepanda will use a function like "os.listdir" to process
-## all the files in a directory.  Unfortunately, that means that any
-## accidental addition of a file to a directory could cause makepanda
-## to misbehave without warning.
-##
-## To alleviate this weakness, we created GetDirectoryContents.  This
-## uses "os.listdir" to fetch the directory contents, but then it
-## compares the results to the appropriate CVS/Entries to see if
-## they match.  If not, it prints a big warning message.
-##
-########################################################################
-
-def GetDirectoryContents(dir, filters="*", skip=[]):
-    if (type(filters)==str):
-        filters = [filters]
-    actual = {}
-    files = os.listdir(dir)
-    for filter in filters:
-        for file in fnmatch.filter(files, filter):
-            if (skip.count(file)==0) and (os.path.isfile(dir + "/" + file)):
-                actual[file] = 1
-    if (os.path.isfile(dir + "/CVS/Entries")):
-        cvs = {}
-        srchandle = open(dir+"/CVS/Entries", "r")
-        files = []
-        for line in srchandle:
-            if (line[0]=="/"):
-                s = line.split("/",2)
-                if (len(s)==3):
-                    files.append(s[1])
-        srchandle.close()
-        for filter in filters:
-            for file in fnmatch.filter(files, filter):
-                if (skip.count(file)==0):
-                    cvs[file] = 1
-        for file in actual.keys():
-            if (cvs.has_key(file)==0):
-                msg = "WARNING: %s is in %s, but not in CVS"%(file, dir)
-                print msg
-                WARNINGS.append(msg)
-        for file in cvs.keys():
-            if (actual.has_key(file)==0):
-                msg = "WARNING: %s is not in %s, but is in CVS"%(file, dir)
-                print msg
-                WARNINGS.append(msg)
-    results = actual.keys()
-    results.sort()
-    return results
-
-########################################################################
-##
-## LocateBinary
-##
-## This function searches the system PATH for the binary. Returns its
-## full path when it is found, or None when it was not found.
-##
-########################################################################
-
-def LocateBinary(binary):
-    if not os.environ.has_key("PATH") or os.environ["PATH"] == "":
-        p = os.defpath
-    else:
-        p = os.environ["PATH"]
-    
-    for path in p.split(os.pathsep):
-        if os.access(os.path.join(path, binary), os.X_OK):
-            return os.path.abspath(os.path.realpath(os.path.join(path, binary)))
-    return None
-
-########################################################################
-##
-## The Timestamp Cache
-##
-## The make utility is constantly fetching the timestamps of files.
-## This can represent the bulk of the file accesses during the make
-## process.  The timestamp cache eliminates redundant checks.
-##
-########################################################################
-
-TIMESTAMPCACHE = {}
-
-def GetTimestamp(path):
-    if TIMESTAMPCACHE.has_key(path):
-        return TIMESTAMPCACHE[path]
-    try: date = os.path.getmtime(path)
-    except: date = 0
-    TIMESTAMPCACHE[path] = date
-    return date
-
-def ClearTimestamp(path):
-    del TIMESTAMPCACHE[path]
-
-########################################################################
-##
-## The Dependency cache.
-##
-## Makepanda's strategy for file dependencies is different from most
-## make-utilities.  Whenever a file is built, makepanda records
-## that the file was built, and it records what the input files were,
-## and what their dates were.  Whenever a file is about to be built,
-## panda compares the current list of input files and their dates,
-## to the previous list of input files and their dates.  If they match,
-## there is no need to build the file.
-##
-########################################################################
-
-BUILTFROMCACHE = {}
-
-def JustBuilt(files,others):
-    dates = []
-    for file in files:
-        del TIMESTAMPCACHE[file]
-        dates.append(GetTimestamp(file))
-    for file in others:
-        dates.append(GetTimestamp(file))
-    key = tuple(files)
-    BUILTFROMCACHE[key] = [others,dates]
-
-def NeedsBuild(files,others):
-    dates = []
-    for file in files:
-        dates.append(GetTimestamp(file))
-    for file in others:
-        dates.append(GetTimestamp(file))
-    key = tuple(files)
-    if (BUILTFROMCACHE.has_key(key)):
-        if (BUILTFROMCACHE[key] == [others,dates]):
-            return 0
-        else:
-            oldothers = BUILTFROMCACHE[key][0]
-            if (oldothers != others):
-                print "CAUTION: file dependencies changed: "+str(files)
-    return 1
-
-########################################################################
-##
-## The CXX include cache:
-##
-## The following routine scans a CXX file and returns a list of
-## the include-directives inside that file.  It's not recursive:
-## it just returns the includes that are textually inside the 
-## file.  If you need recursive dependencies, you need the higher-level
-## routine CxxCalcDependencies, defined elsewhere.
-##
-## Since scanning a CXX file is slow, we cache the result.  It records
-## the date of the source file and the list of includes that it
-## contains.  It assumes that if the file date hasn't changed, that
-## the list of include-statements inside the file has not changed
-## either.  Once again, this particular routine does not return
-## recursive dependencies --- it only returns an explicit list of
-## include statements that are textually inside the file.  That
-## is what the cache stores, as well.
-##
-########################################################################
-
-CXXINCLUDECACHE = {}
-
-global CxxIncludeRegex
-CxxIncludeRegex = re.compile('^[ \t]*[#][ \t]*include[ \t]+"([^"]+)"[ \t\r\n]*$')
-
-def CxxGetIncludes(path):
-    date = GetTimestamp(path)
-    if (CXXINCLUDECACHE.has_key(path)):
-        cached = CXXINCLUDECACHE[path]
-        if (cached[0]==date): return cached[1]
-    try: sfile = open(path, 'rb')
-    except:
-        exit("Cannot open source file \""+path+"\" for reading.")
-    include = []
-    for line in sfile:
-        match = CxxIncludeRegex.match(line,0)
-        if (match):
-            incname = match.group(1)
-            include.append(incname)
-    sfile.close()
-    CXXINCLUDECACHE[path] = [date, include]
-    return include
-
-########################################################################
-##
-## SaveDependencyCache / LoadDependencyCache
-##
-## This actually saves both the dependency and cxx-include caches.
-##
-########################################################################
-
-def SaveDependencyCache():
-    try: icache = open(os.path.join(OUTPUTDIR, "tmp", "makepanda-dcache"),'wb')
-    except: icache = 0
-    if (icache!=0):
-        print "Storing dependency cache."
-        cPickle.dump(CXXINCLUDECACHE, icache, 1)
-        cPickle.dump(BUILTFROMCACHE, icache, 1)
-        icache.close()
-
-def LoadDependencyCache():
-    global CXXINCLUDECACHE
-    global BUILTFROMCACHE
-    try: icache = open(os.path.join(OUTPUTDIR, "tmp", "makepanda-dcache"),'rb')
-    except: icache = 0
-    if (icache!=0):
-        CXXINCLUDECACHE = cPickle.load(icache)
-        BUILTFROMCACHE = cPickle.load(icache)
-        icache.close()
-
-########################################################################
-##
-## CxxFindSource: given a source file name and a directory list,
-## searches the directory list for the given source file.  Returns
-## the full pathname of the located file.
-##
-## CxxFindHeader: given a source file, an include directive, and a
-## directory list, searches the directory list for the given header
-## file.  Returns the full pathname of the located file.
-##
-## Of course, CxxFindSource and CxxFindHeader cannot find a source
-## file that has not been created yet.  This can cause dependency
-## problems.  So the function CreateStubHeader can be used to create
-## a file that CxxFindSource or CxxFindHeader can subsequently find.
-##
-########################################################################
-
-def CxxFindSource(name, ipath):
-    for dir in ipath:
-        if (dir == "."): full = name
-        else: full = dir + "/" + name
-        if GetTimestamp(full) > 0: return full
-    exit("Could not find source file: "+name)
-
-def CxxFindHeader(srcfile, incfile, ipath):
-    if (incfile.startswith(".")):
-        last = srcfile.rfind("/")
-        if (last < 0): exit("CxxFindHeader cannot handle this case #1")
-        srcdir = srcfile[:last+1]
-        while (incfile[:1]=="."):
-            if (incfile[:2]=="./"):
-                incfile = incfile[2:]
-            elif (incfile[:3]=="../"):
-                incfile = incfile[3:]
-                last = srcdir[:-1].rfind("/")
-                if (last < 0): exit("CxxFindHeader cannot handle this case #2")
-                srcdir = srcdir[:last+1]
-            else: exit("CxxFindHeader cannot handle this case #3")
-        full = srcdir + incfile
-        if GetTimestamp(full) > 0: return full
-        return 0
-    else:
-        for dir in ipath:
-            full = dir + "/" + incfile
-            if GetTimestamp(full) > 0: return full
-        return 0
-
-########################################################################
-##
-## CxxCalcDependencies(srcfile, ipath, ignore)
-##
-## Calculate the dependencies of a source file given a
-## particular include-path.  Any file in the list of files to
-## ignore is not considered.
-##
-########################################################################
-
-global CxxIgnoreHeader
-global CxxDependencyCache
-CxxIgnoreHeader = {}
-CxxDependencyCache = {}
-
-def CxxCalcDependencies(srcfile, ipath, ignore):
-    if (CxxDependencyCache.has_key(srcfile)):
-        return CxxDependencyCache[srcfile]
-    if (ignore.count(srcfile)): return []
-    dep = {}
-    dep[srcfile] = 1
-    includes = CxxGetIncludes(srcfile)
-    for include in includes:
-        header = CxxFindHeader(srcfile, include, ipath)
-        if (header!=0):
-            if (ignore.count(header)==0):
-                hdeps = CxxCalcDependencies(header, ipath, [srcfile]+ignore)
-                for x in hdeps: dep[x] = 1
-    result = dep.keys()
-    CxxDependencyCache[srcfile] = result
-    return result
-
-########################################################################
-##
-## Registry Key Handling
-##
-## Of course, these routines will fail if you call them on a
-## non win32 platform.  If you use them on a win64 platform, they
-## will look in the win32 private hive first, then look in the
-## win64 hive.
-##
-########################################################################
-
-if sys.platform == "win32":
-    import _winreg
-
-def TryRegistryKey(path):
-    try:
-        key = _winreg.OpenKey(_winreg.HKEY_LOCAL_MACHINE, path, 0, _winreg.KEY_READ)
-        return key
-    except: pass
-    try:
-        key = _winreg.OpenKey(_winreg.HKEY_LOCAL_MACHINE, path, 0, _winreg.KEY_READ | 256)
-        return key
-    except: pass
-    return 0
-        
-def ListRegistryKeys(path):
-    result=[]
-    index=0
-    key = TryRegistryKey(path)
-    if (key != 0):
-        try:
-            while (1):
-                result.append(_winreg.EnumKey(key, index))
-                index = index + 1
-        except: pass
-        _winreg.CloseKey(key)
-    return result
-
-def GetRegistryKey(path, subkey):
-    k1=0
-    key = TryRegistryKey(path)
-    if (key != 0):
-        try:
-            k1, k2 = _winreg.QueryValueEx(key, subkey)
-        except: pass
-        _winreg.CloseKey(key)
-    return k1
-
-def GetProgramFiles():
-    if (os.environ.has_key("PROGRAMFILES")):
-        return os.environ["PROGRAMFILES"]
-    elif (os.path.isdir("C:\\Program Files")):
-        return "C:\\Program Files"
-    elif (os.path.isdir("D:\\Program Files")):
-        return "D:\\Program Files"
-    elif (os.path.isdir("E:\\Program Files")):
-        return "E:\\Program Files"
-    return 0
-
-########################################################################
-##
-## Parsing Compiler Option Lists
-##
-########################################################################
-
-def GetListOption(opts, prefix):
-    res=[]
-    for x in opts:
-        if (x.startswith(prefix)):
-            res.append(x[len(prefix):])
-    return res
-
-def GetValueOption(opts, prefix):
-    for x in opts:
-        if (x.startswith(prefix)):
-            return x[len(prefix):]
-    return 0
-
-def GetOptimizeOption(opts,defval):
-    val = GetValueOption(opts, "OPT:")
-    if (val == 0):
-        return defval
-    return val
-
-########################################################################
-##
-## General File Manipulation
-##
-########################################################################
-
-def MakeDirectory(path):
-    if os.path.isdir(path): return 0
-    os.mkdir(path)
-
-def ReadFile(wfile):
-    try:
-        srchandle = open(wfile, "rb")
-        data = srchandle.read()
-        srchandle.close()
-        return data
-    except: exit("Cannot read "+wfile)
-
-def WriteFile(wfile,data):
-    try:
-        dsthandle = open(wfile, "wb")
-        dsthandle.write(data)
-        dsthandle.close()
-    except: exit("Cannot write "+wfile)
-
-def ConditionalWriteFile(dest,desiredcontents):
-    try:
-        rfile = open(dest, 'rb')
-        contents = rfile.read(-1)
-        rfile.close()
-    except:
-        contents=0
-    if contents != desiredcontents:
-        sys.stdout.flush()
-        WriteFile(dest,desiredcontents)
-
-def DeleteCVS(dir):
-    for entry in os.listdir(dir):
-        if (entry != ".") and (entry != ".."):
-            subdir = dir + "/" + entry
-            if (os.path.isdir(subdir)):
-                if (entry == "CVS"):
-                    shutil.rmtree(subdir)
-                else:
-                    DeleteCVS(subdir)
-
-def CreateFile(file):
-    if (os.path.exists(file)==0):
-        WriteFile(file,"")
-
-########################################################################
-#
-# Create the panda build tree.
-#
-########################################################################
-
-def MakeBuildTree():
-    MakeDirectory(OUTPUTDIR)
-    MakeDirectory(OUTPUTDIR+"/bin")
-    MakeDirectory(OUTPUTDIR+"/lib")
-    MakeDirectory(OUTPUTDIR+"/tmp")
-    MakeDirectory(OUTPUTDIR+"/etc")
-    MakeDirectory(OUTPUTDIR+"/plugins")
-    MakeDirectory(OUTPUTDIR+"/modelcache")
-    MakeDirectory(OUTPUTDIR+"/include")
-    MakeDirectory(OUTPUTDIR+"/include/parser-inc")
-    MakeDirectory(OUTPUTDIR+"/include/parser-inc/openssl")
-    MakeDirectory(OUTPUTDIR+"/include/parser-inc/netinet")
-    MakeDirectory(OUTPUTDIR+"/include/parser-inc/Cg")
-    MakeDirectory(OUTPUTDIR+"/include/openssl")
-    MakeDirectory(OUTPUTDIR+"/models")
-    MakeDirectory(OUTPUTDIR+"/models/audio")
-    MakeDirectory(OUTPUTDIR+"/models/audio/sfx")
-    MakeDirectory(OUTPUTDIR+"/models/icons")
-    MakeDirectory(OUTPUTDIR+"/models/maps")
-    MakeDirectory(OUTPUTDIR+"/models/misc")
-    MakeDirectory(OUTPUTDIR+"/models/gui")
-    MakeDirectory(OUTPUTDIR+"/direct")
-    MakeDirectory(OUTPUTDIR+"/pandac")
-    MakeDirectory(OUTPUTDIR+"/pandac/input")
-
-########################################################################
-#
-# Make sure that you are in the root of the panda tree.
-#
-########################################################################
-
-def CheckPandaSourceTree():
-    dir = os.getcwd()
-    if ((os.path.exists(os.path.join(dir, "makepanda/makepanda.py"))==0) or
-        (os.path.exists(os.path.join(dir, "dtool","src","dtoolbase","dtoolbase.h"))==0) or
-        (os.path.exists(os.path.join(dir, "panda","src","pandabase","pandabase.h"))==0)):
-        exit("Current directory is not the root of the panda tree.")
-
-########################################################################
-##
-## Visual Studio Manifest Manipulation.
-##
-########################################################################
-
-VC90CRTVERSIONRE=re.compile("name=['\"]Microsoft.VC90.CRT['\"]\\s+version=['\"]([0-9.]+)['\"]")
-
-def GetVC90CRTVersion(fn):
-    manifest = ReadFile(fn)
-    version = VC90CRTVERSIONRE.search(manifest)
-    if (version == None):
-        exit("Cannot locate version number in "+fn)
-    return version.group(1)
-
-def SetVC90CRTVersion(fn, ver):
-    manifest = ReadFile(fn)
-    subst = " name='Microsoft.VC90.CRT' version='"+ver+"' "
-    manifest = VC90CRTVERSIONRE.sub(subst, manifest)
-    WriteFile(fn, manifest)
-
-########################################################################
-##
-## Gets or sets the output directory, by default "built".
-##
-########################################################################
-
-def GetOutputDir():
-  return OUTPUTDIR
-
-def SetOutputDir(outputdir):
-  global OUTPUTDIR
-  OUTPUTDIR=outputdir
-
-########################################################################
-##
-## Package Selection
-##
-## This facility enables makepanda to keep a list of packages selected
-## by the user for inclusion or omission.
-##
-########################################################################
-
-PKG_LIST_ALL=0
-PKG_LIST_OMIT=0
-
-def PkgListSet(pkgs):
-    global PKG_LIST_ALL
-    global PKG_LIST_OMIT
-    PKG_LIST_ALL=pkgs
-    PKG_LIST_OMIT={}
-    PkgDisableAll()
-
-def PkgListGet():
-    return PKG_LIST_ALL
-
-def PkgEnableAll():
-    for x in PKG_LIST_ALL:
-        PKG_LIST_OMIT[x] = 0
-
-def PkgDisableAll():
-    for x in PKG_LIST_ALL:
-        PKG_LIST_OMIT[x] = 1
-
-def PkgEnable(pkg):
-    PKG_LIST_OMIT[pkg] = 0
-
-def PkgDisable(pkg):
-    PKG_LIST_OMIT[pkg] = 1
-
-def PkgSkip(pkg):
-    return PKG_LIST_OMIT[pkg]
-
-def PkgSelected(pkglist, pkg):
-    if (pkglist.count(pkg)==0): return 0
-    if (PKG_LIST_OMIT[pkg]): return 0
-    return 1
-
-########################################################################
-##
-## These functions are for libraries which use pkg-config.
-##
-########################################################################
-
-def PkgConfigHavePkg(pkgname):
-    """Returns a bool whether the pkg-config package is installed."""
-    if (sys.platform == "win32" or not LocateBinary("pkg-config")):
-        return False
-    handle = os.popen(LocateBinary("pkg-config") + " --silence-errors --modversion " + pkgname)
-    result = handle.read().strip()
-    handle.close()
-    return bool(len(result) > 0)
-
-def PkgConfigGetLibs(pkgname):
-    """Returns a list of libs for the package, prefixed by -l."""
-    if (sys.platform == "win32" or not LocateBinary("pkg-config")):
-        return []
-    handle = os.popen(LocateBinary("pkg-config") + " --silence-errors --libs-only-l " + pkgname)
-    result = handle.read().strip()
-    handle.close()
-    libs = []
-    for l in result.split(" "):
-        libs.append(l)
-    return libs
-
-def PkgConfigGetIncDirs(pkgname):
-    """Returns a list of includes for the package, NOT prefixed by -I."""
-    if (sys.platform == "win32" or not LocateBinary("pkg-config")):
-        return []
-    handle = os.popen(LocateBinary("pkg-config") + " --silence-errors --cflags-only-I " + pkgname)
-    result = handle.read().strip()
-    handle.close()
-    if len(result) == 0: return []
-    libs = []
-    for l in result.split(" "):
-        libs.append(l.replace("-I", "").replace("\"", "").strip())
-    return libs
-
-def PkgConfigGetLibDirs(pkgname):
-    """Returns a list of library paths for the package, NOT prefixed by -L."""
-    if (sys.platform == "win32" or not LocateBinary("pkg-config")):
-        return []
-    handle = os.popen(LocateBinary("pkg-config") + " --silence-errors --libs-only-L " + pkgname)
-    result = handle.read().strip()
-    handle.close()
-    if len(result) == 0: return []
-    libs = []
-    for l in result.split(" "):
-        libs.append(l.replace("-L", "").replace("\"", "").strip())
-    return libs
-
-def PkgConfigEnable(opt, pkgname):
-    """Adds the libraries and includes to IncDirectory, LibName and LibDirectory."""
-    for i in PkgConfigGetIncDirs(pkgname):
-        IncDirectory(opt, i)
-    for i in PkgConfigGetLibDirs(pkgname):
-        LibDirectory(opt, i)
-    for i in PkgConfigGetLibs(pkgname):
-        LibName(opt, i)
-
-########################################################################
-##
-## SDK Location
-##
-## This section is concerned with locating the install directories
-## for various third-party packages.  The results are stored in the
-## SDK table.
-##
-## Microsoft keeps changing the &*#$*& registry key for the DirectX SDK.
-## The only way to reliably find it is to search through the installer's
-## uninstall-directories, look in each one, and see if it contains the
-## relevant files.
-##
-########################################################################
-
-SDK = {}
-
-def SdkLocateDirectX():
-    if (sys.platform != "win32"): return
-    if (os.path.isdir("sdks/directx8")): SDK["DX8"]="sdks/directx8"
-    if (os.path.isdir("sdks/directx9")): SDK["DX9"]="sdks/directx9"
-    uninstaller = "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall";
-    for subdir in ListRegistryKeys(uninstaller):
-        if (subdir[0]=="{"):
-            dir = GetRegistryKey(uninstaller+"\\"+subdir, "InstallLocation")
-            if (dir != 0):
-                if ((SDK.has_key("DX8")==0) and
-                    (os.path.isfile(dir+"\\Include\\d3d8.h")) and
-                    (os.path.isfile(dir+"\\Include\\d3dx8.h")) and
-                    (os.path.isfile(dir+"\\Lib\\d3d8.lib")) and
-                    (os.path.isfile(dir+"\\Lib\\d3dx8.lib"))):
-                   SDK["DX8"] = dir.replace("\\", "/").rstrip("/")
-                if ((SDK.has_key("DX9")==0) and
-                    (os.path.isfile(dir+"\\Include\\d3d9.h")) and
-                    (os.path.isfile(dir+"\\Include\\d3dx9.h")) and
-                    (os.path.isfile(dir+"\\Include\\dxsdkver.h")) and
-                    (os.path.isfile(dir+"\\Lib\\x86\\d3d9.lib")) and
-                    (os.path.isfile(dir+"\\Lib\\x86\\d3dx9.lib"))):
-                   SDK["DX9"] = dir.replace("\\", "/").rstrip("/")
-    if (SDK.has_key("DX9")):
-        SDK["DIRECTCAM"] = SDK["DX9"]
-
-def SdkLocateMaya():
-    for (ver,key) in MAYAVERSIONINFO:
-        if (PkgSkip(ver)==0 and SDK.has_key(ver)==0):
-            if (sys.platform == "win32"):
-                ddir = "sdks/"+ver.lower().replace("x","")
-                if (os.path.isdir(ddir)):
-                    SDK[ver] = ddir
-                else:
-                    for dev in ["Alias|Wavefront","Alias","Autodesk"]:
-                        fullkey="SOFTWARE\\"+dev+"\\Maya\\"+key+"\\Setup\\InstallPath"
-                        res = GetRegistryKey(fullkey, "MAYA_INSTALL_LOCATION")
-                        if (res != 0):
-                            res = res.replace("\\", "/").rstrip("/")
-                            SDK[ver] = res
-            elif (sys.platform == "darwin"):
-                ddir1 = "sdks/"+ver.lower().replace("x","")+"-osx"
-                ddir2 = "/Applications/Autodesk/maya"+key+"/Maya.app/Contents"
-                
-                if (os.path.isdir(ddir1)):   SDK[ver] = ddir1
-                elif (os.path.isdir(ddir2)): SDK[ver] = ddir2
-            else:
-                ddir1 = "sdks/"+ver.lower().replace("x","")+"-linux"+platform.architecture()[0].replace("bit","")
-                if (platform.architecture()[0] == "64bit"):
-                    ddir2 = "/usr/autodesk/maya"+key+"-x64"
-                    ddir3 = "/usr/aw/maya"+key+"-x64"
-                else:
-                    ddir2 = "/usr/autodesk/maya"+key
-                    ddir3 = "/usr/aw/maya"+key
-                
-                if (os.path.isdir(ddir1)):   SDK[ver] = ddir1
-                elif (os.path.isdir(ddir2)): SDK[ver] = ddir2
-                elif (os.path.isdir(ddir3)): SDK[ver] = ddir3
-
-def SdkLocateMax():
-    if (sys.platform != "win32"): return
-    for version,key1,key2,subdir in MAXVERSIONINFO:
-        if (PkgSkip(version)==0):
-            if (SDK.has_key(version)==0):
-                ddir = "sdks/maxsdk"+version.lower()[3:]
-                if (os.path.isdir(ddir)):
-                    SDK[version] = ddir
-                    SDK[version+"CS"] = ddir
-                else:
-                    top = GetRegistryKey(key1,key2)
-                    if (top != 0):
-                        SDK[version] = top + "maxsdk"
-                        if (os.path.isdir(top + "\\" + subdir)!=0):
-                            SDK[version+"CS"] = top + subdir
-
-def SdkLocatePython():
-    if (PkgSkip("PYTHON")==0):
-        if (sys.platform == "win32"):
-            SDK["PYTHON"]="thirdparty/win-python"
-            SDK["PYTHONVERSION"]="python2.5"
-        elif (sys.platform == "darwin"):
-            if not SDK.has_key("MACOSX"): SdkLocateMacOSX()
-            if (os.path.isdir("%s/System/Library/Frameworks/Python.framework" % SDK["MACOSX"])):
-                os.system("readlink %s/System/Library/Frameworks/Python.framework/Versions/Current > %s/tmp/pythonversion 2>&1" % (SDK["MACOSX"], OUTPUTDIR))
-                pv = ReadFile(OUTPUTDIR+"/tmp/pythonversion")
-                SDK["PYTHON"] = SDK["MACOSX"]+"/System/Library/Frameworks/Python.framework/Headers"
-                SDK["PYTHONVERSION"] = "python"+pv
-            else:
-                exit("Could not find the python framework!")
-        else:
-            os.system("python -V > "+OUTPUTDIR+"/tmp/pythonversion 2>&1")
-            pv=ReadFile(OUTPUTDIR+"/tmp/pythonversion")
-            if (pv.startswith("Python ")==0):
-                exit("python -V did not produce the expected output")
-            pv = pv[7:10]
-            if (os.path.isdir("/usr/include/python"+pv)==0):
-                exit("Python reports version "+pv+" but /usr/include/python"+pv+" is not installed.")
-            SDK["PYTHON"]="/usr/include/python"+pv
-            SDK["PYTHONVERSION"]="python"+pv
-
-def SdkLocateVisualStudio():
-    if (sys.platform != "win32"): return
-    vcdir = GetRegistryKey("SOFTWARE\\Microsoft\\VisualStudio\\SxS\\VC7", "9.0")
-    if (vcdir != 0) and (vcdir[-4:] == "\\VC\\"):
-        vcdir = vcdir[:-3]
-        SDK["VISUALSTUDIO"] = vcdir
-
-def SdkLocateMSPlatform():
-    if (sys.platform != "win32"): return
-    platsdk=GetRegistryKey("SOFTWARE\\Microsoft\\MicrosoftSDK\\InstalledSDKs\\D2FF9F89-8AA2-4373-8A31-C838BF4DBBE1", "Install Dir")
-    if (platsdk == 0):
-        platsdk=GetRegistryKey("SOFTWARE\\Microsoft\\Microsoft SDKs\\Windows\\v6.1","InstallationFolder")
-    
-    if (platsdk == 0 and os.path.isdir(os.path.join(GetProgramFiles(), "Microsoft Platform SDK for Windows Server 2003 R2"))):
-        platsdk = os.path.join(GetProgramFiles(), "Microsoft Platform SDK for Windows Server 2003 R2")
-    
-    # Doesn't work with the Express versions, so we're checking for the "atlmfc" dir, which is not in the Express 
-    if (platsdk == 0 and os.path.isdir(os.path.join(GetProgramFiles(), "Microsoft Visual Studio 9\\VC\\atlmfc"))):
-        platsdk = os.path.join(GetProgramFiles(), "Microsoft Visual Studio 9\\VC\\PlatformSDK")
-    
-    if (platsdk != 0):
-        if (not platsdk.endswith("//")):
-            platsdk += "//"
-        SDK["MSPLATFORM"] = platsdk
-
-def SdkLocateMacOSX():
-    if (sys.platform != "darwin"): return
-    if (os.path.exists("/Developer/SDKs/MacOSX10.5.sdk")):
-        SDK["MACOSX"] = "/Developer/SDKs/MacOSX10.5.sdk"
-    elif (os.path.exists("/Developer/SDKs/MacOSX10.4u.sdk")):
-        SDK["MACOSX"] = "/Developer/SDKs/MacOSX10.4u.sdk"
-    elif (os.path.exists("/Developer/SDKs/MacOSX10.4.0.sdk")):
-        SDK["MACOSX"] = "/Developer/SDKs/MacOSX10.4.0.sdk"
-    else:
-        exit("Could not find any MacOSX SDK")
-
-########################################################################
-##
-## SDK Auto-Disables
-##
-## Disable packages whose SDKs could not be found.
-##
-########################################################################
-
-def SdkAutoDisableDirectX():
-    for ver in ["DX8","DX9","DIRECTCAM"]:
-        if (PkgSkip(ver)==0):
-            if (SDK.has_key(ver)==0):
-                if (sys.platform == "win32"):
-                    WARNINGS.append("I cannot locate SDK for "+ver)
-                else:
-                    WARNINGS.append(ver+" only supported on windows yet")
-                WARNINGS.append("I have automatically added this command-line option: --no-"+ver.lower())
-                PkgDisable(ver)
-            else:
-                WARNINGS.append("Using "+ver+" sdk: "+SDK[ver])
-
-def SdkAutoDisableMaya():
-    for (ver,key) in MAYAVERSIONINFO:
-        if (SDK.has_key(ver)==0) and (PkgSkip(ver)==0):
-            if (sys.platform == "win32"):
-                WARNINGS.append("The registry does not appear to contain a pointer to the "+ver+" SDK.")
-            else:
-                WARNINGS.append("I cannot locate SDK for "+ver)
-            WARNINGS.append("I have automatically added this command-line option: --no-"+ver.lower())
-            PkgDisable(ver)
-
-def SdkAutoDisableMax():
-    for version,key1,key2,subdir in MAXVERSIONINFO:
-        if (PkgSkip(version)==0) and ((SDK.has_key(version)==0) or (SDK.has_key(version+"CS")==0)): 
-            if (sys.platform == "win32"):
-                if (SDK.has_key(version)):
-                    WARNINGS.append("Your copy of "+version+" does not include the character studio SDK")
-                else: 
-                    WARNINGS.append("The registry does not appear to contain a pointer to "+version)
-            else:
-                WARNINGS.append(version+" only supported on windows yet")
-            WARNINGS.append("I have automatically added this command-line option: --no-"+version.lower())
-            PkgDisable(version)
-
-########################################################################
-##
-## Visual Studio comes with a script called VSVARS32.BAT, which 
-## you need to run before using visual studio command-line tools.
-## The following python subroutine serves the same purpose.
-##
-########################################################################
-
-def AddToPathEnv(path,add):
-    if (os.environ.has_key(path)):
-        os.environ[path] = add + ";" + os.environ[path]
-    else:
-        os.environ[path] = add
-
-def SetupVisualStudioEnviron():
-    if (SDK.has_key("VISUALSTUDIO")==0):
-        exit("Could not find Visual Studio install directory")
-    if (SDK.has_key("MSPLATFORM")==0):
-        exit("Could not find the Microsoft Platform SDK")
-    AddToPathEnv("PATH",    SDK["VISUALSTUDIO"] + "VC\\bin")
-    AddToPathEnv("PATH",    SDK["VISUALSTUDIO"] + "Common7\\IDE")
-    AddToPathEnv("INCLUDE", SDK["VISUALSTUDIO"] + "VC\\include")
-    AddToPathEnv("INCLUDE", SDK["VISUALSTUDIO"] + "VC\\atlmfc\\include")
-    AddToPathEnv("LIB",     SDK["VISUALSTUDIO"] + "VC\\lib")
-    AddToPathEnv("PATH",    SDK["MSPLATFORM"] + "bin")
-    AddToPathEnv("INCLUDE", SDK["MSPLATFORM"] + "include")
-    AddToPathEnv("INCLUDE", SDK["MSPLATFORM"] + "include\\atl")
-    AddToPathEnv("LIB",     SDK["MSPLATFORM"] + "lib")
-
-########################################################################
-#
-# Include and Lib directories.
-#
-# These allow you to add include and lib directories to the
-# compiler search paths.  These methods accept a "package"
-# parameter, which specifies which package the directory is
-# associated with.  The include/lib directory is not used
-# if the package is not selected.  The package can be 'ALWAYS'.
-#
-########################################################################
-
-INCDIRECTORIES = []
-LIBDIRECTORIES = []
-LIBNAMES = []
-DEFSYMBOLS = []
-
-def IncDirectory(opt, dir):
-    INCDIRECTORIES.append((opt, dir))
-
-def LibDirectory(opt, dir):
-    LIBDIRECTORIES.append((opt, dir))
-
-def LibName(opt, name):
-    LIBNAMES.append((opt, name))
-
-def DefSymbol(opt, sym, val):
-    DEFSYMBOLS.append((opt, sym, val))
-
-########################################################################
-#
-# On Linux, to run panda, the dynamic linker needs to know how to find
-# the shared libraries.  This subroutine verifies that the dynamic
-# linker is properly configured.  If not, it sets it up on a temporary
-# basis and issues a warning.
-#
-########################################################################
-
-
-def CheckLinkerLibraryPath():
-    if (sys.platform == "win32"): return
-    builtlib = os.path.abspath(os.path.join(OUTPUTDIR,"lib"))
-    try:
-        ldpath = []
-        f = file("/etc/ld.so.conf","r")
-        for line in f: ldpath.append(line.rstrip())
-        f.close()
-    except: ldpath = []
-    if (os.environ.has_key("LD_LIBRARY_PATH")):
-        ldpath = ldpath + os.environ["LD_LIBRARY_PATH"].split(":")
-    if (ldpath.count(builtlib)==0):
-        WARNINGS.append("Caution: the "+os.path.join(OUTPUTDIR,"lib")+" directory is not in LD_LIBRARY_PATH")
-        WARNINGS.append("or /etc/ld.so.conf.  You must add it before using panda.")
-        if (os.environ.has_key("LD_LIBRARY_PATH")):
-            os.environ["LD_LIBRARY_PATH"] = builtlib + ":" + os.environ["LD_LIBRARY_PATH"]
-        else:
-            os.environ["LD_LIBRARY_PATH"] = builtlib
-
-########################################################################
-##
-## Routines to copy files into the build tree
-##
-########################################################################
-
-def CopyFile(dstfile,srcfile):
-    if (dstfile[-1]=='/'):
-        dstdir = dstfile
-        fnl = srcfile.rfind("/")
-        if (fnl < 0): fn = srcfile
-        else: fn = srcfile[fnl+1:]
-        dstfile = dstdir + fn
-    if (NeedsBuild([dstfile],[srcfile])):
-        WriteFile(dstfile,ReadFile(srcfile))
-        JustBuilt([dstfile], [srcfile])
-
-def CopyAllFiles(dstdir, srcdir, suffix=""):
-    for x in GetDirectoryContents(srcdir, ["*"+suffix]):
-        CopyFile(dstdir+x, srcdir+x)
-
-def CopyAllHeaders(dir, skip=[]):
-    for filename in GetDirectoryContents(dir, ["*.h", "*.I", "*.T"], skip):
-        srcfile = dir + "/" + filename
-        dstfile = OUTPUTDIR+"/include/" + filename
-        if (NeedsBuild([dstfile],[srcfile])):
-            WriteFile(dstfile,ReadFile(srcfile))
-            JustBuilt([dstfile],[srcfile])
-
-def CopyTree(dstdir,srcdir):
-    if (os.path.isdir(dstdir)): return 0
-    if (sys.platform == "win32"):
-        cmd = 'xcopy /I/Y/E/Q "' + srcdir + '" "' + dstdir + '"'
-    else:
-        cmd = 'cp -R -f ' + srcdir + ' ' + dstdir
-    oscmd(cmd)
-
-########################################################################
-##
-## Parse PandaVersion.pp to extract the version number.
-##
-########################################################################
-
-def ParsePandaVersion(fn):
-    try:
-        f = file(fn, "r")
-        pattern = re.compile('^[ \t]*[#][ \t]*define[ \t]+PANDA_VERSION[ \t]+([0-9]+)[ \t]+([0-9]+)[ \t]+([0-9]+)')
-        for line in f:
-            match = pattern.match(line,0)
-            if (match):
-                version = match.group(1)+"."+match.group(2)+"."+match.group(3)
-                break
-        f.close()
-    except: version="0.0.0"
-    return version
-
-########################################################################
-##
-## FindLocation
-##
-########################################################################
-
-ORIG_EXT={}
-
-def GetOrigExt(x):
-    return ORIG_EXT[x]
-
-def CalcLocation(fn, ipath):
-    if (fn.count("/")): return fn
-    
-    if (fn.endswith(".cxx")): return CxxFindSource(fn, ipath)
-    if (fn.endswith(".I")):   return CxxFindSource(fn, ipath)
-    if (fn.endswith(".h")):   return CxxFindSource(fn, ipath)
-    if (fn.endswith(".c")):   return CxxFindSource(fn, ipath)
-    if (fn.endswith(".yxx")): return CxxFindSource(fn, ipath)
-    if (fn.endswith(".lxx")): return CxxFindSource(fn, ipath)
-    if (fn.endswith(".mll")): return OUTPUTDIR+"/plugins/"+fn
-    if (sys.platform == "win32"):
-        if (fn.endswith(".def")): return CxxFindSource(fn, ipath)
-        if (fn.endswith(".obj")): return OUTPUTDIR+"/tmp/"+fn
-        if (fn.endswith(".dll")): return OUTPUTDIR+"/bin/"+fn
-        if (fn.endswith(".dlo")): return OUTPUTDIR+"/plugins/"+fn
-        if (fn.endswith(".dli")): return OUTPUTDIR+"/plugins/"+fn
-        if (fn.endswith(".dle")): return OUTPUTDIR+"/plugins/"+fn
-        if (fn.endswith(".exe")): return OUTPUTDIR+"/bin/"+fn
-        if (fn.endswith(".lib")): return OUTPUTDIR+"/lib/"+fn
-        if (fn.endswith(".ilb")): return OUTPUTDIR+"/tmp/"+fn[:-4]+".lib"
-        if (fn.endswith(".dat")): return OUTPUTDIR+"/tmp/"+fn
-        if (fn.endswith(".in")):  return OUTPUTDIR+"/pandac/input/"+fn
-    elif (sys.platform == "darwin"):
-        if (fn.endswith(".mm")):  return CxxFindSource(fn, ipath)
-        if (fn.endswith(".obj")): return OUTPUTDIR+"/tmp/"+fn[:-4]+".o"
-        if (fn.endswith(".dll")): return OUTPUTDIR+"/lib/"+fn[:-4]+".dylib"
-        if (fn.endswith(".exe")): return OUTPUTDIR+"/bin/"+fn[:-4]
-        if (fn.endswith(".lib")): return OUTPUTDIR+"/lib/"+fn[:-4]+".a"
-        if (fn.endswith(".ilb")): return OUTPUTDIR+"/tmp/"+fn[:-4]+".a"
-        if (fn.endswith(".dat")): return OUTPUTDIR+"/tmp/"+fn
-        if (fn.endswith(".in")):  return OUTPUTDIR+"/pandac/input/"+fn
-    else:
-        if (fn.endswith(".obj")): return OUTPUTDIR+"/tmp/"+fn[:-4]+".o"
-        if (fn.endswith(".dll")): return OUTPUTDIR+"/lib/"+fn[:-4]+".so"
-        if (fn.endswith(".exe")): return OUTPUTDIR+"/bin/"+fn[:-4]
-        if (fn.endswith(".lib")): return OUTPUTDIR+"/lib/"+fn[:-4]+".a"
-        if (fn.endswith(".ilb")): return OUTPUTDIR+"/tmp/"+fn[:-4]+".a"
-        if (fn.endswith(".dat")): return OUTPUTDIR+"/tmp/"+fn
-        if (fn.endswith(".in")):  return OUTPUTDIR+"/pandac/input/"+fn
-    return fn
-
-
-def FindLocation(fn, ipath):
-    loc = CalcLocation(fn, ipath)
-    (base,ext) = os.path.splitext(fn)
-    ORIG_EXT[loc] = ext
-    return loc
-
-########################################################################
-##
-## TargetAdd
-##
-## Makepanda maintains a list of make-targets.  Each target has
-## these attributes:
-##
-## name   - the name of the file being created.
-## ext    - the original file extension, prior to OS-specific translation
-## inputs - the names of the input files to the compiler
-## deps   - other input files that the target also depends on
-## opts   - compiler options, a catch-all category
-##
-## TargetAdd will create the target if it does not exist.  Then,
-## depending on what options you pass, it will push data onto these
-## various target attributes.  This is cumulative: for example, if
-## you use TargetAdd to add compiler options, then use TargetAdd
-## again with more compiler options, both sets of options will be
-## included.
-##
-## TargetAdd does some automatic dependency generation on C++ files.
-## It will scan these files for include-files and automatically push
-## the include files onto the list of dependencies.  In order to do
-## this, it needs an include-file search path.  So if you supply
-## any C++ input, you also need to supply compiler options containing
-## include-directories, or alternately, a separate ipath parameter.
-## 
-## The main body of 'makepanda' is a long list of TargetAdd
-## directives building up a giant list of make targets.  Then, 
-## finally, the targets are run and panda is built.
-##
-## Makepanda's dependency system does not understand multiple
-## outputs from a single build step.  When a build step generates
-## a primary output file and a secondary output file, it is
-## necessary to trick the dependency system.  Insert a dummy
-## build step that "generates" the secondary output file, using
-## the primary output file as an input.  There is a special
-## compiler option DEPENDENCYONLY that creates such a dummy
-## build-step.  There are two cases where dummy build steps must
-## be inserted: bison generates an OBJ and a secondary header
-## file, interrogate generates an IN and a secondary IGATE.OBJ.
-##
-########################################################################
-
-class Target:
-    pass
-
-TARGET_LIST=[]
-TARGET_TABLE={}
-
-def TargetAdd(target, dummy=0, opts=0, input=0, dep=0, ipath=0):
-    if (dummy != 0):
-        exit("Syntax error in TargetAdd "+target)
-    if (ipath == 0): ipath = opts
-    if (ipath == 0): ipath = []
-    if (type(input) == str): input = [input]
-    if (type(dep) == str): dep = [dep]
-    full = FindLocation(target,[OUTPUTDIR+"/include"])
-    if (TARGET_TABLE.has_key(full) == 0):
-        t = Target()
-        t.name = full
-        t.inputs = []
-        t.deps = {}
-        t.opts = []
-        TARGET_TABLE[full] = t
-        TARGET_LIST.append(t)
-    else:
-        t = TARGET_TABLE[full]
-    ipath = [OUTPUTDIR+"/tmp"] + GetListOption(ipath, "DIR:") + [OUTPUTDIR+"/include"]
-    if (opts != 0):
-        for x in opts:
-            if (t.opts.count(x)==0):
-                t.opts.append(x)
-    if (input != 0):
-        for x in input:
-            fullinput = FindLocation(x, ipath)
-            t.inputs.append(fullinput)
-            t.deps[fullinput] = 1
-            (base,suffix) = os.path.splitext(x)
-            if (SUFFIX_INC.count(suffix)):
-                for d in CxxCalcDependencies(fullinput, ipath, []):
-                    t.deps[d] = 1
-    if (dep != 0):                
-        for x in dep:
-            fulldep = FindLocation(x, ipath)
-            t.deps[fulldep] = 1
-    if (target.endswith(".in")):
-        t.deps[FindLocation("interrogate.exe",[])] = 1
-        t.deps[FindLocation("dtool_have_python.dat",[])] = 1
-

+ 0 - 4798
doc/makepanda/otherMakePanda.py

@@ -1,4798 +0,0 @@
-#!/usr/bin/python
-########################################################################
-#
-# Caution: there are two separate, independent build systems:
-# 'makepanda', and 'ppremake'.  Use one or the other, do not attempt
-# to use both.  This file is part of the 'makepanda' system.
-#
-# To build panda using this script, type 'makepanda.py' on unix
-# or 'makepanda.bat' on windows, and examine the help-text.
-# Then run the script again with the appropriate options to compile
-# panda3d.
-#
-########################################################################
-
-import sys,os,time,stat,string,re,getopt,cPickle
-from glob import glob
-
-########################################################################
-##
-## Utility Routines
-##
-## filedate(f) - returns the last modified date of the specified file.
-## youngest(f1,f2...) - returns date of most recently modified file.
-## older(f,f1,f2...) - return true if f is older than all the others.
-## xpaths(pre,pathlist,suf) - appends prefix and suffix to every path.
-##
-########################################################################
-
-global FileDateCache
-FileDateCache = {}
-
-def filedate(path):
-    global FileDateCache
-    if FileDateCache.has_key(path):
-        return FileDateCache[path]
-    try: date = os.path.getmtime(path)
-    except: date = 0
-    FileDateCache[path] = date
-    return date
-
-def updatefiledate(path):
-    global FileDateCache
-    try: date = os.path.getmtime(path)
-    except: date = 0
-    FileDateCache[path] = date
-
-def youngest(files):
-    if type(files) == str:
-        source = filedate(files)
-        if (source==0):
-            sys.exit("Error: source file not readable: "+files)
-        return source
-    result = 0
-    for sfile in files:
-        source = youngest(sfile)
-        if (source > result): result = source
-    return result
-
-def older(file,others):
-    return filedate(file)<youngest(others)
-
-def xpaths(prefix,base,suffix):
-    if type(base) == str:
-        return prefix + base + suffix
-    result = []
-    for x in base:
-        result.append(xpaths(prefix,x,suffix))
-    return result
-
-if sys.platform == "win32" or sys.platform == "cygwin":
-    import _winreg
-    def GetRegistryKey(path, subkey):
-        k1=0
-        key=0
-        try:
-            key = _winreg.OpenKey(_winreg.HKEY_LOCAL_MACHINE, path, 0, _winreg.KEY_READ)
-            k1, k2 = _winreg.QueryValueEx(key, subkey)
-        except: pass
-        if (key!=0): _winreg.CloseKey(key)
-        return k1
-
-def oslocalcmd(cd, cmd):
-    if VERBOSE:
-        if cd != ".":
-            print "( cd "+cd+"; "+cmd+" )"
-        else:
-            print cmd
-    if cd != ".":
-        base=os.getcwd()
-        os.chdir(cd)
-    sys.stdout.flush()
-    if sys.platform == "win32" or sys.platform == "cygwin":
-        exe = cmd.split()[0]
-        if os.path.isfile(exe)==0:
-            for i in os.environ["PATH"].split(";"):
-                if os.path.isfile(os.path.join(i, exe)):
-                    exe = os.path.join(i, exe)
-                    break
-            if os.path.isfile(exe)==0:
-                sys.exit("Cannot find "+exe+" on search path")
-        res = os.spawnl(os.P_WAIT, exe, cmd)
-    else:
-        res = os.system(cmd)
-    if res != 0:
-        if not VERBOSE:
-            print "\n------------- Command Failed ---------------"
-            if cd != ".":
-                print "( cd "+cd+"; "+cmd+" )"
-            else:
-                print cmd
-            print "--------------------------------------------"
-        sys.exit(res)
-    if cd != ".":
-        os.chdir(base)
-
-def oscmd(cmd):
-    oslocalcmd(".",cmd)
-
-def osmove(src,dst):
-    """
-    Move src file or directory to dst.  dst will be removed if it
-    exists (i.e. overwritten).
-    """
-    global VERBOSE
-    if VERBOSE >= 1:
-        print "Moving \"%s\" to \"%s\""%(src, dst)
-    try: os.remove(dst)
-    except OSError: pass
-    os.rename(src, dst)
-
-def replaceInFile(srcPath, dstPath, replaceA, withB):
-    global VERBOSE
-    if VERBOSE >= 1:
-        print "Replacing '%s' in \"%s\" with '%s' and writing it to \"%s\""%(
-            replaceA, srcPath, withB, dstPath)
-    f=file(srcPath, "rb")
-    data=f.read()
-    f.close()
-    data=data.replace(replaceA, withB)
-    f=file(dstPath, "wb")
-    f.write(data)
-    f.close()
-
-def buildingwhat(opts):
-    building = 0
-    for x in opts:
-        if (x[:9]=="BUILDING_"): building = x[9:]
-    return building
-
-def ReadFile(wfile):
-    try:
-        srchandle = open(wfile, "rb")
-        data = srchandle.read()
-        srchandle.close()
-        return data
-    except: sys.exit("Cannot read "+wfile)
-
-def WriteFile(wfile,data):
-    try:
-        dsthandle = open(wfile, "wb")
-        dsthandle.write(data)
-        dsthandle.close()
-    except: sys.exit("Cannot write "+wfile)
-
-def prettyTime(t):
-    t = int(t)
-    hours = t/3600
-    t -= hours*3600
-    minutes = t/60
-    t -= minutes*60
-    seconds = t
-    if (hours): return str(hours)+" hours "+str(minutes)+" min"
-    if (minutes): return str(minutes)+" min "+str(seconds)+" sec"
-    return str(seconds)+" sec"
-
-def MakeDirectory(path):
-    if os.path.isdir(path): return 0
-    os.mkdir(path)
-
-########################################################################
-##
-## Default options:
-##
-## You might be tempted to change the defaults by editing them
-## here.  Don't do it.  Instead, create a script that compiles
-## panda with your preferred options.
-##
-########################################################################
-
-if (sys.platform == "win32"): COMPILERS=["MSVC7", "MSVC71", "MINGW"]
-elif (sys.platform == "cygwin"): COMPILERS=["MSVC7", "MSVC71", "GCC33"]
-elif (sys.platform == "linux2"): COMPILERS=["LINUXA"]
-else:
-    print "which compiler should be used for %s"%(sys.platform,)
-PREFIX="built"
-COMPILER=COMPILERS[0]
-OPTIMIZE="3"
-INSTALLER=0
-GENMAN=0
-PPGAME=0
-COMPLETE=0
-THIRDPARTY="thirdparty"
-VERSION="0.0.0"
-VERBOSE=1
-COMPRESSOR="zlib"
-PACKAGES=["ZLIB","PNG","JPEG","TIFF","VRPN","FMOD","NVIDIACG","HELIX","NSPR",
-          "SSL","FREETYPE","FFTW","MILES","MAYA5","MAYA6","MAYA65","MAX5","MAX6","MAX7"]
-OMIT=PACKAGES[:]
-WARNINGS=[]
-
-SDK_LIB_PATH = {}
-
-DIRECTXSDK = None
-MAYASDK = {}
-MAXSDK = {}
-MAXSDKCS = {}
-NSPR_SDK = None
-PYTHONSDK = None
-
-try:
-    # If there is a makepandaPreferences.py, import it:
-    from makepandaPreferences import *
-except ImportError:
-    # If it's not there, no problem:
-    pass
-
-STARTTIME=time.time()
-
-##########################################################################################
-#
-# Read the default version number out of dtool/PandaVersion.pp
-#
-##########################################################################################
-
-try:
-    f = file("dtool/PandaVersion.pp","r")
-    pattern = re.compile('^[ \t]*[#][ \t]*define[ \t]+PANDA_VERSION[ \t]+([0-9]+)[ \t]+([0-9]+)[ \t]+([0-9]+)')
-    for line in f:
-        match = pattern.match(line,0)
-        if (match):
-            VERSION = match.group(1)+"."+match.group(2)+"."+match.group(3)
-            break
-    f.close()
-except: pass
-
-##########################################################################################
-#
-# Initialize DTOOLCONFIG based on platform (Win/Unix)
-#
-# These are the defaults for the two broad classes of operating system.
-# Subsequent analysis will cause these values to be tweaked.
-#
-##########################################################################################
-
-DTOOLDEFAULTS=[
-    #_Variable_________________________Windows___________________Unix__________
-    ("HAVE_PYTHON",                    '1',                      '1'),
-    ("PYTHON_FRAMEWORK",               'UNDEF',                  'UNDEF'),
-    ("COMPILE_IN_DEFAULT_FONT",        '1',                      '1'),
-    ("HAVE_MAYA",                      '1',                      '1'),
-    ("MAYA_PRE_5_0",                   'UNDEF',                  'UNDEF'),
-    ("HAVE_SOFTIMAGE",                 'UNDEF',                  'UNDEF'),
-    ("SSL_097",                        'UNDEF',                  'UNDEF'),
-    ("REPORT_OPENSSL_ERRORS",          '1',                      '1'),
-    ("HAVE_GL",                        '1',                      '1'),
-    ("HAVE_MESA",                      'UNDEF',                  'UNDEF'),
-    ("MESA_MGL",                       'UNDEF',                  'UNDEF'),
-    ("HAVE_SGIGL",                     'UNDEF',                  'UNDEF'),
-    ("HAVE_GLX",                       'UNDEF',                  '1'),
-    ("HAVE_WGL",                       '1',                      'UNDEF'),
-    ("HAVE_DX",                        '1',                      'UNDEF'),
-    ("HAVE_CHROMIUM",                  'UNDEF',                  'UNDEF'),
-    ("HAVE_THREADS",                   'UNDEF',                  'UNDEF'),
-    ("HAVE_AUDIO",                     '1',                      '1'),
-    ("NOTIFY_DEBUG",                   'UNDEF',                  'UNDEF'),
-    ("DO_PSTATS",                      'UNDEF',                  'UNDEF'),
-    ("DO_COLLISION_RECORDING",         'UNDEF',                  'UNDEF'),
-    ("TRACK_IN_INTERPRETER",           'UNDEF',                  'UNDEF'),
-    ("DO_MEMORY_USAGE",                'UNDEF',                  'UNDEF'),
-    ("DO_PIPELINING",                  'UNDEF',                  'UNDEF'),
-    ("EXPORT_TEMPLATES",               'yes',                    'yes'),
-    ("LINK_IN_GL",                     'UNDEF',                  'UNDEF'),
-    ("LINK_IN_PHYSICS",                'UNDEF',                  'UNDEF'),
-    ("DEFAULT_PATHSEP",                '";"',                    '":"'),
-    ("DEFAULT_PRC_DIR",                '"<auto>etc"',            '"<auto>etc"'),
-    ("PRC_DIR_ENVVARS",                '"PANDA_PRC_DIR"',        '"PANDA_PRC_DIR"'),
-    ("PRC_PATH_ENVVARS",               '"PANDA_PRC_PATH"',       '"PANDA_PRC_PATH"'),
-    ("PRC_PATTERNS",                   '"*.prc"',                '"*.prc"'),
-    ("PRC_EXECUTABLE_PATTERNS",        '""',                     '""'),
-    ("PRC_EXECUTABLE_ARGS_ENVVAR",     '"PANDA_PRC_XARGS"',      '"PANDA_PRC_XARGS"'),
-    ("PRC_PUBLIC_KEYS_FILENAME",       '""',                     '""'),
-    ("PRC_RESPECT_TRUST_LEVEL",        'UNDEF',                  'UNDEF'),
-    ("PRC_SAVE_DESCRIPTIONS",          '1',                      '1'),
-    ("WORDS_BIGENDIAN",                'UNDEF',                  'UNDEF'),
-    ("HAVE_NAMESPACE",                 '1',                      '1'),
-    ("HAVE_OPEN_MASK",                 'UNDEF',                  'UNDEF'),
-    ("HAVE_WCHAR_T",                   '1',                      '1'),
-    ("HAVE_WSTRING",                   '1',                      '1'),
-    ("HAVE_TYPENAME",                  '1',                      '1'),
-    ("SIMPLE_STRUCT_POINTERS",         '1',                      'UNDEF'),
-    ("HAVE_DINKUM",                    'UNDEF',                  'UNDEF'),
-    ("HAVE_STL_HASH",                  'UNDEF',                  'UNDEF'),
-    ("HAVE_GETTIMEOFDAY",              'UNDEF',                  '1'),
-    ("GETTIMEOFDAY_ONE_PARAM",         'UNDEF',                  'UNDEF'),
-    ("HAVE_GETOPT",                    'UNDEF',                  '1'),
-    ("HAVE_GETOPT_LONG_ONLY",          'UNDEF',                  '1'),
-    ("HAVE_GETOPT_H",                  'UNDEF',                  '1'),
-    ("IOCTL_TERMINAL_WIDTH",           'UNDEF',                  '1'),
-    ("HAVE_STREAMSIZE",                '1',                      '1'),
-    ("HAVE_IOS_TYPEDEFS",              '1',                      '1'),
-    ("HAVE_IOS_BINARY",                '1',                      '1'),
-    ("STATIC_INIT_GETENV",             '1',                      'UNDEF'),
-    ("HAVE_PROC_SELF_EXE",             'UNDEF',                  '1'),
-    ("HAVE_PROC_SELF_MAPS",            'UNDEF',                  '1'),
-    ("HAVE_PROC_SELF_ENVIRON",         'UNDEF',                  '1'),
-    ("HAVE_PROC_SELF_CMDLINE",         'UNDEF',                  '1'),
-    ("HAVE_GLOBAL_ARGV",               '1',                      'UNDEF'),
-    ("PROTOTYPE_GLOBAL_ARGV",          'UNDEF',                  'UNDEF'),
-    ("GLOBAL_ARGV",                    '__argv',                 'UNDEF'),
-    ("GLOBAL_ARGC",                    '__argc',                 'UNDEF'),
-    ("HAVE_IO_H",                      '1',                      'UNDEF'),
-    ("HAVE_IOSTREAM",                  '1',                      '1'),
-    ("HAVE_MALLOC_H",                  '1',                      '1'),
-    ("HAVE_SYS_MALLOC_H",              'UNDEF',                  'UNDEF'),
-    ("HAVE_ALLOCA_H",                  'UNDEF',                  '1'),
-    ("HAVE_LOCALE_H",                  'UNDEF',                  '1'),
-    ("HAVE_MINMAX_H",                  '1',                      'UNDEF'),
-    ("HAVE_SSTREAM",                   '1',                      '1'),
-    ("HAVE_NEW",                       '1',                      '1'),
-    ("HAVE_SYS_TYPES_H",               '1',                      '1'),
-    ("HAVE_SYS_TIME_H",                'UNDEF',                  '1'),
-    ("HAVE_UNISTD_H",                  'UNDEF',                  '1'),
-    ("HAVE_UTIME_H",                   'UNDEF',                  '1'),
-    ("HAVE_GLOB_H",                    'UNDEF',                  '1'),
-    ("HAVE_DIRENT_H",                  'UNDEF',                  '1'),
-    ("HAVE_SYS_SOUNDCARD_H",           'UNDEF',                  '1'),
-    ("HAVE_RTTI",                      '1',                      '1'),
-    ("GLOBAL_OPERATOR_NEW_EXCEPTIONS", 'UNDEF',                  '1'),
-    ("OLD_STYLE_ALLOCATOR",            'UNDEF',                  'UNDEF'),
-    ("GNU_STYLE_ALLOCATOR",            'UNDEF',                  '1'),
-    ("VC6_STYLE_ALLOCATOR",            'UNDEF',                  'UNDEF'),
-    ("MODERN_STYLE_ALLOCATOR",         'UNDEF',                  'UNDEF'),
-    ("NO_STYLE_ALLOCATOR",             '1',                      'UNDEF'),
-    ("HAVE_ZLIB",                      'UNDEF',                  'UNDEF'),
-    ("HAVE_PNG",                       'UNDEF',                  'UNDEF'),
-    ("HAVE_JPEG",                      'UNDEF',                  'UNDEF'),
-    ("HAVE_TIFF",                      'UNDEF',                  'UNDEF'),
-    ("HAVE_VRPN",                      'UNDEF',                  'UNDEF'),
-    ("HAVE_FMOD",                      'UNDEF',                  'UNDEF'),
-    ("HAVE_NVIDIACG",                  'UNDEF',                  'UNDEF'),
-    ("HAVE_NSPR",                      'UNDEF',                  'UNDEF'),
-    ("HAVE_FREETYPE",                  'UNDEF',                  'UNDEF'),
-    ("HAVE_FFTW",                      'UNDEF',                  'UNDEF'),
-    ("HAVE_SSL",                       'UNDEF',                  'UNDEF'),
-    ("HAVE_NET",                       'UNDEF',                  'UNDEF'),
-    ("HAVE_CG",                        'UNDEF',                  'UNDEF'),
-    ("HAVE_CGGL",                      'UNDEF',                  'UNDEF'),
-    ]
-
-DTOOLCONFIG={}
-if (sys.platform == "win32" or sys.platform == "cygwin"):
-    for key,win,unix in DTOOLDEFAULTS:
-        DTOOLCONFIG[key] = win
-else:
-    for key,win,unix in DTOOLDEFAULTS:
-        DTOOLCONFIG[key] = unix
-
-########################################################################
-##
-## Help with packages.
-##
-## Output some brief information to help someone understand what the
-## package options are.
-##
-########################################################################
-
-def packageInfo():
-    print """
-  See panda3d/doc/INSTALL-PP for more detailed information.
-
-  3D modeling an painting packages:
-    MAX5      3D Studio Max version 5
-    MAX6      3D Studio Max version 6
-    MAX7      3D Studio Max version 7
-              "uri?"
-              (for .??? files)
-
-    MAYA5     Maya version 5
-    MAYA6     Maya version 6
-              "uri?"
-              (for .??? files)
-
-  Audio playback:
-    FMOD      f mod
-              "http://www.fmod.org/"
-              A music and sound effects library (including playback).
-              (for .wav, .mp3 and other files)
-
-    MILES     Miles Sound System from RAD Game Tools
-              "http://www.radgametools.com/default.htm"
-              A proprietary (non-opensource) audio library.
-              (for .wav, .mp3, and other files).
-
-  Compression/decompression:
-    ZLIB      z lib
-              "http://www.gzip.org/zlib"
-              A commression/decomression library.
-              (for .zip and similar files and data)
-
-  Font manipulation:
-    FREETYPE  free type
-              "http://www.freetype.org/"
-              A font manipulation library.
-              (for .ttf files).
-
-
-  Image support libraries:
-    JPEG      Join Photographic Experts Group
-              "http://www.ijg.org"
-              An image library.
-              (.jpg and .jpeg files)
-
-    PNG       Portable Network Graphics
-              "http://www.libpng.org"
-              An image library.
-              (.png files)
-
-    TIFF      Tagged Image File Format
-              "ftp://ftp.sgi.com/graphics/tiff"
-              An image library.
-              (.tiff files)
-
-  Misc libraries:
-    HELIX
-              "uri?"
-              (for .??? files)
-              A ??? library.
-
-    FFTW      Fast Fourier Transform (in the West)
-              "http://www.fftw.org/"
-              A library for computing DFT in one or more dimensions.
-
-    NVIDIACG  nVidia cg
-              "http://developer.nvidia.com/page/cg_main.html"
-              (for .??? files)
-              A library for gpu programming (shaders and such).
-
-  Network communication:
-    SSL       Open Secure Socket Layer
-              "http://www.openssl.org/"
-              A network encryption library.
-
-    NSPR      Netscape Portable Runtime
-              "http://www.mozilla.org/projects/nspr/"
-              Used for network sockets and threading.
-
-  User input:
-    VRPN      Virtual Reality Peripheral Network
-              "http://www.cs.unc.edu/Research/vrpn/"
-              A controller/peripheral input library.
-"""
-
-########################################################################
-##
-## Command-line parser.
-##
-## You can type "makepanda --help" to see all the options.
-##
-########################################################################
-
-def usage(problem):
-    if (problem):
-        print ""
-        print '***', problem, '***'
-    print ""
-    print "Makepanda generates a 'built' subdirectory containing a"
-    print "compiled copy of Panda3D.  Command-line arguments are:"
-    print ""
-    print "  --help            (print the help message you're reading now)"
-    print "  --package-info    (help info about the optional packages)"
-    print "  --prefix X        (install into prefix dir, default \"built\")"
-    print "  --compiler X      (currently, compiler can only be MSVC7,LINUXA)"
-    print "  --optimize X      (optimization level can be 1,2,3,4)"
-    print "  --thirdparty X    (directory containing third-party software)"
-    print "  --complete        (copy samples and direct into the build)"
-    print "  --installer       (build an executable installer)"
-    print "  --ppgame X        (build a prepackaged game - see manual)"
-    print "  --v1 X            (set the major version number)"
-    print "  --v2 X            (set the minor version number)"
-    print "  --v3 X            (set the sequence version number)"
-    print "  --lzma            (use lzma compression when building installer)"
-    print ""
-    for pkg in PACKAGES:
-        p = pkg.lower()
-        print "  --use-%-9s   --no-%-9s (enable/disable use of %s)"%(p, p, pkg)
-    print ""
-    print "  --nothing         (disable every third-party lib)"
-    print "  --everything      (enable every third-party lib)"
-    print ""
-    print "  --quiet           (print less output)"
-    print "  --verbose         (print more output and debugging info)"
-    print ""
-    print "The simplest way to compile panda is to just type:"
-    print ""
-    print "  makepanda --everything"
-    print ""
-    sys.exit(1)
-
-def parseopts(args):
-    global PREFIX,COMPILER,OPTIMIZE,OMIT,THIRDPARTY,INSTALLER,GENMAN
-    global PPGAME,COPYEXTRAS,VERSION,COMPRESSOR,DIRECTXSDK,VERBOSE
-    longopts = [
-        "help","package-info","prefix=","compiler=","directx-sdk=","thirdparty=",
-        "optimize=","everything","nothing","installer","ppgame=","quiet","verbose",
-        "complete","version=","lzma"]
-    anything = 0
-    for pkg in PACKAGES: longopts.append("no-"+pkg.lower())
-    for pkg in PACKAGES: longopts.append("use-"+pkg.lower())
-    try:
-        opts, extras = getopt.getopt(args, "", longopts)
-        for option,value in opts:
-            if (option=="--help"): raise "usage"
-            elif (option=="--package-info"): raise "package-info"
-            elif (option=="--prefix"): PREFIX=value
-            elif (option=="--compiler"): COMPILER=value
-            elif (option=="--directx-sdk"): DIRECTXSDK=value
-            elif (option=="--thirdparty"): THIRDPARTY=value
-            elif (option=="--optimize"): OPTIMIZE=value
-            elif (option=="--quiet"): VERBOSE-=1
-            elif (option=="--verbose"): VERBOSE+=1
-            elif (option=="--installer"): INSTALLER=1
-            elif (option=="--genman"): GENMAN=1
-            elif (option=="--ppgame"): PPGAME=value
-            elif (option=="--complete"): COMPLETE=1
-            elif (option=="--everything"): OMIT=[]
-            elif (option=="--nothing"): OMIT=PACKAGES[:]
-            elif (option=="--version"):
-                VERSION=value
-                if (len(VERSION.split(".")) != 3): raise "usage"
-            elif (option=="--lzma"): COMPRESSOR="lzma"
-            else:
-                for pkg in PACKAGES:
-                    if (option=="--use-"+pkg.lower()):
-                        if (OMIT.count(pkg)): OMIT.remove(pkg)
-                        break
-                for pkg in PACKAGES:
-                    if (option=="--no-"+pkg.lower()):
-                        if (OMIT.count(pkg)==0): OMIT.append(pkg)
-                        break
-            anything = 1
-    except "package-info": packageInfo()
-    except "help": usage('')
-    except Exception, e: usage(e)
-    if (anything==0): usage(0)
-    if   (OPTIMIZE=="1"): OPTIMIZE=1
-    elif (OPTIMIZE=="2"): OPTIMIZE=2
-    elif (OPTIMIZE=="3"): OPTIMIZE=3
-    elif (OPTIMIZE=="4"): OPTIMIZE=4
-    else: usage("Invalid setting for OPTIMIZE")
-    if (COMPILERS.count(COMPILER)==0): usage("Invalid setting for COMPILER: "+COMPILER)
-
-parseopts(sys.argv[1:])
-
-########################################################################
-#
-# Avoid trouble by not allowing weird --prefix or --thirdparty
-#
-# One of my goals for makepanda was for it to be maintainable.
-# I found that trying to support arbitrary pathnames for "prefix"
-# and "thirdparty" required the use of lots of backslashes and
-# quotation marks, which were quite frankly hard to get right.
-# I think it's better to simply rule out weird pathnames.
-#
-########################################################################
-
-PREFIX     = PREFIX.replace("\\","/")
-THIRDPARTY = THIRDPARTY.replace("\\","/")
-
-if (PREFIX.count(" ")  or THIRDPARTY.count(" ")):
-  sys.exit("The --prefix and --thirdparty may not contain spaces")
-if (PREFIX.count('"')  or THIRDPARTY.count('"')):
-  sys.exit("The --prefix and --thirdparty may not contain quotation marks")
-
-########################################################################
-#
-# Locate the root of the panda tree
-#
-########################################################################
-
-PANDASOURCE=os.path.dirname(os.path.abspath(sys.path[0]))
-
-if ((os.path.exists(os.path.join(PANDASOURCE,"makepanda/makepanda.py"))==0) or
-    (os.path.exists(os.path.join(PANDASOURCE,"dtool","src","dtoolbase","dtoolbase.h"))==0) or
-    (os.path.exists(os.path.join(PANDASOURCE,"panda","src","pandabase","pandabase.h"))==0)):
-    sys.exit("I am unable to locate the root of the panda source tree.")
-
-os.chdir(PANDASOURCE)
-
-########################################################################
-##
-## If you have the "sdks" directory, supply all sdks
-##
-## This is a temporary hack, it may go away.
-##
-########################################################################
-
-if (os.path.isdir("sdks")):
-    DIRECTXSDK="sdks/directx"
-    MAXSDKCS["MAX5"] = "sdks/maxsdk5"
-    MAXSDKCS["MAX6"] = "sdks/maxsdk6"
-    MAXSDKCS["MAX7"] = "sdks/maxsdk7"
-    MAXSDK["MAX5"]   = "sdks/maxsdk5"
-    MAXSDK["MAX6"]   = "sdks/maxsdk6"
-    MAXSDK["MAX7"]   = "sdks/maxsdk7"
-    MAYASDK["MAYA5"] = "sdks/maya5"
-    MAYASDK["MAYA6"] = "sdks/maya6"
-    MAYASDK["MAYA65"] = "sdks/maya65"
-
-########################################################################
-##
-## Locate the DirectX SDK
-##
-########################################################################
-
-if (sys.platform == "win32" or sys.platform == "cygwin") and DIRECTXSDK is None:
-    dxdir = GetRegistryKey("SOFTWARE\\Microsoft\\DirectX SDK", "DX9SDK Samples Path")
-    if (dxdir != 0): DIRECTXSDK = os.path.dirname(dxdir)
-    else:
-        dxdir = GetRegistryKey("SYSTEM\\CurrentControlSet\\Control\\Session Manager\\Environment","DXSDK_DIR")
-        if (dxdir != 0): DIRECTXSDK=dxdir
-        else:
-            dxdir = GetRegistryKey("SYSTEM\\CurrentControlSet\\Control\\Session Manager\\Environment","DXSDKROOT")
-            if dxdir != 0:
-                if dxdir[-2:]=="/.":
-                    DIRECTXSDK=dxdir[:-1]
-                else:
-                    DIRECTXSDK=dxdir
-            else:
-                sys.exit("The registry does not appear to contain a pointer to the DirectX 9.0 SDK.")
-    DIRECTXSDK=DIRECTXSDK.replace("\\", "/").rstrip("/")
-
-########################################################################
-##
-## Locate the Maya 5.0 and Maya 6.0 SDK
-##
-########################################################################
-
-MAYAVERSIONS=[("MAYA5",  "SOFTWARE\\Alias|Wavefront\\Maya\\5.0\\Setup\\InstallPath"),
-              ("MAYA6",  "SOFTWARE\\Alias|Wavefront\\Maya\\6.0\\Setup\\InstallPath"),
-              ("MAYA65", "SOFTWARE\\Alias|Wavefront\\Maya\\6.5\\Setup\\InstallPath")
-]
-
-for (ver,key) in MAYAVERSIONS:
-    if (OMIT.count(ver)==0) and (MAYASDK.has_key(ver)==0):
-        if (sys.platform == "win32" or sys.platform == "cygwin"):
-            MAYASDK[ver]=GetRegistryKey(key, "MAYA_INSTALL_LOCATION")
-            if (MAYASDK[ver] == 0):
-                WARNINGS.append("The registry does not appear to contain a pointer to the "+ver+" SDK.")
-                WARNINGS.append("I have automatically added this command-line option: --no-"+ver.lower())
-                OMIT.append(ver)
-            else:
-                MAYASDK[ver] = MAYASDK[ver].replace("\\", "/").rstrip("/")
-        else:
-            WARNINGS.append(ver+" not yet supported under linux")
-            WARNINGS.append("I have automatically added this command-line option: --no-"+ver.lower())
-            OMIT.append(ver)
-
-########################################################################
-##
-## Locate the 3D Studio Max and Character Studio SDKs
-##
-########################################################################
-
-MAXVERSIONS = [("MAX5", "SOFTWARE\\Autodesk\\3DSMAX\\5.0\\MAX-1:409", "uninstallpath", "Cstudio\\Sdk"),
-               ("MAX6", "SOFTWARE\\Autodesk\\3DSMAX\\6.0",            "installdir",    "maxsdk\\cssdk\\include"),
-               ("MAX7", "SOFTWARE\\Autodesk\\3DSMAX\\7.0",            "Installdir",    "maxsdk\\include\\CS")]
-
-for version,key1,key2,subdir in MAXVERSIONS:
-    if (OMIT.count(version)==0) and (MAXSDK.has_key(version)==0):
-        if (sys.platform == "win32" or sys.platform == "cygwin"):
-            top = GetRegistryKey(key1,key2)
-            if (top == 0):
-                WARNINGS.append("The registry does not appear to contain a pointer to "+version)
-                WARNINGS.append("I have automatically added this command-line option: --no-"+version.lower())
-                OMIT.append(version)
-            else:
-                if (os.path.isdir(top + "\\" + subdir)==0):
-                    WARNINGS.append("Your copy of "+version+" does not include the character studio SDK")
-                    WARNINGS.append("I have automatically added this command-line option: --no-"+version.lower())
-                    OMIT.append(version)
-                else:
-                    MAXSDK[version] = top + "maxsdk"
-                    MAXSDKCS[version] = top + subdir
-        else:
-            WARNINGS.append(version+" not yet supported under linux")
-            WARNINGS.append("I have automatically added this command-line option: --no-"+version.lower())
-            OMIT.append(version)
-            
-########################################################################
-##
-## Locate the NSPR SDK
-##
-########################################################################
-
-if NSPR_SDK is None:
-    if sys.platform == "win32" or sys.platform == "cygwin":
-        nsprPaths = ["C:/Python22", 'thirdparty/nspr']
-    else:
-        nsprPaths = ["/usr/include/nspr", 'thirdparty/win-python']
-    for p in nsprPaths:
-        if os.path.isdir(p): NSPR_SDK = p
-    if NSPR_SDK is None:
-        sys.exit("Cannot find the NSPR SDK")
-
-########################################################################
-##
-## Locate the Python SDK
-##
-########################################################################
-
-if PYTHONSDK is None:
-    if sys.platform == "win32" or sys.platform == "cygwin":
-        pythonPaths = [
-            "C:/Python22",
-            "C:/Python23",
-            "C:/Python24",
-            "C:/Python25",
-            'thirdparty/win-python']
-    else:
-        pythonPaths = [
-            "/usr/include/python2.5",
-            "/usr/include/python2.4",
-            "/usr/include/python2.3",
-            "/usr/include/python2.2"]
-    for p in pythonPaths:
-        if os.path.isdir(p): PYTHONSDK = p
-    if PYTHONSDK is None:
-        sys.exit("Cannot find the Python SDK")
-            
-########################################################################
-##
-## Locate the SSL SDK
-##
-########################################################################
-
-if sys.platform == "win32" or sys.platform == "cygwin":
-    SDK_SEARCH_PATHS = {
-        'ssl': [
-            "C:/openssl",
-            'thirdparty/ssl']
-else:
-    SDK_SEARCH_PATHS = {
-        'ssl': [
-            "/usr/include/ssl",
-            'thirdparty/win-python']
-for package in packages:
-    if SDK_LIB_PATH.get(package) is None:
-        for p in SDK_SEARCH_PATHS.get(package, '.'):
-            if os.path.isdir(p):
-                SDK_LIB_PATH[package] = p
-    if SDK_LIB_PATH.get(package) is None or not os.path.isdir(SDK_LIB_PATH.get(package)):
-        sys.exit("The SDK for %s was not found."%(package,))
-
-########################################################################
-##
-## Locate Visual Studio 7.0 or 7.1
-##
-## The visual studio compiler doesn't work unless you set up a
-## couple of environment variables to point at the compiler.
-##
-########################################################################
-
-if (COMPILER == "MSVC7" or COMPILER=="MSVC71"):
-    vcdir = GetRegistryKey("SOFTWARE\\Microsoft\\VisualStudio\\7.1", "InstallDir")
-    if ((vcdir == 0) or (vcdir[-13:] != "\\Common7\\IDE\\")):
-        vcdir = GetRegistryKey("SOFTWARE\\Microsoft\\VisualStudio\\7.0", "InstallDir")
-        if ((vcdir == 0) or (vcdir[-13:] != "\\Common7\\IDE\\")):
-            sys.exit("The registry does not appear to contain a pointer to the Visual Studio 7 install directory")
-    vcdir = vcdir[:-12]
-    old_env_path    = ""
-    old_env_include = ""
-    old_env_lib     = ""
-    if (os.environ.has_key("PATH")):    old_env_path    = os.environ["PATH"]
-    if (os.environ.has_key("INCLUDE")): old_env_include = os.environ["INCLUDE"]
-    if (os.environ.has_key("LIB")):     old_env_lib     = os.environ["LIB"]
-    os.environ["PATH"] = vcdir + "vc7\\bin;" + vcdir + "Common7\\IDE;" + vcdir + "Common7\\Tools;" + vcdir + "Common7\\Tools\\bin\\prerelease;" + vcdir + "Common7\\Tools\\bin;" + old_env_path
-    os.environ["INCLUDE"] = vcdir + "vc7\\ATLMFC\\INCLUDE;" + vcdir + "vc7\\include;" + vcdir + "vc7\\PlatformSDK\\include\\prerelease;" + vcdir + "vc7\\PlatformSDK\\include;" + old_env_include
-    os.environ["LIB"] = vcdir + "vc7\\ATLMFC\\LIB;" + vcdir + "vc7\\LIB;" + vcdir + "vc7\\PlatformSDK\\lib\\prerelease;" + vcdir + "vc7\\PlatformSDK\\lib;" + old_env_lib
-    sys.stdout.flush()
-
-##########################################################################################
-#
-# Disable Helix unless running under Windows
-#
-##########################################################################################
-
-if (sys.platform != "win32" or sys.platform == "cygwin"):
-    if (OMIT.count("HELIX")==0):
-        WARNINGS.append("HELIX not yet supported under linux")
-        WARNINGS.append("I have automatically added this command-line option: --no-helix")
-        OMIT.append("HELIX")
-
-##########################################################################################
-#
-# See if there's a "MILES" subdirectory under 'thirdparty'
-#
-##########################################################################################
-
-if (os.path.isdir(os.path.join(THIRDPARTY, "win-libs-vc7", "miles"))==0):
-    if (OMIT.count("MILES")==0):
-        WARNINGS.append("You do not have a copy of MILES sound system")
-        WARNINGS.append("I have automatically added this command-line option: --no-miles")
-        OMIT.append("MILES")
-
-##########################################################################################
-#
-# Enable or Disable runtime debugging mechanisms based on optimize level.
-#
-##########################################################################################
-
-for x in PACKAGES:
-    if (OMIT.count(x)==0):
-        if (DTOOLCONFIG.has_key("HAVE_"+x)):
-            DTOOLCONFIG["HAVE_"+x] = '1'
-
-DTOOLCONFIG["HAVE_NET"] = DTOOLCONFIG["HAVE_NSPR"]
-
-if (OMIT.count("NVIDIACG")==0):
-    DTOOLCONFIG["HAVE_CG"] = '1'
-    DTOOLCONFIG["HAVE_CGGL"] = '1'
-
-if (OPTIMIZE <= 3):
-    if (DTOOLCONFIG["HAVE_NET"] != 'UNDEF'):
-        DTOOLCONFIG["DO_PSTATS"] = '1'
-
-if (OPTIMIZE <= 3):
-    DTOOLCONFIG["DO_COLLISION_RECORDING"] = '1'
-
-#if (OPTIMIZE <= 2):
-#    DTOOLCONFIG["TRACK_IN_INTERPRETER"] = '1'
-
-if (OPTIMIZE <= 3):
-    DTOOLCONFIG["DO_MEMORY_USAGE"] = '1'
-
-#if (OPTIMIZE <= 1):
-#    DTOOLCONFIG["DO_PIPELINING"] = '1'
-
-if (OPTIMIZE <= 3):
-    DTOOLCONFIG["NOTIFY_DEBUG"] = '1'
-
-##########################################################################################
-#
-# Verify that LD_LIBRARY_PATH contains the PREFIX/lib directory.
-#
-# If not, add it on a temporary basis, and issue a warning.
-#
-##########################################################################################
-
-if (sys.platform != "win32" and sys.platform != "cygwin"):
-    BUILTLIB = os.path.abspath(PREFIX+"/lib")
-    try:
-        LDPATH = []
-        f = file("/etc/ld.so.conf","r")
-        for line in f: LDPATH.append(line.rstrip())
-        f.close()
-    except: LDPATH = []
-    if (os.environ.has_key("LD_LIBRARY_PATH")):
-        LDPATH = LDPATH + os.environ["LD_LIBRARY_PATH"].split(":")
-    if (LDPATH.count(BUILTLIB)==0):
-        WARNINGS.append("Caution: the "+PREFIX+"/lib directory is not in LD_LIBRARY_PATH")
-        WARNINGS.append("or /etc/ld.so.conf.  You must add it before using panda.")
-        if (os.environ.has_key("LD_LIBRARY_PATH")):
-            os.environ["LD_LIBRARY_PATH"] = BUILTLIB + ":" + os.environ["LD_LIBRARY_PATH"]
-        else:
-            os.environ["LD_LIBRARY_PATH"] = BUILTLIB
-
-########################################################################
-##
-## Give a Status Report on Command-Line Options
-##
-########################################################################
-
-def printStatus(header,warnings):
-    global VERBOSE
-    if VERBOSE >= -2:
-        print ""
-        print "-------------------------------------------------------------------"
-        print header
-        tkeep = ""
-        tomit = ""
-        for x in PACKAGES:
-            if (OMIT.count(x)==0): tkeep = tkeep + x + " "
-            else:                  tomit = tomit + x + " "
-        print "Makepanda: Prefix Directory:",PREFIX
-        print "Makepanda: Compiler:",COMPILER
-        print "Makepanda: Optimize:",OPTIMIZE
-        print "Makepanda: Keep Pkg:",tkeep
-        print "Makepanda: Omit Pkg:",tomit
-        print "Makepanda: Thirdparty dir:",THIRDPARTY
-        print "Makepanda: DirectX SDK dir:",DIRECTXSDK
-        print "Makepanda: Verbose vs. Quiet Level:",VERBOSE
-        print "Makepanda: PYTHONSDK:", PYTHONSDK
-        if (GENMAN): print "Makepanda: Generate API reference manual"
-        else       : print "Makepanda: Don't generate API reference manual"
-        if (sys.platform == "win32" or sys.platform == "cygwin"):
-            if INSTALLER:  print "Makepanda: Build installer, using",COMPRESSOR
-            else        :  print "Makepanda: Don't build installer"
-            if PPGAME!=0:  print "Makepanda: Build pprepackaged game ",PPGAME,"using",COMPRESSOR
-            else        :  print "Makepanda: Don't build pprepackaged game"
-        print "Makepanda: Version ID: "+VERSION
-        for x in warnings: print "Makepanda: "+x
-        print "-------------------------------------------------------------------"
-        print ""
-        sys.stdout.flush()
-
-printStatus("Makepanda Initial Status Report", WARNINGS)
-
-
-##########################################################################################
-#
-# Create the directory tree
-#
-##########################################################################################
-
-MakeDirectory(PREFIX)
-MakeDirectory(PREFIX+"/bin")
-MakeDirectory(PREFIX+"/lib")
-MakeDirectory(PREFIX+"/etc")
-MakeDirectory(PREFIX+"/plugins")
-MakeDirectory(PREFIX+"/pandac")
-MakeDirectory(PREFIX+"/pandac/input")
-MakeDirectory(PREFIX+"/include")
-MakeDirectory(PREFIX+"/include/parser-inc")
-MakeDirectory(PREFIX+"/include/parser-inc/openssl")
-MakeDirectory(PREFIX+"/include/parser-inc/Cg")
-MakeDirectory(PREFIX+"/include/openssl")
-MakeDirectory(PREFIX+"/direct")
-MakeDirectory(PREFIX+"/tmp")
-
-########################################################################
-##
-## PkgSelected(package-list,package)
-##
-## This function returns true if the package-list contains the
-## package, AND the OMIT list does not contain the package.
-##
-########################################################################
-
-def PkgSelected(pkglist, pkg):
-    if (pkglist.count(pkg)==0): return 0
-    if (OMIT.count(pkg)): return 0
-    return 1
-
-########################################################################
-##
-## These two globals accumulate a global list of everything compiled.
-##
-########################################################################
-
-ALLIN=[]
-ALLTARGETS=[]
-
-########################################################################
-##
-## The CXX include-cache.
-##
-## Dictionary: for each CXX source file, a list of all the
-## include-directives inside that file.
-##
-## Makepanda analyzes include-directives to determine the dependencies
-## of C source files.  This requires us to read the C source files,
-## a time-consuming process.  This means that doing a 'makepanda'
-## takes quite a bit of time, even if there's nothing to compile.
-##
-## To accelerate this process, we store the list of include-directives
-## in each source file in the "CXX include-cache".  This cache is
-## preserved (using the 'cPickle' module) from execution to execution
-## of makepanda.  The use of file dates in the cache makes it very
-## unlikely for the cache to get out-of-sync with the source tree.
-##
-########################################################################
-
-global CxxIncludeCache
-CxxIncludeCache = {}
-
-iCachePath=PREFIX+"/tmp/makepanda-icache"
-try: icache = open(iCachePath,'rb')
-except: icache = 0
-if (icache!=0):
-    CxxIncludeCache = cPickle.load(icache)
-    icache.close()
-
-########################################################################
-##
-## CxxGetIncludes
-##
-## return a list of the include-directives in a given source file
-##
-########################################################################
-
-global CxxIncludeRegex
-CxxIncludeRegex = re.compile('^[ \t]*[#][ \t]*include[ \t]+"([^"]+)"[ \t\r\n]*$')
-
-def CxxGetIncludes(path):
-    date = filedate(path)
-    if (CxxIncludeCache.has_key(path)):
-        cached = CxxIncludeCache[path]
-        if (cached[0]==date): return cached[1]
-    try: sfile = open(path, 'rb')
-    except: sys.exit("Cannot open source file \""+path+"\" for reading.")
-    include = []
-    for line in sfile:
-        match = CxxIncludeRegex.match(line,0)
-        if (match):
-            incname = match.group(1)
-            include.append(incname)
-    sfile.close()
-    CxxIncludeCache[path] = [date, include]
-    return include
-
-########################################################################
-##
-## CxxFindSource
-##
-## given a source file name and a directory list, searches the
-## directory list for the given source file.  Returns the full
-## pathname of the located file.
-##
-########################################################################
-
-def CxxFindSource(name, ipath):
-    for dir in ipath:
-        if (dir == "."): full = name
-        else: full = dir + "/" + name
-        if filedate(full) > 0: return full
-    return 0
-
-########################################################################
-##
-## CxxFindHeader
-##
-## given a source file name and an include directive in that source
-## file, locates the relevant header file.
-##
-########################################################################
-
-def CxxFindHeader(srcfile, incfile, ipath):
-    if (incfile[:1]=="."):
-        last = srcfile.rfind("/")
-        if (last < 0): sys.exit("CxxFindHeader cannot handle this case #1")
-        srcdir = srcfile[:last+1]
-        while (incfile[:1]=="."):
-            if (incfile[:2]=="./"):
-                incfile = incfile[2:]
-            elif (incfile[:3]=="../"):
-                incfile = incfile[3:]
-                last = srcdir[:-1].rfind("/")
-                if (last < 0): sys.exit("CxxFindHeader cannot handle this case #2")
-                srcdir = srcdir[:last+1]
-            else: sys.exit("CxxFindHeader cannot handle this case #3")
-        full = srcdir + incfile
-        if filedate(full) > 0: return full
-        return 0
-    else: return CxxFindSource(incfile, ipath)
-
-########################################################################
-##
-## CxxCalcDependencies(srcfile, ipath, ignore)
-##
-## Calculate the dependencies of a source file given a
-## particular include-path.  Any file in the list of files to
-## ignore is not considered.
-##
-########################################################################
-
-global CxxIgnoreHeader
-global CxxDependencyCache
-CxxIgnoreHeader = {}
-CxxDependencyCache = {}
-
-def CxxCalcDependencies(srcfile, ipath, ignore):
-    if (CxxDependencyCache.has_key(srcfile)):
-        return CxxDependencyCache[srcfile]
-    if (ignore.count(srcfile)): return []
-    dep = {}
-    dep[srcfile] = 1
-    includes = CxxGetIncludes(srcfile)
-    for include in includes:
-        if (CxxIgnoreHeader.has_key(include)==0):
-            header = CxxFindHeader(srcfile, include, ipath)
-            if (header==0):
-                print "CAUTION: header file "+include+" cannot be found."
-            else:
-                if (ignore.count(header)==0):
-                    hdeps = CxxCalcDependencies(header, ipath, [srcfile]+ignore)
-                    for x in hdeps: dep[x] = 1
-    result = dep.keys()
-    CxxDependencyCache[srcfile] = result
-    return result
-
-def CxxCalcDependenciesAll(srcfiles, ipath):
-    dep = {}
-    for srcfile in srcfiles:
-        for x in CxxCalcDependencies(srcfile, ipath, []):
-            dep[x] = 1
-    return dep.keys()
-
-########################################################################
-##
-## ConditionalWriteFile
-##
-## Creates the given file, but only if it doesn't already
-## contain the correct contents.
-##
-########################################################################
-
-def ConditionalWriteFile(dest,desiredcontents):
-    try:
-        rfile = open(dest, 'rb')
-        contents = rfile.read(-1)
-        rfile.close()
-    except:
-        contents=0
-    if contents != desiredcontents:
-        if VERBOSE:
-            print "Regenerating file: "+dest
-        sys.stdout.flush()
-        WriteFile(dest,desiredcontents)
-
-########################################################################
-##
-## CopyFile
-##
-## Copy a file into the build tree.
-##
-########################################################################
-
-def CopyFile(dstfile,srcfile):
-    if (dstfile[-1]=='/'):
-        dstdir = dstfile
-        fnl = srcfile.rfind("/")
-        if (fnl < 0): fn = srcfile
-        else: fn = srcfile[fnl+1:]
-        dstfile = dstdir + fn
-    if (older(dstfile,srcfile)):
-        global VERBOSE
-        if VERBOSE >= 1:
-            print "Copying \"%s\" --> \"%s\""%(srcfile, dstfile)
-        WriteFile(dstfile,ReadFile(srcfile))
-        updatefiledate(dstfile)
-    ALLTARGETS.append(dstfile)
-
-########################################################################
-##
-## CopyAllFiles
-##
-## Copy the contents of an entire directory into the build tree.
-##
-########################################################################
-
-def CopyAllFiles(dstdir, srcdir, suffix=""):
-    suflen = len(suffix)
-    files = os.listdir(srcdir)
-    for x in files:
-        if (os.path.isfile(srcdir+x)):
-            if (suflen==0) or (x[-suflen:]==suffix):
-                CopyFile(dstdir+x, srcdir+x)
-
-########################################################################
-##
-## CopyTree
-##
-## Copy a directory into the build tree.
-##
-########################################################################
-
-def CopyTree(dstdir,srcdir):
-    if (os.path.isdir(dstdir)): return 0
-    if (COMPILER=="MSVC7" or COMPILER=="MSVC71"): cmd = 'xcopy.exe /I/Y/E/Q "' + srcdir + '" "' + dstdir + '"'
-    elif (COMPILER=="LINUXA"): cmd = 'cp --recursive --force ' + srcdir + ' ' + dstdir
-    oscmd(cmd)
-    updatefiledate(dstdir)
-
-def CompileBison(pre, dstc, dsth, src):
-    """
-    Generate a CXX file from a source YXX file.
-    """
-    (base, fn) = os.path.split(src)
-    dstc=base+"/"+dstc
-    dsth=base+"/"+dsth
-    if (older(dstc,src) or older(dsth,src)):
-        CopyFile(PREFIX+"/tmp/", src)
-        if (COMPILER=="MSVC7"):
-            CopyFile(PREFIX+"/tmp/", "thirdparty/win-util/bison.simple")
-            bisonFullPath=os.path.abspath("thirdparty/win-util/bison.exe")
-            oslocalcmd(PREFIX+"/tmp", bisonFullPath+" -y -d -p " + pre + " " + fn)
-            osmove(PREFIX+"/tmp/y_tab.c", dstc)
-            osmove(PREFIX+"/tmp/y_tab.h", dsth)
-        elif (COMPILER=="LINUXA"):
-            oslocalcmd(PREFIX+"/tmp", "bison -y -d -p "+pre+" "+fn)
-            osmove(PREFIX+"/tmp/y.tab.c", dstc)
-            osmove(PREFIX+"/tmp/y.tab.h", dsth)
-        else:
-            oslocalcmd(PREFIX+"/tmp", "bison -y -d -p "+pre+" "+fn)
-            osmove(PREFIX+"/tmp/y.tab.c", dstc)
-            osmove(PREFIX+"/tmp/y.tab.h", dsth)
-        updatefiledate(dstc)
-        updatefiledate(dsth)
-
-def CompileFlex(pre,dst,src,dashi):
-    """
-    Generate a CXX file from a source LXX file.
-    """
-    last = src.rfind("/")
-    fn = src[last+1:]
-    dst = PREFIX+"/tmp/"+dst
-    if (older(dst,src)):
-        CopyFile(PREFIX+"/tmp/", src)
-        if (COMPILER=="MSVC7" or COMPILER=="MSVC71"):
-            flexFullPath=os.path.abspath("thirdparty/win-util/flex.exe")
-            if (dashi): oslocalcmd(PREFIX+"/tmp", flexFullPath+" -i -P" + pre + " -olex.yy.c " + fn)
-            else:       oslocalcmd(PREFIX+"/tmp", flexFullPath+"    -P" + pre + " -olex.yy.c " + fn)
-            replaceInFile(PREFIX+'/tmp/lex.yy.c', dst, '#include <unistd.h>', '')
-        elif (COMPILER=="LINUXA"):
-            if (dashi): oslocalcmd(PREFIX+"/tmp", "flex -i -P" + pre + " -olex.yy.c " + fn)
-            else:       oslocalcmd(PREFIX+"/tmp", "flex    -P" + pre + " -olex.yy.c " + fn)
-            oscmd('cp '+PREFIX+'/tmp/lex.yy.c '+dst)
-        updatefiledate(dst)
-
-########################################################################
-##
-## CompileC
-##
-## Generate an OBJ file from a source CXX file.
-##
-########################################################################
-
-priorIPath=None
-def checkIfNewDir(path):
-    global priorIPath
-    if priorIPath != path:
-        print "\nStarting compile in \"%s\" (%s):\n"%(path,prettyTime(time.time()-STARTTIME),)
-    priorIPath=path
-
-def CompileC(obj=0,src=0,ipath=[],opts=[]):
-    global VERBOSE
-    if ((obj==0)|(src==0)): sys.exit("syntax error in CompileC directive")
-    ipath = [PREFIX+"/tmp"] + ipath + [PREFIX+"/include"]
-    fullsrc = CxxFindSource(src, ipath)
-    if (fullsrc == 0): sys.exit("Cannot find source file "+src)
-    dep = CxxCalcDependencies(fullsrc, ipath, [])
-
-    if (COMPILER=="MSVC7" or COMPILER=="MSVC71"):
-        wobj = PREFIX+"/tmp/"+obj
-        if (older(wobj, dep)):
-            if VERBOSE >= 0:
-                checkIfNewDir(ipath[1])
-            cmd = "cl.exe /Fo" + wobj + " /nologo /c"
-            cmd = cmd + " /I" + PREFIX + "/python/include"
-            if (opts.count("DXSDK")): cmd = cmd + ' /I"' + DIRECTXSDK + '/include"'
-            for ver in ["MAYA5","MAYA6","MAYA65"]:
-              if (opts.count(ver)): cmd = cmd + ' /I"' + MAYASDK[ver] + '/include"'
-            for max in ["MAX5","MAX6","MAX7"]:
-                if (PkgSelected(opts,max)):
-                    cmd = cmd + ' /I"' + MAXSDK[max] + '/include" /I"' + MAXSDKCS[max] + '" /D' + max
-            for pkg in PACKAGES:
-                if (pkg[:4] != "MAYA") and PkgSelected(opts,pkg):
-                    cmd = cmd + " /I" + SDK_LIB_PATH.get(pkg.lower(), '.') + "/include"
-            for x in ipath: cmd = cmd + " /I" + x
-            if (opts.count('NOFLOATWARN')): cmd = cmd + ' /wd4244 /wd4305'
-            if (opts.count("WITHINPANDA")): cmd = cmd + ' /DWITHIN_PANDA'
-            if (OPTIMIZE==1): cmd = cmd + " /Zc:forScope /MD /Zi /O2 /Ob2 /DFORCE_INLINING /RTCs /GS"
-            if (OPTIMIZE==2): cmd = cmd + " /Zc:forScope /MD /Zi /O2 /Ob2 /DFORCE_INLINING "
-            if (OPTIMIZE==3): cmd = cmd + " /Zc:forScope /MD /Zi /O2 /Ob2 /DFORCE_INLINING "
-            if (OPTIMIZE==4): cmd = cmd + " /Zc:forScope /MD /Zi /O2 /Ob2 /DFORCE_INLINING /GL /DNDEBUG "
-            cmd = cmd + " /Fd" + wobj[:-4] + ".pdb"
-            building = buildingwhat(opts)
-            if (building): cmd = cmd + " /DBUILDING_" + building
-            cmd = cmd + " /EHsc /Zm300 /DWIN32_VC /DWIN32 /W3 " + fullsrc
-            oscmd(cmd)
-            updatefiledate(wobj)
-    elif (COMPILER=="LINUXA"):
-        wobj = PREFIX+"/tmp/" + obj[:-4] + ".o"
-        if (older(wobj, dep)):
-            if VERBOSE >= 0:
-                checkIfNewDir(ipath[1])
-            if (src[-2:]==".c"): cmd = 'gcc -c -o ' + wobj
-            else:                cmd = 'g++ -ftemplate-depth-30 -c -o ' + wobj
-            cmd = cmd + ' -I"' + PYTHONSDK + '"'
-            if (PkgSelected(opts,"VRPN")):     cmd = cmd + ' -I' + THIRDPARTY + '/linux-libs-a/vrpn/include'
-            if (PkgSelected(opts,"FFTW")):     cmd = cmd + ' -I' + THIRDPARTY + '/linux-libs-a/fftw/include'
-            if (PkgSelected(opts,"FMOD")):     cmd = cmd + ' -I' + THIRDPARTY + '/linux-libs-a/fmod/include'
-            if (PkgSelected(opts,"NVIDIACG")): cmd = cmd + ' -I' + THIRDPARTY + '/linux-libs-a/nvidiacg/include'
-            if (PkgSelected(opts,"NSPR")):     cmd = cmd + ' -I' + NSPR_SDK + '/include'
-            if (PkgSelected(opts,"FREETYPE")): cmd = cmd + ' -I/usr/include/freetype2'
-            for x in ipath: cmd = cmd + ' -I' + x
-            if (opts.count("WITHINPANDA")): cmd = cmd + ' -DWITHIN_PANDA'
-            if (OPTIMIZE==1): cmd = cmd + " -g"
-            if (OPTIMIZE==2): cmd = cmd + " -O1"
-            if (OPTIMIZE==3): cmd = cmd + " -O2"
-            if (OPTIMIZE==4): cmd = cmd + " -O2"
-            building = buildingwhat(opts)
-            if (building): cmd = cmd + " -DBUILDING_" + building
-            cmd = cmd + ' ' + fullsrc
-            oscmd(cmd)
-            updatefiledate(wobj)
-
-########################################################################
-##
-## CompileRES
-##
-## Generate an RES file from a source RC file.
-##
-########################################################################
-
-def CompileRES(obj=0,src=0,ipath=[],opts=[]):
-    if ((obj==0)|(src==0)): sys.exit("syntax error in CompileRES directive")
-    fullsrc = CxxFindSource(src, ipath)
-    if (fullsrc == 0): sys.exit("Cannot find source file "+src)
-    obj = PREFIX+"/tmp/"+obj
-    wdep = CxxCalcDependencies(fullsrc, ipath, [])
-
-    if (COMPILER=="MSVC7" or COMPILER=="MSVC71"):
-        if (older(obj, wdep)):
-            cmd = 'rc.exe /d "NDEBUG" /l 0x409'
-            for x in ipath: cmd = cmd + " /I" + x
-            cmd = cmd + ' /fo' + obj
-            cmd = cmd + ' ' + fullsrc
-            oscmd(cmd)
-            updatefiledate(obj)
-    elif (COMPILER=="LINUXA"):
-        sys.exit("Can only compile RES files on Windows.")
-
-########################################################################
-##
-## Interrogate
-##
-## Generate an IN file and a CXX-stub file from CXX source files
-##
-########################################################################
-
-def Interrogate(ipath=0, opts=0, outd=0, outc=0, src=0, module=0, library=0, files=0):
-    if ((ipath==0)|(opts==0)|(outd==0)|(outc==0)|(src==0)|(module==0)|(library==0)|(files==0)):
-        sys.exit("syntax error in Interrogate directive")
-    ALLIN.append(outd)
-    ipath = [PREFIX+"/tmp"] + ipath + [PREFIX+"/include"]
-    outd = PREFIX+"/pandac/input/"+outd
-    outc = PREFIX+"/tmp/"+outc
-    paths = xpaths(src+"/",files,"")
-    dep = CxxCalcDependenciesAll(paths, ipath)
-    dotdots = ""
-    for i in range(0,src.count("/")+1): dotdots = dotdots + "../"
-    building = 0
-    for x in opts:
-        if (x[:9]=="BUILDING_"): building = x[9:]
-    if (older(outc, dep) or older(outd, dep)):
-        if (COMPILER=="MSVC7"):
-            cmd = dotdots + PREFIX + "/bin/interrogate.exe"
-            cmd = cmd + ' -DCPPPARSER -D__STDC__=1 -D__cplusplus -longlong __int64 -D_X86_ -DWIN32_VC -D_WIN32'
-            cmd = cmd + ' -D"_declspec(param)=" -D_near -D_far -D__near -D__far -D__stdcall'
-            if (OPTIMIZE==1): cmd = cmd + ' '
-            if (OPTIMIZE==2): cmd = cmd + ' '
-            if (OPTIMIZE==3): cmd = cmd + ' -DFORCE_INLINING'
-            if (OPTIMIZE==4): cmd = cmd + ' -DFORCE_INLINING'
-            cmd = cmd + ' -S' + dotdots + PREFIX + '/include/parser-inc'
-            cmd = cmd + ' -I' + dotdots + PREFIX + '/python/include'
-            for pkg in PACKAGES:
-                if (PkgSelected(opts,pkg)):
-                    cmd = cmd + ' -I' + dotdots + THIRDPARTY + "/win-libs-vc7/" + pkg.lower() + "/include"
-        elif (COMPILER=="MSVC71"):
-            cmd = dotdots + PREFIX + "/bin/interrogate.exe"
-            cmd = cmd + ' -DCPPPARSER -D__STDC__=1 -D__cplusplus -longlong __int64 -D_X86_ -DWIN32_VC -D_WIN32'
-            cmd = cmd + ' -D"_declspec(param)=" -D_near -D_far -D__near -D__far -D__stdcall'
-            if (OPTIMIZE==1): cmd = cmd + ' '
-            if (OPTIMIZE==2): cmd = cmd + ' '
-            if (OPTIMIZE==3): cmd = cmd + ' -DFORCE_INLINING'
-            if (OPTIMIZE==4): cmd = cmd + ' -DFORCE_INLINING'
-            cmd = cmd + ' -S' + dotdots + PREFIX + '/include/parser-inc'
-            cmd = cmd + ' -I' + dotdots + PREFIX + '/python/include'
-            for pkg in PACKAGES:
-                if (PkgSelected(opts,pkg)):
-                    cmd = cmd + ' -I' + dotdots + THIRDPARTY + "/win-libs-vc7/" + pkg.lower() + "/include"
-        elif (COMPILER=="LINUXA"):
-            cmd = dotdots + PREFIX + '/bin/interrogate'
-            cmd = cmd + ' -DCPPPARSER -D__STDC__=1 -D__cplusplus -D__i386__ -D__const=const'
-            if (OPTIMIZE==1): cmd = cmd + ' '
-            if (OPTIMIZE==2): cmd = cmd + ' '
-            if (OPTIMIZE==3): cmd = cmd + ' '
-            if (OPTIMIZE==4): cmd = cmd + ' '
-            cmd = cmd + ' -S' + dotdots + PREFIX + '/include/parser-inc -S/usr/include'
-            cmd = cmd + ' -I' + dotdots + PREFIX + '/python/include'
-            for pkg in PACKAGES:
-                if (PkgSelected(opts,pkg)):
-                    cmd = cmd + ' -I' + dotdots + THIRDPARTY + "/linux-libs-a/" + pkg.lower() + "/include"
-        else:
-            cmd = dotdots + PREFIX + '/bin/interrogate'
-            cmd = cmd + ' -DCPPPARSER -D__STDC__=1 -D__cplusplus -D__i386__ -D__const=const'
-            if (OPTIMIZE==1): cmd = cmd + ' '
-            if (OPTIMIZE==2): cmd = cmd + ' '
-            if (OPTIMIZE==3): cmd = cmd + ' '
-            if (OPTIMIZE==4): cmd = cmd + ' '
-            cmd = cmd + ' -S' + dotdots + PREFIX + '/include/parser-inc -S/usr/include'
-            cmd = cmd + ' -I' + dotdots + PREFIX + '/python/include'
-            for pkg in PACKAGES:
-                if (PkgSelected(opts,pkg)):
-                    cmd = cmd + ' -I' + dotdots + THIRDPARTY + "/linux-libs-a/" + pkg.lower() + "/include"
-        cmd = cmd + ' -oc ' + dotdots + outc + ' -od ' + dotdots + outd
-        cmd = cmd + ' -fnames -string -refcount -assert -python'
-        for x in ipath: cmd = cmd + ' -I' + dotdots + x
-        if (building): cmd = cmd + " -DBUILDING_"+building
-        if (opts.count("WITHINPANDA")): cmd = cmd + " -DWITHIN_PANDA"
-        cmd = cmd + ' -module ' + module + ' -library ' + library
-        if ((COMPILER=="MSVC7" or COMPILER=="MSVC71") and opts.count("DXSDK")):
-            cmd = cmd + ' -I"' + DIRECTXSDK + '/include"'
-        for ver in ["MAYA5","MAYA6","MAYA65"]:
-          if ((COMPILER=="MSVC7" or COMPILER=="MSVC71") and opts.count(ver)):
-              cmd = cmd + ' -I"' + MAYASDK[ver] + '/include"'
-        for x in files: cmd = cmd + ' ' + x
-        oslocalcmd(src, cmd)
-        updatefiledate(outd)
-        updatefiledate(outc)
-
-########################################################################
-##
-## InterrogateModule
-##
-## Generate a python-stub CXX file from a bunch of IN files.
-##
-########################################################################
-
-def InterrogateModule(outc=0, module=0, library=0, files=0):
-    if ((outc==0)|(module==0)|(library==0)|(files==0)):
-        sys.exit("syntax error in InterrogateModule directive")
-    outc = PREFIX+"/tmp/"+outc
-    files = xpaths(PREFIX+"/pandac/input/",files,"")
-    if (older(outc, files)):
-        global VERBOSE
-        if VERBOSE >= 1:
-            print "Generating Python-stub cxx file for %s"%(library,)
-        if (COMPILER=="MSVC7" or COMPILER=="MSVC71"):
-            cmd = PREFIX + '/bin/interrogate_module.exe '
-        elif (COMPILER=="LINUXA"):
-            cmd = PREFIX + '/bin/interrogate_module '
-        cmd = cmd + ' -oc ' + outc + ' -module ' + module + ' -library ' + library + ' -python '
-        for x in files: cmd = cmd + ' ' + x
-        oscmd(cmd)
-        updatefiledate(outc)
-
-########################################################################
-##
-## CompileLIB
-##
-## Generate a LIB file from a bunch of OBJ files.
-##
-########################################################################
-
-def CompileLIB(lib=0, obj=[], opts=[]):
-    if (lib==0): sys.exit("syntax error in CompileLIB directive")
-
-    if (COMPILER=="MSVC7" or COMPILER=="MSVC71"):
-        if (lib[-4:]==".ilb"): wlib = PREFIX+"/tmp/" + lib[:-4] + ".lib"
-        else:                  wlib = PREFIX+"/lib/" + lib[:-4] + ".lib"
-        wobj = xpaths(PREFIX+"/tmp/",obj,"")
-        ALLTARGETS.append(wlib)
-        if (older(wlib, wobj)):
-            cmd = 'lib.exe /nologo /OUT:' + wlib
-            if (OPTIMIZE==4): cmd = cmd + " /LTCG "
-            for x in wobj: cmd = cmd + ' ' + x
-            oscmd(cmd)
-            updatefiledate(wlib)
-    elif (COMPILER=="LINUXA"):
-        if (lib[-4:]==".ilb"): wlib = PREFIX+"/tmp/" + lib[:-4] + ".a"
-        else:                  wlib = PREFIX+"/lib/" + lib[:-4] + ".a"
-        wobj = []
-        for x in obj: wobj.append(PREFIX + "/tmp/" + x[:-4] + ".o")
-        if (older(wlib, wobj)):
-            cmd = 'ar cru ' + wlib
-            for x in wobj: cmd=cmd + ' ' + x
-            oscmd(cmd)
-            updatefiledate(wlib)
-
-########################################################################
-##
-## CompileLink
-##
-## Generate a DLL or EXE file from a bunch of OBJ and LIB files.
-##
-########################################################################
-
-def CompileLink(dll=0, obj=[], opts=[], xdep=[]):
-    if (dll==0): sys.exit("Syntax error in CompileLink directive")
-
-    if (COMPILER=="MSVC7" or COMPILER=="MSVC71"):
-        lib = PREFIX+"/lib/"+dll[:-4]+".lib"
-        if ((dll[-4:] != ".exe") and (dll[-4:] != ".dll")):
-            dll = PREFIX+"/plugins/"+dll
-        else:
-            dll = PREFIX+"/bin/"+dll
-        ALLTARGETS.append(dll)
-        wobj = []
-        for x in obj:
-            suffix = x[-4:]
-            if   (suffix==".obj"): wobj.append(PREFIX+"/tmp/"+x)
-            elif (suffix==".dll"): wobj.append(PREFIX+"/lib/"+x[:-4]+".lib")
-            elif (suffix==".lib"): wobj.append(PREFIX+"/lib/"+x)
-            elif (suffix==".ilb"): wobj.append(PREFIX+"/tmp/"+x[:-4]+".lib")
-            elif (suffix==".res"): wobj.append(PREFIX+"/tmp/"+x)
-            else: sys.exit("unknown suffix in object list.")
-        if (older(dll, wobj+xdep)):
-            cmd = 'link.exe /nologo /NODEFAULTLIB:LIBCI.LIB'
-            if (dll[-4:]!=".exe"): cmd = cmd + " /DLL"
-            if (OPTIMIZE==1): cmd = cmd + " /DEBUG /NODEFAULTLIB:MSVCRTD.LIB /OPT:REF "
-            if (OPTIMIZE==2): cmd = cmd + " /DEBUG /NODEFAULTLIB:MSVCRTD.LIB /OPT:REF "
-            if (OPTIMIZE==3): cmd = cmd + " /DEBUG /NODEFAULTLIB:MSVCRTD.LIB /OPT:REF "
-            if (OPTIMIZE==4): cmd = cmd + " /DEBUG /NODEFAULTLIB:MSVCRTD.LIB /OPT:REF /LTCG "
-            cmd = cmd + " /MAP /MAPINFO:EXPORTS /MAPINFO:LINES /fixed:no /incremental:no /stack:4194304 "
-            if (opts.count("NOLIBCI")): cmd = cmd + " /NODEFAULTLIB:LIBCI.LIB "
-            if (opts.count("MAXEGGDEF")): cmd = cmd + ' /DEF:pandatool/src/maxegg/MaxEgg.def'
-            cmd = cmd + ' /OUT:' + dll + ' /IMPLIB:' + lib + ' /MAP:NUL'
-            cmd = cmd + ' /LIBPATH:' + PREFIX + '/python/libs '
-            for x in wobj: cmd = cmd + ' ' + x
-            if (dll[-4:]==".exe"): cmd = cmd + ' ' + PREFIX + '/tmp/pandaIcon.res'
-            if (opts.count("D3D8") or opts.count("D3D9") or opts.count("DXDRAW") or opts.count("DXSOUND") or opts.count("DXGUID")):
-                cmd = cmd + ' /LIBPATH:"' + DIRECTXSDK + '/lib/x86"'
-                cmd = cmd + ' /LIBPATH:"' + DIRECTXSDK + '/lib"'
-            if (opts.count("D3D8")):        cmd = cmd + ' d3d8.lib d3dx8.lib dxerr8.lib'
-            if (opts.count("D3D9")):        cmd = cmd + ' d3d9.lib d3dx9.lib dxerr9.lib'
-            if (opts.count("DXDRAW")):      cmd = cmd + ' ddraw.lib'
-            if (opts.count("DXSOUND")):     cmd = cmd + ' dsound.lib'
-            if (opts.count("DXGUID")):      cmd = cmd + ' dxguid.lib'
-            if (opts.count("WINSOCK")):     cmd = cmd + " wsock32.lib"
-            if (opts.count("WINSOCK2")):    cmd = cmd + " wsock32.lib ws2_32.lib"
-            if (opts.count("WINCOMCTL")):   cmd = cmd + ' comctl32.lib'
-            if (opts.count("WINCOMDLG")):   cmd = cmd + ' comdlg32.lib'
-            if (opts.count("WINUSER")):     cmd = cmd + " user32.lib"
-            if (opts.count("WINMM")):       cmd = cmd + " winmm.lib"
-            if (opts.count("WINIMM")):      cmd = cmd + " imm32.lib"
-            if (opts.count("WINKERNEL")):   cmd = cmd + " kernel32.lib"
-            if (opts.count("WINOLDNAMES")): cmd = cmd + " oldnames.lib"
-            if (opts.count("WINGDI")):      cmd = cmd + " gdi32.lib"
-            if (opts.count("ADVAPI")):      cmd = cmd + " advapi32.lib"
-            if (opts.count("GLUT")):        cmd = cmd + " opengl32.lib glu32.lib"
-            if (PkgSelected(opts,"ZLIB")):     cmd = cmd + ' ' + THIRDPARTY + '/win-libs-vc7/zlib/lib/libz.lib'
-            if (PkgSelected(opts,"PNG")):      cmd = cmd + ' ' + THIRDPARTY + '/win-libs-vc7/png/lib/libpng.lib'
-            if (PkgSelected(opts,"JPEG")):     cmd = cmd + ' ' + THIRDPARTY + '/win-libs-vc7/jpeg/lib/libjpeg.lib'
-            if (PkgSelected(opts,"TIFF")):     cmd = cmd + ' ' + THIRDPARTY + '/win-libs-vc7/tiff/lib/libtiff.lib'
-            if (PkgSelected(opts,"VRPN")):
-                cmd = cmd + ' ' + THIRDPARTY + '/win-libs-vc7/vrpn/lib/vrpn.lib'
-                cmd = cmd + ' ' + THIRDPARTY + '/win-libs-vc7/vrpn/lib/quat.lib'
-            if (PkgSelected(opts,"FMOD")):
-                cmd = cmd + ' ' + THIRDPARTY + '/win-libs-vc7/fmod/lib/fmod.lib'
-            if (PkgSelected(opts,"MILES")):
-                cmd = cmd + ' ' + THIRDPARTY + '/win-libs-vc7/miles/lib/mss32.lib'
-            if (PkgSelected(opts,"NVIDIACG")):
-                if (opts.count("CGGL")):
-                    cmd = cmd + ' ' + THIRDPARTY + '/win-libs-vc7/nvidiacg/lib/cgGL.lib'
-                cmd = cmd + ' ' + THIRDPARTY + '/win-libs-vc7/nvidiacg/lib/cg.lib'
-            if (PkgSelected(opts,"HELIX")):
-                cmd = cmd + ' ' + THIRDPARTY + '/win-libs-vc7/helix/lib/runtlib.lib'
-                cmd = cmd + ' ' + THIRDPARTY + '/win-libs-vc7/helix/lib/syslib.lib'
-                cmd = cmd + ' ' + THIRDPARTY + '/win-libs-vc7/helix/lib/contlib.lib'
-                cmd = cmd + ' ' + THIRDPARTY + '/win-libs-vc7/helix/lib/debuglib.lib'
-                cmd = cmd + ' ' + THIRDPARTY + '/win-libs-vc7/helix/lib/utillib.lib'
-                cmd = cmd + ' ' + THIRDPARTY + '/win-libs-vc7/helix/lib/stlport_vc7.lib'
-            if (PkgSelected(opts,"NSPR")):
-                cmd = cmd + ' ' + SDK_LIB_PATH['nspr'] + '/nspr4.lib'
-            if (PkgSelected(opts,"SSL")):
-                cmd = cmd + ' ' + SDK_LIB_PATH['ssl'] + '/ssleay32.lib'
-                cmd = cmd + ' ' + SDK_LIB_PATH['ssl'] + '/libeay32.lib'
-            if (PkgSelected(opts,"FREETYPE")):
-                cmd = cmd + ' ' + THIRDPARTY + '/win-libs-vc7/freetype/lib/libfreetype.lib'
-            if (PkgSelected(opts,"FFTW")):
-                cmd = cmd + ' ' + THIRDPARTY + '/win-libs-vc7/fftw/lib/rfftw.lib'
-                cmd = cmd + ' ' + THIRDPARTY + '/win-libs-vc7/fftw/lib/fftw.lib'
-            for maya in ["MAYA5","MAYA6","MAYA65"]:
-                if (PkgSelected(opts,maya)):
-                    cmd = cmd + ' "' + MAYASDK[maya] +  '/lib/Foundation.lib"'
-                    cmd = cmd + ' "' + MAYASDK[maya] +  '/lib/OpenMaya.lib"'
-                    cmd = cmd + ' "' + MAYASDK[maya] +  '/lib/OpenMayaAnim.lib"'
-            for max in ["MAX5","MAX6","MAX7"]:
-                if PkgSelected(opts,max):
-                    cmd = cmd + ' "' + MAXSDK[max] +  '/lib/core.lib"'
-                    cmd = cmd + ' "' + MAXSDK[max] +  '/lib/edmodel.lib"'
-                    cmd = cmd + ' "' + MAXSDK[max] +  '/lib/gfx.lib"'
-                    cmd = cmd + ' "' + MAXSDK[max] +  '/lib/geom.lib"'
-                    cmd = cmd + ' "' + MAXSDK[max] +  '/lib/mesh.lib"'
-                    cmd = cmd + ' "' + MAXSDK[max] +  '/lib/maxutil.lib"'
-                    cmd = cmd + ' "' + MAXSDK[max] +  '/lib/paramblk2.lib"'
-            oscmd(cmd)
-            updatefiledate(dll)
-            if ((OPTIMIZE == 1) and (dll[-4:]==".dll")):
-                CopyFile(dll[:-4]+"_d.dll", dll)
-    elif (COMPILER=="LINUXA"):
-        ALLTARGETS.append(PREFIX+"/lib/"+dll[:-4]+".so")
-        if (dll[-4:]==".exe"): wdll = PREFIX+"/bin/"+dll[:-4]
-        else: wdll = PREFIX+"/lib/"+dll[:-4]+".so"
-        wobj = []
-        for x in obj:
-            suffix = x[-4:]
-            if   (suffix==".obj"): wobj.append(PREFIX+"/tmp/"+x[:-4]+".o")
-            elif (suffix==".dll"): wobj.append(PREFIX+"/lib/"+x[:-4]+".so")
-            elif (suffix==".lib"): wobj.append(PREFIX+"/lib/"+x[:-4]+".a")
-            elif (suffix==".ilb"): wobj.append(PREFIX+"/tmp/"+x[:-4]+".a")
-            else: sys.exit("unknown suffix in object list.")
-        if (older(wdll, wobj+xdep)):
-            if (dll[-4:]==".exe"): cmd = 'g++ -o ' + wdll + ' -L' + PREFIX + '/lib'
-            else:                  cmd = 'g++ -shared -o ' + wdll + ' -L' + PREFIX + '/lib'
-            for x in obj:
-                suffix = x[-4:]
-                if   (suffix==".obj"): cmd = cmd + ' ' + PREFIX + '/tmp/' + x[:-4] + '.o'
-                elif (suffix==".dll"): cmd = cmd + ' -l' + x[3:-4]
-                elif (suffix==".lib"): cmd = cmd + ' ' + PREFIX + '/lib/' + x[:-4] + '.a'
-                elif (suffix==".ilb"): cmd = cmd + ' ' + PREFIX + '/tmp/' + x[:-4] + '.a'
-            if (PkgSelected(opts,"FMOD")):     cmd = cmd + ' -L' + THIRDPARTY + '/linux-libs-a/fmod/lib -lfmod-3.74'
-            if (PkgSelected(opts,"NVIDIACG")):
-                cmd = cmd + ' -L' + THIRDPARTY + 'nvidiacg/lib '
-                if (opts.count("CGGL")): cmd = cmd + " -lCgGL"
-                cmd = cmd + " -lCg"
-            if (PkgSelected(opts,"NSPR")):     cmd = cmd + ' -L' + NSPR_SDK + '/lib -lpandanspr4'
-            if (PkgSelected(opts,"ZLIB")):     cmd = cmd + " -lz"
-            if (PkgSelected(opts,"PNG")):      cmd = cmd + " -lpng"
-            if (PkgSelected(opts,"JPEG")):     cmd = cmd + " -ljpeg"
-            if (PkgSelected(opts,"TIFF")):     cmd = cmd + " -ltiff"
-            if (PkgSelected(opts,"SSL")):      cmd = cmd + " -lssl"
-            if (PkgSelected(opts,"FREETYPE")): cmd = cmd + " -lfreetype"
-            if (PkgSelected(opts,"VRPN")):     cmd = cmd + ' -L' + THIRDPARTY + '/linux-libs-a/vrpn/lib -lvrpn -lquat'
-            if (PkgSelected(opts,"FFTW")):     cmd = cmd + ' -L' + THIRDPARTY + '/linux-libs-a/fftw/lib -lrfftw -lfftw'
-            if (opts.count("GLUT")):           cmd = cmd + " -lGL -lGLU"
-            oscmd(cmd)
-            updatefiledate(wdll)
-
-##########################################################################################
-#
-# CompileBAM
-#
-# Generate a BAM file from an EGG or FLT
-#
-##########################################################################################
-
-def CompileBAM(preconv, bam, egg):
-    dotexe = ".exe"
-    if (sys.platform != "win32" or sys.platform == "cygwin"): dotexe = ""
-    if (older(bam, egg)):
-        if (egg[-4:]==".flt"):
-            oscmd(PREFIX + "/bin/flt2egg" + dotexe + " -pr " + preconv + " -o " + PREFIX + "/tmp/tmp.egg" + " " + egg)
-            oscmd(PREFIX + "/bin/egg2bam" + dotexe + " -o " + bam + " " + PREFIX + "/tmp/tmp.egg")
-        else:
-            oscmd(PREFIX + "/bin/egg2bam" + dotexe + " -pr " + preconv + " -o " + bam + " " + egg)
-
-##########################################################################################
-#
-# If the 'make depend' process discovers an 'include'
-# directive that includes one of the following files,
-# the specified file is not added as a dependency,
-# nor is it traversed.
-#
-##########################################################################################
-
-CxxIgnoreHeader["Python.h"] = 1
-CxxIgnoreHeader["Python/Python.h"] = 1
-CxxIgnoreHeader["alloc.h"] = 1
-CxxIgnoreHeader["ctype.h"] = 1
-CxxIgnoreHeader["stdlib.h"] = 1
-CxxIgnoreHeader["ipc_thread.h"] = 1
-CxxIgnoreHeader["platform/symbian/symbian_print.h"] = 1
-CxxIgnoreHeader["hxtypes.h"] = 1
-CxxIgnoreHeader["hxcom.h"] = 1
-CxxIgnoreHeader["hxiids.h"] = 1
-CxxIgnoreHeader["hxpiids.h"] = 1
-CxxIgnoreHeader["dsound.h"] = 1
-CxxIgnoreHeader["hlxosstr.h"] = 1
-CxxIgnoreHeader["ddraw.h"] = 1
-CxxIgnoreHeader["mss.h"] = 1
-CxxIgnoreHeader["MacSocket.h"] = 1
-CxxIgnoreHeader["textureTransition.h"] = 1
-CxxIgnoreHeader["transformTransition.h"] = 1
-CxxIgnoreHeader["billboardTransition.h"] = 1
-CxxIgnoreHeader["transformTransition.h"] = 1
-CxxIgnoreHeader["transparencyTransition.h"] = 1
-CxxIgnoreHeader["allTransitionsWrapper.h"] = 1
-CxxIgnoreHeader["allTransitionsWrapper.h"] = 1
-CxxIgnoreHeader["namedNode.h"] = 1
-CxxIgnoreHeader["renderRelation.h"] = 1
-CxxIgnoreHeader["renderTraverser.h"] = 1
-CxxIgnoreHeader["get_rel_pos.h"] = 1
-CxxIgnoreHeader["Max.h"] = 1
-CxxIgnoreHeader["iparamb2.h"] = 1
-CxxIgnoreHeader["iparamm2.h"] = 1
-CxxIgnoreHeader["istdplug.h"] = 1
-CxxIgnoreHeader["iskin.h"] = 1
-CxxIgnoreHeader["stdmat.h"] = 1
-CxxIgnoreHeader["phyexp.h"] = 1
-CxxIgnoreHeader["bipexp.h"] = 1
-CxxIgnoreHeader["windows.h"] = 1
-CxxIgnoreHeader["windef.h"] = 1
-CxxIgnoreHeader["modstack.h"] = 1
-CxxIgnoreHeader["afxres.h"] = 1
-
-##########################################################################################
-#
-# Generate pandaVersion.h
-#
-##########################################################################################
-
-VERSION1=int(VERSION.split(".")[0])
-VERSION2=int(VERSION.split(".")[1])
-VERSION3=int(VERSION.split(".")[2])
-NVERSION=VERSION1*1000000+VERSION2*1000+VERSION3
-
-conf="""
-#define PANDA_MAJOR_VERSION VERSION1
-#define PANDA_MINOR_VERSION VERSION2
-#define PANDA_SEQUENCE_VERSION VERSION2
-#undef  PANDA_OFFICIAL_VERSION
-#define PANDA_VERSION NVERSION
-#define PANDA_VERSION_STR "VERSION1.VERSION2.VERSION3"
-#define PANDA_DISTRIBUTOR "makepanda"
-"""
-
-conf = conf.replace("VERSION1",str(VERSION1))
-conf = conf.replace("VERSION2",str(VERSION2))
-conf = conf.replace("VERSION3",str(VERSION3))
-conf = conf.replace("NVERSION",str(NVERSION))
-
-ConditionalWriteFile(PREFIX+'/include/pandaVersion.h',conf)
-
-conf="""
-# include "dtoolbase.h"
-EXPCL_DTOOL int panda_version_VERSION1_VERSION2_VERSION3 = 0;
-"""
-
-conf = conf.replace("VERSION1",str(VERSION1))
-conf = conf.replace("VERSION2",str(VERSION2))
-conf = conf.replace("VERSION3",str(VERSION3))
-conf = conf.replace("NVERSION",str(NVERSION))
-
-ConditionalWriteFile(PREFIX+'/include/checkPandaVersion.cxx',conf)
-
-conf="""
-# include "dtoolbase.h"
-extern EXPCL_DTOOL int panda_version_VERSION1_VERSION2_VERSION3;
-# ifndef WIN32
-/* For Windows, exporting the symbol from the DLL is sufficient; the
-      DLL will not load unless all expected public symbols are defined.
-      Other systems may not mind if the symbol is absent unless we
-      explictly write code that references it. */
-static int check_panda_version = panda_version_VERSION1_VERSION2_VERSION3;
-# endif
-"""
-
-conf = conf.replace("VERSION1",str(VERSION1))
-conf = conf.replace("VERSION2",str(VERSION2))
-conf = conf.replace("VERSION3",str(VERSION3))
-conf = conf.replace("NVERSION",str(NVERSION))
-
-ConditionalWriteFile(PREFIX+'/include/checkPandaVersion.h',conf)
-
-ConditionalWriteFile(PREFIX + "/tmp/pythonversion", os.path.basename(PYTHONSDK))
-
-##########################################################################################
-#
-# If running under windows, compile up the icon.
-#
-##########################################################################################
-
-if (sys.platform == "win32" or sys.platform == "cygwin"):
-  IPATH=["panda/src/configfiles"]
-  OPTS=[]
-  CompileRES(ipath=IPATH, opts=OPTS, src='pandaIcon.rc', obj='pandaIcon.res')
-
-##########################################################################################
-#
-# Generate direct/__init__.py
-#
-##########################################################################################
-
-DIRECTINIT="""
-import os,sys
-srcdir1 = os.path.join(__path__[0], 'src')
-srcdir2 = os.path.join(__path__[0], '..', '..', 'direct', 'src')
-if    (os.path.isdir(srcdir1)): __path__[0] = srcdir1
-elif  (os.path.isdir(srcdir2)): __path__[0] = srcdir2
-else: sys.exit("Cannot find the 'direct' tree")
-"""
-ConditionalWriteFile(PREFIX+'/direct/__init__.py', DIRECTINIT)
-
-##########################################################################################
-#
-# Generate dtool_have_xxx.dat
-#
-##########################################################################################
-
-for x in PACKAGES:
-    if (OMIT.count(x)): ConditionalWriteFile(PREFIX+'/tmp/dtool_have_'+x.lower()+'.dat',"0\n")
-    else:               ConditionalWriteFile(PREFIX+'/tmp/dtool_have_'+x.lower()+'.dat',"1\n")
-
-##########################################################################################
-#
-# Generate dtool_config.h
-#
-##########################################################################################
-
-conf = "/* dtool_config.h.  Generated automatically by makepanda.py */\n"
-for key,win,unix in DTOOLDEFAULTS:
-    val = DTOOLCONFIG[key]
-    if (val == 'UNDEF'): conf = conf + "#undef " + key + "\n"
-    else:                conf = conf + "#define " + key + " " + val + "\n"
-ConditionalWriteFile(PREFIX+'/include/dtool_config.h',conf)
-
-##########################################################################################
-#
-# Generate the PRC files into the ETC directory.
-#
-##########################################################################################
-
-CONFAUTOPRC="""
-###########################################################
-###                                                     ###
-### Panda3D Configuration File - Auto-Generated Portion ###
-###                                                     ###
-### Editing this file is not recommended. Most of these ###
-### directives can be overriden in Config.prc           ###
-###                                                     ###
-###########################################################
-
-# Define the display types that have been compiled in.  Panda will
-# pick one of these by going through the list in this order until one
-# is found that works, unless the user specifically requests a
-# particular display type with the load-display directive.
-
-aux-display pandagl
-aux-display pandadx9
-aux-display pandadx8
-aux-display pandadx7
-
-# The egg loader is handy to have available by default.  This allows
-# clients to load egg files.  (The bam loader is built-in so bam files
-# are always loadable).
-
-# By qualifying with the extension "egg", we indicate the egg loader
-# should be made available only if you explicitly name a file with an
-# .egg extension.
-
-load-file-type egg pandaegg
-
-# The following lines define some handy object types to use within the
-# egg syntax.  This remaps <ObjectType> { name } into whatever egg
-# syntax is given by egg-object-type-name, which makes a handy
-# abbreviation for modeling packages (like Maya) to insert
-# sophisticated egg syntax into the generated egg file, using a single
-# object type string.
-
-egg-object-type-portal          <Scalar> portal { 1 }
-egg-object-type-polylight       <Scalar> polylight { 1 }
-egg-object-type-seq24           <Switch> { 1 } <Scalar> fps { 24 }
-egg-object-type-seq12           <Switch> { 1 } <Scalar> fps { 12 }
-egg-object-type-indexed         <Scalar> indexed { 1 }
-
-# These are just shortcuts to define the Model and DCS flags, which
-# indicate nodes that should not be flattened out of the hierarchy
-# during the conversion process.  DCS goes one step further and
-# indicates that the node's transform is important and should be
-# preserved (DCS stands for Dynamic Coordinate System).
-
-egg-object-type-model           <Model> { 1 }
-egg-object-type-dcs             <DCS> { 1 }
-
-# The following define various kinds of collision geometry.  These
-# mark the geometry at this level and below as invisible collision
-# polygons, which can be used by Panda's collision system to detect
-# collisions more optimally than regular visible polygons.
-
-egg-object-type-barrier         <Collide> { Polyset descend }
-egg-object-type-sphere          <Collide> { Sphere descend }
-egg-object-type-invsphere       <Collide> { InvSphere descend }
-egg-object-type-tube            <Collide> { Tube descend }
-
-# As above, but these are flagged to be "intangible", so that they
-# will trigger an event but not stop an object from passing through.
-
-egg-object-type-trigger         <Collide> { Polyset descend intangible }
-egg-object-type-trigger-sphere  <Collide> { Sphere descend intangible }
-
-# "bubble" puts an invisible bubble around an object, but does not
-# otherwise remove the geometry.
-
-egg-object-type-bubble          <Collide> { Sphere keep descend }
-
-# "ghost" turns off the normal collide bit that is set on visible
-# geometry by default, so that if you are using visible geometry for
-# collisions, this particular geometry will not be part of those
-# collisions--it is ghostlike.
-
-egg-object-type-ghost           <Scalar> collide-mask { 0 }
-
-# This module allows direct loading of formats like .flt, .mb, or .dxf
-
-load-file-type ptloader
-
-# Define a new egg object type.  See the comments in _panda.prc about this.
-
-egg-object-type-direct-widget   <Scalar> collide-mask { 0x80000000 } <Collide> { Polyset descend }
-
-# Define a new cull bin that will render on top of everything else.
-
-cull-bin gui-popup 60 unsorted
-"""
-
-CONFIGPRC="""
-###########################################################
-###                                                     ###
-### Panda3D Configuration File -  User-Editable Portion ###
-###                                                     ###
-###########################################################
-
-# Uncomment one of the following lines to choose whether you should
-# run using OpenGL or DirectX rendering.
-
-load-display pandagl
-
-# These control the placement and size of the default rendering window.
-
-win-origin 100 0
-win-size 800 600
-
-# Uncomment this line if you want to run Panda fullscreen instead of
-# in a window.
-
-fullscreen #f
-
-# If you don't object to running OpenGL in software leave the keyword
-# "software" in the following line, otherwise remove it to force
-# hardware only.
-
-framebuffer-mode rgba double-buffer depth multisample hardware software
-
-# These control the amount of output Panda gives for some various
-# categories.  The severity levels, in order, are "spam", "debug",
-# "info", "warning", and "fatal"; the default is "info".  Uncomment
-# one (or define a new one for the particular category you wish to
-# change) to control this output.
-
-notify-level warning
-default-directnotify-level warning
-
-# These specify where model files may be loaded from.  You probably
-# want to set this to a sensible path for yourself.  $THIS_PRC_DIR is
-# a special variable that indicates the same directory as this
-# particular Config.prc file.
-
-model-path    .
-model-path    $THIS_PRC_DIR/..
-model-path    $THIS_PRC_DIR/../models
-sound-path    .
-sound-path    $THIS_PRC_DIR/..
-sound-path    $THIS_PRC_DIR/../models
-texture-path  .
-texture-path  $THIS_PRC_DIR/..
-texture-path  $THIS_PRC_DIR/../models
-
-# This enable the automatic creation of a TK window when running
-# Direct.
-
-want-directtools  #f
-want-tk           #f
-
-# This enables simple networked programs to easily provide a DC file
-
-dc-file sample.dc
-
-# Enable audio using the FMod audio library by default:
-
-audio-library-name fmod_audio
-"""
-
-if (sys.platform != "win32" or sys.platform == "cygwin"):
-    CONFAUTOPRC = CONFAUTOPRC.replace("aux-display pandadx9","")
-    CONFAUTOPRC = CONFAUTOPRC.replace("aux-display pandadx8","")
-    CONFAUTOPRC = CONFAUTOPRC.replace("aux-display pandadx7","")
-
-ConditionalWriteFile(PREFIX + "/etc/Confauto.prc", CONFAUTOPRC)
-ConditionalWriteFile(PREFIX + "/etc/Config.prc", CONFIGPRC)
-
-##########################################################################################
-#
-# Copy the precompiled binaries and DLLs into the build.
-#
-##########################################################################################
-
-for pkg in (PACKAGES + ["extras"]):
-    if (OMIT.count(pkg)==0):
-        if (COMPILER == "MSVC7" or COMPILER=="MSVC71"):
-            if (os.path.exists(THIRDPARTY+"/win-libs-vc7/"+pkg.lower()+"/bin")):
-                CopyAllFiles(PREFIX+"/bin/",THIRDPARTY+"/win-libs-vc7/"+pkg.lower()+"/bin/")
-        elif (COMPILER == "LINUXA"):
-            if (os.path.exists(THIRDPARTY+"/linux-libs-a/"+pkg.lower()+"/lib")):
-                CopyAllFiles(PREFIX+"/lib/",THIRDPARTY+"/linux-libs-a/"+pkg.lower()+"/lib/")
-
-if sys.platform == "win32" or sys.platform == "cygwin":
-    CopyTree(PREFIX+'/python', PYTHONSDK)
-    if os.path.isfile(PYTHONSDK+'/python22.dll'):
-        CopyFile(PREFIX+'/bin/',   PYTHONSDK+'/python22.dll')
-
-########################################################################
-##
-## Compile the 'ppython' executable and 'genpycode' executables
-##
-########################################################################
-
-IPATH=['direct/src/directbase']
-CompileC(ipath=IPATH, opts=['BUILDING_PPYTHON'], src='ppython.cxx', obj='ppython.obj')
-CompileLink(opts=['WINUSER'], dll='ppython.exe', obj=['ppython.obj'])
-
-IPATH=['direct/src/directbase']
-CompileC(ipath=IPATH, opts=['BUILDING_GENPYCODE'], src='ppython.cxx', obj='genpycode.obj')
-CompileLink(opts=['WINUSER'], dll='genpycode.exe', obj=['genpycode.obj'])
-
-########################################################################
-#
-# Copy header files to the PREFIX/include directory.
-#
-# Are we just copying *ALL* headers into the include directory?
-# If so, let's automate this.
-#
-# We're definitely not copying all headers.  We're only copying those
-# same headers that are copied by ppremake.  But the bigger question
-# is, did he *intend* to copy all headers?  Another good question is,
-# could we just put a little tag into the header file itself, indicating
-# that it is meant to be copied?
-#
-########################################################################
-
-ConditionalWriteFile(PREFIX+'/include/ctl3d.h', '/* dummy file to make MAX happy */')
-
-class FileList:
-    allFiles=['*']
-    includes=['/*_src.cxx', '/*.h', '/*.I', '/*.T']
-
-    def __init__(self):
-        self.files={}
-
-    def add(self, srcPattern="*"):
-        global VERBOSE
-        if VERBOSE:
-            print "FileList.add(\"%s\")"%(srcPattern,)
-        for i in glob(srcPattern):
-            self.files[i.replace("\\", "/")]=None
-
-    def addIncludes(self, srcPattern="."):
-        for i in self.includes:
-            self.add(srcPattern+i)
-
-    def omit(self, srcPattern="*"):
-        global VERBOSE
-        if VERBOSE:
-            print "FileList.omit(\"%s\")"%(srcPattern,)
-        for i in glob(srcPattern):
-            try: del self.files[i.replace("\\", "/")]
-            except: pass
-
-    def omitIncludes(self, srcPattern="."):
-        for i in self.includes:
-            self.omit(srcPattern+i)
-
-    def copyTo(self, dstDir="."):
-        global VERBOSE
-        if VERBOSE:
-            print "FileList.copyTo(\"%s\")"%(dstDir,)
-        for i in self.files.keys():
-            if os.path.isfile(i):
-                CopyFile(dstDir+'/'+os.path.split(i)[1], i)
-
-fileList=FileList()
-fileList.addIncludes('dtool/src/*')
-fileList.addIncludes('panda/src/*')
-fileList.addIncludes('pandatool/src/*')
-fileList.addIncludes('pandaapp/src/*')
-fileList.addIncludes('direct/src/*')
-fileList.omitIncludes('dtool/src/parser-inc')
-fileList.omitIncludes('dtool/src/parser-inc')
-fileList.copyTo(PREFIX+'/include')
-del fileList
-
-fileList=FileList()
-fileList.add('dtool/src/parser-inc/*')
-fileList.copyTo(PREFIX+'/include/parser-inc')
-fileList.copyTo(PREFIX+'/include/parser-inc/openssl')
-del fileList
-
-fileList=FileList()
-fileList.add('dtool/src/parser-inc/cg.h')
-fileList.add('dtool/src/parser-inc/cgGL.h')
-fileList.copyTo(PREFIX+'/include/parser-inc/Cg')
-del fileList
-
-
-########################################################################
-#
-# This file contains a list of all the files that need to be compiled.
-#
-########################################################################
-
-#
-# DIRECTORY: dtool/src/dtoolbase/
-#
-
-IPATH=['dtool/src/dtoolbase']
-OPTS=['BUILDING_DTOOL', 'NSPR']
-CompileC(ipath=IPATH, opts=OPTS, src='dtoolbase.cxx', obj='dtoolbase_dtoolbase.obj')
-
-#
-# DIRECTORY: dtool/src/dtoolutil/
-#
-
-IPATH=['dtool/src/dtoolutil']
-OPTS=['BUILDING_DTOOL', 'NSPR']
-CompileC(ipath=IPATH, opts=OPTS, src='gnu_getopt.c',             obj='dtoolutil_gnu_getopt.obj')
-CompileC(ipath=IPATH, opts=OPTS, src='gnu_getopt1.c',            obj='dtoolutil_gnu_getopt1.obj')
-CompileC(ipath=IPATH, opts=OPTS, src='dtoolutil_composite1.cxx', obj='dtoolutil_composite1.obj')
-CompileC(ipath=IPATH, opts=OPTS, src='dtoolutil_composite2.cxx', obj='dtoolutil_composite2.obj')
-
-#
-# DIRECTORY: dtool/metalibs/dtool/
-#
-
-IPATH=['dtool/metalibs/dtool']
-OPTS=['BUILDING_DTOOL', 'NSPR']
-CompileC(ipath=IPATH, opts=OPTS, src='dtool.cxx', obj='dtool_dtool.obj')
-CompileLink(opts=['ADVAPI', 'NSPR'], dll='libdtool.dll', obj=[
-             'dtool_dtool.obj',
-             'dtoolutil_gnu_getopt.obj',
-             'dtoolutil_gnu_getopt1.obj',
-             'dtoolutil_composite1.obj',
-             'dtoolutil_composite2.obj',
-             'dtoolbase_dtoolbase.obj',
-])
-
-#
-# DIRECTORY: dtool/src/cppparser/
-#
-
-IPATH=['dtool/src/cppparser']
-CompileBison(pre='cppyy', dstc='cppBison.cxx', dsth='cppBison.h', src='dtool/src/cppparser/cppBison.yxx')
-OPTS=['NSPR']
-CompileC(ipath=IPATH, opts=OPTS, src='cppParser_composite1.cxx', obj='cppParser_composite1.obj')
-CompileC(ipath=IPATH, opts=OPTS, src='cppParser_composite2.cxx', obj='cppParser_composite2.obj')
-CompileC(ipath=IPATH, opts=OPTS, src='cppBison.cxx', obj='cppParser_cppBison.obj')
-CompileLIB(lib='libcppParser.ilb', obj=[
-             'cppParser_composite1.obj',
-             'cppParser_composite2.obj',
-             'cppParser_cppBison.obj',
-])
-
-#
-# DIRECTORY: dtool/src/prc/
-#
-
-IPATH=['dtool/src/prc']
-OPTS=['BUILDING_DTOOLCONFIG', 'SSL', 'NSPR']
-CompileC(ipath=IPATH, opts=OPTS, src='prc_composite1.cxx', obj='prc_composite1.obj')
-CompileC(ipath=IPATH, opts=OPTS, src='prc_composite2.cxx', obj='prc_composite2.obj')
-
-#
-# DIRECTORY: dtool/src/dconfig/
-#
-
-IPATH=['dtool/src/dconfig']
-OPTS=['BUILDING_DTOOLCONFIG', 'NSPR']
-CompileC(ipath=IPATH, opts=OPTS, src='dconfig_composite1.cxx', obj='dconfig_composite1.obj')
-
-#
-# DIRECTORY: dtool/src/interrogatedb/
-#
-
-IPATH=['dtool/src/interrogatedb']
-OPTS=['BUILDING_DTOOLCONFIG', 'NSPR']
-CompileC(ipath=IPATH, opts=OPTS, src='interrogatedb_composite1.cxx', obj='interrogatedb_composite1.obj')
-CompileC(ipath=IPATH, opts=OPTS, src='interrogatedb_composite2.cxx', obj='interrogatedb_composite2.obj')
-
-#
-# DIRECTORY: dtool/metalibs/dtoolconfig/
-#
-
-IPATH=['dtool/metalibs/dtoolconfig']
-OPTS=['BUILDING_DTOOLCONFIG', 'NSPR']
-CompileC(ipath=IPATH, opts=OPTS, src='dtoolconfig.cxx', obj='dtoolconfig_dtoolconfig.obj')
-CompileC(ipath=IPATH, opts=OPTS, src='pydtool.cxx', obj='dtoolconfig_pydtool.obj')
-CompileLink(opts=['ADVAPI', 'NSPR', 'SSL'], dll='libdtoolconfig.dll', obj=[
-             'dtoolconfig_dtoolconfig.obj',
-             'dtoolconfig_pydtool.obj',
-             'interrogatedb_composite1.obj',
-             'interrogatedb_composite2.obj',
-             'dconfig_composite1.obj',
-             'prc_composite1.obj',
-             'prc_composite2.obj',
-             'libdtool.dll',
-])
-
-#
-# DIRECTORY: dtool/src/pystub/
-#
-
-IPATH=['dtool/src/pystub']
-OPTS=['BUILDING_DTOOLCONFIG', 'NSPR']
-CompileC(ipath=IPATH, opts=OPTS, src='pystub.cxx', obj='pystub_pystub.obj')
-CompileLink(opts=['ADVAPI', 'NSPR'], dll='libpystub.dll', obj=[
-             'pystub_pystub.obj',
-             'libdtool.dll',
-])
-
-#
-# DIRECTORY: dtool/src/interrogate/
-#
-
-IPATH=['dtool/src/interrogate', 'dtool/src/cppparser', 'dtool/src/interrogatedb']
-OPTS=['NSPR']
-CompileC(ipath=IPATH, opts=OPTS, src='interrogate_composite1.cxx', obj='interrogate_composite1.obj')
-CompileC(ipath=IPATH, opts=OPTS, src='interrogate_composite2.cxx', obj='interrogate_composite2.obj')
-CompileLink(opts=['ADVAPI', 'NSPR', 'SSL'], dll='interrogate.exe', obj=[
-             'interrogate_composite1.obj',
-             'interrogate_composite2.obj',
-             'libcppParser.ilb',
-             'libpystub.dll',
-             'libdtoolconfig.dll',
-             'libdtool.dll',
-])
-
-CompileC(ipath=IPATH, opts=OPTS, src='interrogate_module.cxx', obj='interrogate_module_interrogate_module.obj')
-CompileLink(opts=['ADVAPI', 'NSPR', 'SSL'], dll='interrogate_module.exe', obj=[
-             'interrogate_module_interrogate_module.obj',
-             'libcppParser.ilb',
-             'libpystub.dll',
-             'libdtoolconfig.dll',
-             'libdtool.dll',
-])
-
-CompileC(ipath=IPATH, opts=OPTS, src='parse_file.cxx', obj='parse_file_parse_file.obj')
-CompileLink(opts=['ADVAPI', 'NSPR', 'SSL'], dll='parse_file.exe', obj=[
-             'parse_file_parse_file.obj',
-             'libcppParser.ilb',
-             'libpystub.dll',
-             'libdtoolconfig.dll',
-             'libdtool.dll',
-])
-
-#
-# DIRECTORY: dtool/src/prckeys/
-#
-
-if (OMIT.count("SSL")==0):
-  IPATH=['dtool/src/prckeys']
-  OPTS=['SSL', 'NSPR']
-  CompileC(ipath=IPATH, opts=OPTS, src='makePrcKey.cxx', obj='make-prc-key_makePrcKey.obj')
-  CompileLink(opts=['ADVAPI', 'NSPR', 'SSL'], dll='make-prc-key.exe', obj=[
-               'make-prc-key_makePrcKey.obj',
-               'libpystub.dll',
-               'libdtool.dll',
-               'libdtoolconfig.dll',
-               ])
-
-#
-# DIRECTORY: dtool/src/test_interrogate/
-#
-
-IPATH=['dtool/src/test_interrogate']
-OPTS=['NSPR']
-CompileC(ipath=IPATH, opts=OPTS, src='test_interrogate.cxx', obj='test_interrogate_test_interrogate.obj')
-CompileLink(opts=['ADVAPI', 'NSPR', 'SSL'], dll='test_interrogate.exe', obj=[
-             'test_interrogate_test_interrogate.obj',
-             'libpystub.dll',
-             'libdtoolconfig.dll',
-             'libdtool.dll',
-])
-
-#
-# DIRECTORY: panda/src/pandabase/
-#
-
-IPATH=['panda/src/pandabase']
-OPTS=['BUILDING_PANDAEXPRESS', 'NSPR']
-CompileC(ipath=IPATH, opts=OPTS, src='pandabase.cxx', obj='pandabase_pandabase.obj')
-
-#
-# DIRECTORY: panda/src/express/
-#
-
-IPATH=['panda/src/express']
-OPTS=['BUILDING_PANDAEXPRESS', 'SSL', 'ZLIB', 'NSPR']
-CompileC(ipath=IPATH, opts=OPTS, src='express_composite1.cxx', obj='express_composite1.obj')
-CompileC(ipath=IPATH, opts=OPTS, src='express_composite2.cxx', obj='express_composite2.obj')
-Interrogate(ipath=IPATH, opts=OPTS, outd='libexpress.in', outc='libexpress_igate.cxx',
-            src='panda/src/express',  module='pandaexpress', library='libexpress',
-            files=['atomicAdjustDummyImpl.h', 'atomicAdjust.h', 'atomicAdjustImpl.h', 'atomicAdjustNsprImpl.h', 'bigEndian.h', 'buffer.h', 'checksumHashGenerator.h', 'circBuffer.h', 'clockObject.h', 'conditionVarDummyImpl.h', 'conditionVar.h', 'conditionVarImpl.h', 'conditionVarNsprImpl.h', 'config_express.h', 'datagram.h', 'datagramGenerator.h', 'datagramIterator.h', 'datagramSink.h', 'dcast.h', 'encryptStreamBuf.h', 'encryptStream.h', 'error_utils.h', 'hashGeneratorBase.h', 'hashVal.h', 'indent.h', 'indirectLess.h', 'littleEndian.h', 'memoryInfo.h', 'memoryUsage.h', 'memoryUsagePointerCounts.h', 'memoryUsagePointers.h', 'multifile.h', 'mutexDummyImpl.h', 'pmutex.h', 'mutexHolder.h', 'mutexImpl.h', 'mutexNsprImpl.h', 'namable.h', 'nativeNumericData.h', 'numeric_types.h', 'ordered_vector.h', 'password_hash.h', 'patchfile.h', 'pointerTo.h', 'pointerToArray.h', 'pointerToBase.h', 'pointerToVoid.h', 'profileTimer.h', 'pta_uchar.h', 'ramfile.h', 'referenceCount.h', 'register_type.h', 'reversedNumericData.h', 'selectThreadImpl.h', 'streamReader.h', 'streamWriter.h', 'stringDecoder.h', 'subStream.h', 'subStreamBuf.h', 'textEncoder.h', 'threadDummyImpl.h', 'thread.h', 'threadImpl.h', 'threadNsprImpl.h', 'threadPriority.h', 'tokenBoard.h', 'trueClock.h', 'typeHandle.h', 'typedObject.h', 'typedReferenceCount.h', 'typedef.h', 'typeRegistry.h', 'typeRegistryNode.h', 'unicodeLatinMap.h', 'vector_uchar.h', 'virtualFileComposite.h', 'virtualFile.h', 'virtualFileList.h', 'virtualFileMount.h', 'virtualFileMountMultifile.h', 'virtualFileMountSystem.h', 'virtualFileSimple.h', 'virtualFileSystem.h', 'weakPointerTo.h', 'weakPointerToBase.h', 'weakPointerToVoid.h', 'weakReferenceList.h', 'windowsRegistry.h', 'zStream.h', 'zStreamBuf.h', 'express_composite1.cxx', 'express_composite2.cxx'])
-CompileC(ipath=IPATH, opts=OPTS, src='libexpress_igate.cxx', obj='libexpress_igate.obj')
-
-#
-# DIRECTORY: panda/src/downloader/
-#
-
-IPATH=['panda/src/downloader']
-OPTS=['BUILDING_PANDAEXPRESS', 'SSL', 'ZLIB', 'NSPR']
-CompileC(ipath=IPATH, opts=OPTS, src='downloader_composite1.cxx', obj='downloader_composite1.obj')
-CompileC(ipath=IPATH, opts=OPTS, src='downloader_composite2.cxx', obj='downloader_composite2.obj')
-Interrogate(ipath=IPATH, opts=OPTS, outd='libdownloader.in', outc='libdownloader_igate.cxx',
-            src='panda/src/downloader',  module='pandaexpress', library='libdownloader', files=[
-            'config_downloader.h', 'asyncUtility.h', 'bioPtr.h', 'bioStreamPtr.h', 'bioStream.h', 'bioStreamBuf.h',
-            'chunkedStream.h', 'chunkedStreamBuf.h', 'decompressor.h', 'documentSpec.h', 'downloadDb.h',
-            'download_utils.h', 'extractor.h', 'httpAuthorization.h', 'httpBasicAuthorization.h', 'httpChannel.h',
-            'httpClient.h', 'httpCookie.h', 'httpDate.h', 'httpDigestAuthorization.h', 'httpEntityTag.h',
-            'httpEnum.h', 'identityStream.h', 'identityStreamBuf.h', 'multiplexStream.h', 'multiplexStreamBuf.h',
-            'patcher.h', 'socketStream.h', 'ssl_utils.h', 'urlSpec.h',
-            'downloader_composite1.cxx', 'downloader_composite2.cxx'])
-CompileC(ipath=IPATH, opts=OPTS, src='libdownloader_igate.cxx', obj='libdownloader_igate.obj')
-
-#
-# DIRECTORY: panda/metalibs/pandaexpress/
-#
-
-IPATH=['panda/metalibs/pandaexpress']
-OPTS=['BUILDING_PANDAEXPRESS', 'ZLIB', 'NSPR']
-CompileC(ipath=IPATH, opts=OPTS, src='pandaexpress.cxx', obj='pandaexpress_pandaexpress.obj')
-InterrogateModule(outc='libpandaexpress_module.cxx', module='pandaexpress', library='libpandaexpress',
-                  files=['libdownloader.in', 'libexpress.in'])
-CompileC(ipath=IPATH, opts=OPTS, src='libpandaexpress_module.cxx', obj='libpandaexpress_module.obj')
-CompileLink(opts=['ADVAPI', 'WINSOCK2', 'NSPR', 'SSL', 'ZLIB'], dll='libpandaexpress.dll', obj=[
-             'pandaexpress_pandaexpress.obj',
-             'libpandaexpress_module.obj',
-             'downloader_composite1.obj',
-             'downloader_composite2.obj',
-             'libdownloader_igate.obj',
-             'express_composite1.obj',
-             'express_composite2.obj',
-             'libexpress_igate.obj',
-             'pandabase_pandabase.obj',
-             'libdtoolconfig.dll',
-             'libdtool.dll',
-])
-
-#
-# DIRECTORY: panda/src/putil/
-#
-
-IPATH=['panda/src/putil']
-OPTS=['BUILDING_PANDA', 'NSPR']
-CompileC(ipath=IPATH, opts=OPTS, src='putil_composite1.cxx', obj='putil_composite1.obj')
-CompileC(ipath=IPATH, opts=OPTS, src='putil_composite2.cxx', obj='putil_composite2.obj')
-Interrogate(ipath=IPATH, opts=OPTS, outd='libputil.in', outc='libputil_igate.cxx',
-            src='panda/src/putil',  module='panda', library='libputil', files=[
-            'bam.h', 'bamReader.h', 'bamReaderParam.h', 'bamWriter.h', 'bitMask.h', 'buttonHandle.h',
-            'buttonRegistry.h', 'cachedTypedWritableReferenceCount.h', 'collideMask.h', 'portalMask.h',
-            'compareTo.h', 'config_util.h', 'configurable.h', 'cycleData.h', 'cycleDataReader.h',
-            'cycleDataWriter.h', 'datagramInputFile.h', 'datagramOutputFile.h', 'drawMask.h', 'factoryBase.h',
-            'factoryParam.h', 'factoryParams.h', 'firstOfPairCompare.h', 'firstOfPairLess.h',
-            'globalPointerRegistry.h', 'indirectCompareNames.h', 'indirectCompareTo.h', 'ioPtaDatagramFloat.h',
-            'ioPtaDatagramInt.h', 'ioPtaDatagramShort.h', 'keyboardButton.h', 'lineStream.h', 'lineStreamBuf.h',
-            'load_prc_file.h', 'modifierButtons.h', 'mouseButton.h', 'mouseData.h', 'nameUniquifier.h',
-            'pipeline.h', 'pipelineCycler.h', 'pipelineCyclerBase.h', 'pta_double.h', 'pta_float.h',
-            'pta_int.h', 'string_utils.h', 'timedCycle.h', 'typedWritable.h', 'typedWritableReferenceCount.h',
-            'updateSeq.h', 'uniqueIdAllocator.h', 'vector_double.h', 'vector_float.h', 'vector_typedWritable.h',
-            'vector_ushort.h', 'vector_writable.h', 'writableConfigurable.h', 'writableParam.h',
-            'putil_composite1.cxx', 'putil_composite2.cxx'])
-CompileC(ipath=IPATH, opts=OPTS, src='libputil_igate.cxx', obj='libputil_igate.obj')
-
-#
-# DIRECTORY: panda/src/audio/
-#
-
-IPATH=['panda/src/audio']
-OPTS=['BUILDING_PANDA', 'NSPR']
-CompileC(ipath=IPATH, opts=OPTS, src='audio_composite1.cxx', obj='audio_composite1.obj')
-Interrogate(ipath=IPATH, opts=OPTS, outd='libaudio.in', outc='libaudio_igate.cxx',
-            src='panda/src/audio',  module='panda', library='libaudio',
-            files=['audio.h'])
-CompileC(ipath=IPATH, opts=OPTS, src='libaudio_igate.cxx', obj='libaudio_igate.obj')
-
-#
-# DIRECTORY: panda/src/event/
-#
-
-IPATH=['panda/src/event']
-OPTS=['BUILDING_PANDA', 'NSPR']
-CompileC(ipath=IPATH, opts=OPTS, src='event_composite1.cxx', obj='event_composite1.obj')
-Interrogate(ipath=IPATH, opts=OPTS, outd='libevent.in', outc='libevent_igate.cxx',
-            src='panda/src/event',  module='panda', library='libevent', files=[
-            'config_event.h', 'buttonEvent.h', 'buttonEventList.h', 'event.h', 'eventHandler.h',
-            'eventParameter.h', 'eventQueue.h', 'eventReceiver.h', 'pt_Event.h', 'throw_event.h', 'event_composite1.cxx'])
-CompileC(ipath=IPATH, opts=OPTS, src='libevent_igate.cxx', obj='libevent_igate.obj')
-
-#
-# DIRECTORY: panda/src/linmath/
-#
-
-IPATH=['panda/src/linmath']
-OPTS=['BUILDING_PANDA', 'NSPR']
-CompileC(ipath=IPATH, opts=OPTS, src='linmath_composite1.cxx', obj='linmath_composite1.obj')
-CompileC(ipath=IPATH, opts=OPTS, src='linmath_composite2.cxx', obj='linmath_composite2.obj')
-Interrogate(ipath=IPATH, opts=OPTS, outd='liblinmath.in', outc='liblinmath_igate.cxx',
-            src='panda/src/linmath',  module='panda', library='liblinmath', files=[
-            'compose_matrix.h', 'compose_matrix_src.h', 'config_linmath.h', 'coordinateSystem.h', 'dbl2fltnames.h', 'dblnames.h', 'deg_2_rad.h', 'flt2dblnames.h', 'fltnames.h', 'ioPtaDatagramLinMath.h', 'lcast_to.h', 'lcast_to_src.h', 'lmatrix.h', 'lmatrix3.h', 'lmatrix3_src.h', 'lmatrix4.h', 'lmatrix4_src.h', 'lorientation.h', 'lorientation_src.h', 'lpoint2.h', 'lpoint2_src.h', 'lpoint3.h', 'lpoint3_src.h', 'lpoint4.h', 'lpoint4_src.h', 'lquaternion.h', 'lquaternion_src.h', 'lrotation.h', 'lrotation_src.h', 'luse.h', 'lvec2_ops.h', 'lvec2_ops_src.h', 'lvec3_ops.h', 'lvec3_ops_src.h', 'lvec4_ops.h', 'lvec4_ops_src.h', 'lvecBase2.h', 'lvecBase2_src.h', 'lvecBase3.h', 'lvecBase3_src.h', 'lvecBase4.h', 'lvecBase4_src.h', 'lvector2.h', 'lvector2_src.h', 'lvector3.h', 'lvector3_src.h', 'lvector4.h', 'lvector4_src.h', 'mathNumbers.h', 'pta_Colorf.h', 'pta_Normalf.h', 'pta_TexCoordf.h', 'pta_Vertexf.h', 'vector_Colorf.h', 'vector_LPoint2f.h', 'vector_LVecBase3f.h', 'vector_Normalf.h', 'vector_TexCoordf.h', 'vector_Vertexf.h', 'linmath_composite1.cxx', 'linmath_composite2.cxx'])
-CompileC(ipath=IPATH, opts=OPTS, src='liblinmath_igate.cxx', obj='liblinmath_igate.obj')
-
-#
-# DIRECTORY: panda/src/mathutil/
-#
-
-IPATH=['panda/src/mathutil']
-OPTS=['BUILDING_PANDA', 'FFTW', 'NSPR']
-CompileC(ipath=IPATH, opts=OPTS, src='mathutil_composite1.cxx', obj='mathutil_composite1.obj')
-CompileC(ipath=IPATH, opts=OPTS, src='mathutil_composite2.cxx', obj='mathutil_composite2.obj')
-Interrogate(ipath=IPATH, opts=OPTS, outd='libmathutil.in', outc='libmathutil_igate.cxx',
-            src='panda/src/mathutil',  module='panda', library='libmathutil', files=[
-            'boundingHexahedron.h', 'boundingLine.h', 'boundingSphere.h', 'boundingVolume.h', 'config_mathutil.h', 'fftCompressor.h', 'finiteBoundingVolume.h', 'frustum.h', 'frustum_src.h', 'geometricBoundingVolume.h', 'linmath_events.h', 'look_at.h', 'look_at_src.h', 'omniBoundingVolume.h', 'plane.h', 'plane_src.h', 'rotate_to.h', 'mathutil_composite1.cxx', 'mathutil_composite2.cxx'])
-CompileC(ipath=IPATH, opts=OPTS, src='libmathutil_igate.cxx', obj='libmathutil_igate.obj')
-
-#
-# DIRECTORY: panda/src/gsgbase/
-#
-
-IPATH=['panda/src/gsgbase']
-OPTS=['BUILDING_PANDA', 'NSPR']
-CompileC(ipath=IPATH, opts=OPTS, src='gsgbase_composite1.cxx', obj='gsgbase_composite1.obj')
-Interrogate(ipath=IPATH, opts=OPTS, outd='libgsgbase.in', outc='libgsgbase_igate.cxx',
-            src='panda/src/gsgbase',  module='panda', library='libgsgbase', files=[
-            'config_gsgbase.h', 'graphicsStateGuardianBase.h', 'gsgbase_composite1.cxx'])
-CompileC(ipath=IPATH, opts=OPTS, src='libgsgbase_igate.cxx', obj='libgsgbase_igate.obj')
-
-#
-# DIRECTORY: panda/src/pnmimage/
-#
-
-IPATH=['panda/src/pnmimage']
-OPTS=['BUILDING_PANDA', 'NSPR']
-CompileC(ipath=IPATH, opts=OPTS, src='pnmimage_composite1.cxx', obj='pnmimage_composite1.obj')
-CompileC(ipath=IPATH, opts=OPTS, src='pnmimage_composite2.cxx', obj='pnmimage_composite2.obj')
-Interrogate(ipath=IPATH, opts=OPTS, outd='libpnmimage.in', outc='libpnmimage_igate.cxx',
-            src='panda/src/pnmimage',  module='panda', library='libpnmimage', files=[
-            'config_pnmimage.h', 'pnmbitio.h', 'pnmFileType.h', 'pnmFileTypeRegistry.h', 'pnmImage.h', 'pnmImageHeader.h', 'pnmReader.h', 'pnmWriter.h', 'pnmimage_base.h', 'ppmcmap.h', 'pnmimage_composite1.cxx', 'pnmimage_composite2.cxx'])
-CompileC(ipath=IPATH, opts=OPTS, src='libpnmimage_igate.cxx', obj='libpnmimage_igate.obj')
-
-#
-# DIRECTORY: panda/src/net/
-#
-
-if (OMIT.count("NSPR")==0):
-    IPATH=['panda/src/net']
-    OPTS=['BUILDING_PANDA', 'NSPR']
-    CompileC(ipath=IPATH, opts=OPTS, src='net_composite1.cxx', obj='net_composite1.obj')
-    CompileC(ipath=IPATH, opts=OPTS, src='net_composite2.cxx', obj='net_composite2.obj')
-    Interrogate(ipath=IPATH, opts=OPTS, outd='libnet.in', outc='libnet_igate.cxx',
-                src='panda/src/net',  module='panda', library='libnet', files=[
-                'config_net.h', 'connection.h', 'connectionListener.h', 'connectionManager.h',
-                'connectionReader.h', 'connectionWriter.h', 'datagramQueue.h', 'datagramTCPHeader.h',
-                'datagramUDPHeader.h', 'netAddress.h', 'netDatagram.h', 'pprerror.h', 'queuedConnectionListener.h',
-                'queuedConnectionManager.h', 'queuedConnectionReader.h', 'recentConnectionReader.h',
-                'queuedReturn.h', 'net_composite1.cxx', 'net_composite2.cxx'])
-    CompileC(ipath=IPATH, opts=OPTS, src='libnet_igate.cxx', obj='libnet_igate.obj')
-
-#
-# DIRECTORY: panda/src/pstatclient/
-#
-
-IPATH=['panda/src/pstatclient']
-OPTS=['BUILDING_PANDA', 'NSPR']
-CompileC(ipath=IPATH, opts=OPTS, src='pstatclient_composite1.cxx', obj='pstatclient_composite1.obj')
-CompileC(ipath=IPATH, opts=OPTS, src='pstatclient_composite2.cxx', obj='pstatclient_composite2.obj')
-Interrogate(ipath=IPATH, opts=OPTS, outd='libpstatclient.in', outc='libpstatclient_igate.cxx',
-            src='panda/src/pstatclient',  module='panda', library='libpstatclient', files=[
-            'config_pstats.h', 'pStatClient.h', 'pStatClientImpl.h', 'pStatClientVersion.h', 'pStatClientControlMessage.h', 'pStatCollector.h', 'pStatCollectorDef.h', 'pStatFrameData.h', 'pStatProperties.h', 'pStatServerControlMessage.h', 'pStatThread.h', 'pStatTimer.h', 'pstatclient_composite1.cxx', 'pstatclient_composite2.cxx'])
-CompileC(ipath=IPATH, opts=OPTS, src='libpstatclient_igate.cxx', obj='libpstatclient_igate.obj')
-
-#
-# DIRECTORY: panda/src/gobj/
-#
-
-IPATH=['panda/src/gobj']
-OPTS=['BUILDING_PANDA', 'NSPR']
-CompileC(ipath=IPATH, opts=OPTS, src='gobj_composite1.cxx', obj='gobj_composite1.obj')
-CompileC(ipath=IPATH, opts=OPTS, src='gobj_composite2.cxx', obj='gobj_composite2.obj')
-Interrogate(ipath=IPATH, opts=OPTS, outd='libgobj.in', outc='libgobj_igate.cxx',
-            src='panda/src/gobj',  module='panda', library='libgobj', files=[
-            'boundedObject.h', 'config_gobj.h', 'drawable.h', 'geom.h',
-            'geomContext.h', 'geomLine.h', 'geomLinestrip.h', 'geomPoint.h',
-            'geomPolygon.h', 'geomQuad.h', 'geomSphere.h', 'geomSprite.h',
-            'geomTri.h', 'geomTrifan.h', 'geomTristrip.h', 'imageBuffer.h',
-            'material.h', 'materialPool.h', 'matrixLens.h', 'orthographicLens.h',
-            'perspectiveLens.h', 'pixelBuffer.h', 'preparedGraphicsObjects.h',
-            'lens.h', 'savedContext.h', 'texture.h', 'textureContext.h',
-            'texturePool.h', 'texCoordName.h', 'textureStage.h',
-            'gobj_composite1.cxx', 'gobj_composite2.cxx'])
-CompileC(ipath=IPATH, opts=OPTS, src='libgobj_igate.cxx', obj='libgobj_igate.obj')
-
-#
-# DIRECTORY: panda/src/lerp/
-#
-
-IPATH=['panda/src/lerp']
-OPTS=['BUILDING_PANDA', 'NSPR']
-CompileC(ipath=IPATH, opts=OPTS, src='lerp_composite1.cxx', obj='lerp_composite1.obj')
-Interrogate(ipath=IPATH, opts=OPTS, outd='liblerp.in', outc='liblerp_igate.cxx',
-            src='panda/src/lerp',  module='panda', library='liblerp', files=[
-            'config_lerp.h', 'lerp.h', 'lerpblend.h', 'lerpfunctor.h', 'lerp_composite1.cxx'])
-CompileC(ipath=IPATH, opts=OPTS, src='liblerp_igate.cxx', obj='liblerp_igate.obj')
-
-#
-# DIRECTORY: panda/src/pgraph/
-#
-
-IPATH=['panda/src/pgraph']
-OPTS=['BUILDING_PANDA', 'NSPR']
-CompileC(ipath=IPATH, opts=OPTS, src='nodePath.cxx', obj='pgraph_nodePath.obj')
-CompileC(ipath=IPATH, opts=OPTS, src='pgraph_composite1.cxx', obj='pgraph_composite1.obj')
-CompileC(ipath=IPATH, opts=OPTS, src='pgraph_composite2.cxx', obj='pgraph_composite2.obj')
-Interrogate(ipath=IPATH, opts=OPTS, outd='libpgraph.in', outc='libpgraph_igate.cxx',
-            src='panda/src/pgraph',  module='panda', library='libpgraph', files=[
-            'accumulatedAttribs.h', 'alphaTestAttrib.h', 'ambientLight.h', 'auxSceneData.h', 'bamFile.h', 'billboardEffect.h', 'binCullHandler.h', 'camera.h', 'clipPlaneAttrib.h', 'colorAttrib.h', 'colorBlendAttrib.h', 'colorScaleAttrib.h', 'colorWriteAttrib.h', 'compassEffect.h', 'config_pgraph.h', 'cullBin.h', 'cullBinAttrib.h', 'cullBinBackToFront.h', 'cullBinFixed.h', 'cullBinFrontToBack.h', 'cullBinManager.h', 'cullBinUnsorted.h', 'cullFaceAttrib.h', 'cullHandler.h', 'cullResult.h', 'cullTraverser.h', 'cullTraverserData.h', 'cullableObject.h', 'decalEffect.h', 'depthOffsetAttrib.h', 'depthTestAttrib.h', 'depthWriteAttrib.h', 'directionalLight.h', 'drawCullHandler.h', 'fadeLodNode.h', 'fadeLodNodeData.h', 'findApproxLevelEntry.h', 'findApproxPath.h', 'fog.h', 'fogAttrib.h', 'geomNode.h', 'geomTransformer.h', 'lensNode.h', 'light.h', 'lightAttrib.h', 'lightLensNode.h', 'lightNode.h', 'loader.h', 'loaderFileType.h', 'loaderFileTypeBam.h', 'loaderFileTypeRegistry.h', 'lodNode.h', 'materialAttrib.h', 'modelNode.h', 'modelPool.h', 'modelRoot.h', 'nodePath.h', 'nodePath.cxx', 'nodePathCollection.h', 'nodePathComponent.h', 'nodePathLerps.h', 'pandaNode.h', 'planeNode.h', 'pointLight.h', 'polylightNode.h', 'polylightEffect.h', 'portalNode.h', 'portalClipper.h', 'renderAttrib.h', 'renderEffect.h', 'renderEffects.h', 'renderModeAttrib.h', 'renderState.h', 'rescaleNormalAttrib.h', 'sceneGraphAnalyzer.h', 'sceneGraphReducer.h', 'sceneSetup.h', 'selectiveChildNode.h', 'sequenceNode.h', 'showBoundsEffect.h', 'spotlight.h', 'switchNode.h', 'texMatrixAttrib.h', 'texProjectorEffect.h', 'textureApplyAttrib.h', 'textureAttrib.h', 'texGenAttrib.h', 'textureCollection.h', 'textureStageCollection.h', 'transformState.h', 'transparencyAttrib.h', 'weakNodePath.h', 'workingNodePath.h', 'pgraph_composite1.cxx', 'pgraph_composite2.cxx'])
-CompileC(ipath=IPATH, opts=OPTS, src='libpgraph_igate.cxx', obj='libpgraph_igate.obj')
-
-#
-# DIRECTORY: panda/src/chan/
-#
-
-IPATH=['panda/src/chan']
-OPTS=['BUILDING_PANDA', 'NSPR']
-CompileC(ipath=IPATH, opts=OPTS, src='chan_composite1.cxx', obj='chan_composite1.obj')
-CompileC(ipath=IPATH, opts=OPTS, src='chan_composite2.cxx', obj='chan_composite2.obj')
-Interrogate(ipath=IPATH, opts=OPTS, outd='libchan.in', outc='libchan_igate.cxx',
-            src='panda/src/chan',  module='panda', library='libchan', files=[
-            'animBundle.h', 'animBundleNode.h', 'animChannel.h', 'animChannelBase.h', 'animChannelMatrixDynamic.h', 'animChannelMatrixXfmTable.h', 'animChannelScalarDynamic.h', 'animChannelScalarTable.h', 'animControl.h', 'animControlCollection.h', 'animGroup.h', 'auto_bind.h', 'config_chan.h', 'movingPartBase.h', 'movingPartMatrix.h', 'movingPartScalar.h', 'partBundle.h', 'partBundleNode.h', 'partGroup.h', 'vector_PartGroupStar.h', 'chan_composite1.cxx', 'chan_composite2.cxx'])
-CompileC(ipath=IPATH, opts=OPTS, src='libchan_igate.cxx', obj='libchan_igate.obj')
-
-#
-# DIRECTORY: panda/src/char/
-#
-
-IPATH=['panda/src/char']
-OPTS=['BUILDING_PANDA', 'NSPR']
-CompileC(ipath=IPATH, opts=OPTS, src='char_composite1.cxx', obj='char_composite1.obj')
-CompileC(ipath=IPATH, opts=OPTS, src='char_composite2.cxx', obj='char_composite2.obj')
-Interrogate(ipath=IPATH, opts=OPTS, outd='libchar.in', outc='libchar_igate.cxx',
-            src='panda/src/char',  module='panda', library='libchar', files=[
-            'character.h', 'characterJoint.h', 'characterJointBundle.h', 'characterSlider.h', 'computedVertices.h', 'computedVerticesMorph.h', 'config_char.h', 'dynamicVertices.h', 'char_composite1.cxx', 'char_composite2.cxx'])
-CompileC(ipath=IPATH, opts=OPTS, src='libchar_igate.cxx', obj='libchar_igate.obj')
-
-#
-# DIRECTORY: panda/src/dgraph/
-#
-
-IPATH=['panda/src/dgraph']
-OPTS=['BUILDING_PANDA', 'NSPR']
-CompileC(ipath=IPATH, opts=OPTS, src='dgraph_composite1.cxx', obj='dgraph_composite1.obj')
-CompileC(ipath=IPATH, opts=OPTS, src='dgraph_composite2.cxx', obj='dgraph_composite2.obj')
-Interrogate(ipath=IPATH, opts=OPTS, outd='libdgraph.in', outc='libdgraph_igate.cxx',
-            src='panda/src/dgraph',  module='panda', library='libdgraph', files=[
-            'config_dgraph.h', 'dataGraphTraverser.h', 'dataNode.h', 'dataNodeTransmit.h', 'dgraph_composite1.cxx', 'dgraph_composite2.cxx'])
-CompileC(ipath=IPATH, opts=OPTS, src='libdgraph_igate.cxx', obj='libdgraph_igate.obj')
-
-#
-# DIRECTORY: panda/src/display/
-#
-
-IPATH=['panda/src/display']
-OPTS=['BUILDING_PANDA', 'NSPR']
-CompileC(ipath=IPATH, opts=OPTS, src='display_composite1.cxx', obj='display_composite1.obj')
-CompileC(ipath=IPATH, opts=OPTS, src='display_composite2.cxx', obj='display_composite2.obj')
-Interrogate(ipath=IPATH, opts=OPTS, outd='libdisplay.in', outc='libdisplay_igate.cxx',
-            src='panda/src/display',  module='panda', library='libdisplay', files=[
-            'config_display.h', 'drawableRegion.h', 'displayRegion.h', 'displayRegionStack.h', 'frameBufferProperties.h', 'frameBufferStack.h', 'graphicsEngine.h', 'graphicsOutput.h', 'graphicsBuffer.h', 'graphicsPipe.h', 'graphicsPipeSelection.h', 'graphicsStateGuardian.h', 'graphicsThreadingModel.h', 'graphicsWindow.h', 'graphicsWindowInputDevice.h', 'graphicsDevice.h', 'parasiteBuffer.h', 'windowProperties.h', 'lensStack.h', 'savedFrameBuffer.h', 'display_composite1.cxx', 'display_composite2.cxx'])
-CompileC(ipath=IPATH, opts=OPTS, src='libdisplay_igate.cxx', obj='libdisplay_igate.obj')
-
-#
-# DIRECTORY: panda/src/device/
-#
-
-IPATH=['panda/src/device']
-OPTS=['BUILDING_PANDA', 'NSPR']
-CompileC(ipath=IPATH, opts=OPTS, src='device_composite1.cxx', obj='device_composite1.obj')
-CompileC(ipath=IPATH, opts=OPTS, src='device_composite2.cxx', obj='device_composite2.obj')
-Interrogate(ipath=IPATH, opts=OPTS, outd='libdevice.in', outc='libdevice_igate.cxx',
-            src='panda/src/device',  module='panda', library='libdevice', files=[
-            'analogNode.h', 'buttonNode.h', 'clientAnalogDevice.h', 'clientBase.h', 'clientButtonDevice.h', 'clientDevice.h', 'clientDialDevice.h', 'clientTrackerDevice.h', 'config_device.h', 'dialNode.h', 'mouseAndKeyboard.h', 'trackerData.h', 'trackerNode.h', 'virtualMouse.h', 'device_composite1.cxx', 'device_composite2.cxx'])
-CompileC(ipath=IPATH, opts=OPTS, src='libdevice_igate.cxx', obj='libdevice_igate.obj')
-
-#
-# DIRECTORY: panda/src/tform/
-#
-
-IPATH=['panda/src/tform']
-OPTS=['BUILDING_PANDA', 'NSPR']
-CompileC(ipath=IPATH, opts=OPTS, src='tform_composite1.cxx', obj='tform_composite1.obj')
-CompileC(ipath=IPATH, opts=OPTS, src='tform_composite2.cxx', obj='tform_composite2.obj')
-Interrogate(ipath=IPATH, opts=OPTS, outd='libtform.in', outc='libtform_igate.cxx',
-            src='panda/src/tform',  module='panda', library='libtform', files=[
-            'buttonThrower.h', 'config_tform.h', 'driveInterface.h', 'mouseInterfaceNode.h', 'mouseWatcher.h', 'mouseWatcherGroup.h', 'mouseWatcherParameter.h', 'mouseWatcherRegion.h', 'trackball.h', 'transform2sg.h', 'tform_composite1.cxx', 'tform_composite2.cxx'])
-CompileC(ipath=IPATH, opts=OPTS, src='libtform_igate.cxx', obj='libtform_igate.obj')
-
-#
-# DIRECTORY: panda/src/collide/
-#
-
-IPATH=['panda/src/collide']
-OPTS=['BUILDING_PANDA', 'NSPR']
-CompileC(ipath=IPATH, opts=OPTS, src='collide_composite1.cxx', obj='collide_composite1.obj')
-CompileC(ipath=IPATH, opts=OPTS, src='collide_composite2.cxx', obj='collide_composite2.obj')
-Interrogate(ipath=IPATH, opts=OPTS, outd='libcollide.in', outc='libcollide_igate.cxx',
-            src='panda/src/collide',  module='panda', library='libcollide', files=[
-            'collisionEntry.h', 'collisionHandler.h', 'collisionHandlerEvent.h', 'collisionHandlerFloor.h', 'collisionHandlerGravity.h', 'collisionHandlerPhysical.h', 'collisionHandlerPusher.h', 'collisionHandlerQueue.h', 'collisionInvSphere.h', 'collisionLine.h', 'collisionLevelState.h', 'collisionNode.h', 'collisionPlane.h', 'collisionPolygon.h', 'collisionRay.h', 'collisionRecorder.h', 'collisionSegment.h', 'collisionSolid.h', 'collisionSphere.h', 'collisionTraverser.h', 'collisionTube.h', 'collisionVisualizer.h', 'config_collide.h', 'collide_composite1.cxx', 'collide_composite2.cxx'])
-CompileC(ipath=IPATH, opts=OPTS, src='libcollide_igate.cxx', obj='libcollide_igate.obj')
-
-#
-# DIRECTORY: panda/src/pnmtext/
-#
-
-if (OMIT.count("FREETYPE")==0):
-    IPATH=['panda/src/pnmtext']
-    OPTS=['BUILDING_PANDA', 'NSPR', 'FREETYPE']
-    CompileC(ipath=IPATH, opts=OPTS, src='config_pnmtext.cxx', obj='pnmtext_config_pnmtext.obj')
-    CompileC(ipath=IPATH, opts=OPTS, src='freetypeFont.cxx', obj='pnmtext_freetypeFont.obj')
-    CompileC(ipath=IPATH, opts=OPTS, src='pnmTextGlyph.cxx', obj='pnmtext_pnmTextGlyph.obj')
-    CompileC(ipath=IPATH, opts=OPTS, src='pnmTextMaker.cxx', obj='pnmtext_pnmTextMaker.obj')
-
-#
-# DIRECTORY: panda/src/text/
-#
-
-IPATH=['panda/src/text']
-OPTS=['BUILDING_PANDA', 'ZLIB', 'NSPR', 'FREETYPE']
-CompileC(ipath=IPATH, opts=OPTS, src='text_composite1.cxx', obj='text_composite1.obj')
-CompileC(ipath=IPATH, opts=OPTS, src='text_composite2.cxx', obj='text_composite2.obj')
-Interrogate(ipath=IPATH, opts=OPTS, outd='libtext.in', outc='libtext_igate.cxx',
-            src='panda/src/text',  module='panda', library='libtext', files=[
-            'config_text.h', 'default_font.h', 'dynamicTextFont.h', 'dynamicTextGlyph.h', 'dynamicTextPage.h', 'fontPool.h', 'geomTextGlyph.h', 'staticTextFont.h', 'textAssembler.h', 'textFont.h', 'textGlyph.h', 'textNode.h', 'textProperties.h', 'textPropertiesManager.h', 'text_composite1.cxx', 'text_composite2.cxx'])
-CompileC(ipath=IPATH, opts=OPTS, src='libtext_igate.cxx', obj='libtext_igate.obj')
-
-#
-# DIRECTORY: panda/src/grutil/
-#
-
-IPATH=['panda/src/grutil']
-OPTS=['BUILDING_PANDA', 'NSPR']
-CompileC(ipath=IPATH, opts=OPTS, src='multitexReducer.cxx', obj='grutil_multitexReducer.obj')
-CompileC(ipath=IPATH, opts=OPTS, src='grutil_composite1.cxx', obj='grutil_composite1.obj')
-Interrogate(ipath=IPATH, opts=OPTS, outd='libgrutil.in', outc='libgrutil_igate.cxx',
-            src='panda/src/grutil',  module='panda', library='libgrutil', files=[
-            'cardMaker.h', 'config_grutil.h', 'frameRateMeter.h', 'lineSegs.h', 'multitexReducer.h', 'multitexReducer.cxx', 'grutil_composite1.cxx'])
-CompileC(ipath=IPATH, opts=OPTS, src='libgrutil_igate.cxx', obj='libgrutil_igate.obj')
-
-#
-# DIRECTORY: panda/src/gsgmisc/
-#
-
-IPATH=['panda/src/gsgmisc']
-OPTS=['BUILDING_PANDA', 'NSPR']
-CompileC(ipath=IPATH, opts=OPTS, src='geomIssuer.cxx', obj='gsgmisc_geomIssuer.obj')
-
-#
-# DIRECTORY: panda/src/helix/
-#
-
-if (OMIT.count("HELIX")==0):
-  IPATH=['panda/src/helix']
-  OPTS=['BUILDING_PANDA', 'NSPR', 'HELIX']
-  CompileC(ipath=IPATH, opts=OPTS, src='config_helix.cxx', obj='helix_config_helix.obj')
-  CompileC(ipath=IPATH, opts=OPTS, src='fivemmap.cxx', obj='helix_fivemmap.obj')
-  CompileC(ipath=IPATH, opts=OPTS, src='HelixClient.cxx', obj='helix_HelixClient.obj')
-  CompileC(ipath=IPATH, opts=OPTS, src='HxAdviseSink.cxx', obj='helix_HxAdviseSink.obj')
-  CompileC(ipath=IPATH, opts=OPTS, src='HxAuthenticationManager.cxx', obj='helix_HxAuthenticationManager.obj')
-  CompileC(ipath=IPATH, opts=OPTS, src='HxClientContext.cxx', obj='helix_HxClientContext.obj')
-  CompileC(ipath=IPATH, opts=OPTS, src='HxErrorSink.cxx', obj='helix_HxErrorSink.obj')
-  CompileC(ipath=IPATH, opts=OPTS, src='HxSiteSupplier.cxx', obj='helix_HxSiteSupplier.obj')
-  CompileC(ipath=IPATH, opts=OPTS, src='iids.cxx', obj='helix_iids.obj')
-  CompileC(ipath=IPATH, opts=OPTS, src='print.cxx', obj='helix_print.obj')
-  Interrogate(ipath=IPATH, opts=OPTS, outd='libhelix.in', outc='libhelix_igate.cxx',
-              src='panda/src/helix',  module='panda', library='libhelix', files=['HelixClient.cxx'])
-  CompileC(ipath=IPATH, opts=OPTS, src='libhelix_igate.cxx', obj='libhelix_igate.obj')
-  CompileLIB(lib='libhelix.ilb', obj=[
-             'helix_config_helix.obj',
-             'helix_fivemmap.obj',
-             'helix_HelixClient.obj',
-             'helix_HxAdviseSink.obj',
-             'helix_HxAuthenticationManager.obj',
-             'helix_HxClientContext.obj',
-             'helix_HxErrorSink.obj',
-             'helix_HxSiteSupplier.obj',
-             'helix_iids.obj',
-             'helix_print.obj',
-             'libhelix_igate.obj'])
-
-#
-# DIRECTORY: panda/src/parametrics/
-#
-
-IPATH=['panda/src/parametrics']
-OPTS=['BUILDING_PANDA', 'NSPR']
-CompileC(ipath=IPATH, opts=OPTS, src='parametrics_composite1.cxx', obj='parametrics_composite1.obj')
-CompileC(ipath=IPATH, opts=OPTS, src='parametrics_composite2.cxx', obj='parametrics_composite2.obj')
-Interrogate(ipath=IPATH, opts=OPTS, outd='libparametrics.in', outc='libparametrics_igate.cxx',
-            src='panda/src/parametrics',  module='panda', library='libparametrics', files=[
-            'classicNurbsCurve.h', 'config_parametrics.h', 'cubicCurveseg.h', 'parametricCurveDrawer.h',
-            'curveFitter.h', 'hermiteCurve.h', 'nurbsCurve.h', 'nurbsCurveDrawer.h', 'nurbsCurveEvaluator.h',
-            'nurbsCurveInterface.h', 'nurbsCurveResult.h', 'nurbsBasisVector.h', 'nurbsSurfaceEvaluator.h',
-            'nurbsSurfaceResult.h', 'nurbsVertex.h', 'parametricCurve.h', 'parametricCurveCollection.h',
-            'piecewiseCurve.h', 'ropeNode.h', 'sheetNode.h', 'parametrics_composite1.cxx', 'parametrics_composite2.cxx'])
-CompileC(ipath=IPATH, opts=OPTS, src='libparametrics_igate.cxx', obj='libparametrics_igate.obj')
-
-#
-# DIRECTORY: panda/src/pgui/
-#
-
-IPATH=['panda/src/pgui']
-OPTS=['BUILDING_PANDA', 'NSPR']
-CompileC(ipath=IPATH, opts=OPTS, src='pgui_composite1.cxx', obj='pgui_composite1.obj')
-CompileC(ipath=IPATH, opts=OPTS, src='pgui_composite2.cxx', obj='pgui_composite2.obj')
-Interrogate(ipath=IPATH, opts=OPTS, outd='libpgui.in', outc='libpgui_igate.cxx',
-            src='panda/src/pgui',  module='panda', library='libpgui', files=[
-            'config_pgui.h', 'pgButton.h', 'pgSliderButton.h', 'pgCullTraverser.h', 'pgEntry.h',
-            'pgMouseWatcherGroup.h', 'pgMouseWatcherParameter.h', 'pgFrameStyle.h', 'pgItem.h',
-            'pgMouseWatcherBackground.h', 'pgMouseWatcherRegion.h', 'pgTop.h', 'pgWaitBar.h', 'pgSliderBar.h',
-            'pgui_composite1.cxx', 'pgui_composite2.cxx'])
-CompileC(ipath=IPATH, opts=OPTS, src='libpgui_igate.cxx', obj='libpgui_igate.obj')
-
-#
-# DIRECTORY: panda/src/pnmimagetypes/
-#
-
-IPATH=['panda/src/pnmimagetypes', 'panda/src/pnmimage']
-OPTS=['BUILDING_PANDA', 'PNG', 'ZLIB', 'JPEG', 'ZLIB', 'NSPR', 'JPEG', 'TIFF']
-CompileC(ipath=IPATH, opts=OPTS, src='pnmFileTypePNG.cxx', obj='pnmimagetypes_pnmFileTypePNG.obj')
-CompileC(ipath=IPATH, opts=OPTS, src='pnmFileTypeTIFF.cxx', obj='pnmimagetypes_pnmFileTypeTIFF.obj')
-CompileC(ipath=IPATH, opts=OPTS, src='pnmimagetypes_composite1.cxx', obj='pnmimagetypes_composite1.obj')
-CompileC(ipath=IPATH, opts=OPTS, src='pnmimagetypes_composite2.cxx', obj='pnmimagetypes_composite2.obj')
-
-#
-# DIRECTORY: panda/src/recorder/
-#
-
-IPATH=['panda/src/recorder']
-OPTS=['BUILDING_PANDA', 'NSPR']
-CompileC(ipath=IPATH, opts=OPTS, src='recorder_composite1.cxx', obj='recorder_composite1.obj')
-CompileC(ipath=IPATH, opts=OPTS, src='recorder_composite2.cxx', obj='recorder_composite2.obj')
-Interrogate(ipath=IPATH, opts=OPTS, outd='librecorder.in', outc='librecorder_igate.cxx',
-            src='panda/src/recorder',  module='panda', library='librecorder', files=[
-            'config_recorder.h', 'mouseRecorder.h', 'recorderBase.h', 'recorderController.h', 'recorderFrame.h', 'recorderHeader.h', 'recorderTable.h', 'socketStreamRecorder.h', 'recorder_composite1.cxx', 'recorder_composite2.cxx'])
-CompileC(ipath=IPATH, opts=OPTS, src='librecorder_igate.cxx', obj='librecorder_igate.obj')
-
-#
-# DIRECTORY: panda/src/vrpn/
-#
-
-if (OMIT.count("VRPN")==0):
-    IPATH=['panda/src/vrpn']
-    OPTS=['BUILDING_PANDA', 'NSPR', 'VRPN']
-    CompileC(ipath=IPATH, opts=OPTS, src='vrpn_composite1.cxx', obj='pvrpn_composite1.obj')
-    Interrogate(ipath=IPATH, opts=OPTS, outd='libpvrpn.in', outc='libpvrpn_igate.cxx',
-                src='panda/src/vrpn',  module='panda', library='libpvrpn', files=[
-                'config_vrpn.cxx', 'config_vrpn.h', 'vrpnClient.cxx', 'vrpnAnalog.cxx', 'vrpnAnalog.h',
-                'vrpnAnalogDevice.cxx', 'vrpnAnalogDevice.h', 'vrpnButton.cxx', 'vrpnButton.h',
-                'vrpnButtonDevice.cxx', 'vrpnButtonDevice.h', 'vrpnClient.h', 'vrpnDial.cxx', 'vrpnDial.h',
-                'vrpnDialDevice.cxx', 'vrpnDialDevice.h', 'vrpnTracker.cxx', 'vrpnTracker.h', 'vrpnTrackerDevice.cxx',
-                'vrpnTrackerDevice.h', 'vrpn_interface.h'])
-    CompileC(ipath=IPATH, opts=OPTS, src='libpvrpn_igate.cxx', obj='libpvrpn_igate.obj')
-
-#
-# DIRECTORY: panda/metalibs/panda/
-#
-
-IPATH=['panda/metalibs/panda']
-OPTS=['BUILDING_PANDA', 'ZLIB', 'VRPN', 'JPEG', 'PNG', 'TIFF', 'NSPR', 'FREETYPE', 'HELIX', 'FFTW',
-      'ADVAPI', 'WINSOCK2', 'WINUSER', 'WINMM']
-INFILES=['librecorder.in', 'libpgraph.in', 'libgrutil.in', 'libchan.in', 'libpstatclient.in',
-         'libchar.in', 'libcollide.in', 'libdevice.in', 'libdgraph.in', 'libdisplay.in', 'libevent.in',
-         'libgobj.in', 'libgsgbase.in', 'liblinmath.in', 'libmathutil.in', 'libparametrics.in',
-         'libpnmimage.in', 'libtext.in', 'libtform.in', 'liblerp.in', 'libputil.in', 'libaudio.in',
-         'libpgui.in']
-OBJFILES=['panda_panda.obj', 'libpanda_module.obj', 'recorder_composite1.obj',
-          'recorder_composite2.obj', 'librecorder_igate.obj',
-          'pgraph_nodePath.obj', 'pgraph_composite1.obj', 'pgraph_composite2.obj', 'libpgraph_igate.obj',
-          'grutil_multitexReducer.obj', 'grutil_composite1.obj', 'libgrutil_igate.obj',
-          'chan_composite1.obj', 'chan_composite2.obj', 'libchan_igate.obj', 'pstatclient_composite1.obj',
-          'pstatclient_composite2.obj', 'libpstatclient_igate.obj', 'char_composite1.obj',
-          'char_composite2.obj', 'libchar_igate.obj', 'collide_composite1.obj', 'collide_composite2.obj',
-          'libcollide_igate.obj', 'device_composite1.obj', 'device_composite2.obj', 'libdevice_igate.obj',
-          'dgraph_composite1.obj', 'dgraph_composite2.obj', 'libdgraph_igate.obj', 'display_composite1.obj',
-          'display_composite2.obj', 'libdisplay_igate.obj', 'event_composite1.obj', 'libevent_igate.obj',
-          'gobj_composite1.obj', 'gobj_composite2.obj', 'libgobj_igate.obj', 'gsgbase_composite1.obj',
-          'libgsgbase_igate.obj', 'gsgmisc_geomIssuer.obj', 'linmath_composite1.obj',
-          'linmath_composite2.obj', 'liblinmath_igate.obj',
-          'mathutil_composite1.obj', 'mathutil_composite2.obj', 'libmathutil_igate.obj',
-          'parametrics_composite1.obj', 'parametrics_composite2.obj', 'libparametrics_igate.obj',
-          'pnmimagetypes_pnmFileTypePNG.obj', 'pnmimagetypes_pnmFileTypeTIFF.obj', 'pnmimagetypes_composite1.obj',
-          'pnmimagetypes_composite2.obj', 'pnmimage_composite1.obj', 'pnmimage_composite2.obj', 'libpnmimage_igate.obj',
-          'text_composite1.obj', 'text_composite2.obj', 'libtext_igate.obj',
-          'tform_composite1.obj', 'tform_composite2.obj',
-          'libtform_igate.obj', 'lerp_composite1.obj', 'liblerp_igate.obj',
-          'putil_composite1.obj', 'putil_composite2.obj', 'libputil_igate.obj',
-          'audio_composite1.obj', 'libaudio_igate.obj', 'pgui_composite1.obj', 'pgui_composite2.obj',
-          'libpgui_igate.obj', 'pandabase_pandabase.obj', 'libpandaexpress.dll', 'libdtoolconfig.dll', 'libdtool.dll']
-if OMIT.count("HELIX")==0:
-    OBJFILES.append("libhelix.ilb")
-    INFILES.append("libhelix.in")
-if OMIT.count("VRPN")==0:
-    OBJFILES.append("pvrpn_composite1.obj")
-    OBJFILES.append("libpvrpn_igate.obj")
-    INFILES.append("libpvrpn.in")
-if OMIT.count("NSPR")==0:
-    OBJFILES.append("net_composite1.obj")
-    OBJFILES.append("net_composite2.obj")
-    OBJFILES.append("libnet_igate.obj")
-    INFILES.append("libnet.in")
-if OMIT.count("FREETYPE")==0:
-    OBJFILES.append("pnmtext_config_pnmtext.obj")
-    OBJFILES.append("pnmtext_freetypeFont.obj")
-    OBJFILES.append("pnmtext_pnmTextGlyph.obj")
-    OBJFILES.append("pnmtext_pnmTextMaker.obj")
-InterrogateModule(outc='libpanda_module.cxx', module='panda', library='libpanda', files=INFILES)
-CompileC(ipath=IPATH, opts=OPTS, src='panda.cxx', obj='panda_panda.obj')
-CompileC(ipath=IPATH, opts=OPTS, src='libpanda_module.cxx', obj='libpanda_module.obj')
-CompileLink(opts=OPTS, dll='libpanda.dll', obj=OBJFILES, xdep=[
-        PREFIX+'/tmp/dtool_have_helix.dat',
-        PREFIX+'/tmp/dtool_have_vrpn.dat',
-        PREFIX+'/tmp/dtool_have_nspr.dat',
-        PREFIX+'/tmp/dtool_have_freetype.dat',
-])
-
-#
-# DIRECTORY: panda/src/audiotraits/
-#
-
-if OMIT.count("FMOD") == 0:
-  IPATH=['panda/src/audiotraits']
-  OPTS=['BUILDING_FMOD_AUDIO', 'NSPR', 'FMOD']
-  CompileC(ipath=IPATH, opts=OPTS, src='fmod_audio_composite1.cxx', obj='fmod_audio_fmod_audio_composite1.obj')
-  CompileLink(opts=['ADVAPI', 'WINUSER', 'WINMM', 'FMOD', 'NSPR'], dll='libfmod_audio.dll', obj=[
-               'fmod_audio_fmod_audio_composite1.obj',
-               'libpanda.dll',
-               'libpandaexpress.dll',
-               'libdtoolconfig.dll',
-               'libdtool.dll',
-  ])
-
-if OMIT.count("MILES") == 0:
-  IPATH=['panda/src/audiotraits']
-  OPTS=['BUILDING_MILES_AUDIO', 'NSPR', 'MILES']
-  CompileC(ipath=IPATH, opts=OPTS, src='miles_audio_composite1.cxx', obj='miles_audio_miles_audio_composite1.obj')
-  CompileLink(opts=['ADVAPI', 'WINUSER', 'WINMM', 'MILES', 'NSPR'], dll='libmiles_audio.dll', obj=[
-               'miles_audio_miles_audio_composite1.obj',
-               'libpanda.dll',
-               'libpandaexpress.dll',
-               'libdtoolconfig.dll',
-               'libdtool.dll',
-  ])
-
-#
-# DIRECTORY: panda/src/builder/
-#
-
-IPATH=['panda/src/builder']
-OPTS=['BUILDING_PANDAEGG', 'NSPR']
-CompileC(ipath=IPATH, opts=OPTS, src='builder_composite1.cxx', obj='builder_composite1.obj')
-CompileC(ipath=IPATH, opts=OPTS, src='builder_composite2.cxx', obj='builder_composite2.obj')
-
-#
-# DIRECTORY: panda/src/distort/
-#
-
-IPATH=['panda/src/distort']
-OPTS=['BUILDING_PANDAFX', 'NSPR']
-CompileC(ipath=IPATH, opts=OPTS, src='distort_composite1.cxx', obj='distort_composite1.obj')
-Interrogate(ipath=IPATH, opts=OPTS, outd='libdistort.in', outc='libdistort_igate.cxx',
-            src='panda/src/distort',  module='pandafx', library='libdistort',
-            files=['config_distort.h', 'projectionScreen.h', 'cylindricalLens.h', 'fisheyeLens.h', 'nonlinearImager.h', 'pSphereLens.h', 'distort_composite1.cxx'])
-CompileC(ipath=IPATH, opts=OPTS, src='libdistort_igate.cxx', obj='libdistort_igate.obj')
-
-#
-# DIRECTORY: panda/src/downloadertools/
-#
-
-if OMIT.count("SSL")==0:
-    IPATH=['panda/src/downloadertools']
-    OPTS=['SSL', 'ZLIB', 'NSPR']
-    CompileC(ipath=IPATH, opts=OPTS, src='apply_patch.cxx', obj='apply_patch_apply_patch.obj')
-    CompileLink(dll='apply_patch.exe', opts=['ADVAPI', 'NSPR'], obj=[
-                 'apply_patch_apply_patch.obj',
-                 'libpandaexpress.dll',
-                 'libpanda.dll',
-                 'libdtoolconfig.dll',
-                 'libdtool.dll',
-                 'libpystub.dll',
-    ])
-    CompileC(ipath=IPATH, opts=OPTS, src='build_patch.cxx', obj='build_patch_build_patch.obj')
-    CompileLink(dll='build_patch.exe', opts=['ADVAPI', 'NSPR'], obj=[
-                 'build_patch_build_patch.obj',
-                 'libpandaexpress.dll',
-                 'libpanda.dll',
-                 'libdtoolconfig.dll',
-                 'libdtool.dll',
-                 'libpystub.dll',
-    ])
-    IPATH=['panda/src/downloadertools']
-    OPTS=['SSL', 'ZLIB', 'ZLIB', 'NSPR']
-    CompileC(ipath=IPATH, opts=OPTS, src='check_adler.cxx', obj='check_adler_check_adler.obj')
-    CompileLink(dll='check_adler.exe', opts=['ADVAPI', 'NSPR', 'ZLIB'], obj=[
-                 'check_adler_check_adler.obj',
-                 'libpandaexpress.dll',
-                 'libpanda.dll',
-                 'libdtoolconfig.dll',
-                 'libdtool.dll',
-                 'libpystub.dll',
-    ])
-    CompileC(ipath=IPATH, opts=OPTS, src='check_crc.cxx', obj='check_crc_check_crc.obj')
-    CompileLink(dll='check_crc.exe', opts=['ADVAPI', 'NSPR', 'ZLIB'], obj=[
-                 'check_crc_check_crc.obj',
-                 'libpandaexpress.dll',
-                 'libpanda.dll',
-                 'libdtoolconfig.dll',
-                 'libdtool.dll',
-                 'libpystub.dll',
-    ])
-    IPATH=['panda/src/downloadertools']
-    OPTS=['SSL', 'ZLIB', 'NSPR']
-    CompileC(ipath=IPATH, opts=OPTS, src='check_md5.cxx', obj='check_md5_check_md5.obj')
-    CompileLink(dll='check_md5.exe', opts=['ADVAPI', 'NSPR', 'SSL'], obj=[
-                 'check_md5_check_md5.obj',
-                 'libpandaexpress.dll',
-                 'libpanda.dll',
-                 'libdtoolconfig.dll',
-                 'libdtool.dll',
-                 'libpystub.dll',
-    ])
-    CompileC(ipath=IPATH, opts=OPTS, src='multify.cxx', obj='multify_multify.obj')
-    CompileLink(dll='multify.exe', opts=['ADVAPI', 'NSPR'], obj=[
-                 'multify_multify.obj',
-                 'libpandaexpress.dll',
-                 'libpanda.dll',
-                 'libdtoolconfig.dll',
-                 'libdtool.dll',
-                 'libpystub.dll',
-    ])
-    IPATH=['panda/src/downloadertools']
-    OPTS=['SSL', 'ZLIB', 'ZLIB', 'NSPR']
-    CompileC(ipath=IPATH, opts=OPTS, src='pcompress.cxx', obj='pcompress_pcompress.obj')
-    CompileLink(dll='pcompress.exe', opts=['ADVAPI', 'NSPR', 'ZLIB'], obj=[
-                 'pcompress_pcompress.obj',
-                 'libpandaexpress.dll',
-                 'libpanda.dll',
-                 'libdtoolconfig.dll',
-                 'libdtool.dll',
-                 'libpystub.dll',
-    ])
-    CompileC(ipath=IPATH, opts=OPTS, src='pdecompress.cxx', obj='pdecompress_pdecompress.obj')
-    CompileLink(dll='pdecompress.exe', opts=['ADVAPI', 'NSPR', 'ZLIB'], obj=[
-                 'pdecompress_pdecompress.obj',
-                 'libpandaexpress.dll',
-                 'libpanda.dll',
-                 'libdtoolconfig.dll',
-                 'libdtool.dll',
-                 'libpystub.dll',
-    ])
-    IPATH=['panda/src/downloadertools']
-    OPTS=['SSL', 'ZLIB', 'NSPR']
-    CompileC(ipath=IPATH, opts=OPTS, src='pdecrypt.cxx', obj='pdecrypt_pdecrypt.obj')
-    CompileLink(dll='pdecrypt.exe', opts=['ADVAPI', 'NSPR', 'SSL'], obj=[
-                 'pdecrypt_pdecrypt.obj',
-                 'libpandaexpress.dll',
-                 'libpanda.dll',
-                 'libdtoolconfig.dll',
-                 'libdtool.dll',
-                 'libpystub.dll',
-    ])
-    CompileC(ipath=IPATH, opts=OPTS, src='pencrypt.cxx', obj='pencrypt_pencrypt.obj')
-    CompileLink(dll='pencrypt.exe', opts=['ADVAPI', 'NSPR', 'SSL'], obj=[
-                 'pencrypt_pencrypt.obj',
-                 'libpandaexpress.dll',
-                 'libpanda.dll',
-                 'libdtoolconfig.dll',
-                 'libdtool.dll',
-                 'libpystub.dll',
-    ])
-    CompileC(ipath=IPATH, opts=OPTS, src='show_ddb.cxx', obj='show_ddb_show_ddb.obj')
-    CompileLink(dll='show_ddb.exe', opts=['ADVAPI', 'NSPR'], obj=[
-                 'show_ddb_show_ddb.obj',
-                 'libpandaexpress.dll',
-                 'libpanda.dll',
-                 'libdtoolconfig.dll',
-                 'libdtool.dll',
-                 'libpystub.dll',
-    ])
-
-#
-# DIRECTORY: panda/src/glgsg/
-#
-
-IPATH=['panda/src/glgsg', 'panda/src/glstuff', 'panda/src/gobj']
-OPTS=['BUILDING_PANDAGL', 'NSPR', 'NVIDIACG']
-CompileC(ipath=IPATH, opts=OPTS, src='config_glgsg.cxx', obj='glgsg_config_glgsg.obj')
-CompileC(ipath=IPATH, opts=OPTS, src='glgsg.cxx', obj='glgsg_glgsg.obj')
-
-#
-# DIRECTORY: panda/src/effects/
-#
-
-IPATH=['panda/src/effects']
-OPTS=['BUILDING_PANDAFX', 'NSPR', 'NVIDIACG']
-CompileC(ipath=IPATH, opts=OPTS, src='effects_composite1.cxx', obj='effects_composite1.obj')
-Interrogate(ipath=IPATH, opts=OPTS, outd='libeffects.in', outc='libeffects_igate.cxx',
-            src='panda/src/effects',  module='pandafx', library='libeffects',
-            files=['config_effects.h', 'cgShader.h', 'cgShaderAttrib.h', 'cgShaderContext.h', 'lensFlareNode.h', 'effects_composite1.cxx'])
-CompileC(ipath=IPATH, opts=OPTS, src='libeffects_igate.cxx', obj='libeffects_igate.obj')
-
-#
-# DIRECTORY: panda/metalibs/pandafx/
-#
-
-IPATH=['panda/metalibs/pandafx', 'panda/src/distort']
-OPTS=['BUILDING_PANDAFX', 'NSPR', 'NVIDIACG']
-CompileC(ipath=IPATH, opts=OPTS, src='pandafx.cxx', obj='pandafx_pandafx.obj')
-InterrogateModule(outc='libpandafx_module.cxx', module='pandafx', library='libpandafx',
-                  files=['libdistort.in', 'libeffects.in'])
-CompileC(ipath=IPATH, opts=OPTS, src='libpandafx_module.cxx', obj='libpandafx_module.obj')
-CompileLink(dll='libpandafx.dll', opts=['ADVAPI', 'NSPR', 'NVIDIACG'], obj=[
-             'pandafx_pandafx.obj',
-             'libpandafx_module.obj',
-             'distort_composite1.obj',
-             'libdistort_igate.obj',
-             'effects_composite1.obj',
-             'libeffects_igate.obj',
-             'libpanda.dll',
-             'libpandaexpress.dll',
-             'libdtoolconfig.dll',
-             'libdtool.dll',
-])
-
-#
-# DIRECTORY: panda/src/glstuff/
-#
-
-IPATH=['panda/src/glstuff']
-OPTS=['NSPR', 'NVIDIACG', 'CGGL']
-CompileC(ipath=IPATH, opts=OPTS, src='glpure.cxx', obj='glstuff_glpure.obj')
-CompileLink(dll='libglstuff.dll', opts=['ADVAPI', 'GLUT', 'NSPR', 'NVIDIACG', 'CGGL'], obj=[
-             'glstuff_glpure.obj',
-             'libpanda.dll',
-             'libpandafx.dll',
-             'libpandaexpress.dll',
-             'libdtoolconfig.dll',
-             'libdtool.dll',
-])
-
-#
-# DIRECTORY: panda/src/windisplay/
-#
-
-if (sys.platform == "win32" or sys.platform == "cygwin"):
-    IPATH=['panda/src/windisplay']
-    OPTS=['BUILDING_PANDAWIN', 'NSPR']
-    CompileC(ipath=IPATH, opts=OPTS, src='winGraphicsWindow.cxx', obj='windisplay_winGraphicsWindow.obj')
-    CompileC(ipath=IPATH, opts=OPTS, src='config_windisplay.cxx', obj='windisplay_config_windisplay.obj')
-    CompileC(ipath=IPATH, opts=OPTS, src='winGraphicsPipe.cxx', obj='windisplay_winGraphicsPipe.obj')
-    CompileLink(opts=['WINIMM', 'WINGDI', 'WINKERNEL', 'WINOLDNAMES', 'WINUSER', 'WINMM', 'NSPR'],
-                dll='libwindisplay.dll', obj=[
-      'windisplay_winGraphicsWindow.obj',
-      'windisplay_config_windisplay.obj',
-      'windisplay_winGraphicsPipe.obj',
-      'libpanda.dll',
-      'libpandaexpress.dll',
-      'libdtoolconfig.dll',
-      'libdtool.dll',
-      ])
-
-#
-# DIRECTORY: panda/src/glxdisplay/
-#
-
-if (sys.platform != "win32" and sys.platform != "cygwin"):
-    IPATH=['panda/src/glxdisplay', 'panda/src/gobj']
-    OPTS=['BUILDING_PANDAGLUT', 'NSPR', 'GLUT', 'NVIDIACG', 'CGGL']
-    CompileC(ipath=IPATH, opts=OPTS, src='glxdisplay_composite1.cxx',     obj='glxdisplay_composite1.obj')
-    Interrogate(ipath=IPATH, opts=OPTS, outd='libglxdisplay.in', outc='libglxdisplay_igate.cxx',
-                src='panda/src/glxdisplay',  module='pandagl', library='libglxdisplay', files=['glxGraphicsPipe.h'])
-    CompileC(ipath=IPATH, opts=OPTS, src='libglxdisplay_igate.cxx',      obj='libglxdisplay_igate.obj')
-
-    IPATH=['panda/metalibs/pandagl']
-    OPTS=['BUILDING_PANDAGL', 'NSPR', 'NVIDIACG', 'CGGL']
-    CompileC(ipath=IPATH, opts=OPTS, src='pandagl.cxx', obj='pandagl_pandagl.obj')
-    CompileLink(opts=['GLUT', 'NVIDIACG', 'CGGL', 'NSPR'], dll='libpandagl.dll', obj=[
-      'pandagl_pandagl.obj',
-      'glgsg_config_glgsg.obj',
-      'glgsg_glgsg.obj',
-      'glxdisplay_composite1.obj',
-      'libglxdisplay_igate.obj',
-      'libpanda.dll',
-      'libpandaexpress.dll',
-      'libglstuff.dll',
-      'libpandafx.dll',
-      'libdtoolconfig.dll',
-      'libdtool.dll',
-      ])
-
-#
-# DIRECTORY: panda/src/wgldisplay/
-#
-
-if (sys.platform == "win32" or sys.platform == "cygwin"):
-    IPATH=['panda/src/wgldisplay', 'panda/src/glstuff', 'panda/src/gobj']
-    OPTS=['BUILDING_PANDAGL', 'NSPR', 'NVIDIACG', 'CGGL']
-    CompileC(ipath=IPATH, opts=OPTS, src='wgldisplay_composite1.cxx', obj='wgldisplay_composite1.obj')
-
-    IPATH=['panda/metalibs/pandagl']
-    OPTS=['BUILDING_PANDAGL', 'NSPR', 'NVIDIACG', 'CGGL']
-    CompileC(ipath=IPATH, opts=OPTS, src='pandagl.cxx', obj='pandagl_pandagl.obj')
-    CompileLink(opts=['WINGDI', 'GLUT', 'WINKERNEL', 'WINOLDNAMES', 'WINUSER', 'WINMM', 'NSPR', 'NVIDIACG', 'CGGL'],
-                dll='libpandagl.dll', obj=[
-      'pandagl_pandagl.obj',
-      'glgsg_config_glgsg.obj',
-      'glgsg_glgsg.obj',
-      'wgldisplay_composite1.obj',
-      'libwindisplay.dll',
-      'libpanda.dll',
-      'libpandaexpress.dll',
-      'libglstuff.dll',
-      'libpandafx.dll',
-      'libdtoolconfig.dll',
-      'libdtool.dll',
-      ])
-
-#
-# DIRECTORY: panda/metalibs/pandadx7/
-#
-
-if (sys.platform == "win32" or sys.platform == "cygwin"):
-    IPATH=['panda/src/dxgsg7']
-    OPTS=['BUILDING_PANDADX', 'DXSDK', 'NSPR']
-    CompileC(ipath=IPATH, opts=OPTS, src='dxGraphicsStateGuardian7.cxx', obj='dxgsg7_dxGraphicsStateGuardian7.obj')
-    CompileC(ipath=IPATH, opts=OPTS, src='dxgsg7_composite1.cxx', obj='dxgsg7_composite1.obj')
-
-    IPATH=['panda/metalibs/pandadx7']
-    OPTS=['BUILDING_PANDADX', 'DXSDK', 'NSPR']
-    CompileC(ipath=IPATH, opts=OPTS, src='pandadx7.cxx', obj='pandadx7_pandadx7.obj')
-    CompileLink(dll='libpandadx7.dll', opts=['ADVAPI', 'WINGDI', 'WINKERNEL', 'WINUSER', 'WINMM', 'DXDRAW', 'DXGUID', 'D3D8', 'NSPR'], obj=[
-      'pandadx7_pandadx7.obj',
-      'dxgsg7_dxGraphicsStateGuardian7.obj',
-      'dxgsg7_composite1.obj',
-      'libpanda.dll',
-      'libpandaexpress.dll',
-      'libwindisplay.dll',
-      'libdtoolconfig.dll',
-      'libdtool.dll',
-      ])
-
-#
-# DIRECTORY: panda/metalibs/pandadx8/
-#
-
-if (sys.platform == "win32" or sys.platform == "cygwin"):
-    IPATH=['panda/src/dxgsg8']
-    OPTS=['BUILDING_PANDADX', 'DXSDK', 'NSPR']
-    CompileC(ipath=IPATH, opts=OPTS, src='dxGraphicsStateGuardian8.cxx', obj='dxgsg8_dxGraphicsStateGuardian8.obj')
-    CompileC(ipath=IPATH, opts=OPTS, src='dxgsg8_composite1.cxx', obj='dxgsg8_composite1.obj')
-
-    IPATH=['panda/metalibs/pandadx8']
-    OPTS=['BUILDING_PANDADX', 'DXSDK', 'NSPR']
-    CompileC(ipath=IPATH, opts=OPTS, src='pandadx8.cxx', obj='pandadx8_pandadx8.obj')
-    CompileLink(dll='libpandadx8.dll',
-      opts=['ADVAPI', 'WINGDI', 'WINKERNEL', 'WINUSER', 'WINMM', 'DXDRAW', 'DXGUID', 'D3D8', 'NSPR'], obj=[
-      'pandadx8_pandadx8.obj',
-      'dxgsg8_dxGraphicsStateGuardian8.obj',
-      'dxgsg8_composite1.obj',
-      'libpanda.dll',
-      'libpandaexpress.dll',
-      'libwindisplay.dll',
-      'libdtoolconfig.dll',
-      'libdtool.dll',
-      ])
-
-#
-# DIRECTORY: panda/metalibs/pandadx9/
-#
-
-if (sys.platform == "win32" or sys.platform == "cygwin"):
-    IPATH=['panda/src/dxgsg9']
-    OPTS=['BUILDING_PANDADX', 'DXSDK', 'NSPR']
-    CompileC(ipath=IPATH, opts=OPTS, src='dxGraphicsStateGuardian9.cxx', obj='dxgsg9_dxGraphicsStateGuardian9.obj')
-    CompileC(ipath=IPATH, opts=OPTS, src='dxgsg9_composite1.cxx', obj='dxgsg9_composite1.obj')
-
-    IPATH=['panda/metalibs/pandadx9']
-    OPTS=['BUILDING_PANDADX', 'DXSDK', 'NSPR']
-    CompileC(ipath=IPATH, opts=OPTS, src='pandadx9.cxx', obj='pandadx9_pandadx9.obj')
-    CompileLink(dll='libpandadx9.dll',
-      opts=['ADVAPI', 'WINGDI', 'WINKERNEL', 'WINUSER', 'WINMM', 'DXDRAW', 'DXGUID', 'D3D9', 'NSPR'], obj=[
-      'pandadx9_pandadx9.obj',
-      'dxgsg9_dxGraphicsStateGuardian9.obj',
-      'dxgsg9_composite1.obj',
-      'libpanda.dll',
-      'libpandaexpress.dll',
-      'libwindisplay.dll',
-      'libdtoolconfig.dll',
-      'libdtool.dll',
-      ])
-
-#
-# DIRECTORY: panda/src/egg/
-#
-
-IPATH=['panda/src/egg']
-CompileBison(pre='eggyy', dstc='parser.cxx', dsth='parser.h', src='panda/src/egg/parser.yxx')
-CompileFlex(pre='eggyy', dst='lexer.cxx', src='panda/src/egg/lexer.lxx', dashi=1)
-OPTS=['BUILDING_PANDAEGG', 'NSPR']
-CompileC(ipath=IPATH, opts=OPTS, src='egg_composite1.cxx', obj='egg_composite1.obj')
-CompileC(ipath=IPATH, opts=OPTS, src='egg_composite2.cxx', obj='egg_composite2.obj')
-CompileC(ipath=IPATH, opts=OPTS, src='parser.cxx', obj='egg_parser.obj')
-CompileC(ipath=IPATH, opts=OPTS, src='lexer.cxx', obj='egg_lexer.obj')
-Interrogate(ipath=IPATH, opts=OPTS, outd='libegg.in', outc='libegg_igate.cxx',
-            src='panda/src/egg',  module='pandaegg', library='libegg', files=[
-            'config_egg.h', 'eggAnimData.h', 'eggAttributes.h', 'eggBin.h', 'eggBinMaker.h', 'eggComment.h',
-            'eggCoordinateSystem.h', 'eggCurve.h', 'eggData.h', 'eggExternalReference.h', 'eggFilenameNode.h',
-            'eggGroup.h', 'eggGroupNode.h', 'eggGroupUniquifier.h', 'eggLine.h', 'eggMaterial.h',
-            'eggMaterialCollection.h', 'eggMiscFuncs.h', 'eggMorph.h', 'eggMorphList.h', 'eggNamedObject.h',
-            'eggNameUniquifier.h', 'eggNode.h', 'eggNurbsCurve.h', 'eggNurbsSurface.h', 'eggObject.h',
-            'eggParameters.h', 'eggPoint.h', 'eggPolygon.h', 'eggPolysetMaker.h', 'eggPoolUniquifier.h',
-            'eggPrimitive.h', 'eggRenderMode.h', 'eggSAnimData.h', 'eggSurface.h', 'eggSwitchCondition.h',
-            'eggTable.h', 'eggTexture.h', 'eggTextureCollection.h', 'eggTransform3d.h', 'eggUserData.h',
-            'eggUtilities.h', 'eggVertex.h', 'eggVertexPool.h', 'eggVertexUV.h', 'eggXfmAnimData.h',
-            'eggXfmSAnim.h', 'parserDefs.h', 'lexerDefs.h', 'pt_EggMaterial.h', 'vector_PT_EggMaterial.h',
-            'pt_EggTexture.h', 'vector_PT_EggTexture.h', 'pt_EggVertex.h', 'vector_PT_EggVertex.h',
-            'egg_composite1.cxx', 'egg_composite2.cxx'])
-CompileC(ipath=IPATH, opts=OPTS, src='libegg_igate.cxx', obj='libegg_igate.obj')
-
-#
-# DIRECTORY: panda/src/egg2pg/
-#
-
-IPATH=['panda/src/egg2pg']
-OPTS=['BUILDING_PANDAEGG', 'NSPR']
-CompileC(ipath=IPATH, opts=OPTS, src='egg2pg_composite1.cxx', obj='egg2pg_composite1.obj')
-CompileC(ipath=IPATH, opts=OPTS, src='egg2pg_composite2.cxx', obj='egg2pg_composite2.obj')
-Interrogate(ipath=IPATH, opts=OPTS, outd='libegg2pg.in', outc='libegg2pg_igate.cxx',
-            src='panda/src/egg2pg',  module='pandaegg', library='libegg2pg', files=['load_egg_file.h'])
-CompileC(ipath=IPATH, opts=OPTS, src='libegg2pg_igate.cxx', obj='libegg2pg_igate.obj')
-
-#
-# DIRECTORY: panda/src/framework/
-#
-
-IPATH=['panda/src/framework']
-OPTS=['BUILDING_FRAMEWORK', 'NSPR']
-CompileC(ipath=IPATH, opts=OPTS, src='config_framework.cxx', obj='framework_config_framework.obj')
-CompileC(ipath=IPATH, opts=OPTS, src='pandaFramework.cxx', obj='framework_pandaFramework.obj')
-CompileC(ipath=IPATH, opts=OPTS, src='windowFramework.cxx', obj='framework_windowFramework.obj')
-CompileLink(dll='libframework.dll', opts=['ADVAPI', 'NSPR'], obj=[
-             'framework_config_framework.obj',
-             'framework_pandaFramework.obj',
-             'framework_windowFramework.obj',
-             'libpanda.dll',
-             'libpandaexpress.dll',
-             'libdtoolconfig.dll',
-             'libdtool.dll',
-             ])
-
-#
-# DIRECTORY: panda/metalibs/pandaegg/
-#
-
-IPATH=['panda/metalibs/pandaegg', 'panda/src/egg']
-OPTS=['BUILDING_PANDAEGG', 'NSPR']
-CompileC(ipath=IPATH, opts=OPTS, src='pandaegg.cxx', obj='pandaegg_pandaegg.obj')
-InterrogateModule(outc='libpandaegg_module.cxx', module='pandaegg', library='libpandaegg',
-                  files=['libegg2pg.in', 'libegg.in'])
-CompileC(ipath=IPATH, opts=OPTS, src='libpandaegg_module.cxx', obj='libpandaegg_module.obj')
-CompileLink(dll='libpandaegg.dll', opts=['ADVAPI', 'NSPR'], obj=[
-             'pandaegg_pandaegg.obj',
-             'libpandaegg_module.obj',
-             'egg2pg_composite1.obj',
-             'egg2pg_composite2.obj',
-             'libegg2pg_igate.obj',
-             'egg_composite1.obj',
-             'egg_composite2.obj',
-             'egg_parser.obj',
-             'egg_lexer.obj',
-             'libegg_igate.obj',
-             'builder_composite1.obj',
-             'builder_composite2.obj',
-             'libpanda.dll',
-             'libpandaexpress.dll',
-             'libdtoolconfig.dll',
-             'libdtool.dll',
-])
-
-#
-# DIRECTORY: panda/src/physics/
-#
-
-IPATH=['panda/src/physics']
-OPTS=['BUILDING_PANDAPHYSICS', 'NSPR']
-CompileC(ipath=IPATH, opts=OPTS, src='physics_composite1.cxx', obj='physics_composite1.obj')
-CompileC(ipath=IPATH, opts=OPTS, src='physics_composite2.cxx', obj='physics_composite2.obj')
-Interrogate(ipath=IPATH, opts=OPTS, outd='libphysics.in', outc='libphysics_igate.cxx',
-            src='panda/src/physics',  module='pandaphysics', library='libphysics',
-            files=['actorNode.h', 'angularEulerIntegrator.h', 'angularForce.h', 'angularIntegrator.h', 'angularVectorForce.h', 'baseForce.h', 'baseIntegrator.h', 'config_physics.h', 'forceNode.h', 'linearCylinderVortexForce.h', 'linearDistanceForce.h', 'linearEulerIntegrator.h', 'linearForce.h', 'linearFrictionForce.h', 'linearIntegrator.h', 'linearJitterForce.h', 'linearNoiseForce.h', 'linearRandomForce.h', 'linearSinkForce.h', 'linearSourceForce.h', 'linearUserDefinedForce.h', 'linearVectorForce.h', 'physical.h', 'physicalNode.h', 'physicsCollisionHandler.h', 'physicsManager.h', 'physicsObject.h', 'physics_composite1.cxx', 'physics_composite2.cxx'])
-CompileC(ipath=IPATH, opts=OPTS, src='libphysics_igate.cxx', obj='libphysics_igate.obj')
-
-#
-# DIRECTORY: panda/src/particlesystem/
-#
-
-IPATH=['panda/src/particlesystem']
-OPTS=['BUILDING_PANDAPHYSICS', 'NSPR']
-CompileC(ipath=IPATH, opts=OPTS, src='particlesystem_composite1.cxx', obj='particlesystem_composite1.obj')
-CompileC(ipath=IPATH, opts=OPTS, src='particlesystem_composite2.cxx', obj='particlesystem_composite2.obj')
-Interrogate(ipath=IPATH, opts=OPTS, outd='libparticlesystem.in', outc='libparticlesystem_igate.cxx',
-            src='panda/src/particlesystem',  module='pandaphysics', library='libparticlesystem',
-            files=['baseParticle.h', 'baseParticleEmitter.h', 'baseParticleFactory.h', 'baseParticleRenderer.h', 'boxEmitter.h', 'config_particlesystem.h', 'discEmitter.h', 'geomParticleRenderer.h', 'lineEmitter.h', 'lineParticleRenderer.h', 'particleSystem.h', 'particleSystemManager.h', 'pointEmitter.h', 'pointParticle.h', 'pointParticleFactory.h', 'pointParticleRenderer.h', 'rectangleEmitter.h', 'ringEmitter.h', 'sparkleParticleRenderer.h', 'sphereSurfaceEmitter.h', 'sphereVolumeEmitter.h', 'spriteParticleRenderer.h', 'tangentRingEmitter.h', 'zSpinParticle.h', 'zSpinParticleFactory.h', 'particleCommonFuncs.h', 'particlesystem_composite1.cxx', 'particlesystem_composite2.cxx'])
-CompileC(ipath=IPATH, opts=OPTS, src='libparticlesystem_igate.cxx', obj='libparticlesystem_igate.obj')
-
-#
-# DIRECTORY: panda/metalibs/pandaphysics/
-#
-
-IPATH=['panda/metalibs/pandaphysics']
-OPTS=['BUILDING_PANDAPHYSICS', 'NSPR']
-CompileC(ipath=IPATH, opts=OPTS, src='pandaphysics.cxx', obj='pandaphysics_pandaphysics.obj')
-InterrogateModule(outc='libpandaphysics_module.cxx', module='pandaphysics', library='libpandaphysics',
-                  files=['libphysics.in', 'libparticlesystem.in'])
-CompileC(ipath=IPATH, opts=OPTS, src='libpandaphysics_module.cxx', obj='libpandaphysics_module.obj')
-CompileLink(dll='libpandaphysics.dll', opts=['ADVAPI', 'NSPR'], obj=[
-             'pandaphysics_pandaphysics.obj',
-             'libpandaphysics_module.obj',
-             'physics_composite1.obj',
-             'physics_composite2.obj',
-             'libphysics_igate.obj',
-             'particlesystem_composite1.obj',
-             'particlesystem_composite2.obj',
-             'libparticlesystem_igate.obj',
-             'libpanda.dll',
-             'libpandaexpress.dll',
-             'libdtoolconfig.dll',
-             'libdtool.dll',
-])
-
-#
-# DIRECTORY: panda/src/testbed/
-#
-
-IPATH=['panda/src/testbed']
-OPTS=['NSPR']
-CompileC(ipath=IPATH, opts=OPTS, src='pview.cxx', obj='pview_pview.obj')
-CompileLink(dll='pview.exe', opts=['ADVAPI', 'NSPR'], obj=[
-             'pview_pview.obj',
-             'libframework.dll',
-             'libpanda.dll',
-             'libpandafx.dll',
-             'libpandaexpress.dll',
-             'libdtoolconfig.dll',
-             'libdtool.dll',
-             'libpystub.dll',
-])
-
-#
-# DIRECTORY: direct/src/directbase/
-#
-
-IPATH=['direct/src/directbase']
-OPTS=['BUILDING_DIRECT', 'NSPR']
-CompileC(ipath=IPATH, opts=OPTS, src='directbase.cxx', obj='directbase_directbase.obj')
-
-#
-# DIRECTORY: direct/src/dcparser/
-#
-
-CompileBison(pre='dcyy', dstc='dcParser.cxx', dsth='dcParser.h', src='direct/src/dcparser/dcParser.yxx')
-CompileFlex(pre='dcyy', dst='dcLexer.cxx', src='direct/src/dcparser/dcLexer.lxx', dashi=0)
-IPATH=['direct/src/dcparser']
-OPTS=['WITHINPANDA', 'BUILDING_DIRECT', 'NSPR']
-CompileC(ipath=IPATH, opts=OPTS, src='dcparser_composite1.cxx', obj='dcparser_composite1.obj')
-CompileC(ipath=IPATH, opts=OPTS, src='dcparser_composite2.cxx', obj='dcparser_composite2.obj')
-CompileC(ipath=IPATH, opts=OPTS, src='dcParser.cxx', obj='dcparser_dcParser.obj')
-CompileC(ipath=IPATH, opts=OPTS, src='dcLexer.cxx', obj='dcparser_dcLexer.obj')
-Interrogate(ipath=IPATH, opts=OPTS, outd='libdcparser.in', outc='libdcparser_igate.cxx',
-            src='direct/src/dcparser',  module='direct', library='libdcparser',
-            files=['dcAtomicField.h', 'dcClass.h', 'dcDeclaration.h', 'dcField.h', 'dcFile.h',
-            'dcLexerDefs.h', 'dcMolecularField.h', 'dcParserDefs.h', 'dcSubatomicType.h',
-            'dcPackData.h', 'dcPacker.h', 'dcPackerCatalog.h', 'dcPackerInterface.h',
-            'dcParameter.h', 'dcClassParameter.h', 'dcArrayParameter.h', 'dcSimpleParameter.h',
-            'dcSwitchParameter.h', 'dcNumericRange.h', 'dcSwitch.h', 'dcTypedef.h', 'dcPython.h',
-            'dcbase.h', 'dcindent.h', 'hashGenerator.h', 'primeNumberGenerator.h',
-            'dcparser_composite1.cxx', 'dcparser_composite2.cxx'])
-CompileC(ipath=IPATH, opts=OPTS, src='libdcparser_igate.cxx', obj='libdcparser_igate.obj')
-
-#
-# DIRECTORY: direct/src/deadrec/
-#
-
-IPATH=['direct/src/deadrec']
-OPTS=['BUILDING_DIRECT', 'NSPR']
-CompileC(ipath=IPATH, opts=OPTS, src='deadrec_composite1.cxx', obj='deadrec_composite1.obj')
-Interrogate(ipath=IPATH, opts=OPTS, outd='libdeadrec.in', outc='libdeadrec_igate.cxx',
-            src='direct/src/deadrec',  module='direct', library='libdeadrec',
-            files=['smoothMover.h', 'deadrec_composite1.cxx'])
-CompileC(ipath=IPATH, opts=OPTS, src='libdeadrec_igate.cxx', obj='libdeadrec_igate.obj')
-
-#
-# DIRECTORY: direct/src/distributed/
-#
-
-IPATH=['direct/src/distributed', 'direct/src/dcparser']
-OPTS=['WITHINPANDA', 'BUILDING_DIRECT', 'SSL', 'NSPR']
-CompileC(ipath=IPATH, opts=OPTS, src='config_distributed.cxx', obj='distributed_config_distributed.obj')
-CompileC(ipath=IPATH, opts=OPTS, src='cConnectionRepository.cxx', obj='distributed_cConnectionRepository.obj')
-CompileC(ipath=IPATH, opts=OPTS, src='cDistributedSmoothNodeBase.cxx', obj='distributed_cDistributedSmoothNodeBase.obj')
-Interrogate(ipath=IPATH, opts=OPTS, outd='libdistributed.in', outc='libdistributed_igate.cxx',
-            src='direct/src/distributed',  module='direct', library='libdistributed',
-            files=['config_distributed.cxx', 'config_distributed.h', 'cConnectionRepository.cxx',
-            'cConnectionRepository.h', 'cDistributedSmoothNodeBase.cxx', 'cDistributedSmoothNodeBase.h'])
-CompileC(ipath=IPATH, opts=OPTS, src='libdistributed_igate.cxx', obj='libdistributed_igate.obj')
-
-#
-# DIRECTORY: direct/src/interval/
-#
-
-IPATH=['direct/src/interval']
-OPTS=['BUILDING_DIRECT', 'NSPR']
-#CompileC(ipath=IPATH, opts=OPTS, src='config_interval.cxx', obj='interval_config_interval.obj')
-#CompileC(ipath=IPATH, opts=OPTS, src='cInterval.cxx', obj='interval_cInterval.obj')
-#CompileC(ipath=IPATH, opts=OPTS, src='cIntervalManager.cxx', obj='interval_cIntervalManager.obj')
-#CompileC(ipath=IPATH, opts=OPTS, src='cLerpInterval.cxx', obj='interval_cLerpInterval.obj')
-#CompileC(ipath=IPATH, opts=OPTS, src='cLerpNodePathInterval.cxx', obj='interval_cLerpNodePathInterval.obj')
-#CompileC(ipath=IPATH, opts=OPTS, src='cLerpAnimEffectInterval.cxx', obj='interval_cLerpAnimEffectInterval.obj')
-#CompileC(ipath=IPATH, opts=OPTS, src='cMetaInterval.cxx', obj='interval_cMetaInterval.obj')
-#CompileC(ipath=IPATH, opts=OPTS, src='hideInterval.cxx', obj='interval_hideInterval.obj')
-#CompileC(ipath=IPATH, opts=OPTS, src='showInterval.cxx', obj='interval_showInterval.obj')
-#CompileC(ipath=IPATH, opts=OPTS, src='waitInterval.cxx', obj='interval_waitInterval.obj')
-CompileC(ipath=IPATH, opts=OPTS, src='interval_composite1.cxx', obj='interval_composite1.obj')
-Interrogate(ipath=IPATH, opts=OPTS, outd='libinterval.in', outc='libinterval_igate.cxx',
-            src='direct/src/interval',  module='direct', library='libinterval',
-            files=['config_interval.cxx', 'config_interval.h', 'cInterval.cxx', 'cInterval.h',
-            'cIntervalManager.cxx', 'cIntervalManager.h', 'cLerpInterval.cxx', 'cLerpInterval.h',
-            'cLerpNodePathInterval.cxx', 'cLerpNodePathInterval.h', 'cLerpAnimEffectInterval.cxx',
-            'cLerpAnimEffectInterval.h', 'cMetaInterval.cxx', 'cMetaInterval.h', 'hideInterval.cxx',
-            'hideInterval.h', 'showInterval.cxx', 'showInterval.h', 'waitInterval.cxx', 'waitInterval.h',
-            'lerp_helpers.h'])
-CompileC(ipath=IPATH, opts=OPTS, src='libinterval_igate.cxx', obj='libinterval_igate.obj')
-
-#
-# DIRECTORY: direct/src/showbase/
-#
-
-IPATH=['direct/src/showbase']
-OPTS=['BUILDING_DIRECT', 'NSPR']
-CompileC(ipath=IPATH, opts=OPTS, src='showBase.cxx', obj='showbase_showBase.obj')
-CompileC(ipath=IPATH, opts=OPTS, src='mersenne.cxx', obj='showbase_mersenne.obj')
-Interrogate(ipath=IPATH, opts=OPTS, outd='libshowbase.in', outc='libshowbase_igate.cxx',
-            src='direct/src/showbase', module='direct', library='libshowbase',
-            files=['showBase.cxx', 'showBase.h', 'mersenne.cxx', 'mersenne.h'])
-CompileC(ipath=IPATH, opts=OPTS, src='libshowbase_igate.cxx', obj='libshowbase_igate.obj')
-
-#
-# DIRECTORY: direct/metalibs/direct/
-#
-
-IPATH=['direct/metalibs/direct']
-OPTS=['BUILDING_DIRECT', 'NSPR']
-CompileC(ipath=IPATH, opts=OPTS, src='direct.cxx', obj='direct_direct.obj')
-InterrogateModule(outc='libdirect_module.cxx', module='direct', library='libdirect',
-                  files=['libdcparser.in', 'libshowbase.in', 'libdeadrec.in', 'libinterval.in', 'libdistributed.in'])
-CompileC(ipath=IPATH, opts=OPTS, src='libdirect_module.cxx', obj='libdirect_module.obj')
-CompileLink(dll='libdirect.dll', opts=['ADVAPI', 'NSPR', 'SSL'], obj=[
-             'direct_direct.obj',
-             'libdirect_module.obj',
-             'directbase_directbase.obj',
-             'dcparser_composite1.obj',
-             'dcparser_composite2.obj',
-             'dcparser_dcParser.obj',
-             'dcparser_dcLexer.obj',
-             'libdcparser_igate.obj',
-             'showbase_showBase.obj',
-             'showbase_mersenne.obj',
-             'libshowbase_igate.obj',
-             'deadrec_composite1.obj',
-             'libdeadrec_igate.obj',
-             'interval_composite1.obj',
-             'libinterval_igate.obj',
-             'distributed_config_distributed.obj',
-             'distributed_cConnectionRepository.obj',
-             'distributed_cDistributedSmoothNodeBase.obj',
-             'libdistributed_igate.obj',
-             'libpanda.dll',
-             'libpandaexpress.dll',
-             'libdtoolconfig.dll',
-             'libdtool.dll',
-])
-
-#
-# DIRECTORY: direct/src/dcparse/
-#
-
-IPATH=['direct/src/dcparse', 'direct/src/dcparser']
-OPTS=['WITHINPANDA', 'NSPR']
-CompileC(ipath=IPATH, opts=OPTS, src='dcparse.cxx', obj='dcparse_dcparse.obj')
-CompileLink(dll='dcparse.exe', opts=['ADVAPI', 'NSPR'], obj=[
-             'dcparse_dcparse.obj',
-             'libdirect.dll',
-             'libpandaexpress.dll',
-             'libdtoolconfig.dll',
-             'libdtool.dll',
-             'libpystub.dll',
-])
-
-#
-# DIRECTORY: direct/src/heapq/
-#
-
-IPATH=['direct/src/heapq']
-OPTS=['NSPR']
-CompileC(ipath=IPATH, opts=OPTS, src='heapq.cxx', obj='heapq_heapq.obj')
-CompileLink(dll='libheapq.dll', opts=['ADVAPI', 'NSPR'], obj=[
-             'heapq_heapq.obj',
-             'libpandaexpress.dll',
-             'libdtoolconfig.dll',
-             'libdtool.dll',
-])
-
-#
-# DIRECTORY: pandatool/src/pandatoolbase/
-#
-
-IPATH=['pandatool/src/pandatoolbase']
-OPTS=['NSPR']
-CompileC(ipath=IPATH, opts=OPTS, src='pandatoolbase_composite1.cxx', obj='pandatoolbase_composite1.obj')
-CompileLIB(lib='libpandatoolbase.lib', obj=['pandatoolbase_composite1.obj'])
-
-#
-# DIRECTORY: pandatool/src/converter/
-#
-
-IPATH=['pandatool/src/converter']
-OPTS=['NSPR']
-CompileC(ipath=IPATH, opts=OPTS, src='somethingToEggConverter.cxx', obj='converter_somethingToEggConverter.obj')
-CompileLIB(lib='libconverter.lib', obj=['converter_somethingToEggConverter.obj'])
-
-#
-# DIRECTORY: pandatool/src/progbase/
-#
-
-IPATH=['pandatool/src/progbase']
-OPTS=['NSPR']
-CompileC(ipath=IPATH, opts=OPTS, src='progbase_composite1.cxx', obj='progbase_composite1.obj')
-CompileLIB(lib='libprogbase.lib', obj=['progbase_composite1.obj'])
-
-#
-# DIRECTORY: pandatool/src/eggbase/
-#
-
-IPATH=['pandatool/src/eggbase']
-OPTS=['NSPR']
-CompileC(ipath=IPATH, opts=OPTS, src='eggbase_composite1.cxx', obj='eggbase_composite1.obj')
-CompileLIB(lib='libeggbase.lib', obj=['eggbase_composite1.obj'])
-
-#
-# DIRECTORY: pandatool/src/bam/
-#
-
-IPATH=['pandatool/src/bam']
-OPTS=['NSPR']
-CompileC(ipath=IPATH, opts=OPTS, src='bamInfo.cxx', obj='bam-info_bamInfo.obj')
-CompileLink(dll='bam-info.exe', opts=['ADVAPI', 'NSPR', 'FFTW'], obj=[
-             'bam-info_bamInfo.obj',
-             'libprogbase.lib',
-             'libpandatoolbase.lib',
-             'libpandaegg.dll',
-             'libpanda.dll',
-             'libpandaexpress.dll',
-             'libdtoolconfig.dll',
-             'libdtool.dll',
-             'libpystub.dll',
-])
-CompileC(ipath=IPATH, opts=OPTS, src='bamToEgg.cxx', obj='bam2egg_bamToEgg.obj')
-CompileLink(dll='bam2egg.exe', opts=['ADVAPI', 'NSPR', 'FFTW'], obj=[
-             'bam2egg_bamToEgg.obj',
-             'libconverter.lib',
-             'libeggbase.lib',
-             'libprogbase.lib',
-             'libpandatoolbase.lib',
-             'libpandaegg.dll',
-             'libpanda.dll',
-             'libpandaexpress.dll',
-             'libdtoolconfig.dll',
-             'libdtool.dll',
-             'libpystub.dll',
-])
-CompileC(ipath=IPATH, opts=OPTS, src='eggToBam.cxx', obj='egg2bam_eggToBam.obj')
-CompileLink(dll='egg2bam.exe', opts=['ADVAPI', 'NSPR', 'FFTW'], obj=[
-             'egg2bam_eggToBam.obj',
-             'libeggbase.lib',
-             'libprogbase.lib',
-             'libconverter.lib',
-             'libpandatoolbase.lib',
-             'libpandaegg.dll',
-             'libpanda.dll',
-             'libpandaexpress.dll',
-             'libdtoolconfig.dll',
-             'libdtool.dll',
-             'libpystub.dll',
-])
-
-#
-# DIRECTORY: pandatool/src/cvscopy/
-#
-
-IPATH=['pandatool/src/cvscopy']
-OPTS=['NSPR']
-CompileC(ipath=IPATH, opts=OPTS, src='cvscopy_composite1.cxx', obj='cvscopy_composite1.obj')
-CompileLIB(lib='libcvscopy.lib', obj=['cvscopy_composite1.obj'])
-
-#
-# DIRECTORY: pandatool/src/dxf/
-#
-
-IPATH=['pandatool/src/dxf']
-OPTS=['NSPR']
-CompileC(ipath=IPATH, opts=OPTS, src='dxf_composite1.cxx', obj='dxf_composite1.obj')
-CompileLIB(lib='libdxf.lib', obj=['dxf_composite1.obj'])
-
-#
-# DIRECTORY: pandatool/src/dxfegg/
-#
-
-IPATH=['pandatool/src/dxfegg']
-OPTS=['NSPR']
-CompileC(ipath=IPATH, opts=OPTS, src='dxfToEggConverter.cxx', obj='dxfegg_dxfToEggConverter.obj')
-CompileC(ipath=IPATH, opts=OPTS, src='dxfToEggLayer.cxx', obj='dxfegg_dxfToEggLayer.obj')
-CompileLIB(lib='libdxfegg.lib', obj=[
-             'dxfegg_dxfToEggConverter.obj',
-             'dxfegg_dxfToEggLayer.obj',
-])
-
-#
-# DIRECTORY: pandatool/src/dxfprogs/
-#
-
-IPATH=['pandatool/src/dxfprogs']
-OPTS=['NSPR']
-CompileC(ipath=IPATH, opts=OPTS, src='dxfPoints.cxx', obj='dxf-points_dxfPoints.obj')
-CompileLink(dll='dxf-points.exe', opts=['ADVAPI', 'NSPR', 'FFTW'], obj=[
-             'dxf-points_dxfPoints.obj',
-             'libprogbase.lib',
-             'libdxf.lib',
-             'libpandatoolbase.lib',
-             'libpanda.dll',
-             'libpandaexpress.dll',
-             'libdtoolconfig.dll',
-             'libdtool.dll',
-             'libpystub.dll',
-])
-CompileC(ipath=IPATH, opts=OPTS, src='dxfToEgg.cxx', obj='dxf2egg_dxfToEgg.obj')
-CompileLink(dll='dxf2egg.exe', opts=['ADVAPI', 'NSPR', 'FFTW'], obj=[
-             'dxf2egg_dxfToEgg.obj',
-             'libdxfegg.lib',
-             'libdxf.lib',
-             'libeggbase.lib',
-             'libprogbase.lib',
-             'libpandatoolbase.lib',
-             'libconverter.lib',
-             'libpandaegg.dll',
-             'libpanda.dll',
-             'libpandaexpress.dll',
-             'libdtoolconfig.dll',
-             'libdtool.dll',
-             'libpystub.dll',
-])
-CompileC(ipath=IPATH, opts=OPTS, src='eggToDXF.cxx', obj='egg2dxf_eggToDXF.obj')
-CompileC(ipath=IPATH, opts=OPTS, src='eggToDXFLayer.cxx', obj='egg2dxf_eggToDXFLayer.obj')
-CompileLink(dll='egg2dxf.exe', opts=['ADVAPI', 'NSPR', 'FFTW'], obj=[
-             'egg2dxf_eggToDXF.obj',
-             'egg2dxf_eggToDXFLayer.obj',
-             'libdxf.lib',
-             'libeggbase.lib',
-             'libprogbase.lib',
-             'libpandatoolbase.lib',
-             'libconverter.lib',
-             'libpandaegg.dll',
-             'libpanda.dll',
-             'libpandaexpress.dll',
-             'libdtoolconfig.dll',
-             'libdtool.dll',
-             'libpystub.dll',
-])
-
-#
-# DIRECTORY: pandatool/src/palettizer/
-#
-
-IPATH=['pandatool/src/palettizer']
-OPTS=['NSPR']
-CompileC(ipath=IPATH, opts=OPTS, src='palettizer_composite1.cxx', obj='palettizer_composite1.obj')
-CompileLIB(lib='libpalettizer.lib', obj=['palettizer_composite1.obj'])
-
-#
-# DIRECTORY: pandatool/src/egg-mkfont/
-#
-
-if OMIT.count("FREETYPE")==0:
-    IPATH=['pandatool/src/egg-mkfont', 'pandatool/src/palettizer']
-    OPTS=['NSPR', 'FREETYPE']
-    CompileC(ipath=IPATH, opts=OPTS, src='eggMakeFont.cxx', obj='egg-mkfont_eggMakeFont.obj')
-    CompileC(ipath=IPATH, opts=OPTS, src='rangeDescription.cxx', obj='egg-mkfont_rangeDescription.obj')
-    CompileC(ipath=IPATH, opts=OPTS, src='rangeIterator.cxx', obj='egg-mkfont_rangeIterator.obj')
-    CompileLink(dll='egg-mkfont.exe', opts=['ADVAPI', 'NSPR', 'FREETYPE'], obj=[
-                 'egg-mkfont_eggMakeFont.obj',
-                 'egg-mkfont_rangeDescription.obj',
-                 'egg-mkfont_rangeIterator.obj',
-                 'libpalettizer.lib',
-                 'libeggbase.lib',
-                 'libprogbase.lib',
-                 'libpandatoolbase.lib',
-                 'libconverter.lib',
-                 'libpandaegg.dll',
-                 'libpanda.dll',
-                 'libpandaexpress.dll',
-                 'libdtoolconfig.dll',
-                 'libdtool.dll',
-                 'libpystub.dll',
-    ])
-
-#
-# DIRECTORY: pandatool/src/eggcharbase/
-#
-
-IPATH=['pandatool/src/eggcharbase']
-OPTS=['ZLIB', 'NSPR']
-CompileC(ipath=IPATH, opts=OPTS, src='eggcharbase_composite1.cxx', obj='eggcharbase_composite1.obj')
-CompileLIB(lib='libeggcharbase.lib', obj=['eggcharbase_composite1.obj'])
-
-#
-# DIRECTORY: pandatool/src/egg-optchar/
-#
-
-IPATH=['pandatool/src/egg-optchar']
-OPTS=['NSPR']
-CompileC(ipath=IPATH, opts=OPTS, src='config_egg_optchar.cxx', obj='egg-optchar_config_egg_optchar.obj')
-CompileC(ipath=IPATH, opts=OPTS, src='eggOptchar.cxx', obj='egg-optchar_eggOptchar.obj')
-CompileC(ipath=IPATH, opts=OPTS, src='eggOptcharUserData.cxx', obj='egg-optchar_eggOptcharUserData.obj')
-CompileC(ipath=IPATH, opts=OPTS, src='vertexMembership.cxx', obj='egg-optchar_vertexMembership.obj')
-CompileLink(dll='egg-optchar.exe', opts=['ADVAPI', 'NSPR'], obj=[
-             'egg-optchar_config_egg_optchar.obj',
-             'egg-optchar_eggOptchar.obj',
-             'egg-optchar_eggOptcharUserData.obj',
-             'egg-optchar_vertexMembership.obj',
-             'libeggcharbase.lib',
-             'libconverter.lib',
-             'libeggbase.lib',
-             'libprogbase.lib',
-             'libpandatoolbase.lib',
-             'libpandaegg.dll',
-             'libpanda.dll',
-             'libpandaexpress.dll',
-             'libdtoolconfig.dll',
-             'libdtool.dll',
-             'libpystub.dll',
-])
-
-#
-# DIRECTORY: pandatool/src/egg-palettize/
-#
-
-IPATH=['pandatool/src/egg-palettize', 'pandatool/src/palettizer']
-OPTS=['NSPR']
-CompileC(ipath=IPATH, opts=OPTS, src='eggPalettize.cxx', obj='egg-palettize_eggPalettize.obj')
-CompileLink(dll='egg-palettize.exe', opts=['ADVAPI', 'NSPR'], obj=[
-             'egg-palettize_eggPalettize.obj',
-             'libpalettizer.lib',
-             'libeggbase.lib',
-             'libprogbase.lib',
-             'libpandatoolbase.lib',
-             'libconverter.lib',
-             'libpandaegg.dll',
-             'libpanda.dll',
-             'libpandaexpress.dll',
-             'libdtoolconfig.dll',
-             'libdtool.dll',
-             'libpystub.dll',
-])
-
-#
-# DIRECTORY: pandatool/src/egg-qtess/
-#
-
-IPATH=['pandatool/src/egg-qtess']
-OPTS=['NSPR']
-CompileC(ipath=IPATH, opts=OPTS, src='egg-qtess_composite1.cxx', obj='egg-qtess_composite1.obj')
-CompileLink(dll='egg-qtess.exe', opts=['ADVAPI', 'NSPR'], obj=[
-             'egg-qtess_composite1.obj',
-             'libeggbase.lib',
-             'libprogbase.lib',
-             'libconverter.lib',
-             'libpandatoolbase.lib',
-             'libpandaegg.dll',
-             'libpanda.dll',
-             'libpandaexpress.dll',
-             'libdtoolconfig.dll',
-             'libdtool.dll',
-             'libpystub.dll',
-])
-
-#
-# DIRECTORY: pandatool/src/eggprogs/
-#
-
-IPATH=['pandatool/src/eggprogs']
-OPTS=['NSPR']
-CompileC(ipath=IPATH, opts=OPTS, src='eggCrop.cxx', obj='egg-crop_eggCrop.obj')
-CompileLink(dll='egg-crop.exe', opts=['ADVAPI', 'NSPR'], obj=[
-             'egg-crop_eggCrop.obj',
-             'libconverter.lib',
-             'libeggbase.lib',
-             'libprogbase.lib',
-             'libpandatoolbase.lib',
-             'libpandaegg.dll',
-             'libpanda.dll',
-             'libpandaexpress.dll',
-             'libdtoolconfig.dll',
-             'libdtool.dll',
-             'libpystub.dll',
-])
-CompileC(ipath=IPATH, opts=OPTS, src='eggMakeTube.cxx', obj='egg-make-tube_eggMakeTube.obj')
-CompileLink(dll='egg-make-tube.exe', opts=['ADVAPI', 'NSPR'], obj=[
-             'egg-make-tube_eggMakeTube.obj',
-             'libconverter.lib',
-             'libeggbase.lib',
-             'libprogbase.lib',
-             'libpandatoolbase.lib',
-             'libpandaegg.dll',
-             'libpanda.dll',
-             'libpandaexpress.dll',
-             'libdtoolconfig.dll',
-             'libdtool.dll',
-             'libpystub.dll',
-])
-CompileC(ipath=IPATH, opts=OPTS, src='eggTextureCards.cxx', obj='egg-texture-cards_eggTextureCards.obj')
-CompileLink(dll='egg-texture-cards.exe', opts=['ADVAPI', 'NSPR'], obj=[
-             'egg-texture-cards_eggTextureCards.obj',
-             'libconverter.lib',
-             'libeggbase.lib',
-             'libprogbase.lib',
-             'libpandatoolbase.lib',
-             'libpandaegg.dll',
-             'libpanda.dll',
-             'libpandaexpress.dll',
-             'libdtoolconfig.dll',
-             'libdtool.dll',
-             'libpystub.dll',
-])
-CompileC(ipath=IPATH, opts=OPTS, src='eggTopstrip.cxx', obj='egg-topstrip_eggTopstrip.obj')
-CompileLink(dll='egg-topstrip.exe', opts=['ADVAPI', 'NSPR'], obj=[
-             'egg-topstrip_eggTopstrip.obj',
-             'libeggcharbase.lib',
-             'libconverter.lib',
-             'libeggbase.lib',
-             'libprogbase.lib',
-             'libpandatoolbase.lib',
-             'libpandaegg.dll',
-             'libpanda.dll',
-             'libpandaexpress.dll',
-             'libdtoolconfig.dll',
-             'libdtool.dll',
-             'libpystub.dll',
-])
-CompileC(ipath=IPATH, opts=OPTS, src='eggTrans.cxx', obj='egg-trans_eggTrans.obj')
-CompileLink(dll='egg-trans.exe', opts=['ADVAPI', 'NSPR'], obj=[
-             'egg-trans_eggTrans.obj',
-             'libconverter.lib',
-             'libeggbase.lib',
-             'libprogbase.lib',
-             'libpandatoolbase.lib',
-             'libpandaegg.dll',
-             'libpanda.dll',
-             'libpandaexpress.dll',
-             'libdtoolconfig.dll',
-             'libdtool.dll',
-             'libpystub.dll',
-])
-CompileC(ipath=IPATH, opts=OPTS, src='eggToC.cxx', obj='egg2c_eggToC.obj')
-CompileLink(dll='egg2c.exe', opts=['ADVAPI', 'NSPR'], obj=[
-             'egg2c_eggToC.obj',
-             'libconverter.lib',
-             'libeggbase.lib',
-             'libprogbase.lib',
-             'libpandatoolbase.lib',
-             'libpandaegg.dll',
-             'libpanda.dll',
-             'libpandaexpress.dll',
-             'libdtoolconfig.dll',
-             'libdtool.dll',
-             'libpystub.dll',
-])
-
-#
-# DIRECTORY: pandatool/src/flt/
-#
-
-IPATH=['pandatool/src/flt']
-OPTS=['NSPR']
-CompileC(ipath=IPATH, opts=OPTS, src='fltVectorRecord.cxx', obj='flt_fltVectorRecord.obj')
-CompileC(ipath=IPATH, opts=OPTS, src='flt_composite1.cxx', obj='flt_composite1.obj')
-CompileLIB(lib='libflt.lib', obj=['flt_fltVectorRecord.obj', 'flt_composite1.obj'])
-
-#
-# DIRECTORY: pandatool/src/fltegg/
-#
-
-IPATH=['pandatool/src/fltegg']
-OPTS=['NSPR']
-CompileC(ipath=IPATH, opts=OPTS, src='fltToEggConverter.cxx', obj='fltegg_fltToEggConverter.obj')
-CompileC(ipath=IPATH, opts=OPTS, src='fltToEggLevelState.cxx', obj='fltegg_fltToEggLevelState.obj')
-CompileLIB(lib='libfltegg.lib', obj=['fltegg_fltToEggConverter.obj', 'fltegg_fltToEggLevelState.obj'])
-
-#
-# DIRECTORY: pandatool/src/fltprogs/
-#
-
-IPATH=['pandatool/src/fltprogs', 'pandatool/src/flt', 'pandatool/src/cvscopy']
-OPTS=['NSPR']
-CompileC(ipath=IPATH, opts=OPTS, src='eggToFlt.cxx', obj='egg2flt_eggToFlt.obj')
-CompileLink(dll='egg2flt.exe', opts=['ADVAPI', 'NSPR'], obj=[
-             'egg2flt_eggToFlt.obj',
-             'libflt.lib',
-             'libeggbase.lib',
-             'libprogbase.lib',
-             'libconverter.lib',
-             'libpandatoolbase.lib',
-             'libpandaegg.dll',
-             'libpanda.dll',
-             'libpandaexpress.dll',
-             'libdtoolconfig.dll',
-             'libdtool.dll',
-             'libpystub.dll',
-])
-CompileC(ipath=IPATH, opts=OPTS, src='fltInfo.cxx', obj='flt-info_fltInfo.obj')
-CompileLink(dll='flt-info.exe', opts=['ADVAPI', 'NSPR'], obj=[
-             'flt-info_fltInfo.obj',
-             'libprogbase.lib',
-             'libflt.lib',
-             'libpandatoolbase.lib',
-             'libconverter.lib',
-             'libpandaegg.dll',
-             'libpanda.dll',
-             'libpandaexpress.dll',
-             'libdtoolconfig.dll',
-             'libdtool.dll',
-             'libpystub.dll',
-])
-CompileC(ipath=IPATH, opts=OPTS, src='fltTrans.cxx', obj='flt-trans_fltTrans.obj')
-CompileLink(dll='flt-trans.exe', opts=['ADVAPI', 'NSPR'], obj=[
-             'flt-trans_fltTrans.obj',
-             'libprogbase.lib',
-             'libflt.lib',
-             'libpandatoolbase.lib',
-             'libconverter.lib',
-             'libpandaegg.dll',
-             'libpanda.dll',
-             'libpandaexpress.dll',
-             'libdtoolconfig.dll',
-             'libdtool.dll',
-             'libpystub.dll',
-])
-CompileC(ipath=IPATH, opts=OPTS, src='fltToEgg.cxx', obj='flt2egg_fltToEgg.obj')
-CompileLink(dll='flt2egg.exe', opts=['ADVAPI', 'NSPR'], obj=[
-             'flt2egg_fltToEgg.obj',
-             'libflt.lib',
-             'libfltegg.lib',
-             'libeggbase.lib',
-             'libprogbase.lib',
-             'libconverter.lib',
-             'libpandatoolbase.lib',
-             'libpandaegg.dll',
-             'libpanda.dll',
-             'libpandaexpress.dll',
-             'libdtoolconfig.dll',
-             'libdtool.dll',
-             'libpystub.dll',
-])
-CompileC(ipath=IPATH, opts=OPTS, src='fltCopy.cxx', obj='fltcopy_fltCopy.obj')
-CompileLink(dll='fltcopy.exe', opts=['ADVAPI', 'NSPR'], obj=[
-             'fltcopy_fltCopy.obj',
-             'libcvscopy.lib',
-             'libflt.lib',
-             'libprogbase.lib',
-             'libpandatoolbase.lib',
-             'libconverter.lib',
-             'libpandaegg.dll',
-             'libpanda.dll',
-             'libpandaexpress.dll',
-             'libdtoolconfig.dll',
-             'libdtool.dll',
-             'libpystub.dll',
-])
-
-#
-# DIRECTORY: pandatool/src/imagebase/
-#
-
-IPATH=['pandatool/src/imagebase']
-OPTS=['NSPR']
-CompileC(ipath=IPATH, opts=OPTS, src='imagebase_composite1.cxx', obj='imagebase_composite1.obj')
-CompileLIB(lib='libimagebase.lib', obj=['imagebase_composite1.obj'])
-
-#
-# DIRECTORY: pandatool/src/imageprogs/
-#
-
-IPATH=['pandatool/src/imageprogs']
-OPTS=['NSPR']
-CompileC(ipath=IPATH, opts=OPTS, src='imageInfo.cxx', obj='image-info_imageInfo.obj')
-CompileLink(dll='image-info.exe', opts=['ADVAPI', 'NSPR'], obj=[
-             'image-info_imageInfo.obj',
-             'libimagebase.lib',
-             'libprogbase.lib',
-             'libpandatoolbase.lib',
-             'libpandaegg.dll',
-             'libpanda.dll',
-             'libpandaexpress.dll',
-             'libdtoolconfig.dll',
-             'libdtool.dll',
-             'libpystub.dll',
-])
-
-CompileC(ipath=IPATH, opts=OPTS, src='imageResize.cxx', obj='image-resize_imageResize.obj')
-CompileLink(dll='image-resize.exe', opts=['ADVAPI', 'NSPR'], obj=[
-             'image-resize_imageResize.obj',
-             'libimagebase.lib',
-             'libprogbase.lib',
-             'libpandatoolbase.lib',
-             'libpandaegg.dll',
-             'libpanda.dll',
-             'libpandaexpress.dll',
-             'libdtoolconfig.dll',
-             'libdtool.dll',
-             'libpystub.dll',
-])
-
-CompileC(ipath=IPATH, opts=OPTS, src='imageTrans.cxx', obj='image-trans_imageTrans.obj')
-CompileLink(dll='image-trans.exe', opts=['ADVAPI', 'NSPR'], obj=[
-             'image-trans_imageTrans.obj',
-             'libimagebase.lib',
-             'libprogbase.lib',
-             'libpandatoolbase.lib',
-             'libpandaegg.dll',
-             'libpanda.dll',
-             'libpandaexpress.dll',
-             'libdtoolconfig.dll',
-             'libdtool.dll',
-             'libpystub.dll',
-])
-
-#
-# DIRECTORY: pandatool/src/lwo/
-#
-
-IPATH=['pandatool/src/lwo']
-OPTS=['NSPR']
-CompileC(ipath=IPATH, opts=OPTS, src='lwo_composite1.cxx', obj='lwo_composite1.obj')
-CompileLIB(lib='liblwo.lib', obj=['lwo_composite1.obj'])
-
-#
-# DIRECTORY: pandatool/src/lwoegg/
-#
-
-IPATH=['pandatool/src/lwoegg']
-OPTS=['NSPR']
-CompileC(ipath=IPATH, opts=OPTS, src='lwoegg_composite1.cxx', obj='lwoegg_composite1.obj')
-CompileLIB(lib='liblwoegg.lib', obj=['lwoegg_composite1.obj'])
-
-#
-# DIRECTORY: pandatool/src/lwoprogs/
-#
-
-IPATH=['pandatool/src/lwoprogs', 'pandatool/src/lwo']
-OPTS=['NSPR']
-CompileC(ipath=IPATH, opts=OPTS, src='lwoScan.cxx', obj='lwo-scan_lwoScan.obj')
-CompileLink(dll='lwo-scan.exe', opts=['ADVAPI', 'NSPR'], obj=[
-             'lwo-scan_lwoScan.obj',
-             'liblwo.lib',
-             'libprogbase.lib',
-             'libpandatoolbase.lib',
-             'libpandaegg.dll',
-             'libpanda.dll',
-             'libpandaexpress.dll',
-             'libdtoolconfig.dll',
-             'libdtool.dll',
-             'libpystub.dll',
-])
-
-CompileC(ipath=IPATH, opts=OPTS, src='lwoToEgg.cxx', obj='lwo2egg_lwoToEgg.obj')
-CompileLink(dll='lwo2egg.exe', opts=['ADVAPI', 'NSPR'], obj=[
-             'lwo2egg_lwoToEgg.obj',
-             'liblwo.lib',
-             'liblwoegg.lib',
-             'libeggbase.lib',
-             'libprogbase.lib',
-             'libpandatoolbase.lib',
-             'libconverter.lib',
-             'libpandaegg.dll',
-             'libpanda.dll',
-             'libpandaexpress.dll',
-             'libdtoolconfig.dll',
-             'libdtool.dll',
-             'libpystub.dll',
-])
-
-#
-# DIRECTORY: pandatool/src/maya/
-#
-
-for VER in ["5","6","65"]:
-  if (OMIT.count("MAYA"+VER)==0):
-    IPATH=['pandatool/src/maya']
-    OPTS=['MAYA'+VER, 'NSPR']
-    CompileC(ipath=IPATH, opts=OPTS, src='maya_composite1.cxx',    obj='maya'+VER+'_composite1.obj')
-    CompileLIB(lib='libmaya'+VER+'.lib', obj=[ 'maya'+VER+'_composite1.obj' ])
-
-#
-# DIRECTORY: pandatool/src/mayaegg/
-#
-
-for VER in ["5","6","65"]:
-  if (OMIT.count("MAYA"+VER)==0):
-    IPATH=['pandatool/src/mayaegg', 'pandatool/src/maya']
-    OPTS=['MAYA'+VER, 'NSPR']
-    CompileC(ipath=IPATH, opts=OPTS, src='mayaegg_composite1.cxx',   obj='mayaegg'+VER+'_composite1.obj')
-    CompileLIB(lib='libmayaegg'+VER+'.lib', obj=[ 'mayaegg'+VER+'_composite1.obj' ])
-
-#
-# DIRECTORY: pandatool/src/maxegg/
-#
-
-for VER in ["5", "6", "7"]:
-  if (OMIT.count("MAX"+VER)==0):
-    IPATH=['pandatool/src/maxegg']
-    OPTS=['MAX'+VER, 'NSPR', "WINCOMCTL", "WINCOMDLG", "WINUSER", "MAXEGGDEF"]
-    CompileRES(ipath=IPATH, opts=OPTS, src='MaxEgg.rc', obj='maxegg'+VER+'_MaxEgg.res')
-    CompileC(ipath=IPATH, opts=OPTS, src='maxegg_composite1.cxx',obj='maxegg'+VER+'_composite1.obj')
-    CompileLink(opts=OPTS, dll='maxegg'+VER+'.dlo', obj=[
-                'maxegg'+VER+'_composite1.obj',
-                'maxegg'+VER+'_MaxEgg.res',
-                'libeggbase.lib',
-                'libprogbase.lib',
-                'libpandatoolbase.lib',
-                'libconverter.lib',
-                'libpandaegg.dll',
-                'libpanda.dll',
-                'libpandaexpress.dll',
-                'libdtoolconfig.dll',
-                'libdtool.dll',
-                'libpystub.dll'
-               ])
-
-#
-# DIRECTORY: pandatool/src/vrml/
-#
-
-CompileBison(pre='vrmlyy', dstc='vrmlParser.cxx', dsth='vrmlParser.h', src='pandatool/src/vrml/vrmlParser.yxx')
-CompileFlex(pre='vrmlyy', dst='vrmlLexer.cxx', src='pandatool/src/vrml/vrmlLexer.lxx', dashi=0)
-IPATH=['pandatool/src/vrml']
-OPTS=['ZLIB', 'NSPR']
-CompileC(ipath=IPATH, opts=OPTS, src='parse_vrml.cxx', obj='pvrml_parse_vrml.obj')
-CompileC(ipath=IPATH, opts=OPTS, src='standard_nodes.cxx', obj='pvrml_standard_nodes.obj')
-CompileC(ipath=IPATH, opts=OPTS, src='vrmlNode.cxx', obj='pvrml_vrmlNode.obj')
-CompileC(ipath=IPATH, opts=OPTS, src='vrmlNodeType.cxx', obj='pvrml_vrmlNodeType.obj')
-CompileC(ipath=IPATH, opts=OPTS, src='vrmlParser.cxx', obj='pvrml_vrmlParser.obj')
-CompileC(ipath=IPATH, opts=OPTS, src='vrmlLexer.cxx', obj='pvrml_vrmlLexer.obj')
-CompileLIB(lib='libpvrml.lib', obj=[
-             'pvrml_parse_vrml.obj',
-             'pvrml_standard_nodes.obj',
-             'pvrml_vrmlNode.obj',
-             'pvrml_vrmlNodeType.obj',
-             'pvrml_vrmlParser.obj',
-             'pvrml_vrmlLexer.obj',
-])
-
-#
-# DIRECTORY: pandatool/src/vrmlegg/
-#
-
-IPATH=['pandatool/src/vrmlegg', 'pandatool/src/vrml']
-OPTS=['NSPR']
-CompileC(ipath=IPATH, opts=OPTS, src='indexedFaceSet.cxx', obj='vrmlegg_indexedFaceSet.obj')
-CompileC(ipath=IPATH, opts=OPTS, src='vrmlAppearance.cxx', obj='vrmlegg_vrmlAppearance.obj')
-CompileC(ipath=IPATH, opts=OPTS, src='vrmlToEggConverter.cxx', obj='vrmlegg_vrmlToEggConverter.obj')
-CompileLIB(lib='libvrmlegg.lib', obj=[
-             'vrmlegg_indexedFaceSet.obj',
-             'vrmlegg_vrmlAppearance.obj',
-             'vrmlegg_vrmlToEggConverter.obj',
-])
-
-#
-# DIRECTORY: pandatool/src/xfile/
-#
-
-CompileBison(pre='xyy', dstc='xParser.cxx', dsth='xParser.h', src='pandatool/src/xfile/xParser.yxx')
-CompileFlex(pre='xyy', dst='xLexer.cxx', src='pandatool/src/xfile/xLexer.lxx', dashi=1)
-IPATH=['pandatool/src/xfile']
-OPTS=['ZLIB', 'NSPR']
-CompileC(ipath=IPATH, opts=OPTS, src='xfile_composite1.cxx', obj='xfile_composite1.obj')
-CompileC(ipath=IPATH, opts=OPTS, src='xParser.cxx', obj='xfile_xParser.obj')
-CompileC(ipath=IPATH, opts=OPTS, src='xLexer.cxx', obj='xfile_xLexer.obj')
-CompileLIB(lib='libxfile.lib', obj=[
-             'xfile_composite1.obj',
-             'xfile_xParser.obj',
-             'xfile_xLexer.obj',
-])
-
-#
-# DIRECTORY: pandatool/src/xfileegg/
-#
-
-IPATH=['pandatool/src/xfileegg', 'pandatool/src/xfile']
-OPTS=['NSPR']
-CompileC(ipath=IPATH, opts=OPTS, src='xfileegg_composite1.cxx', obj='xfileegg_composite1.obj')
-CompileLIB(lib='libxfileegg.lib', obj=[
-             'xfileegg_composite1.obj',
-])
-
-#
-# DIRECTORY: pandatool/src/ptloader/
-#
-
-IPATH=['pandatool/src/ptloader', 'pandatool/src/flt', 'pandatool/src/lwo', 'pandatool/src/xfile', 'pandatool/src/xfileegg']
-OPTS=['BUILDING_PTLOADER', 'NSPR']
-CompileC(ipath=IPATH, opts=OPTS, src='config_ptloader.cxx', obj='ptloader_config_ptloader.obj')
-CompileC(ipath=IPATH, opts=OPTS, src='loaderFileTypePandatool.cxx', obj='ptloader_loaderFileTypePandatool.obj')
-CompileLink(dll='libptloader.dll', opts=['ADVAPI', 'NSPR'], obj=[
-             'ptloader_config_ptloader.obj',
-             'ptloader_loaderFileTypePandatool.obj',
-             'libfltegg.lib',
-             'libflt.lib',
-             'liblwoegg.lib',
-             'liblwo.lib',
-             'libdxfegg.lib',
-             'libdxf.lib',
-             'libvrmlegg.lib',
-             'libpvrml.lib',
-             'libxfileegg.lib',
-             'libxfile.lib',
-             'libconverter.lib',
-             'libpandatoolbase.lib',
-             'libeggbase.lib',
-             'libprogbase.lib',
-             'libpandaegg.dll',
-             'libpanda.dll',
-             'libpandaexpress.dll',
-             'libdtoolconfig.dll',
-             'libdtool.dll',
-])
-
-#
-# DIRECTORY: pandatool/src/mayaprogs/
-#
-
-for VER in ["5","6","65"]:
-  if (OMIT.count('MAYA'+VER)==0):
-    IPATH=['pandatool/src/mayaprogs', 'pandatool/src/maya', 'pandatool/src/mayaegg',
-           'pandatool/src/cvscopy']
-    OPTS=['BUILDING_MISC', 'MAYA'+VER, 'NSPR']
-    CompileC(ipath=IPATH, opts=OPTS, src='config_mayaloader.cxx', obj='mayaloader'+VER+'_config_mayaloader.obj')
-    CompileLink(dll='libmayaloader'+VER+'.dll',                 opts=['ADVAPI', 'NSPR', 'MAYA'+VER], obj=[
-                 'mayaloader'+VER+'_config_mayaloader.obj',
-                 'libmayaegg'+VER+'.lib',
-                 'libptloader.lib',
-                 'libconverter.lib',
-                 'libpandatoolbase.lib',
-                 'libmaya'+VER+'.lib',
-                 'libfltegg.lib',
-                 'libflt.lib',
-                 'liblwoegg.lib',
-                 'liblwo.lib',
-                 'libdxfegg.lib',
-                 'libdxf.lib',
-                 'libvrmlegg.lib',
-                 'libpvrml.lib',
-                 'libxfileegg.lib',
-                 'libxfile.lib',
-                 'libeggbase.lib',
-                 'libprogbase.lib',
-                 'libpandaegg.dll',
-                 'libpanda.dll',
-                 'libpandaexpress.dll',
-                 'libdtoolconfig.dll',
-                 'libdtool.dll',
-    ])
-    CompileC(ipath=IPATH, opts=OPTS, src='mayaPview.cxx', obj='mayapview'+VER+'_mayaPview.obj')
-    CompileLink(dll='libmayapview'+VER+'.mll', opts=['ADVAPI', 'NSPR', 'MAYA'+VER], obj=[
-                 'mayapview'+VER+'_mayaPview.obj',
-                 'libmayaegg'+VER+'.lib',
-                 'libmaya'+VER+'.lib',
-                 'libconverter.lib',
-                 'libpandatoolbase.lib',
-                 'libpandaegg.dll',
-                 'libframework.dll',
-                 'libpanda.dll',
-                 'libpandaexpress.dll',
-                 'libdtoolconfig.dll',
-                 'libdtool.dll',
-                 'libpystub.dll',
-    ])
-    IPATH=['pandatool/src/mayaprogs', 'pandatool/src/maya', 'pandatool/src/mayaegg',
-           'pandatool/src/cvscopy']
-    OPTS=['MAYA'+VER, 'NSPR']
-    CompileC(ipath=IPATH, opts=OPTS, src='mayaSavePview.cxx', obj='mayasavepview'+VER+'_mayaSavePview.obj')
-    CompileLink(dll='libmayasavepview'+VER+'.mll', opts=['ADVAPI', 'NSPR', 'MAYA'+VER], obj=[
-                 'mayasavepview'+VER+'_mayaSavePview.obj',
-    ])
-    CompileC(ipath=IPATH, opts=OPTS, src='mayaToEgg.cxx', obj='maya2egg'+VER+'_mayaToEgg.obj')
-    CompileLink(dll='maya2egg'+VER+'.exe',                 opts=['ADVAPI', 'NSPR', 'MAYA'+VER], obj=[
-                 'maya2egg'+VER+'_mayaToEgg.obj',
-                 'libmayaegg'+VER+'.lib',
-                 'libmaya'+VER+'.lib',
-                 'libeggbase.lib',
-                 'libprogbase.lib',
-                 'libconverter.lib',
-                 'libpandatoolbase.lib',
-                 'libpandaegg.dll',
-                 'libpanda.dll',
-                 'libpandaexpress.dll',
-                 'libdtoolconfig.dll',
-                 'libdtool.dll',
-                 'libpystub.dll',
-    ])
-    CompileC(ipath=IPATH, opts=OPTS, src='mayaCopy.cxx', obj='mayacopy'+VER+'_mayaCopy.obj')
-    CompileLink(dll='mayacopy'+VER+'.exe',  opts=['ADVAPI', 'NSPR', 'MAYA'+VER], obj=[
-                 'mayacopy'+VER+'_mayaCopy.obj',
-                 'libcvscopy.lib',
-                 'libmaya'+VER+'.lib',
-                 'libprogbase.lib',
-                 'libpandatoolbase.lib',
-                 'libconverter.lib',
-                 'libpandaegg.dll',
-                 'libpanda.dll',
-                 'libpandaexpress.dll',
-                 'libdtoolconfig.dll',
-                 'libdtool.dll',
-                 'libpystub.dll',
-    ])
-
-#
-# DIRECTORY: pandatool/src/miscprogs/
-#
-
-IPATH=['pandatool/src/miscprogs']
-OPTS=['NSPR']
-CompileC(ipath=IPATH, opts=OPTS, src='binToC.cxx', obj='bin2c_binToC.obj')
-CompileLink(dll='bin2c.exe', opts=['ADVAPI', 'NSPR'], obj=[
-             'bin2c_binToC.obj',
-             'libprogbase.lib',
-             'libpandatoolbase.lib',
-             'libpanda.dll',
-             'libpandaexpress.dll',
-             'libdtoolconfig.dll',
-             'libdtool.dll',
-             'libpystub.dll',
-])
-
-#
-# DIRECTORY: pandatool/src/pstatserver/
-#
-
-if OMIT.count("NSPR")==0:
-    IPATH=['pandatool/src/pstatserver']
-    OPTS=['NSPR']
-    CompileC(ipath=IPATH, opts=OPTS, src='pstatserver_composite1.cxx', obj='pstatserver_composite1.obj')
-    CompileLIB(lib='libpstatserver.lib', obj=[ 'pstatserver_composite1.obj' ])
-
-#
-# DIRECTORY: pandatool/src/softprogs/
-#
-
-IPATH=['pandatool/src/softprogs']
-OPTS=['NSPR']
-CompileC(ipath=IPATH, opts=OPTS, src='softCVS.cxx', obj='softcvs_softCVS.obj')
-CompileC(ipath=IPATH, opts=OPTS, src='softFilename.cxx', obj='softcvs_softFilename.obj')
-CompileLink(opts=['ADVAPI', 'NSPR'], dll='softcvs.exe', obj=[
-             'softcvs_softCVS.obj',
-             'softcvs_softFilename.obj',
-             'libprogbase.lib',
-             'libpandatoolbase.lib',
-             'libpandaegg.dll',
-             'libpanda.dll',
-             'libpandaexpress.dll',
-             'libdtoolconfig.dll',
-             'libdtool.dll',
-             'libpystub.dll',
-])
-
-#
-# DIRECTORY: pandatool/src/text-stats/
-#
-
-if OMIT.count("NSPR")==0:
-    IPATH=['pandatool/src/text-stats']
-    OPTS=['NSPR']
-    CompileC(ipath=IPATH, opts=OPTS, src='textMonitor.cxx', obj='text-stats_textMonitor.obj')
-    CompileC(ipath=IPATH, opts=OPTS, src='textStats.cxx', obj='text-stats_textStats.obj')
-    CompileLink(opts=['ADVAPI', 'NSPR'], dll='text-stats.exe', obj=[
-                 'text-stats_textMonitor.obj',
-                 'text-stats_textStats.obj',
-                 'libprogbase.lib',
-                 'libpstatserver.lib',
-                 'libpandatoolbase.lib',
-                 'libpandaegg.dll',
-                 'libpanda.dll',
-                 'libpandaexpress.dll',
-                 'libdtoolconfig.dll',
-                 'libdtool.dll',
-                 'libpystub.dll',
-    ])
-
-#
-# DIRECTORY: pandatool/src/vrmlprogs/
-#
-
-IPATH=['pandatool/src/vrmlprogs', 'pandatool/src/vrml', 'pandatool/src/vrmlegg']
-OPTS=['NSPR']
-CompileC(ipath=IPATH, opts=OPTS, src='vrmlTrans.cxx', obj='vrml-trans_vrmlTrans.obj')
-CompileLink(opts=['ADVAPI', 'NSPR'], dll='vrml-trans.exe', obj=[
-             'vrml-trans_vrmlTrans.obj',
-             'libprogbase.lib',
-             'libpvrml.lib',
-             'libpandatoolbase.lib',
-             'libpanda.dll',
-             'libpandaexpress.dll',
-             'libdtoolconfig.dll',
-             'libdtool.dll',
-             'libpystub.dll',
-])
-
-CompileC(ipath=IPATH, opts=OPTS, src='vrmlToEgg.cxx', obj='vrml2egg_vrmlToEgg.obj')
-CompileLink(opts=['ADVAPI', 'NSPR'], dll='vrml2egg.exe', obj=[
-             'vrml2egg_vrmlToEgg.obj',
-             'libvrmlegg.lib',
-             'libpvrml.lib',
-             'libeggbase.lib',
-             'libprogbase.lib',
-             'libpandatoolbase.lib',
-             'libconverter.lib',
-             'libpandaegg.dll',
-             'libpanda.dll',
-             'libpandaexpress.dll',
-             'libdtoolconfig.dll',
-             'libdtool.dll',
-             'libpystub.dll',
-])
-
-#
-# DIRECTORY: pandatool/src/win-stats/
-#
-
-if (OMIT.count("NSPR")==0) and (sys.platform == "win32" or sys.platform == "cygwin"):
-    IPATH=['pandatool/src/win-stats']
-    OPTS=['NSPR']
-    CompileC(ipath=IPATH, opts=OPTS, src='winstats_composite1.cxx', obj='pstats_composite1.obj')
-    CompileLink(opts=['WINSOCK', 'WINIMM', 'WINGDI', 'WINKERNEL', 'WINOLDNAMES', 'WINUSER', 'WINMM', 'NSPR'],
-                dll='pstats.exe', obj=[
-                'pstats_composite1.obj',
-                'libprogbase.lib',
-                'libpstatserver.lib',
-                'libpandatoolbase.lib',
-                'libpandaexpress.dll',
-                'libpanda.dll',
-                'libdtoolconfig.dll',
-                'libdtool.dll',
-                'libpystub.dll',
-                ])
-
-#
-# DIRECTORY: pandatool/src/xfileprogs/
-#
-
-IPATH=['pandatool/src/xfileprogs', 'pandatool/src/xfile', 'pandatool/src/xfileegg']
-OPTS=['NSPR']
-CompileC(ipath=IPATH, opts=OPTS, src='eggToX.cxx', obj='egg2x_eggToX.obj')
-CompileLink(dll='egg2x.exe', opts=['ADVAPI', 'NSPR'], obj=[
-             'egg2x_eggToX.obj',
-             'libxfileegg.lib',
-             'libxfile.lib',
-             'libeggbase.lib',
-             'libprogbase.lib',
-             'libpandatoolbase.lib',
-             'libconverter.lib',
-             'libpandaegg.dll',
-             'libpanda.dll',
-             'libpandaexpress.dll',
-             'libdtoolconfig.dll',
-             'libdtool.dll',
-             'libpystub.dll',
-])
-
-CompileC(ipath=IPATH, opts=OPTS, src='xFileTrans.cxx', obj='x-trans_xFileTrans.obj')
-CompileLink(dll='x-trans.exe', opts=['ADVAPI', 'NSPR'], obj=[
-             'x-trans_xFileTrans.obj',
-             'libprogbase.lib',
-             'libxfile.lib',
-             'libpandatoolbase.lib',
-             'libpanda.dll',
-             'libpandaexpress.dll',
-             'libdtoolconfig.dll',
-             'libdtool.dll',
-             'libpystub.dll',
-])
-
-CompileC(ipath=IPATH, opts=OPTS, src='xFileToEgg.cxx', obj='x2egg_xFileToEgg.obj')
-CompileLink(opts=['ADVAPI', 'NSPR'], dll='x2egg.exe', obj=[
-             'x2egg_xFileToEgg.obj',
-             'libxfileegg.lib',
-             'libxfile.lib',
-             'libconverter.lib',
-             'libeggbase.lib',
-             'libprogbase.lib',
-             'libpandatoolbase.lib',
-             'libpandaegg.dll',
-             'libpanda.dll',
-             'libpandaexpress.dll',
-             'libdtoolconfig.dll',
-             'libdtool.dll',
-             'libpystub.dll',
-])
-
-#
-# DIRECTORY: pandaapp/src/pandaappbase/
-#
-
-IPATH=['pandaapp/src/pandaappbase']
-OPTS=['NSPR']
-CompileC(ipath=IPATH, opts=OPTS, src='pandaappbase.cxx', obj='pandaappbase_pandaappbase.obj')
-CompileLIB(lib='libpandaappbase.lib', obj=['pandaappbase_pandaappbase.obj'])
-
-#
-# DIRECTORY: pandaapp/src/httpbackup/
-#
-
-if OMIT.count("SSL")==0:
-    IPATH=['pandaapp/src/httpbackup', 'pandaapp/src/pandaappbase']
-    OPTS=['SSL', 'NSPR']
-    CompileC(ipath=IPATH, opts=OPTS, src='backupCatalog.cxx', obj='httpbackup_backupCatalog.obj')
-    CompileC(ipath=IPATH, opts=OPTS, src='httpBackup.cxx', obj='httpbackup_httpBackup.obj')
-    CompileLink(opts=['ADVAPI', 'NSPR', 'SSL'], dll='httpbackup.exe', obj=[
-                 'httpbackup_backupCatalog.obj',
-                 'httpbackup_httpBackup.obj',
-                 'libpandaappbase.lib',
-                 'libpandaexpress.dll',
-                 'libpanda.dll',
-                 'libdtool.dll',
-                 'libdtoolconfig.dll',
-                 'libprogbase.lib',
-                 'libpandatoolbase.lib',
-                 'libpystub.dll',
-    ])
-
-#
-# DIRECTORY: pandaapp/src/indexify/
-#
-
-if OMIT.count("FREETYPE")==0:
-    IPATH=['pandaapp/src/indexify']
-    OPTS=['NSPR', 'FREETYPE']
-    CompileC(ipath=IPATH, opts=OPTS, src='default_font.cxx', obj='font-samples_default_font.obj')
-    CompileC(ipath=IPATH, opts=OPTS, src='fontSamples.cxx', obj='font-samples_fontSamples.obj')
-    CompileLink(opts=['ADVAPI', 'NSPR', 'FREETYPE'], dll='font-samples.exe', obj=[
-                 'font-samples_default_font.obj',
-                 'font-samples_fontSamples.obj',
-                 'libpanda.dll',
-                 'libpandaexpress.dll',
-                 'libdtool.dll',
-                 'libdtoolconfig.dll',
-                 'libprogbase.lib',
-                 'libpandatoolbase.lib',
-                 'libpystub.dll',
-    ])
-
-    CompileC(ipath=IPATH, opts=OPTS, src='default_index_icons.cxx', obj='indexify_default_index_icons.obj')
-    CompileC(ipath=IPATH, opts=OPTS, src='default_font.cxx', obj='indexify_default_font.obj')
-    CompileC(ipath=IPATH, opts=OPTS, src='indexImage.cxx', obj='indexify_indexImage.obj')
-    CompileC(ipath=IPATH, opts=OPTS, src='indexParameters.cxx', obj='indexify_indexParameters.obj')
-    CompileC(ipath=IPATH, opts=OPTS, src='indexify.cxx', obj='indexify_indexify.obj')
-    CompileC(ipath=IPATH, opts=OPTS, src='photo.cxx', obj='indexify_photo.obj')
-    CompileC(ipath=IPATH, opts=OPTS, src='rollDirectory.cxx', obj='indexify_rollDirectory.obj')
-    CompileLink(opts=['ADVAPI', 'NSPR', 'FREETYPE'], dll='indexify.exe', obj=[
-                 'indexify_default_index_icons.obj',
-                 'indexify_default_font.obj',
-                 'indexify_indexImage.obj',
-                 'indexify_indexParameters.obj',
-                 'indexify_indexify.obj',
-                 'indexify_photo.obj',
-                 'indexify_rollDirectory.obj',
-                 'libpanda.dll',
-                 'libpandaexpress.dll',
-                 'libdtool.dll',
-                 'libdtoolconfig.dll',
-                 'libprogbase.lib',
-                 'libpandatoolbase.lib',
-                 'libpystub.dll',
-    ])
-
-#
-# DIRECTORY: pandaapp/src/stitchbase/
-#
-
-CompileBison(pre='stitchyy', dstc='stitchParser.cxx', dsth='stitchParser.h', src='pandaapp/src/stitchbase/stitchParser.yxx')
-CompileFlex(pre='stitchyy', dst='stitchLexer.cxx', src='pandaapp/src/stitchbase/stitchLexer.lxx', dashi=1)
-IPATH=['pandaapp/src/stitchbase', 'pandaapp/src/pandaappbase']
-OPTS=['NSPR']
-CompileC(ipath=IPATH, opts=OPTS, src='stitchbase_composite1.cxx', obj='stitchbase_composite1.obj')
-CompileC(ipath=IPATH, opts=OPTS, src='stitchbase_composite2.cxx', obj='stitchbase_composite2.obj')
-CompileC(ipath=IPATH, opts=OPTS, src='stitchParser.cxx', obj='stitchbase_stitchParser.obj')
-CompileC(ipath=IPATH, opts=OPTS, src='stitchLexer.cxx', obj='stitchbase_stitchLexer.obj')
-CompileLIB(lib='libstitchbase.lib', obj=[
-             'stitchbase_composite1.obj',
-             'stitchbase_composite2.obj',
-             'stitchbase_stitchParser.obj',
-             'stitchbase_stitchLexer.obj',
-])
-
-#
-# DIRECTORY: pandaapp/src/stitch/
-#
-
-IPATH=['pandaapp/src/stitch', 'pandaapp/src/stitchbase', 'pandaapp/src/pandaappbase']
-OPTS=['NSPR']
-CompileC(ipath=IPATH, opts=OPTS, src='stitchCommandProgram.cxx', obj='stitch-command_stitchCommandProgram.obj')
-CompileLink(opts=['ADVAPI', 'NSPR', 'FFTW'], dll='stitch-command.exe', obj=[
-             'stitch-command_stitchCommandProgram.obj',
-             'libstitchbase.lib',
-             'libpandaappbase.lib',
-             'libpanda.dll',
-             'libpandaexpress.dll',
-             'libdtoolconfig.dll',
-             'libdtool.dll',
-             'libprogbase.lib',
-             'libpandatoolbase.lib',
-             'libconverter.lib',
-             'libpystub.dll',
-])
-
-CompileC(ipath=IPATH, opts=OPTS, src='stitchImageProgram.cxx', obj='stitch-image_stitchImageProgram.obj')
-CompileLink(opts=['ADVAPI', 'NSPR', 'FFTW'], dll='stitch-image.exe', obj=[
-             'stitch-image_stitchImageProgram.obj',
-             'libstitchbase.lib',
-             'libpandaappbase.lib',
-             'libpanda.dll',
-             'libpandaexpress.dll',
-             'libdtoolconfig.dll',
-             'libdtool.dll',
-             'libprogbase.lib',
-             'libpandatoolbase.lib',
-             'libconverter.lib',
-             'libpystub.dll',
-])
-
-##########################################################################################
-#
-# Copy Sounds, Icons, and Models into the build.
-#
-##########################################################################################
-
-MakeDirectory(PREFIX+"/models")
-MakeDirectory(PREFIX+"/models/audio")
-MakeDirectory(PREFIX+"/models/audio/sfx")
-MakeDirectory(PREFIX+"/models/icons")
-MakeDirectory(PREFIX+"/models/maps")
-MakeDirectory(PREFIX+"/models/misc")
-MakeDirectory(PREFIX+"/models/gui")
-
-CopyAllFiles(PREFIX+"/models/audio/sfx/",  "dmodels/src/audio/sfx/", ".wav")
-CopyAllFiles(PREFIX+"/models/icons/",      "dmodels/src/icons/",     ".gif")
-
-CopyAllFiles(PREFIX+"/models/",            "models/",                ".egg")
-CopyAllFiles(PREFIX+"/models/",            "models/",                ".bam")
-
-CopyAllFiles(PREFIX+"/models/maps/",       "models/maps/",           ".jpg")
-CopyAllFiles(PREFIX+"/models/maps/",       "models/maps/",           ".png")
-CopyAllFiles(PREFIX+"/models/maps/",       "models/maps/",           ".rgb")
-CopyAllFiles(PREFIX+"/models/maps/",       "models/maps/",           ".rgba")
-
-CopyAllFiles(PREFIX+"/models/maps/",       "dmodels/src/maps/",      ".jpg")
-CopyAllFiles(PREFIX+"/models/maps/",       "dmodels/src/maps/",      ".png")
-CopyAllFiles(PREFIX+"/models/maps/",       "dmodels/src/maps/",      ".rgb")
-CopyAllFiles(PREFIX+"/models/maps/",       "dmodels/src/maps/",      ".rgba")
-
-CompileBAM("../=", PREFIX+"/models/gui/dialog_box_gui.bam",  "dmodels/src/gui/dialog_box_gui.flt")
-
-CompileBAM("../=", PREFIX+"/models/misc/camera.bam",         "dmodels/src/misc/camera.flt")
-CompileBAM("../=", PREFIX+"/models/misc/fade.bam",           "dmodels/src/misc/fade.flt")
-CompileBAM("../=", PREFIX+"/models/misc/fade_sphere.bam",    "dmodels/src/misc/fade_sphere.flt")
-CompileBAM("../=", PREFIX+"/models/misc/gridBack.bam",       "dmodels/src/misc/gridBack.flt")
-CompileBAM("../=", PREFIX+"/models/misc/iris.bam",           "dmodels/src/misc/iris.flt")
-CompileBAM("../=", PREFIX+"/models/misc/lilsmiley.bam",      "dmodels/src/misc/lilsmiley.egg")
-CompileBAM("../=", PREFIX+"/models/misc/objectHandles.bam",  "dmodels/src/misc/objectHandles.flt")
-CompileBAM("../=", PREFIX+"/models/misc/rgbCube.bam",        "dmodels/src/misc/rgbCube.flt")
-CompileBAM("../=", PREFIX+"/models/misc/smiley.bam",         "dmodels/src/misc/smiley.egg")
-CompileBAM("../=", PREFIX+"/models/misc/sphere.bam",         "dmodels/src/misc/sphere.flt")
-CompileBAM("../=", PREFIX+"/models/misc/xyzAxis.bam",        "dmodels/src/misc/xyzAxis.flt")
-CompileBAM("../=", PREFIX+"/models/misc/Pointlight.bam",     "dmodels/src/misc/Pointlight.egg")
-CompileBAM("../=", PREFIX+"/models/misc/Dirlight.bam",       "dmodels/src/misc/Dirlight.egg")
-CompileBAM("../=", PREFIX+"/models/misc/Spotlight.bam",      "dmodels/src/misc/Spotlight.egg")
-
-##########################################################################################
-#
-# Run genpycode
-#
-##########################################################################################
-
-if (older(PREFIX+'/pandac/PandaModules.pyz',xpaths(PREFIX+"/pandac/input/",ALLIN,""))):
-    ALLTARGETS.append(PREFIX+'/pandac/PandaModules.pyz')
-    if (sys.platform=="win32" or sys.platform == "cygwin"):
-        if (GENMAN): oscmd(PREFIX+"/bin/genpycode.exe -m")
-        else       : oscmd(PREFIX+"/bin/genpycode.exe")
-    else:
-        if (GENMAN): oscmd(PREFIX+"/bin/genpycode -m")
-        else       : oscmd(PREFIX+"/bin/genpycode")
-    updatefiledate(PREFIX+'/pandac/PandaModules.pyz')
-
-########################################################################
-##
-## Save the CXX include-cache for next time.
-##
-########################################################################
-
-try: icache = open(iCachePath,'wb')
-except: icache = 0
-if (icache!=0):
-    cPickle.dump(CxxIncludeCache, icache, 1)
-    icache.close()
-
-##########################################################################################
-#
-# 'Complete' mode.
-#
-# Copies the samples and direct into the build. Note that
-# this isn't usually what you want.  It is usually better to let the
-# compiled panda load this stuff directly from the source tree.
-# The only time you really want to do this is if you plan to move
-# the build somewhere and leave the source tree behind.
-#
-##########################################################################################
-
-if (COMPLETE):
-    CopyFile(PREFIX+'/', 'InstallerNotes')
-    CopyFile(PREFIX+'/', 'LICENSE')
-    CopyFile(PREFIX+'/', 'README')
-    CopyTree(PREFIX+'/samples', 'samples')
-    CopyTree(PREFIX+'/direct/src', 'direct/src')
-    CopyTree(PREFIX+'/SceneEditor', 'SceneEditor')
-
-##########################################################################################
-#
-# The Installers
-#
-##########################################################################################
-
-if (sys.platform == "win32" or sys.platform == "cygwin"):
-
-    def MakeInstaller(file,fullname,smdirectory,uninstallkey,installdir,ppgame):
-        if (older(file, ALLTARGETS)):
-            print "Building "+fullname+" installer. This can take up to an hour."
-            if (COMPRESSOR != "lzma"):
-                print("Note: you are using zlib, which is faster, but lzma gives better compression.")
-            if (os.path.exists(file)):
-                os.remove(file)
-            if (os.path.exists("nsis-output.exe")):
-                os.remove("nsis-output.exe")
-            def0 = '/DCOMPRESSOR="'   + COMPRESSOR   + '" '
-            def1 = '/DFULLNAME="'     + fullname     + '" '
-            def2 = '/DSMDIRECTORY="'  + smdirectory  + '" '
-            def3 = '/DUNINSTALLKEY="' + uninstallkey + '" '
-            def4 = '/DINSTALLDIR="'   + installdir   + '" '
-            def5 = ''
-            if (ppgame): def5 = '/DPPGAME="' + ppgame + '" '
-            oscmd("thirdparty/win-nsis/makensis.exe /V2 "+def0+def1+def2+def3+def4+def5+" makepanda/panda.nsi")
-            os.rename("nsis-output.exe", file)
-
-    if (INSTALLER!=0):
-        MakeInstaller("Panda3D-"+VERSION+".exe", "Panda3D", "Panda3D "+VERSION,
-                      "Panda3D "+VERSION, "C:\\Panda3D-"+VERSION, 0)
-
-    if (PPGAME!=0):
-        if (os.path.isdir(PPGAME)==0):
-            sys.exit("No such directory "+PPGAME)
-        if (os.path.exists(os.path.join(PPGAME,PPGAME+".py"))==0):
-            sys.exit("No such file "+PPGAME+"/"+PPGAME+".py")
-        MakeInstaller(PPGAME+"-"+VERSION+".exe", PPGAME, PPGAME+" "+VERSION,
-                      PPGAME+" "+VERSION, "C:\\"+PPGAME+"-"+VERSION, PPGAME)
-
-
-##########################################################################################
-#
-# Print final status report.
-#
-##########################################################################################
-
-WARNINGS.append("Elapsed Time: "+prettyTime(time.time() - STARTTIME))
-printStatus("Makepanda Final Status Report", WARNINGS)
-
-