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