Пример #1
0
 def loadFlatQuad(self, fullFilename):
     cm = CardMaker('cm-%s' % fullFilename)
     cm.setColor(1.0, 1.0, 1.0, 1.0)
     aspect = base.camLens.getAspectRatio()
     htmlWidth = 2.0 * aspect * WEB_WIDTH_PIXELS / float(WIN_WIDTH)
     htmlHeight = 2.0 * float(WEB_HEIGHT_PIXELS) / float(WIN_HEIGHT)
     cm.setFrame(-htmlWidth / 2.0, htmlWidth / 2.0, -htmlHeight / 2.0,
                 htmlHeight / 2.0)
     bottomRightX = WEB_WIDTH_PIXELS / float(WEB_WIDTH + 1)
     bottomRightY = WEB_HEIGHT_PIXELS / float(WEB_HEIGHT + 1)
     cm.setUvRange(Point2(0, 1 - bottomRightY), Point2(bottomRightX, 1))
     card = cm.generate()
     quad = NodePath(card)
     jpgFile = PNMImage(WEB_WIDTH, WEB_HEIGHT)
     smallerJpgFile = PNMImage()
     readFile = smallerJpgFile.read(Filename(fullFilename))
     if readFile:
         jpgFile.copySubImage(smallerJpgFile, 0, 0)
         guiTex = Texture('guiTex')
         guiTex.setupTexture(Texture.TT2dTexture, WEB_WIDTH, WEB_HEIGHT, 1,
                             Texture.TUnsignedByte, Texture.FRgba)
         guiTex.setMinfilter(Texture.FTLinear)
         guiTex.load(jpgFile)
         guiTex.setWrapU(Texture.WMClamp)
         guiTex.setWrapV(Texture.WMClamp)
         ts = TextureStage('webTS')
         quad.setTexture(ts, guiTex)
         quad.setTransparency(0)
         quad.setTwoSided(True)
         quad.setColor(1.0, 1.0, 1.0, 1.0)
         result = quad
     else:
         result = None
     Texture.setTexturesPower2(1)
     return result
Пример #2
0
 def loadFlatQuad(self, fullFilename):
     cm = CardMaker("cm-%s" % fullFilename)
     cm.setColor(1.0, 1.0, 1.0, 1.0)
     aspect = base.camLens.getAspectRatio()
     htmlWidth = 2.0 * aspect * WEB_WIDTH_PIXELS / float(WIN_WIDTH)
     htmlHeight = 2.0 * float(WEB_HEIGHT_PIXELS) / float(WIN_HEIGHT)
     cm.setFrame(-htmlWidth / 2.0, htmlWidth / 2.0, -htmlHeight / 2.0, htmlHeight / 2.0)
     bottomRightX = WEB_WIDTH_PIXELS / float(WEB_WIDTH + 1)
     bottomRightY = WEB_HEIGHT_PIXELS / float(WEB_HEIGHT + 1)
     cm.setUvRange(Point2(0, 1 - bottomRightY), Point2(bottomRightX, 1))
     card = cm.generate()
     quad = NodePath(card)
     jpgFile = PNMImage(WEB_WIDTH, WEB_HEIGHT)
     smallerJpgFile = PNMImage()
     readFile = smallerJpgFile.read(Filename(fullFilename))
     if readFile:
         jpgFile.copySubImage(smallerJpgFile, 0, 0)
         guiTex = Texture("guiTex")
         guiTex.setupTexture(Texture.TT2dTexture, WEB_WIDTH, WEB_HEIGHT, 1, Texture.TUnsignedByte, Texture.FRgba)
         guiTex.setMinfilter(Texture.FTLinear)
         guiTex.load(jpgFile)
         guiTex.setWrapU(Texture.WMClamp)
         guiTex.setWrapV(Texture.WMClamp)
         ts = TextureStage("webTS")
         quad.setTexture(ts, guiTex)
         quad.setTransparency(0)
         quad.setTwoSided(True)
         quad.setColor(1.0, 1.0, 1.0, 1.0)
         result = quad
     else:
         result = None
     Texture.setTexturesPower2(1)
     return result
    def __init__(self, **kwargs):
        """
        See the Element class to find out what attributes are available
        from scratch
        """
        super(VideoPlayer, self).__init__(**kwargs)

        self.videofile = getattr(self.config, 'file_video', None)
        self.loopCount = getattr(self.config, 'loop', 1)
        self.hoffset = getattr(self.config, 'hoffset', 0)
        self.voffset = getattr(self.config, 'voffset', 0)

        #self.videoScale = getattr(self.config, 'scale', (1,1))
        #self.playrate = getattr(self.config, 'speed', 1.0)

        if self.videofile:
            movieTexture = loader.loadTexture(self.videofile)
            cm = CardMaker("video_card")
            # cm.setFrameFullscreenQuad()
            cm.setUvRange(movieTexture)
            card = NodePath(cm.generate())
            card.reparentTo(self.hudNP)
            card.setTexture(movieTexture)
            card.setTexScale(TextureStage.getDefault(),
                             movieTexture.getTexScale())
            card.setPos(-0.5 + self.hoffset, 0.0, -0.5 + self.voffset)
            self.movie = movieTexture
            print card.getScale()
            self.time = 0
            self.movie.stop()

        self.hideElement()
Пример #4
0
	def __init__(self, name, nrplates, width, height, shaderfile, texturefile, uvlist, jitter=-1):
		self.name = name
		self.texturefile = texturefile
		self.shaderfile = shaderfile
		
		self.np = NodePath('leaf')
		
		self.tex = loader.loadTexture('textures/' + texturefile)
		self.tex.setMinfilter(Texture.FTLinearMipmapLinear)
		self.tex.setMagfilter(Texture.FTLinearMipmapLinear)
		self.tex.setAnisotropDegree(2)
		self.np.setTexture(self.tex)
		self.np.setTwoSided(True)
		self.np.setTransparency(TransparencyAttrib.MAlpha)
		self.np.setDepthWrite(False)
		
		maker = CardMaker('leaf')
		maker.setFrame(-width/2.0, width/2.0, 0, height)
		#maker.setFrame(0,1,0,1)
		for i in range(nrplates):
			if uvlist != None:
				maker.setUvRange(uvlist[i][0], uvlist[i][1])
			else:
				maker.setUvRange(Point2(0,0), Point2(1,0.98))
			node = self.np.attachNewNode(maker.generate())
			#node.setTwoSided(True)
			node.setHpr(i * 180.0 / nrplates,0,0)
		self.np.flattenStrong()
		#np.flattenLight()
		#np.setTwoSided(True)
		
		if jitter == -1:
			self.jitter = height/width/2
		else:
			self.jitter = jitter
Пример #5
0
 def setupTexture(self):
     cm = CardMaker('quadMaker')
     cm.setColor(1.0, 1.0, 1.0, 1.0)
     aspect = base.camLens.getAspectRatio()
     htmlWidth = 2.0 * aspect * WEB_WIDTH_PIXELS / float(WIN_WIDTH)
     htmlHeight = 2.0 * float(WEB_HEIGHT_PIXELS) / float(WIN_HEIGHT)
     cm.setFrame(-htmlWidth / 2.0, htmlWidth / 2.0, -htmlHeight / 2.0,
                 htmlHeight / 2.0)
     bottomRightX = WEB_WIDTH_PIXELS / float(WEB_WIDTH + 1)
     bottomRightY = WEB_HEIGHT_PIXELS / float(WEB_HEIGHT + 1)
     cm.setUvRange(Point2(0, 1 - bottomRightY), Point2(bottomRightX, 1))
     card = cm.generate()
     self.quad = NodePath(card)
     self.quad.reparentTo(self.parent)
     self.guiTex = Texture('guiTex')
     self.guiTex.setupTexture(Texture.TT2dTexture, WEB_WIDTH, WEB_HEIGHT, 1,
                              Texture.TUnsignedByte, Texture.FRgba)
     self.guiTex.setMinfilter(Texture.FTLinear)
     self.guiTex.setKeepRamImage(True)
     self.guiTex.makeRamImage()
     self.guiTex.setWrapU(Texture.WMRepeat)
     self.guiTex.setWrapV(Texture.WMRepeat)
     ts = TextureStage('webTS')
     self.quad.setTexture(ts, self.guiTex)
     self.quad.setTexScale(ts, 1.0, -1.0)
     self.quad.setTransparency(0)
     self.quad.setTwoSided(True)
     self.quad.setColor(1.0, 1.0, 1.0, 1.0)
     self.calcMouseLimits()
Пример #6
0
    def title(self):
        #Removes title and loads current room
        def destroyTitle(task):
            card.removeNode()
            startGame()

        def startGame():
            if os.path.isfile('saves/location.json'):
                self.directToRoom()
            else:
                self.homeFirst()

        #Loads title animation
        titleText = self.loader.loadTexture('resources/titleText.avi')
        titleText.setLoopCount(1)
        titleText.play()

        #Displays title
        cm = CardMaker('titleText')
        cm.setFrameFullscreenQuad()
        cm.setUvRange(titleText)
        # noinspection PyArgumentList
        card = NodePath(cm.generate())
        card.reparentTo(self.render2d)
        card.setTexture(titleText)
        self.taskMgr.doMethodLater(5.6, destroyTitle, 'endTitle')
Пример #7
0
 def setupTexture(self):
     cm = CardMaker('quadMaker')
     cm.setColor(1.0, 1.0, 1.0, 1.0)
     aspect = base.camLens.getAspectRatio()
     htmlWidth = 2.0 * aspect * WEB_WIDTH_PIXELS / float(WIN_WIDTH)
     htmlHeight = 2.0 * float(WEB_HEIGHT_PIXELS) / float(WIN_HEIGHT)
     cm.setFrame(-htmlWidth / 2.0, htmlWidth / 2.0, -htmlHeight / 2.0, htmlHeight / 2.0)
     bottomRightX = WEB_WIDTH_PIXELS / float(WEB_WIDTH + 1)
     bottomRightY = WEB_HEIGHT_PIXELS / float(WEB_HEIGHT + 1)
     cm.setUvRange(Point2(0, 1 - bottomRightY), Point2(bottomRightX, 1))
     card = cm.generate()
     self.quad = NodePath(card)
     self.quad.reparentTo(self.parent)
     self.guiTex = Texture('guiTex')
     self.guiTex.setupTexture(Texture.TT2dTexture, WEB_WIDTH, WEB_HEIGHT, 1, Texture.TUnsignedByte, Texture.FRgba)
     self.guiTex.setMinfilter(Texture.FTLinear)
     self.guiTex.setKeepRamImage(True)
     self.guiTex.makeRamImage()
     self.guiTex.setWrapU(Texture.WMRepeat)
     self.guiTex.setWrapV(Texture.WMRepeat)
     ts = TextureStage('webTS')
     self.quad.setTexture(ts, self.guiTex)
     self.quad.setTexScale(ts, 1.0, -1.0)
     self.quad.setTransparency(0)
     self.quad.setTwoSided(True)
     self.quad.setColor(1.0, 1.0, 1.0, 1.0)
     self.calcMouseLimits()
Пример #8
0
    def loadFlatQuad(self, fullFilename):
        """Load the flat jpg into a quad."""
        assert self.notify.debugStateCall(self)
        #Texture.setTexturesPower2(AutoTextureScale.ATSUp)
        #Texture.setTexturesPower2(2)
        
        cm = CardMaker('cm-%s'%fullFilename)
        cm.setColor(1.0, 1.0, 1.0, 1.0)
        aspect = base.camLens.getAspectRatio()
        htmlWidth = 2.0*aspect * WEB_WIDTH_PIXELS / float(WIN_WIDTH)		
        htmlHeight = 2.0*float(WEB_HEIGHT_PIXELS) / float(WIN_HEIGHT) 

        # the html area will be center aligned and vertically top aligned
        #cm.setFrame(-htmlWidth/2.0, htmlWidth/2.0, 1.0 - htmlHeight, 1.0)
        cm.setFrame(-htmlWidth/2.0, htmlWidth/2.0, - htmlHeight / 2.0, htmlHeight / 2.0)

        bottomRightX = (WEB_WIDTH_PIXELS) / float( WEB_WIDTH +1)
        bottomRightY = WEB_HEIGHT_PIXELS / float (WEB_HEIGHT+1)

        #cm.setUvRange(Point2(0,0), Point2(bottomRightX, bottomRightY))
        cm.setUvRange(Point2(0,1-bottomRightY), Point2(bottomRightX,1))
        
        card = cm.generate()
        quad = NodePath(card)
        #quad.reparentTo(self.parent)

        jpgFile = PNMImage(WEB_WIDTH, WEB_HEIGHT)
        smallerJpgFile = PNMImage()
        readFile = smallerJpgFile.read(Filename(fullFilename))
        if readFile:
            jpgFile.copySubImage(smallerJpgFile, 0, 0)

            guiTex = Texture("guiTex")
            guiTex.setupTexture(Texture.TT2dTexture, WEB_WIDTH, WEB_HEIGHT, 1, Texture.TUnsignedByte, Texture.FRgba)
            guiTex.setMinfilter(Texture.FTLinear)
            guiTex.load(jpgFile)
            #guiTex.setKeepRamImage(True)		
            #guiTex.makeRamImage()				
            guiTex.setWrapU(Texture.WMClamp)
            guiTex.setWrapV(Texture.WMClamp)

            ts = TextureStage('webTS')
            quad.setTexture(ts, guiTex)
            #quad.setTexScale(ts, 1.0, -1.0)

            quad.setTransparency(0)
            quad.setTwoSided(True)
            quad.setColor(1.0, 1.0, 1.0, 1.0)
            result= quad
        else:
            # if we have an error loading the file, return None to signify an error
            result = None

        #Texture.setTexturesPower2(AutoTextureScale.ATSDown)
        Texture.setTexturesPower2(1)
        return result
	def makeCard(self, color, width, height, i, j, divisions):
		divisions = float(divisions)
		x = i / divisions
		y = j / divisions
		d = 1 / divisions

		card = CardMaker("wall")
		card.setColor(*color)
		card.setFrame(width*(x*2-1), width*((x+d)*2-1), height*(y*2-1), height*((y+d)*2-1))
		card.setUvRange(Point2(width*x, height*y), Point2(width*(x+d), height*(y+d)))
		card.setHasUvs(True)
		card.setHasNormals(True)
		node = self.node.attachNewNode(card.generate())
Пример #10
0
    def makeCard(self, color, width, height, i, j, divisions):
        divisions = float(divisions)
        x = i / divisions
        y = j / divisions
        d = 1 / divisions

        card = CardMaker("wall")
        card.setColor(*color)
        card.setFrame(width * (x * 2 - 1), width * ((x + d) * 2 - 1),
                      height * (y * 2 - 1), height * ((y + d) * 2 - 1))
        card.setUvRange(Point2(width * x, height * y),
                        Point2(width * (x + d), height * (y + d)))
        card.setHasUvs(True)
        card.setHasNormals(True)
        node = self.node.attachNewNode(card.generate())
Пример #11
0
class BulletHoles:
    """The name says it all."""
    def __init__(self, manager, xml):
        self.texture = loader.loadTexture('data/textures/bullet-hole.png')
        self.texture.setMinfilter(Texture.FTLinearMipmapLinear)
        self.container = render.attachNewNode(ModelRoot('bullet-holes'))
        self.card = CardMaker('bullet-hole')
        s = BULLETHOLE_SIZE * 0.5
        self.card.setFrame(-s, s, -s, s)
        self.card.setUvRange(Point2(0, 0), Point2(1, 1))

    def makeNew(self, pos, nor, parent=None):
        """Makes a new bullet hole."""
        if parent == None:
            parent = self.container
        else:
            # Add a subnode to the parent, if it's not already there
            child = parent.find('bullet-holes')
            if child.isEmpty():
                parent = parent.attachNewNode('bullet-holes')
            else:
                parent = child
        newhole = NodePath(self.card.generate())
        newhole.reparentTo(parent)
        newhole.lookAt(render, Point3(newhole.getPos(render) - nor))
        newhole.setR(newhole, random() * 360.0)
        newhole.setPos(render, pos)
        # Offset it a little to avoid z-fighting
        # Increase this value if you still see it.
        newhole.setY(newhole, -.001 - random() * 0.01)
        del newhole
        # We don't want one batch per bullet hole, so flatten it.
        # This could be made smarter to preserve culling, but
        # I have yet to see a performance loss.
        # The clearTexture() is a necessary hack.
        parent.clearTexture()
        parent.flattenStrong()
        parent.setTexture(self.texture)
        parent.setTransparency(TransparencyAttrib.MDual)
        parent.setShaderOff(1)
        parent.hide(BitMask32.bit(
            2))  # Invisible to volumetric lighting camera (speedup)
        parent.hide(BitMask32.bit(3))  # Invisible to shadow cameras (speedup)

    def destroy(self):
        self.container.removeNode()
Пример #12
0
class BulletHoles:
  """The name says it all."""
  def __init__(self,manager,xml):
    self.texture = loader.loadTexture('data/textures/bullet-hole.png')
    self.texture.setMinfilter(Texture.FTLinearMipmapLinear)
    self.container = render.attachNewNode(ModelRoot('bullet-holes'))
    self.card = CardMaker('bullet-hole')
    s = BULLETHOLE_SIZE * 0.5
    self.card.setFrame(-s, s, -s, s)
    self.card.setUvRange(Point2(0, 0), Point2(1, 1))

  def makeNew(self, pos, nor, parent = None):
    """Makes a new bullet hole."""
    if parent == None:
      parent = self.container
    else:
      # Add a subnode to the parent, if it's not already there
      child = parent.find('bullet-holes')
      if child.isEmpty():
        parent = parent.attachNewNode('bullet-holes')
      else:
        parent = child
    newhole = NodePath(self.card.generate())
    newhole.reparentTo(parent)
    newhole.lookAt(render, Point3(newhole.getPos(render) - nor))
    newhole.setR(newhole, random() * 360.0)
    newhole.setPos(render, pos)
    # Offset it a little to avoid z-fighting
    # Increase this value if you still see it.
    newhole.setY(newhole, -.001 - random() * 0.01)
    del newhole
    # We don't want one batch per bullet hole, so flatten it.
    # This could be made smarter to preserve culling, but
    # I have yet to see a performance loss.
    # The clearTexture() is a necessary hack.
    parent.clearTexture()
    parent.flattenStrong()
    parent.setTexture(self.texture)
    parent.setTransparency(TransparencyAttrib.MDual)
    parent.setShaderOff(1)
    parent.hide(BitMask32.bit(2)) # Invisible to volumetric lighting camera (speedup)
    parent.hide(BitMask32.bit(3)) # Invisible to shadow cameras (speedup)

  def destroy(self):
    self.container.removeNode()
    def __init__(self,
                 name,
                 nrplates,
                 width,
                 height,
                 shaderfile,
                 texturefile,
                 uvlist,
                 jitter=-1):
        #print name, nrplates, width, height, shaderfile, texturefile, uvlist, jitter
        self.name = name
        self.texturefile = texturefile
        self.shaderfile = shaderfile

        self.np = NodePath('leaf')

        self.tex = loader.loadTexture('textures/' + texturefile)
        self.tex.setMinfilter(Texture.FTLinearMipmapLinear)
        self.tex.setMagfilter(Texture.FTLinearMipmapLinear)
        self.tex.setAnisotropicDegree(2)
        self.np.setTexture(self.tex)
        self.np.setTwoSided(True)
        self.np.setTransparency(TransparencyAttrib.MAlpha)
        #self.np.setTransparency( TransparencyAttrib.MMultisample )
        self.np.setDepthWrite(False)

        maker = CardMaker('leaf')
        maker.setFrame(-width / 2.0, width / 2.0, 0, height)
        #maker.setFrame( 0,1,0,1)
        for i in range(nrplates):
            if uvlist != None:
                maker.setUvRange(uvlist[i][0], uvlist[i][1])
            else:
                maker.setUvRange(Point2(0, 0), Point2(1, 0.98))
            node = self.np.attachNewNode(maker.generate())
            #node.setTwoSided( True )
            node.setHpr(i * 180.0 / nrplates, 0, 0)
        self.np.flattenStrong()
        #np.flattenLight()
        #np.setTwoSided( True )

        if jitter == -1:
            self.jitter = height / width / 2
        else:
            self.jitter = jitter
Пример #14
0
 def __setupPreview(self):
   """Creates the preview."""
   if not self.previewCheck.Value: return
   if self.preview != None:
     self.__destroyPreview()
   self.preview = wx.StaticBitmap(self, style = wx.SUNKEN_BORDER, size = PREVIEW_SIZE)
   self.sizer.Add(self.preview, 0, wx.ADJUST_MINSIZE | wx.ALIGN_CENTER, 0)
   cm = CardMaker("preview")
   cm.setFrame(-1, 1, -1, 1)
   cm.setUvRange(Point2(0, 0), Point2(1, 1))
   self.previewTexture = Texture()
   self.previewBuffer = WindowManager.windows[0].win.makeTextureBuffer("preview", *PREVIEW_SIZE)
   self.previewBuffer.setClearColor(Vec4(1, 1, 1, 1))
   self.previewCamera = base.makeCamera2d(self.previewBuffer)
   self.previewPlane = NodePath(cm.generate())
   self.previewPlane.setFogOff(1000)
   self.previewPlane.setLightOff(1000)
   self.previewCamera.node().setScene(self.previewPlane)
   self.previewBuffer.addRenderTexture(self.previewTexture, GraphicsOutput.RTMCopyRam)
   self.previewCamera.node().setActive(texturePainter.texturePainterStatus == TEXTURE_PAINTER_STATUS_ENABLED)
   self.Layout()
Пример #15
0
 def __init__(self, direction, particleSpeed, gravity, particleLifetime, scale, texture, textureBlendType, texCoordU, texCoordV):
     self.direction = direction
     self.particleSpeed = particleSpeed
     self.gravity = gravity
     self.particleLifetime = particleLifetime
     self.scale = scale
     self.texture = texture
     self.textureBlendType = textureBlendType
     self.texCoordU = texCoordU
     self.texCoordV = texCoordV
     self.timeAlive = 0
     
     
     
     self.node = render.attachNewNode('Particle')
     cm = CardMaker('ParticleCard')
     cm.setUvRange(Point2(texCoordU[0], texCoordV[0]), Point2(texCoordU[1], texCoordV[1]))
     card = self.node.attachNewNode(cm.generate())
     #card.setPos(-self.scale / 2.0, 0, -self.scale / 2.0)
     card.setScale(self.scale)
     card.setTexture(self.texture)
     card.setLightOff()
     card.setBillboardPointEye()
Пример #16
0
  ballBody.setMass(M)
  ballBody.setPosition(ballNP.getPos(render))
  ballBody.setQuaternion(ballNP.getQuat(render))
  # Create a ballGeom
  ballGeom = OdeSphereGeom(space, 1)
  ballGeom.setCollideBits(BitMask32(0x00000001))
  ballGeom.setCategoryBits(BitMask32(0x00000001))
  ballGeom.setBody(ballBody)
  # Create the sound
  ballSound = loader.loadSfx("audio/sfx/GUI_rollover.wav")
  balls.append((ballNP, ballGeom, ballSound))

# Add a plane to collide with
cm = CardMaker("ground")
cm.setFrame(-20, 20, -20, 20)
cm.setUvRange((0, 1), (1, 0))
ground = render.attachNewNode(cm.generate())
ground.setPos(0, 0, 0); ground.lookAt(0, 0, -1)
groundGeom = OdePlaneGeom(space, (0, 0, 1, 0))
groundGeom.setCollideBits(BitMask32(0x00000001))
groundGeom.setCategoryBits(BitMask32(0x00000001))

# Add a texture to the ground
groundImage = PNMImage(512, 512)
groundImage.fill(1, 1, 1)
groundBrush = PNMBrush.makeSpot((0, 0, 0, 1), 8, True)
groundPainter = PNMPainter(groundImage)
groundPainter.setPen(groundBrush)
groundTexture = Texture("ground")
ground.setTexture(groundTexture)
groundImgChanged = False
Пример #17
0
class VideoPlayer:
    def __init__(self, name, resources):
        self.log = logging.getLogger('pano.videoPlayer' + name)
        self.resources = resources
        self.texCard = None
        self.texCardNode = None
        self.videoTex = None
        self.vidSound = None
        self.animInterface = None

        # has the length of a movie in seconds
        self.totalTime = 0.0

    def dispose(self):
        self._releaseResources()

    def playFullScreen(self, video, audio=None):

        self._releaseResources()

        #        self.videoTex = loader.loadTexture(self.resources.getResourceFullPath(PanoConstants.RES_TYPE_VIDEOS, video))
        self.videoTex = MovieTexture('name')
        self.videoTex.read(
            self.resources.getResourceFullPath(PanoConstants.RES_TYPE_VIDEOS,
                                               video))

        self.texCard = CardMaker("Full screen Video Card for " + video)
        self.texCard.setFrameFullscreenQuad()
        self.texCard.setUvRange(self.videoTex)
        self.texCardNode = NodePath(self.texCard.generate())
        self.texCardNode.reparentTo(render2d)
        self.texCardNode.setTexture(self.videoTex)
        if audio is not None:
            self.vidSound = loader.loadSfx(
                self.resources.getResourceFullPath(
                    PanoConstants.RES_TYPE_MUSIC, audio))
            self.videoTex.synchronizeTo(self.vidSound)

        self.animInterface = self.videoTex
        if self.vidSound is not None:
            self.animInterface = self.vidSound

        self.totalTime = self.videoTex.getTime()
        self.animInterface.setLoop(False)
        self.animInterface.play()

    def stop(self):
        if self.animInterface is not None:
            self.animInterface.stop()

    def pause(self):
        if self.animInterface is not None:
            t = self.animInterface.getTime()
            self.animInterface.stop()
            self.animInterface.setTime(t)

    def hasFinished(self):
        if self.animInterface is not None:
            if type(self.animInterface) == AudioSound:
                return self.animInterface.getTime(
                ) >= self.animInterface.length()
            else:
                return self.totalTime <= self.animInterface.getTime()
        else:
            return True

    def getAnimInterface(self):
        return self.animInterface

    def _releaseResources(self):
        if self.texCardNode is not None:
            self.texCardNode.removeNode()

        self.texCard = None
        self.texCardNode = None
        self.videoTex = None
        self.vidSound = None
        self.animInterface = None
        self.totalTime = 0.0

    def renderToGeom(resources, geom, video, audio):

        videoTex = loader.loadTexture(
            resources.getResourceFullPath(PanoConstants.RES_TYPE_VIDEOS,
                                          video))

        if videoTex is None:
            print "Couldn't load video %s" % video
            return None

#        if (base.sfxManagerList[0].getType().getName() != "OpenALAudioManager"):
#            self.log.error("OpenAL support is not enabled, cannot proceed.")
#            return None

        if (videoTex.getType().getName() != "MovieTexture"):
            print "MovieTexture support is not enabled, cannot proceed."
            return None

        geom.setTexture(videoTex)
        videoTex.setWrapU(Texture.WMClamp)
        videoTex.setWrapV(Texture.WMClamp)
        if videoTex.getTexturesPower2():
            geom.setTexScale(TextureStage.getDefault(), videoTex.getTexScale())

        if audio is not None:
            vidSound = loader.loadSfx(
                resources.getResourceFullPath(PanoConstants.RES_TYPE_MUSIC,
                                              audio))
            videoTex.synchronizeTo(vidSound)
            return vidSound
        else:
            return videoTex

    def renderToTexture(resources, video, audio):

        videoTex = loader.loadTexture(
            resources.getResourceFullPath(PanoConstants.RES_TYPE_VIDEOS,
                                          video))

        if videoTex is None:
            print "Couldn't load video %s" % video
            return None

        if (videoTex.getType().getName() != "MovieTexture"):
            print "MovieTexture support is not enabled, cannot proceed."
            return None

        videoTex.setWrapU(Texture.WMClamp)
        videoTex.setWrapV(Texture.WMClamp)
        #TODO: Check how I can set the texture scale
        #        if videoTex.getTexturesPower2():
        #            geom.setTexScale(TextureStage.getDefault(), videoTex.getTexScale())

        if audio is not None:
            vidSound = loader.loadSfx(
                resources.getResourceFullPath(PanoConstants.RES_TYPE_MUSIC,
                                              audio))
            videoTex.synchronizeTo(vidSound)
            return vidSound
        else:
            return videoTex

    renderToGeom = staticmethod(renderToGeom)
    renderToTexture = staticmethod(renderToTexture)