94 lines
3.3 KiB
Python
94 lines
3.3 KiB
Python
#!/usr/bin/env python
|
|
|
|
# Author: Shao Zhang and Phil Saltzman
|
|
# Last Updated: 2015-03-13
|
|
#
|
|
# This tutorial shows how to take an existing particle effect taken from a
|
|
# .ptf file and run it in a general Panda project.
|
|
|
|
from direct.showbase.ShowBase import ShowBase
|
|
from panda3d.core import TextNode
|
|
from panda3d.core import AmbientLight, DirectionalLight
|
|
from panda3d.core import LPoint3, LVector3
|
|
from panda3d.core import Filename
|
|
from panda3d.physics import BaseParticleEmitter, BaseParticleRenderer
|
|
from panda3d.physics import PointParticleFactory, SpriteParticleRenderer
|
|
from panda3d.physics import LinearNoiseForce, DiscEmitter
|
|
from direct.particles.Particles import Particles
|
|
from direct.particles.ParticleEffect import ParticleEffect
|
|
from direct.particles.ForceGroup import ForceGroup
|
|
from direct.gui.OnscreenText import OnscreenText
|
|
import sys
|
|
|
|
HELP_TEXT = """
|
|
1: Load Steam
|
|
2: Load Dust
|
|
3: Load Fountain
|
|
4: Load Smoke
|
|
5: Load Smokering
|
|
6: Load Fireish
|
|
ESC: Quit
|
|
"""
|
|
|
|
class ParticleDemo(ShowBase):
|
|
|
|
def __init__(self):
|
|
ShowBase.__init__(self)
|
|
|
|
# Standard title and instruction text
|
|
self.title = OnscreenText(
|
|
text="Panda3D: Tutorial - Particles",
|
|
parent=base.a2dBottomCenter,
|
|
style=1, fg=(1, 1, 1, 1), pos=(0, 0.1), scale=.08)
|
|
self.escapeEvent = OnscreenText(
|
|
text=HELP_TEXT, parent=base.a2dTopLeft,
|
|
style=1, fg=(1, 1, 1, 1), pos=(0.06, -0.06),
|
|
align=TextNode.ALeft, scale=.05)
|
|
|
|
# More standard initialization
|
|
self.accept('escape', sys.exit)
|
|
self.accept('1', self.loadParticleConfig, ['steam.ptf'])
|
|
self.accept('2', self.loadParticleConfig, ['dust.ptf'])
|
|
self.accept('3', self.loadParticleConfig, ['fountain.ptf'])
|
|
self.accept('4', self.loadParticleConfig, ['smoke.ptf'])
|
|
self.accept('5', self.loadParticleConfig, ['smokering.ptf'])
|
|
self.accept('6', self.loadParticleConfig, ['fireish.ptf'])
|
|
|
|
self.accept('escape', sys.exit)
|
|
base.disableMouse()
|
|
base.camera.setPos(0, -20, 2)
|
|
base.camLens.setFov(25)
|
|
base.setBackgroundColor(0, 0, 0)
|
|
|
|
# This command is required for Panda to render particles
|
|
base.enableParticles()
|
|
self.t = loader.loadModel("teapot")
|
|
self.t.setPos(0, 10, 0)
|
|
self.t.reparentTo(render)
|
|
self.setupLights()
|
|
self.p = ParticleEffect()
|
|
self.loadParticleConfig('steam.ptf')
|
|
|
|
def loadParticleConfig(self, filename):
|
|
# Start of the code from steam.ptf
|
|
self.p.cleanup()
|
|
self.p = ParticleEffect()
|
|
self.p.loadConfig(Filename(filename))
|
|
# Sets particles to birth relative to the teapot, but to render at
|
|
# toplevel
|
|
self.p.start(self.t)
|
|
self.p.setPos(3.000, 0.000, 2.250)
|
|
|
|
# Setup lighting
|
|
def setupLights(self):
|
|
ambientLight = AmbientLight("ambientLight")
|
|
ambientLight.setColor((.4, .4, .35, 1))
|
|
directionalLight = DirectionalLight("directionalLight")
|
|
directionalLight.setDirection(LVector3(0, 8, -2.5))
|
|
directionalLight.setColor((0.9, 0.8, 0.9, 1))
|
|
# Set lighting on teapot so steam doesn't get affected
|
|
self.t.setLight(self.t.attachNewNode(directionalLight))
|
|
self.t.setLight(self.t.attachNewNode(ambientLight))
|
|
|
|
demo = ParticleDemo()
|
|
demo.run()
|