toontown-just-works/build/nirai/panda3d/samples/media-player/main.py

92 lines
3.2 KiB
Python
Raw Normal View History

2024-07-07 18:08:39 -05:00
#!/usr/bin/env python
from panda3d.core import *
# Tell Panda3D to use OpenAL, not FMOD
loadPrcFileData("", "audio-library-name p3openal_audio")
from direct.showbase.DirectObject import DirectObject
from direct.gui.OnscreenText import OnscreenText
from direct.showbase.ShowBase import ShowBase
# Function to put instructions on the screen.
def addInstructions(pos, msg):
return OnscreenText(text=msg, style=1, fg=(0, 0, 0, 1), shadow=(1, 1, 1, 1),
parent=base.a2dTopLeft, align=TextNode.ALeft,
pos=(0.08, -pos - 0.04), scale=.06)
# Function to put title on the screen.
def addTitle(text):
return OnscreenText(text=text, style=1, pos=(-0.1, 0.09), scale=.08,
parent=base.a2dBottomRight, align=TextNode.ARight,
fg=(1, 1, 1, 1), shadow=(0, 0, 0, 1))
class MediaPlayer(ShowBase):
def __init__(self, media_file):
# Initialize the ShowBase class from which we inherit, which will
# create a window and set up everything we need for rendering into it.
ShowBase.__init__(self)
self.title = addTitle("Panda3D: Tutorial - Media Player")
self.inst1 = addInstructions(0.06, "P: Play/Pause")
self.inst2 = addInstructions(0.12, "S: Stop and Rewind")
self.inst3 = addInstructions(0.18,
"M: Slow Motion / Normal Motion toggle")
# Load the texture. We could use loader.loadTexture for this,
# but we want to make sure we get a MovieTexture, since it
# implements synchronizeTo.
self.tex = MovieTexture("name")
assert self.tex.read(media_file), "Failed to load video!"
# Set up a fullscreen card to set the video texture on.
cm = CardMaker("My Fullscreen Card")
cm.setFrameFullscreenQuad()
# Tell the CardMaker to create texture coordinates that take into
# account the padding region of the texture.
cm.setUvRange(self.tex)
# Now place the card in the scene graph and apply the texture to it.
card = NodePath(cm.generate())
card.reparentTo(self.render2d)
card.setTexture(self.tex)
self.sound = loader.loadSfx(media_file)
# Synchronize the video to the sound.
self.tex.synchronizeTo(self.sound)
self.accept('p', self.playpause)
self.accept('P', self.playpause)
self.accept('s', self.stopsound)
self.accept('S', self.stopsound)
self.accept('m', self.fastforward)
self.accept('M', self.fastforward)
def stopsound(self):
self.sound.stop()
self.sound.setPlayRate(1.0)
def fastforward(self):
if self.sound.status() == AudioSound.PLAYING:
t = self.sound.getTime()
self.sound.stop()
if self.sound.getPlayRate() == 1.0:
self.sound.setPlayRate(0.5)
else:
self.sound.setPlayRate(1.0)
self.sound.setTime(t)
self.sound.play()
def playpause(self):
if self.sound.status() == AudioSound.PLAYING:
t = self.sound.getTime()
self.sound.stop()
self.sound.setTime(t)
else:
self.sound.play()
player = MediaPlayer("PandaSneezes.ogv")
player.run()