# -*- test-case-name: mv3d.test.test_asset -*- # Copyright (C) 2010-2012 Mortal Coil Games # See LICENSE for details. """ Resources for the panda 3d engine. @author: mike """ from urlparse import urlparse from mv3d.resource.asset import MeshAsset from mv3d.util.persist import Text from mv3d.net.ha import withSlaveUpdate from mv3d.util.iservice import IPlayerClient from mv3d.resource.url import URLMeshAsset from mv3d.util.classgen import ClassGenerator from mv3d.client.ui.irenderer import ISceneObject, Panda3D class LocalPandaMeshAsset(MeshAsset): """ An asset that is a panda mesh existing on our local filesystem """ _schemaVersion = 2 filename = Text(default="", autoSave=True, partialSave=True) allowedState = MeshAsset.allowedState + ["filename"] def __init__(self, filename=None): MeshAsset.__init__(self) self.filename = filename def getFilename(self): """ Returns the filename """ return self.filename @withSlaveUpdate def setFilename(self, f): """ Sets the filename """ self.filename = f observe_setFilename = setFilename def getCompatibleRenderers(self): """ Returns a list of compatible renderers. """ return [Panda3D] def create(self, name): """ Creates the asset """ assert self.parent, "LocalPandaMeshAsset requires a parent." render = self.parent.parent.getLocalService(IPlayerClient).getRenderer() return render.createEntity(str(name), self.filename) class URLPandaMeshAsset(URLMeshAsset): """ A panda mesh that can be downoaded from a url """ _schemaVersion = 2 readied = None classModifiers = dict(web=[ ClassGenerator("mv3d.server.editor.URLAssetEditor"), ClassGenerator("mv3d.server.editor.DeleteAsset"), ]) def setURL(self, u): """ Sets the url. """ p = urlparse(u) path = p[2] pp = path.split("/") self.localfile = pp[ -1] URLMeshAsset.setURL(self, u) observe_setURL = setURL def getCompatibleRenderers(self): """ Returns a list of compatible renderers. """ return [Panda3D] def create(self, name): """ Creates the asset """ assert self.parent, "URLPandaMeshAsset requires a parent." rend = self.parent.parent.getLocalService(IPlayerClient).getRenderer() obj = rend.getRendererClass(ISceneObject)(rend) obj.create(self.getFullFile(), str(name)) return obj def newURLPandaMeshAsset(conductor, assetgroup, url, localfile="", name="", depends=tuple()): """ Factory to create a new Panda mesh asset """ d = assetgroup.newAsset(conductor, ClassGenerator( "mv3d.resource.panda.URLPandaMeshAsset")) def finishUp(tm, _u, localfile, name, depends): """ Actually set the attributes of the mesh """ tm.url = url if localfile != "": tm.localfile = localfile if name != "": tm.name = name for d in depends: if isinstance(d, tuple): tm.addDependency(d) else: tm.addDependency(d.getID()) tm.grantPermission("read", "all") tm.grantPermission("reference", "all") tm.queueSave(selectAttributes=["url", "localfile", "name"]) return tm d.addCallback(finishUp, url, localfile, name, depends) return d