mirror of
https://github.com/panda3d/panda3d.git
synced 2025-10-03 10:22:45 -04:00
*** empty log message ***
This commit is contained in:
parent
e1ea42c1b0
commit
0843a79194
82
direct/src/showbase/StartMF.py
Normal file
82
direct/src/showbase/StartMF.py
Normal file
@ -0,0 +1,82 @@
|
||||
""" This module can serve as a startup script to play a Panda
|
||||
application packed within a .mf file. Run via:
|
||||
|
||||
python StartMF.py app.mf
|
||||
|
||||
This is currently experimental, but the intent is to work towards a
|
||||
prepackaged Panda distributable, designed to run applications exactly
|
||||
like this.
|
||||
|
||||
"""
|
||||
|
||||
import sys
|
||||
from direct.showbase import VFSImporter
|
||||
from pandac.PandaModules import VirtualFileSystem, Filename, Multifile, ConfigPageManager, getModelPath
|
||||
from direct.stdpy.file import file, open
|
||||
import __builtin__
|
||||
|
||||
MultifileRoot = '/mf'
|
||||
|
||||
def runPackedApp(args):
|
||||
if not args:
|
||||
print "No Panda app specified. Use:"
|
||||
print "python StartMF.py app.mf"
|
||||
sys.exit(1)
|
||||
|
||||
vfs = VirtualFileSystem.getGlobalPtr()
|
||||
|
||||
fname = Filename.fromOsSpecific(args[0])
|
||||
if not vfs.exists(fname):
|
||||
print "No such file: %s" % (args[0])
|
||||
sys.exit(1)
|
||||
|
||||
mf = Multifile()
|
||||
if not mf.openRead(fname):
|
||||
print "Not a Panda Multifile: %s" % (args[0])
|
||||
sys.exit(1)
|
||||
|
||||
# Clear *all* the mount points, including "/", so that we no
|
||||
# longer access the disk directly.
|
||||
vfs.unmountAll()
|
||||
|
||||
# Mount the Multifile under /mf, by convention, and make that our
|
||||
# "current directory".
|
||||
vfs.mount(mf, MultifileRoot, vfs.MFReadOnly)
|
||||
vfs.chdir(MultifileRoot)
|
||||
|
||||
# Make sure the directories on our standard Python path are mounted
|
||||
# read-only, so we can still load Python.
|
||||
for dirname in sys.path:
|
||||
vfs.mount(dirname, dirname, vfs.MFReadOnly)
|
||||
|
||||
# Also mount some standard directories read-write (temporary and
|
||||
# app-data directories).
|
||||
tdir = Filename.temporary('', '')
|
||||
for dirname in set([ tdir.getDirname(),
|
||||
Filename.getTempDirectory().cStr(),
|
||||
Filename.getUserAppdataDirectory().cStr(),
|
||||
Filename.getCommonAppdataDirectory().cStr() ]):
|
||||
vfs.mount(dirname, dirname, 0)
|
||||
|
||||
# Now set up Python to import this stuff.
|
||||
VFSImporter.register()
|
||||
sys.path = [ MultifileRoot ] + sys.path
|
||||
|
||||
# Put our root directory on the model-path and prc-path, too.
|
||||
getModelPath().prependDirectory(MultifileRoot)
|
||||
|
||||
cpMgr = ConfigPageManager.getGlobalPtr()
|
||||
cpMgr.getSearchPath().prependDirectory(MultifileRoot)
|
||||
cpMgr.reloadImplicitPages()
|
||||
|
||||
# Replace the builtin open and file symbols so code will get our
|
||||
# versions by default, which can open and read files out of the
|
||||
# multifile.
|
||||
__builtin__.file = file
|
||||
__builtin__.open = open
|
||||
|
||||
import main
|
||||
|
||||
if __name__ == '__main__':
|
||||
runPackedApp(sys.argv[1:])
|
||||
|
Loading…
x
Reference in New Issue
Block a user