diff --git a/direct/src/tkpanels/ParticlePanel.py b/direct/src/tkpanels/ParticlePanel.py index 82a180b3b8..81553ccf0f 100644 --- a/direct/src/tkpanels/ParticlePanel.py +++ b/direct/src/tkpanels/ParticlePanel.py @@ -595,42 +595,34 @@ class ParticlePanel(AppShell): activebackground = '#909090') forceMenu = Menu(self.addForceButton) self.addForceButton['menu'] = forceMenu + # DERIVED FROM LINEAR FORCE + # This also has: setVector forceMenu.add_command(label = 'Add Linear Vector Force', command = self.addLinearVectorForce) - forceMenu.add_command(label = 'Add Linear Friction Force', - command = self.addLinearFrictionForce) - """ - # derive from RANDOM derives from Linear Force - # setAmplitude - # setMassDependent - # setVectorMasks - forceMenu.add_command(label = 'Add Linear Jitter Force', - command = self.addLinearJitterForce) + # Parameters: setAmplitude, setMassDependent, setVectorMasks forceMenu.add_command(label = 'Add Linear Noise Force', command = self.addLinearNoiseForce) - # setCoef - # setLength - # setRadius + forceMenu.add_command(label = 'Add Linear Jitter Force', + command = self.addLinearJitterForce) + # This also has setCoef + forceMenu.add_command(label = 'Add Linear Friction Force', + command = self.addLinearFrictionForce) + # This also has: setCoef, setLength, setRadius, forceMenu.add_command(label = 'Add Linear Cylinder Vortex Force', command = self.addLinearCylinderVortexForce) - forceMenu.add_command(label = 'Add Linear User Defined Force', - command = self.addLinearUserDefinedForce) - # Also friction - - # Linear Distance force - # setFalloffType - # setForceCenter - # setRadius + + # DERIVED FROM LINEAR DISTANCE FORCE + # Parameters: setFalloffType, setForceCenter, setRadius forceMenu.add_command(label = 'Add Linear Sink Force', command = self.addLinearSinkForce) forceMenu.add_command(label = 'Add Linear Source Force', command = self.addLinearSourceForce) + """ + # Avoid for now + forceMenu.add_command(label = 'Add Linear User Defined Force', + command = self.addLinearUserDefinedForce) + """ - forceMenu.add_command(label = 'Add Linear Distance Force', - command = self.addLinearDistanceForce) - forceMenu.add_command(label = 'Add Linear Random Force', - command = self.addLinearRandomForce) - """ self.addForceButton.pack(expand = 0) # Notebook to hold force widgets as the are added @@ -943,8 +935,8 @@ class ParticlePanel(AppShell): else: forceGroup.disable() - def toggleForce(self, force, pagename, variableName): - v = self.getVariable(pagename, variableName) + def toggleForce(self, force, pageName, variableName): + v = self.getVariable(pageName, variableName) if v.get(): if (force.isLinear() == 1): physicsMgr.addLinearForce(force) @@ -956,7 +948,6 @@ class ParticlePanel(AppShell): else: physicsMgr.removeAngularForce(force) - def getWidget(self, category, text): return self.widgetDict[category + '-' + text] @@ -1552,26 +1543,22 @@ class ParticlePanel(AppShell): else: self.forceGroupNotebook.pack_forget() - def addLinearCylinderVortexForce(self): - self.addForce(LinearCylinderVortexForce()) - def addLinearDistanceForce(self): - self.addForce(LinearDistanceForce()) + def addLinearVectorForce(self): + self.addForce(LinearVectorForce()) def addLinearFrictionForce(self): self.addForce(LinearFrictionForce()) def addLinearJitterForce(self): self.addForce(LinearJitterForce()) def addLinearNoiseForce(self): self.addForce(LinearNoiseForce()) - def addLinearRandomForce(self): - self.addForce(LinearRandomForce()) def addLinearSinkForce(self): - self.addForce(LinearSingForce()) + self.addForce(LinearSinkForce()) def addLinearSourceForce(self): self.addForce(LinearSourceForce()) + def addLinearCylinderVortexForce(self): + self.addForce(LinearCylinderVortexForce()) def addLinearUserDefinedForce(self): self.addForce(LinearUserDefinedForce()) - def addLinearVectorForce(self): - self.addForce(LinearVectorForce()) def addForce(self, f): if self.forceGroup == None: @@ -1629,87 +1616,114 @@ class ParticlePanel(AppShell): if f.getClassType().eq(force.getClassType()): count += 1 if isinstance(force, LinearVectorForce): - # Vector self.createLinearVectorForceWidget( forcePage, pageName, count, force) + elif isinstance(force, LinearNoiseForce): + self.createLinearRandomForceWidget( + forcePage, pageName, count, force, 'Noise') + elif isinstance(force, LinearJitterForce): + self.createLinearRandomForceWidget( + forcePage, pageName, count, force, 'Jitter') elif isinstance(force, LinearFrictionForce): - # Coef self.createLinearFrictionForceWidget( forcePage, pageName, count, force) elif isinstance(force, LinearCylinderVortexForce): - # Coef, length, radius self.createLinearCylinderVortexForceWidget( forcePage, pageName, count, force) - elif isinstance(force, LinearDistanceForce): - # No constructor - # Falloff type, force center, radius - pass - elif isinstance(force, LinearJitterForce): - # Nothing - pass - elif isinstance(force, LinearNoiseForce): - # Nothing - pass - elif isinstance(force, LinearRandomForce): - # Nothing - pass elif isinstance(force, LinearSinkForce): - # Nothing - pass + self.createLinearDistanceForceWidget( + forcePage, pageName, count, force, 'Sink') elif isinstance(force, LinearSourceForce): - # Nothing - pass + self.createLinearDistanceForceWidget( + forcePage, pageName, count, force, 'Source') elif isinstance(force, LinearUserDefinedForce): # Nothing pass self.forceGroupNotebook.setnaturalsize() - def createLinearVectorForceWidget(self, forcePage, pageName, - count, force): - name = 'Vector Force-' + `count` - cbName = name + ' Active' - def setVec(vec, f = force): - f.setVector(vec[0], vec[1], vec[2]) + def createLinearForceWidgets(self, frame, pageName, forceName, force): + def setAmplitude(amp, f = force): + f.setAmplitude(amp) + def toggleMassDependent(s=self, f=force, p=pageName, n=forceName): + v = s.getVariable(p, n+' Mass Dependent') + f.setMassDependent(v.get()) + def setVectorMasks(s=self, f=force, p=pageName, n=forceName): + xMask = s.getVariable(p, n+' Mask X').get() + yMask = s.getVariable(p, n+' Mask Y').get() + zMask = s.getVariable(p, n+' Mask Z').get() + f.setVectorMasks(xMask, yMask, zMask) + self.createFloater(frame, pageName, forceName + ' Amplitude', + 'Force amplitude multiplier', + command = setAmplitude) + cbf = Frame(frame, relief = FLAT) + self.createCheckbutton(cbf, pageName, forceName + ' Mass Dependent', + ('On: force depends on mass; ' + + 'Off: force does not depend on mass'), + toggleMassDependent, 0) + self.createCheckbutton(cbf, pageName, forceName + ' Mask X', + 'On: enable force along X axis', + setVectorMasks, 1) + self.createCheckbutton(cbf, pageName, forceName + ' Mask Y', + 'On: enable force along X axis', + setVectorMasks, 1) + self.createCheckbutton(cbf, pageName, forceName + ' Mask Z', + 'On: enable force along X axis', + setVectorMasks, 1) + cbf.pack(fill = 'x', expand = 0) + + def createForceActiveWidget(self, frame, pageName, forceName, force): + cbName = forceName + ' Active' def toggle(s = self, f = force, p = pageName, n = cbName): s.toggleForce(f, p, n) - frame = Frame(forcePage, relief = RAISED, borderwidth = 2) - self.createVector3Entry(frame, pageName, name, - 'Set force direction and magnitude', - command = setVec) self.createCheckbutton(frame, pageName, cbName, 'On: force is enabled; Off: force is disabled', toggle, 1) + + def createLinearVectorForceWidget(self, forcePage, pageName, + count, force): + def setVec(vec, f = force): + f.setVector(vec[0], vec[1], vec[2]) + forceName = 'Vector Force-' + `count` + frame = Frame(forcePage, relief = RAISED, borderwidth = 2) + self.createLinearForceWidgets(frame, pageName, forceName, force) + self.createVector3Entry(frame, pageName, forceName, + 'Set force direction and magnitude', + command = setVec) + self.createForceActiveWidget(frame, pageName, forceName, force) + frame.pack(fill = 'x', expand =0) + + def createLinearRandomForceWidget(self, forcePage, pageName, count, + force, type): + forceName = type + ' Force-' + `count` + frame = Frame(forcePage, relief = RAISED, borderwidth = 2) + self.createLinearForceWidgets(frame, pageName, forceName, force) + self.createForceActiveWidget(frame, pageName, forceName, force) frame.pack(fill = 'x', expand =0) def createLinearFrictionForceWidget(self, forcePage, pageName, count, force): - name = 'Friction Force-' + `count` - cbName = name + ' Active' def setCoef(coef, f = force): f.setCoef(coef) - def toggle(s = self, f = force, p = pageName, n = cbName): - s.toggleForce(f, p, n) + forceName = 'Friction Force-' + `count` frame = Frame(forcePage, relief = RAISED, borderwidth = 2) - self.createFloater(frame, pageName, name, + self.createLinearForceWidgets(frame, pageName, forceName, force) + self.createFloater(frame, pageName, forceName, 'Set linear friction force', command = setCoef, min = None) - self.createCheckbutton(frame, pageName, cbName, - 'On: force is enabled; Off: force is disabled', - toggle, 1) + self.createForceActiveWidget(frame, pageName, forceName, force) frame.pack(fill = 'x', expand =0) def createLinearCylinderVortexForceWidget(self, forcePage, pageName, count, force): - cbName = 'Vortex Force-' + `count` + ' Active' + forceName = 'Vortex Force-' + `count` def setCoef(coef, f = force): f.setCoef(coef) def setLength(length, f = force): f.setLength(length) def setRadius(radius, f = force): f.setRadius(radius) - def toggle(s = self, f = force, p = pageName, n = cbName): - s.toggleForce(f, p, n) frame = Frame(forcePage, relief = RAISED, borderwidth = 2) + self.createLinearForceWidgets(frame, pageName, forceName, force) self.createFloater(frame, pageName, 'Coefficient', 'Set linear cylinder vortex coefficient', command = setCoef) @@ -1719,9 +1733,41 @@ class ParticlePanel(AppShell): self.createFloater(frame, pageName, 'Radius', 'Set linear cylinder vortex radius', command = setRadius) - self.createCheckbutton(frame, pageName, cbName, - 'On: force is enabled; Off: force is disabled', - toggle, 1) + self.createForceActiveWidget(frame, pageName, forceName, force) + frame.pack(fill = 'x', expand =0) + + def createLinearDistanceForceWidget(self, forcePage, pageName, + count, force, type): + def setFalloffType(type, f=force): + if type == 'FT_ONE_OVER_R': + #f.setFalloffType(LinearDistanceForce.FTONEOVERR) + f.setFalloffType(0) + if type == 'FT_ONE_OVER_R_SQUARED': + #f.setFalloffType(LinearDistanceForce.FTONEOVERRSQUARED) + f.setFalloffType(1) + if type == 'FT_ONE_OVER_R_CUBED': + #f.setFalloffType(LinearDistanceForce.FTONEOVERRCUBED) + f.setFalloffType(2) + def setForceCenter(vec, f = force): + f.setForceCenter(Point3(vec[0], vec[1], vec[2])) + def setRadius(radius, f = force): + f.setRadius(radius) + forceName = type + ' Force-' + `count` + frame = Frame(forcePage, relief = RAISED, borderwidth = 2) + self.createLinearForceWidgets(frame, pageName, forceName, force) + self.createOptionMenu(frame, pageName, forceName + ' Falloff Type', + 'Set force falloff type', + ('FT_ONE_OVER_R', + 'FT_ONE_OVER_R_SQUARED', + 'FT_ONE_OVER_R_CUBED'), + command = setFalloffType) + self.createVector3Entry(frame, pageName, forceName + ' Force Center', + 'Set center of force', + command = setForceCenter) + self.createFloater(frame, pageName, forceName + ' Radius', + 'Set falloff radius', + command = setRadius) + self.createForceActiveWidget(frame, pageName, forceName, force) frame.pack(fill = 'x', expand =0) ######################################################################