Skip to content

Instantly share code, notes, and snippets.

@benwurth
Last active August 29, 2015 14:01
Show Gist options
  • Save benwurth/10d953e40e393782d65b to your computer and use it in GitHub Desktop.
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.
{
//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