diff --git a/direct/src/tkpanels/ParticlePanel.py b/direct/src/tkpanels/ParticlePanel.py index 66bb17bf49..c324c05baf 100644 --- a/direct/src/tkpanels/ParticlePanel.py +++ b/direct/src/tkpanels/ParticlePanel.py @@ -73,6 +73,7 @@ class ParticlePanel(AppShell): factoryPage = self.mainNotebook.add('Factory') emitterPage = self.mainNotebook.add('Emitter') rendererPage = self.mainNotebook.add('Renderer') + forcePage = self.mainNotebook.add('Force') # Put this here so it isn't called right away self.mainNotebook['raisecommand'] = self.updateInfo @@ -196,8 +197,8 @@ class ParticlePanel(AppShell): self.selectEmitterType) # Emitter modes - self.emissionType = StringVar() - self.emissionType.set('ETCUSTOM') + self.emissionType = IntVar() + self.emissionType.set(BaseParticleEmitter.ETRADIATE) emissionFrame = Frame(emitterPage) self.createRadiobutton( emissionFrame, 'left', @@ -263,22 +264,25 @@ class ParticlePanel(AppShell): 'Radius of disc', command = self.setEmitterDiscRadius, min = 0.01) - self.createAngleDial(discPage, 'Disc Emitter', 'Inner Angle', + customPage = self.discCustomFrame = Frame(discPage) + self.createAngleDial(customPage, 'Disc Emitter', 'Inner Angle', 'Particle launch angle at center of disc', command = self.setEmitterDiscInnerAngle) - self.createFloater(discPage, 'Disc Emitter', 'Inner Velocity', + self.createFloater(customPage, 'Disc Emitter', 'Inner Velocity', 'Launch velocity multiplier at center of disc', command = self.setEmitterDiscInnerVelocity) - self.createAngleDial(discPage, 'Disc Emitter', 'Outer Angle', + self.createAngleDial(customPage, 'Disc Emitter', 'Outer Angle', 'Particle launch angle at outer edge of disc', command = self.setEmitterDiscOuterAngle) - self.createFloater(discPage, 'Disc Emitter', 'Outer Velocity', + self.createFloater(customPage, 'Disc Emitter', 'Outer Velocity', 'Launch velocity multiplier at edge of disc', command = self.setEmitterDiscOuterVelocity) self.emitterDiscCubicLerping = self.createCheckbutton( - discPage, 'Disc Emitter', 'Cubic Lerping', + customPage, 'Disc Emitter', 'Cubic Lerping', 'On: magnitude/angle interpolation from center', self.toggleEmitterDiscCubicLerping, 0) + customPage.pack(fill = BOTH, expand = 1) + # Line page # linePage = self.emitterNotebook.add('LineEmitter') self.createVector3Entry(linePage, 'Line Emitter', 'Min', @@ -309,9 +313,12 @@ class ParticlePanel(AppShell): 'Radius of ring', command = self.setEmitterRingRadius, min = 0.01) - self.createAngleDial(ringPage, 'Ring Emitter', 'Angle', + self.ringCustomFrame = Frame(ringPage) + self.createAngleDial(self.ringCustomFrame, 'Ring Emitter', 'Angle', 'Particle launch angle', command = self.setEmitterRingLaunchAngle) + self.ringCustomFrame.pack(fill = BOTH, expand = 1) + # Sphere volume # sphereVolumePage = self.emitterNotebook.add('SphereVolumeEmitter') self.createFloater(sphereVolumePage, 'Sphere Volume Emitter', 'Radius', @@ -481,6 +488,14 @@ class ParticlePanel(AppShell): 'On: alpha blending is disabled', self.toggleRendererSpriteAlphaDisable, 0) self.rendererNotebook.pack(fill = X) + + ## FORCE PAGE ## + # fn = ForceNode() + # lvf = LinearVectorForce() + # lvf.setVector(0,0,-4) + # fn.addForce(lvf) + # physicsMgr.addLinearForce(lvf) + # render.attachNewNode(fn) self.factoryNotebook.setnaturalsize() self.emitterNotebook.setnaturalsize() @@ -743,7 +758,7 @@ class ParticlePanel(AppShell): def updateEmitterWidgets(self): emitter = self.particles.emitter - self.emissionType.set(self.particles.emitter.getEmissionType()) + self.setEmissionType(self.particles.emitter.getEmissionType()) amp = emitter.getAmplitude() self.getWidget('Emitter', 'Velocity Multiplier').set(amp) spread = emitter.getAmplitudeSpread() @@ -812,9 +827,43 @@ class ParticlePanel(AppShell): radius = emitter.getRadius() self.getWidget('Tangent Ring Emitter', 'Radius').set(radius, 0) # All # - def setEmissionType(self): - self.particles.emitter.setEmissionType( - int(self.emissionType.get())) + def setEmissionType(self, newType = None): + if newType: + type = newType + self.emissionType.set(type) + else: + type = self.emissionType.get() + self.particles.emitter.setEmissionType(type) + if type == BaseParticleEmitter.ETEXPLICIT: + self.getWidget( + 'Emitter', 'Radiate Origin')['state'] = 'disabled' + self.getWidget( + 'Emitter', 'Explicit Velocity')['state'] = 'normal' + # Hide custom widgets + if isinstance(self.particles.emitter, DiscEmitter): + self.discCustomFrame.pack_forget() + elif isinstance(self.particles.emitter, RingEmitter): + self.ringCustomFrame.pack_forget() + elif type == BaseParticleEmitter.ETRADIATE: + self.getWidget( + 'Emitter', 'Radiate Origin')['state'] = 'normal' + self.getWidget( + 'Emitter', 'Explicit Velocity')['state'] = 'disabled' + # Hide custom widgets + if isinstance(self.particles.emitter, DiscEmitter): + self.discCustomFrame.pack_forget() + elif isinstance(self.particles.emitter, RingEmitter): + self.ringCustomFrame.pack_forget() + elif type == BaseParticleEmitter.ETCUSTOM: + self.getWidget( + 'Emitter', 'Radiate Origin')['state'] = 'disabled' + self.getWidget( + 'Emitter', 'Explicit Velocity')['state'] = 'disabled' + # Show custom widgets + if isinstance(self.particles.emitter, DiscEmitter): + self.discCustomFrame.pack(fill = BOTH, expand = 1) + elif isinstance(self.particles.emitter, RingEmitter): + self.ringCustomFrame.pack(fill = BOTH, expand = 1) def setEmitterAmplitude(self, value): self.particles.emitter.setAmplitude(value) diff --git a/direct/src/tkwidgets/VectorWidgets.py b/direct/src/tkwidgets/VectorWidgets.py index 5833b70ab3..b4145e3302 100644 --- a/direct/src/tkwidgets/VectorWidgets.py +++ b/direct/src/tkwidgets/VectorWidgets.py @@ -31,7 +31,8 @@ class VectorEntry(Pmw.MegaWidget): ('min', None, self._updateValidate), ('max', None, self._updateValidate), ('significantDigits', 2, self._setSigDigits), - ('valuatorType', VALUATOR, None) + ('valuatorType', VALUATOR, None), + ('state', 'normal', self._setState), ) self.defineoptions(kw, optiondefs) @@ -104,6 +105,9 @@ class VectorEntry(Pmw.MegaWidget): # Make sure entries are updated self.set(self['initialValue']) + # Record entry color + self.entryBackground = self.cget('Entry_entry_background') + # Make sure input variables processed self.initialiseoptions(VectorEntry) @@ -222,6 +226,32 @@ class VectorEntry(Pmw.MegaWidget): self._floaters.set(self.get()[:]) self._floaters.show() + def _setState(self): + if self['state'] == 'disabled': + # Disable entry + self.configure(Entry_entry_state = 'disabled') + self.configure(Entry_entry_background = '#C0C0C0') + # Disable floater Group scale + self.component('fGroup').configure( + Valuator_scale_state = 'disabled') + # Disable floater group entry + self.component('fGroup').configure( + Valuator_entry_state = 'disabled') + self.component('fGroup').configure( + Valuator_entry_background = '#C0C0C0') + else: + # Disable entry + self.configure(Entry_entry_state = 'normal') + self.configure(Entry_entry_background = self.entryBackground) + # Disable floater Group scale + self.component('fGroup').configure( + Valuator_scale_state = 'normal') + # Disable floater group entry + self.component('fGroup').configure( + Valuator_entry_state = 'normal') + self.component('fGroup').configure( + Valuator_entry_background = self.entryBackground) + class Vector2Entry(VectorEntry): def __init__(self, parent = None, **kw): # Initialize options for the class