Last active
August 29, 2015 14:01
-
-
Save benwurth/10d953e40e393782d65b to your computer and use it in GitHub Desktop.
After Effects script for generating long shadow effects that've become so popular lately.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
//Begin undo group | |
app.beginUndoGroup("Long Shadows"); | |
/* Variables */ | |
// Selected Comp | |
var rootComp = app.project.activeItem; | |
// Actual footage layer that the shadow is applied to | |
var footageLayer; | |
// Name of original footage layer | |
var footageLayerName; | |
// Outer precomp of footageLayer | |
var precomposedFootage; | |
// Inner shadow precomp | |
var shadowSpin; | |
// Outer shadow precomp | |
var shadow; | |
var shadowInitialWidth; | |
var shadowInitialHeight; | |
// Layer with effects that control all shadows in the scene | |
var globalShadowControls; | |
function main () { | |
//Check to see if a single layer is selected | |
if(rootComp.selectedLayers.length != 1) | |
{ | |
alert("Please select ONE footage layer."); | |
return; | |
} | |
// Get the footage layer | |
footageLayer = rootComp.selectedLayers[0]; | |
footageLayerName = footageLayer.name; | |
// Check to see if globalShadowControls exists. If not, create it and add the proper effects. | |
var hasGlobalControls = false; | |
for (var i = 0; i < rootComp.layers.length; i++) { | |
if (rootComp.layers[i+1].name === "globalShadowControls") { | |
hasGlobalControls = true; | |
globalShadowControls = rootComp.layers[i+1]; | |
} | |
} | |
if (!hasGlobalControls) { | |
globalShadowControls = rootComp.layers.addNull(); | |
globalShadowControls.name = "globalShadowControls"; | |
var slider = globalShadowControls("Effects").addProperty("ADBE Slider Control"); | |
slider.name = "Shadow Length"; | |
slider.property(1).setValue(100); | |
var angleControl = globalShadowControls("Effects").addProperty("ADBE Angle Control"); | |
angleControl.name = "Global Light Direction"; | |
var transparency = globalShadowControls("Effects").addProperty("ADBE Slider Control"); | |
transparency.name = "Transparency"; | |
transparency.property(1).setValue(17); | |
} | |
// Precompose the footage layer | |
var precomposedFootageIndex = footageLayer.index; | |
precomposedFootage = rootComp.layers.precompose([footageLayer.index], (footageLayer.name + "-FOOTAGE"), true); | |
var precomposedFootageLayer = rootComp.layers[precomposedFootageIndex]; | |
// Duplicate precomp. Call duplicate "shadow-spin" | |
shadowSpin = precomposedFootage.duplicate(); | |
shadowSpin.name = footageLayerName + "-SHADOW_SPIN"; | |
var shadowSpinLayer = rootComp.layers.add(shadowSpin); | |
shadowSpinLayer.moveAfter(precomposedFootageLayer); | |
// Precompose "shadow-spin" in "shadow" | |
shadow = rootComp.layers.precompose([shadowSpinLayer.index], (footageLayerName + "-SHADOW"), true); | |
// Change size of "shadow" to 4000x4000 | |
shadowInitialHeight = shadow.height; | |
shadowInitialWidth = shadow.width; | |
shadow.height = 4000; | |
shadow.width = 4000; | |
for (var j = 0; j < shadow.layers.length; j++) { | |
var layerXPos = shadow.layers[j+1].position.value[0]; | |
var layerYPos = shadow.layers[j+1].position.value[1]; | |
shadow.layers[j+1].position.setValue([(layerXPos/shadowInitialWidth)*shadow.width, | |
(layerYPos/shadowInitialHeight)*shadow.height]); | |
} | |
// Parent rotation of "shadow-spin" to rotation of "shadow" and invert (*-1) | |
shadow.layers[1].rotation.expression = "comp(\"" + rootComp.name + "\").layer(\"" + shadow.name + | |
"\").transform.rotation*-1"; | |
// Parent rotation of "shadow" to globalShadowControls | |
var shadowLayer = rootComp.layers.byName(footageLayerName + "-SHADOW"); | |
shadowLayer.rotation.expression = "thisComp.layer(\"globalShadowControls\")" + | |
".effect(\"Global Light Direction\")(\"Angle\")"; | |
// Add tint effect to "shadow-spin" and map both to white | |
shadowSpinLayer = shadow.layers.byName(footageLayerName + "-SHADOW_SPIN"); | |
var tint = shadowSpinLayer("Effects").addProperty("Tint"); | |
tint.property(1).setValue([1,1,1,0]); | |
tint.property(2).setValue([1,1,1,0]); | |
// Add box blur effect to "shadow". Change effect to horizontal. | |
var boxBlur = shadowLayer("Effects").addProperty("Box Blur"); | |
boxBlur.property(3).setValue(2); | |
// Add expression to "shadow" anchor point. | |
shadowLayer.anchorPoint.expression = "temp = effect(\"Box Blur\")(\"Blur Radius\");[2000-temp, 2000]"; | |
// Parent box blur radius to globalShadowControls. | |
boxBlur("Blur Radius").expression = 'thisComp.layer("globalShadowControls").effect("Shadow Length")("Slider")'; | |
// Add set matte effect to "shadow," change layer to none. Set invert matte to True. Set composite matte to False. | |
var setMatte = shadowLayer("Effects").addProperty("Set Matte"); | |
setMatte.property(1).setValue(0); | |
setMatte.property(3).setValue(true); | |
setMatte.property(5).setValue(false); | |
// Add invert effect to "shadow". | |
var invert = shadowLayer("Effects").addProperty("Invert"); | |
// Change blend mode of "shadow" to multiply. | |
shadowLayer.blendingMode = BlendingMode.MULTIPLY; | |
shadowLayer.opacity.expression = 'thisComp.layer("globalShadowControls")' + | |
'.effect("Transparency")("Slider")'; | |
// Add drop shadow layer style to footage | |
var dropShadow = precomposedFootageLayer("Effects").addProperty("Drop Shadow"); | |
dropShadow.property(2).setValue(64); | |
dropShadow.property(3).expression = 'thisComp.layer("globalShadowControls")' + | |
'.effect("Global Light Direction")("Angle")+90'; | |
dropShadow.property(4).setValue(2); | |
dropShadow.property(5).setValue(2); | |
} | |
main(); | |
//End Undo group | |
app.endUndoGroup(); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment