Skip to content

Instantly share code, notes, and snippets.

@GLITCHGEIST
Created July 2, 2019 18:24
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save GLITCHGEIST/ebd4476a67a322f73d062cd39c9d6d23 to your computer and use it in GitHub Desktop.
Save GLITCHGEIST/ebd4476a67a322f73d062cd39c9d6d23 to your computer and use it in GitHub Desktop.
Weapon Effect UI - Maya Script
#Weapon Effect UI Ver.1
#Authors: Caspar Vee
#
#Currently only tested in Maya 2011.
#
#------------------------------------------
#
# -- OVERVIEW --
#This script creates weapon effects using Animated Sweeps and Particle Effects. There are three menus;
#Curve Menu: Select the curve in the scene. Curves must be visible to be on the list. If you create a new curve, reload
#the script to refresh the menu.
#Animated Sweep: Check the box if you want to use this effect. Options are: Start and End frames, frame delay, trail size and colour.
#Once you're happy with the effect, click 'Finalise'.
#Particle Effect: Check the box if you want to use this effect. Options are particle presets loaded from Maya's presets folder. Options are
#Particle size and Emit Rate. Once you're happy with the effect, click 'Finalise'
#
# -- INSTALLATION AND SETUP --
#To install the script, open Maya's script editor, load the script from the save location, select all and click "Save to Shelf".
#This script requires the use of an expression. Create an expression with any name and include the line of code below:
#python("doSweep("+frame+ " )");
#
#Run the script from the shelf when needed. Delete the expression once finished using the tool.
#
#Particle Presets: Maya does not save nParticle presets to the same place that it loads them from with nodePreset. To include any presets, move
#them to the folder Documents/maya/[maya version]/presets and ensure all presets have the prefix "transformPreset_".
#
#It is recommended that you name all objects in your scene meaningfully. This script cleans up after itself by deleting unused objects,
#but identifies these using default names. Giving all objects a meaningful prefix will avoid any unwanted deletion.
#
# -- REFERENCES --
#The keyframing script used for the animated sweep is a slightly modified version of a script provided by the user 'liubo' on Vimeo:
#https://vimeo.com/84725024
#
#------------------------------------------
import maya.cmds as cmds
import maya.mel as mel
#Loading lists
#GLOBAL defaults
#Animated Sweep
CURVE_NAME = "curve1"
listOfCurves = ""
START_FRAME = 1
END_FRAME = 10
FRAME_INCREMENT = 1
TRAIL_SIZE = 4
#Sweep Colours
RED = (1, 0, 0)
ORANGE = (1, 0.5, 0)
YELLOW = (1, 1, 0)
GREEN = (0, 1, 0)
SKYBLUE = (0, 1, 1)
DARKBLUE = (0, 0, 1)
PURPLE = (0.5, 0, 1)
PINK = (1, 0, 1)
BLACK = (0, 0, 0)
GREY = (0.5, 0.5, 0.5)
WHITE = (1, 1, 1)
COLOUR = WHITE
#Particle Sweep
PARTICLE_NAME = "particle1"
listOfPresets = ""
listOfShaders = ""
PARTICLE_SCALE = 0.5
EMIT_RATE = 200
#For getting the curve name
def setCurveName(selection):
global CURVE_NAME
CURVE_NAME = selection
print(CURVE_NAME)
#Animated Sweep
#For getting the start frame
def setStartFrame(inputText):
global START_FRAME
START_FRAME = inputText
print(START_FRAME)
#For getting the end frame
def setEndFrame(inputText):
global END_FRAME
END_FRAME = inputText
print(END_FRAME)
#For getting the frame increment
def setFrameIncrement(inputText):
global FRAME_INCREMENT
FRAME_INCREMENT = inputText
print(FRAME_INCREMENT)
#For getting the trail size
def setTrailSize(inputText):
global TRAIL_SIZE
TRAIL_SIZE = inputText
print(TRAIL_SIZE)
#For changing the colour of the sweep
def setColourName(colSelection):
global COLOUR
print (colSelection)
if (colSelection == "Red"):
COLOUR = RED
if (colSelection == "Orange"):
COLOUR = ORANGE
if (colSelection == "Yellow"):
COLOUR = YELLOW
if (colSelection == "Green"):
COLOUR = GREEN
if (colSelection == "Sky Blue"):
COLOUR = SKYBLUE
if (colSelection == "Dark Blue"):
COLOUR = DARKBLUE
if (colSelection == "Purple"):
COLOUR = PURPLE
if (colSelection == "Pink"):
COLOUR = PINK
if (colSelection == "Black"):
COLOUR = BLACK
if (colSelection == "Grey"):
COLOUR = GREY
if (colSelection == "White"):
COLOUR = WHITE
print(COLOUR)
def FinaliseSweep(self):
FINAL_PREFIX = "ANIM_"
#cmds.rename(CURVE_NAME, FINAL_PREFIX+CURVE_NAME)
cmds.rename("snapshot1Group", FINAL_PREFIX+CURVE_NAME+"_snapshot")
cmds.rename("loftedSurface1", FINAL_PREFIX+CURVE_NAME+"_loftedSurface")
#parentObject = cmds.listRelatives(CURVE_NAME, allParents=True )
#cmds.group( parentObject[0], CURVE_NAME, FINAL_PREFIX+CURVE_NAME+"snapshot", FINAL_PREFIX+CURVE_NAME+"loftedSurface", n="GRP_"+CURVE_NAME )
#Particle Sweep
#For getting the trail size
def setParticleName(selection):
global PARTICLE_NAME
PARTICLE_NAME = selection
print(PARTICLE_NAME)
#For getting the particle scale
def setParticleScale(inputText):
global PARTICLE_SCALE
PARTICLE_SCALE = inputText
print(PARTICLE_SCALE)
#For getting the emit rate
def setEmitRate(inputText):
global EMIT_RATE
EMIT_RATE = inputText
print(EMIT_RATE)
def FinaliseParticles(self):
FINAL_PREFIX = "PARTICLE_"
info = cmds.getAttr("nParticleShape1.particleRenderType")
print("INFO")
print(info)
print("INFO")
#rename particles/emitters
cmds.rename("nParticleShape1", FINAL_PREFIX+CURVE_NAME+"_particleShape")
cmds.rename("nParticle1", FINAL_PREFIX+CURVE_NAME+"_particle")
cmds.rename("emitter1", FINAL_PREFIX+CURVE_NAME+"_emitter")
cmds.rename("nucleus1", FINAL_PREFIX+CURVE_NAME+"nucleus")
#Get the materials
shaderGroup = cmds.listConnections(FINAL_PREFIX+CURVE_NAME+"_particle*", type='shadingEngine')
shaders = cmds.ls(cmds.listConnections(shaderGroup), materials=True)
#Loop through the shaders
for shade in shaders:
print(shade)
tempShader = cmds.duplicate(shade, ic=True)
print(tempShader[0])
shaderGroup2 = cmds.sets(r=True, nss=True, em=True, n="PARTICLE_SG")
#If the shader is of type Blobby Surface or otherwise, apply surface and volume shaders
if (info == 7):
cmds.connectAttr (tempShader[0] + ".outColor", shaderGroup2 + ".surfaceShader", f=True)
cmds.connectAttr (tempShader[0] + ".outColor", shaderGroup2 + ".volumeShader", f=True)
#Else if not a blobby surface, check for particleCloud type and apply to volume shader ONLY
elif (info !=7):
if (cmds.nodeType(tempShader[0]) == "particleCloud"):
cmds.hyperShade(a=tempShader[0])
cmds.connectAttr (tempShader[0] + ".outColor", shaderGroup2 + ".volumeShader", f=True)
#Select the particles and apply the set
selected = cmds.select(FINAL_PREFIX+CURVE_NAME+"_particle*")
cmds.sets(forceElement="PARTICLE_SG*")
cmds.hyperShade(a=tempShader[0])
def doSweep(frame):
sword_sweep(frame)
sparks_sweep(frame)
#define function
def sword_sweep(frame):
print(frame)
isEnabled = cmds.checkBox(AnimSweepCheck, q=True, v=True)
if frame == 1:
global CURVE_NAME
global START_TIME
global END_TIME
#Delete the old snapshots, if any exist
oldSnapshots = cmds.ls("snapshot*")
list_size = len(oldSnapshots)
if list_size >= 1:
cmds.delete("snapshot*")
#Delete the old lofts, if any exist
oldLofts = cmds.ls("loftedSurface*")
list_size = len(oldLofts)
if list_size >= 1:
cmds.delete("loftedSurface*")
if isEnabled == True:
#Create a snapshot from the curve's frames, using the start and end times and the frame increment
cmds.snapshot( CURVE_NAME, constructionHistory=True, startTime=START_FRAME, endTime=END_FRAME, increment=FRAME_INCREMENT )
#Find all of the transforms under the snapshot object
listOfTransforms = cmds.listRelatives("snapshot*", ad=True)
#Create a loft surface between the transforms
cmds.loft( listOfTransforms, ch=True, rn=True, ar=True )
#Create the new material and assign the colour and shading group
shader = cmds.shadingNode("lambert", asShader=True)
cmds.setAttr(shader + '.color', *COLOUR)
shaderGroup = cmds.sets(r=True, nss=True, em=True, n="lambertSG")
cmds.connectAttr (shader + ".outColor", shaderGroup + ".surfaceShader", f=True)
#Assign the new material to the surface
selected = cmds.select("loftedSurface*")
cmds.hyperShade(a=shader)
nodes = cmds.listRelatives(cmds.ls('snapshot*'), type='transform')
#Cycle through the transform curves and turn them from blocking to nonblocking on different frames
for i in range(len(nodes)):
cmds.setKeyframe(nodes[i],attribute='nodeState', value = 2, time = START_FRAME)
cmds.setKeyframe(nodes[i],attribute='nodeState', value = 0, time = i+int(START_FRAME))
cmds.setKeyframe(nodes[i],attribute='nodeState', value = 2, time = (i+(int(START_FRAME)+(int(TRAIL_SIZE)))))
#Hide the transform curves after creation
cmds.hide(cmds.ls("transform*", type='transform'))
cmds.select( clear=True )
def sparks_sweep(frame):
print(frame)
isEnabled = cmds.checkBox(ParticleSweepCheck, q=True, v=True)
if frame == 1:
global CURVE_NAME
global PARTICLE_NAME
#Delete unused materials
#Check if the particle exists, if it does, delete the old shaders
doesExist = cmds.particleExists("nParticle*")
if doesExist == True:
#get material and keep a list
tempShaderGroup = cmds.listConnections("nParticle*", type='shadingEngine')
# get the shaders amd delete them
listOfShaders = cmds.ls(cmds.listConnections(tempShaderGroup), materials=True)
list_size = len(listOfShaders)
if list_size >= 1:
for shade in listOfShaders:
print(shade)
cmds.delete(shade)
mel.eval('hyperShadePanelMenuCommand("hyperShadePanel1", "deleteUnusedNodes");')
#Delete the old emitters, if any exist
oldEmitters = cmds.ls("emitter*")
list_size = len(oldEmitters)
if list_size >= 1:
cmds.delete("emitter*")
#Delete the old particles, if any exist
oldParticles = cmds.ls("nParticle*")
list_size = len(oldParticles)
if list_size >= 1:
cmds.delete("nParticle*")
#Delete the old particles, if any exist
oldNuclei = cmds.ls("nucleus*")
list_size = len(oldNuclei)
if list_size >= 1:
cmds.delete("nucleus*")
if isEnabled == True:
nucleus = ""
cmds.select(CURVE_NAME)
cmds.emitter(n="emitter1", type="curve", r = float(EMIT_RATE), dx = 1)
cmds.nParticle()
cmds.nodePreset( load=('nParticle1', PARTICLE_NAME) )
cmds.setAttr('nParticle1.radius', float(PARTICLE_SCALE))
cmds.connectDynamic('nParticle1', em='emitter1')
cmds.select(clear=True)
#Load the list of curves
listOfCurves = cmds.ls(type="nurbsCurve", v=True)
list_size = len(listOfCurves)
if list_size >= 1:
print (listOfCurves)
#Load the list of particle presets
cmds.nParticle(n="nParticle1")
listOfPresets = cmds.nodePreset(ls='nParticle1')
list_size = len(listOfPresets)
if list_size >= 1:
print (listOfPresets)
#get material and keep a list, stops the script crashing
tempShaderGroup = cmds.listConnections("nParticle1", type='shadingEngine')
cmds.delete("nParticle1")
#create a window
win = cmds.window(title="Sweep Controls", width=400, height=200, s=False)
cmds.columnLayout()
#GET CURVE NAME
cmds.frameLayout(cll=False, label=" ", bgc=(0, 0.5, 0))
cmds.separator(height=5, style='none')
curveNameText = cmds.text(label="Curves:", al="left")
cmds.optionMenu("Curves", changeCommand=setCurveName, w=200)
for cve in listOfCurves:
print (cve)
cmds.menuItem(cve, label=cve)
cmds.separator(height=10, style='none')
cmds.setParent("..")
cmds.setParent("..")
#ANIMATED SWEEP
cmds.frameLayout(cll=True, label="Sweep", bgc=(0, 0.5, 0))
#define the layout of controls added
#to the window.
cmds.columnLayout()
cmds.separator(height=5, style='in')
AnimSweepCheck = cmds.checkBox(l="Animated Sweep", v=False)
cmds.separator(height=10, style='in')
startFrameText = cmds.text(label="Start Frame:")
cmds.textField("StartFrameText", w=200, enterCommand=setStartFrame, text=START_FRAME)
endFrameText = cmds.text(label="End Frame:")
cmds.textField("EndFrameText", w=200, enterCommand=setEndFrame, text=END_FRAME)
frameIncrementText = cmds.text(label="Frame Increment:")
cmds.textField("FrameIncrementText", w=200, enterCommand=setFrameIncrement, text=FRAME_INCREMENT)
cmds.separator(height=10, style='in')
trailSizeText = cmds.text(label="Trail Size:")
cmds.textField("TrailSizeText", w=200, enterCommand=setTrailSize, text=TRAIL_SIZE)
cmds.separator(height=10, style='in')
coloursText = cmds.text(label="Colours:", al="left")
cmds.optionMenu("Colours", changeCommand=setColourName, w=200)
cmds.menuItem(1, label="Red", en=True)
cmds.menuItem(2, label="Orange", en=True)
cmds.menuItem(3, label="Yellow", en=True)
cmds.menuItem(4, label="Green", en=True)
cmds.menuItem(5, label="Sky Blue", en=True)
cmds.menuItem(6, label="Dark Blue", en=True)
cmds.menuItem(7, label="Purple", en=True)
cmds.menuItem(8, label="Pink", en=True)
cmds.menuItem(9, label="Black", en=True)
cmds.menuItem(10, label="Grey", en=True)
cmds.menuItem(11, label="White", en=True)
cmds.separator(height=15, style='in')
cmds.button (label="Finalise", command=FinaliseSweep, w=200)
cmds.setParent("..")
cmds.setParent("..")
#PARTICLE SWEEP
cmds.frameLayout(cll=True, label="Particles", bgc=(0, 0.5, 0))
#define the layout of controls added
#to the window.
cmds.columnLayout()
cmds.separator(height=5, style='in')
ParticleSweepCheck = cmds.checkBox(l="Particle Sweep", v=False)
cmds.separator(height=10, style='in')
particleNameText = cmds.text(label="Particle Name:", al="left")
cmds.optionMenu("Presets", changeCommand=setParticleName, w=200)
for preset in listOfPresets:
print (preset)
cmds.menuItem(preset, label=preset)
cmds.separator(height=10, style='none')
particleScaleText = cmds.text(label="Particle Scale:", al="left")
cmds.textField("ParticleScaleText", w=200, enterCommand=setParticleScale, text=PARTICLE_SCALE)
cmds.separator(height=10, style='none')
emitRateText = cmds.text(label="Emit Rate:", al="left")
cmds.textField("EmitRateText", w=200, enterCommand=setEmitRate, text=EMIT_RATE)
cmds.separator(height=15, style='none')
cmds.button (label="Finalise", command=FinaliseParticles, w=200)
cmds.setParent("..")
cmds.setParent("..")
#show the window we last created
cmds.showWindow()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment