| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104 |
- ##############################################################################
- #
- # eggcacher
- #
- # EggCacher searches a directory for egg files, and loads
- # them all into the model-cache. This is used as part of the
- # panda installation process.
- #
- ##############################################################################
- import os
- import sys
- import gc
- from panda3d.core import *
- class EggCacher:
- def __init__(self, args):
- maindir = Filename.fromOsSpecific(os.getcwd()).getFullpath()
- ExecutionEnvironment.setEnvironmentVariable("MAIN_DIR", maindir)
- self.bamcache = BamCache.getGlobalPtr()
- self.pandaloader = Loader()
- self.loaderopts = LoaderOptions(LoaderOptions.LF_no_ram_cache)
- if not self.bamcache.getActive():
- print("The model cache is not currently active.")
- print("You must set a model-cache-dir in your config file.")
- sys.exit(1)
- self.parseArgs(args)
- files = self.scanPaths(self.paths)
- self.processFiles(files)
- def parseArgs(self, args):
- self.concise = 0
- self.pzkeep = 0
- while len(args) > 0:
- if args[0] == "--concise":
- self.concise = 1
- args = args[1:]
- elif args[0] == "--pzkeep":
- self.pzkeep = 1
- args = args[1:]
- else:
- break
- if len(args) < 1:
- print("Usage: eggcacher options file-or-directory")
- sys.exit(1)
- self.paths = args
- def scanPath(self, eggs, path):
- if not os.path.exists(path):
- print("No such file or directory: " + path)
- return
- if os.path.isdir(path):
- for f in os.listdir(path):
- self.scanPath(eggs, os.path.join(path,f))
- return
- if path.endswith(".egg"):
- size = os.path.getsize(path)
- eggs.append((path,size))
- return
- if path.endswith(".egg.pz") or path.endswith(".egg.gz"):
- size = os.path.getsize(path)
- if self.pzkeep:
- eggs.append((path, size))
- else:
- eggs.append((path[:-3], size))
- def scanPaths(self, paths):
- eggs = []
- for path in paths:
- #abs = os.path.abspath(path)
- self.scanPath(eggs, path)
- return eggs
- def processFiles(self, files):
- total = 0
- for (path, size) in files:
- total += size
- progress = 0
- for (path, size) in files:
- fn = Filename.fromOsSpecific(path)
- cached = self.bamcache.lookup(fn, "bam")
- percent = (progress * 100) / total
- report = path
- if self.concise:
- report = os.path.basename(report)
- print("Preprocessing Models %2d%% %s" % (percent, report))
- sys.stdout.flush()
- if cached and not cached.hasData():
- self.pandaloader.loadSync(fn, self.loaderopts)
- gc.collect()
- ModelPool.releaseAllModels()
- TexturePool.releaseAllTextures()
- progress += size
- def main(args=None):
- if args is None:
- args = sys.argv[1:]
- cacher = EggCacher(args)
- return 0
- if __name__ == '__main__':
- sys.exit(main())
|