Files
GDevelop/Extensions/Effects/JsExtension.js
Quarkstar c7d5ab8013 Update Twist/ZoomBlur/RadialBlur to be centered by default (#1564)
Remove dependency on window size, preparing for object effects support
2020-03-25 23:33:55 +01:00

1245 lines
43 KiB
JavaScript
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* This is a declaration of an extension for GDevelop 5.
*
* Run `node import-GDJS-Runtime.js` (in newIDE/app/scripts) if you make any change
* to this extension file or to any other *.js file that you reference inside.
*
* The file must be named "JsExtension.js", otherwise GDevelop won't load it.
* ⚠️ If you make a change and the extension is not loaded, open the developer console
* and search for any errors.
*
* More information on https://github.com/4ian/GDevelop/blob/master/newIDE/README-extensions.md
*/
module.exports = {
createExtension: function(_, gd) {
const extension = new gd.PlatformExtension();
extension.setExtensionInformation(
'Effects',
'Effects',
'Contains various effects to be used in games.',
'Various contributors from PixiJS, PixiJS filters and GDevelop',
'MIT'
);
// You can declare an effect here. Please order the effects by alphabetical order.
// This file is for common effects that are well-known/"battle-tested". If you have an
// experimental effect, create an extension for it (copy this folder, rename "Effects" to something else,
// and remove all the files and declaration of effects, or take a look at ExampleJsExtension).
const adjustmentEffect = extension
.addEffect('Adjustment')
.setFullName(_('Adjustment'))
.setDescription(
_(
'Adjust gamma, contrast, saturation, brightness, alpha or color-channel shift.'
)
)
.addIncludeFile('Extensions/Effects/pixi-filters/filter-adjustment.js')
.addIncludeFile('Extensions/Effects/adjustment-pixi-filter.js');
const adjustmentProperties = adjustmentEffect.getProperties();
adjustmentProperties.set(
'gamma',
new gd.PropertyDescriptor(/* defaultValue= */ '1')
.setLabel(_('Gamma (between 0 and 5)'))
.setType('number')
);
adjustmentProperties.set(
'saturation',
new gd.PropertyDescriptor(/* defaultValue= */ '2')
.setLabel(_('Saturation (between 0 and 5)'))
.setType('number')
);
adjustmentProperties.set(
'contrast',
new gd.PropertyDescriptor(/* defaultValue= */ '1')
.setLabel(_('Contrast (between 0 and 5)'))
.setType('number')
);
adjustmentProperties.set(
'brightness',
new gd.PropertyDescriptor(/* defaultValue= */ '1')
.setLabel(_('Brightness (between 0 and 5)'))
.setType('number')
);
adjustmentProperties.set(
'red',
new gd.PropertyDescriptor(/* defaultValue= */ '1')
.setLabel(_('Red (between 0 and 5)'))
.setType('number')
);
adjustmentProperties.set(
'green',
new gd.PropertyDescriptor(/* defaultValue= */ '1')
.setLabel(_('Green (between 0 and 5)'))
.setType('number')
);
adjustmentProperties.set(
'blue',
new gd.PropertyDescriptor(/* defaultValue= */ '0.6')
.setLabel(_('Blue (between 0 and 5)'))
.setType('number')
);
adjustmentProperties.set(
'alpha',
new gd.PropertyDescriptor(/* defaultValue= */ '1')
.setLabel(_('Alpha (between 0 and 1, 0 is transparent)'))
.setType('number')
);
const advancedBloomEffect = extension
.addEffect('AdvancedBloom')
.setFullName(_('Advanced bloom'))
.setDescription(_('Applies a bloom effect.'))
.addIncludeFile(
'Extensions/Effects/pixi-filters/filter-advanced-bloom.js'
)
.addIncludeFile('Extensions/Effects/advanced-bloom-pixi-filter.js');
const advancedBloomProperties = advancedBloomEffect.getProperties();
advancedBloomProperties.set(
'threshold',
new gd.PropertyDescriptor(/* defaultValue= */ '0.5')
.setLabel(_('Threshold (between 0 and 1)'))
.setType('number')
);
advancedBloomProperties.set(
'bloomScale',
new gd.PropertyDescriptor(/* defaultValue= */ '0.7')
.setLabel(_('Bloom Scale (between 0 and 2)'))
.setType('number')
);
advancedBloomProperties.set(
'brightness',
new gd.PropertyDescriptor(/* defaultValue= */ '0.7')
.setLabel(_('Brightness (between 0 and 2)'))
.setType('number')
);
advancedBloomProperties.set(
'blur',
new gd.PropertyDescriptor(/* defaultValue= */ '4')
.setLabel(_('Blur (between 0 and 20)'))
.setType('number')
);
advancedBloomProperties.set(
'quality',
new gd.PropertyDescriptor(/* defaultValue= */ '7')
.setLabel(_('Quality (between 0 and 20)'))
.setType('number')
);
const asciiEffect = extension
.addEffect('Ascii')
.setFullName(_('ASCII'))
.setDescription(_('Render the image with ASCII characters only.'))
.addIncludeFile('Extensions/Effects/pixi-filters/filter-ascii.js')
.addIncludeFile('Extensions/Effects/ascii-pixi-filter.js');
const asciiProperties = asciiEffect.getProperties();
asciiProperties.set(
'size',
new gd.PropertyDescriptor(/* defaultValue= */ '8')
.setLabel(_('Size (between 2 and 20)'))
.setType('number')
);
const bevelEffect = extension
.addEffect('Bevel')
.setFullName(_('Beveled edges'))
.setDescription(_('Add beveled edges around the rendered image.'))
.addIncludeFile('Extensions/Effects/pixi-filters/filter-bevel.js')
.addIncludeFile('Extensions/Effects/bevel-pixi-filter.js');
const bevelProperties = bevelEffect.getProperties();
bevelProperties.set(
'rotation',
new gd.PropertyDescriptor(/* defaultValue= */ '1')
.setLabel(_('Rotation (between 0 and 360)'))
.setType('number')
);
bevelProperties.set(
'thickness',
new gd.PropertyDescriptor(/* defaultValue= */ '2')
.setLabel(_('Outer strength (between 0 and 5)'))
.setType('number')
);
bevelProperties.set(
'distance',
new gd.PropertyDescriptor(/* defaultValue= */ '15')
.setLabel(_('Distance (between 10 and 20)'))
.setType('number')
);
bevelProperties.set(
'lightAlpha',
new gd.PropertyDescriptor(/* defaultValue= */ '1')
.setLabel(_('Light alpha (between 0 and 1)'))
.setType('number')
);
bevelProperties.set(
'lightColor',
new gd.PropertyDescriptor(/* defaultValue= */ '#ffffff')
.setLabel(_('Light color (color of the outline)'))
.setType('color')
);
bevelProperties.set(
'shadowColor',
new gd.PropertyDescriptor(/* defaultValue= */ '#000000')
.setLabel(_('Shadow color (color of the outline)'))
.setType('color')
);
bevelProperties.set(
'shadowAlpha',
new gd.PropertyDescriptor(/* defaultValue= */ '1')
.setLabel(_('Shadow alpha (between 0 and 1)'))
.setType('number')
);
const blackAndWhiteEffect = extension
.addEffect('BlackAndWhite')
.setFullName(_('Black and White'))
.setDescription(_('Alter the colors to make the image black and white'))
.addIncludeFile('Extensions/Effects/black-and-white-pixi-filter.js');
const blackAndWhiteProperties = blackAndWhiteEffect.getProperties();
blackAndWhiteProperties.set(
'opacity',
new gd.PropertyDescriptor(/* defaultValue= */ '1')
.setLabel(_('Opacity (between 0 and 1)'))
.setType('number')
);
const blendingModeEffect = extension
.addEffect('BlendingMode')
.setFullName(_('Blending mode'))
.setDescription(
_('Alter the rendered image with the specified blend mode.')
)
.addIncludeFile('Extensions/Effects/pixi-filters/filter-alpha.js')
.addIncludeFile('Extensions/Effects/blending-mode-pixi-filter.js');
const blendingModeProperties = blendingModeEffect.getProperties();
blendingModeProperties.set(
'blendmode',
new gd.PropertyDescriptor(/* defaultValue= */ '0')
.setLabel(_('Mode (0: Normal, 1: Add, 2: Multiply, 3: Screen)'))
.setType('number')
);
blendingModeProperties.set(
'opacity',
new gd.PropertyDescriptor(/* defaultValue= */ '1')
.setLabel(_('Opacity (between 0 and 1)'))
.setType('number')
);
const blurEffect = extension
.addEffect('Blur')
.setFullName(_('Blur'))
.setDescription(_('Blur the rendered image.'))
.addIncludeFile('Extensions/Effects/blur-pixi-filter.js');
const blurProperties = blurEffect.getProperties();
blurProperties.set(
'blur',
new gd.PropertyDescriptor(/* defaultValue= */ '8')
.setLabel(_('Blur intensity'))
.setType('number')
);
blurProperties.set(
'quality',
new gd.PropertyDescriptor(/* defaultValue= */ '1')
.setLabel(
_(
'Number of render passes. An high value will cause lags/poor performance.'
)
)
.setType('number')
);
blurProperties.set(
'resolution',
new gd.PropertyDescriptor(/* defaultValue= */ '2')
.setLabel(_('Resolution'))
.setType('number')
);
blurProperties.set(
'resolution',
new gd.PropertyDescriptor(/* defaultValue= */ '5')
.setLabel(_('Kernel size (one of these values: 5, 7, 9, 11, 13, 15)'))
.setType('number')
);
const brightnessEffect = extension
.addEffect('Brightness')
.setFullName(_('Brightness'))
.setDescription(_('Make the image brighter.'))
.addIncludeFile('Extensions/Effects/brightness-pixi-filter.js');
const brightnessProperties = brightnessEffect.getProperties();
brightnessProperties.set(
'brightness',
new gd.PropertyDescriptor(/* defaultValue= */ '0.8')
.setLabel(_('Brightness (between 0 and 1)'))
.setType('number')
);
const bulgePinchEffect = extension
.addEffect('BulgePinch')
.setFullName(_('Bulge Pinch'))
.setDescription(_('Bulges or pinches the image in a circle.'))
.addIncludeFile('Extensions/Effects/pixi-filters/filter-bulge-pinch.js')
.addIncludeFile('Extensions/Effects/bulge-pinch-pixi-filter.js');
const bulgePinchProperties = bulgePinchEffect.getProperties();
bulgePinchProperties.set(
'centerX',
new gd.PropertyDescriptor(/* defaultValue= */ '0')
.setLabel(_('Center X (between 0 and 1, 0.5 is image middle)'))
.setType('number')
);
bulgePinchProperties.set(
'centerY',
new gd.PropertyDescriptor(/* defaultValue= */ '0')
.setLabel(_('Center Y (between 0 and 1, 0.5 is image middle)'))
.setType('number')
);
bulgePinchProperties.set(
'radius',
new gd.PropertyDescriptor(/* defaultValue= */ '100')
.setLabel(_('Radius'))
.setType('number')
);
bulgePinchProperties.set(
'strength',
new gd.PropertyDescriptor(/* defaultValue= */ '1')
.setLabel(_('strength (between -1 and 1)'))
.setType('number')
.setDescription(_('-1 is strong pinch, 0 is no effect, 1 is strong bulge'))
);
const colorMapEffect = extension
.addEffect('ColorMap')
.setFullName(_('Color Map'))
.setDescription(_('Change the color rendered on screen.'))
.addIncludeFile('Extensions/Effects/color-map-pixi-filter.js')
.addIncludeFile('Extensions/Effects/pixi-filters/filter-color-map.js');
const colorMapProperties = colorMapEffect.getProperties();
colorMapProperties.set(
'colorMapTexture',
new gd.PropertyDescriptor('')
.setType('resource')
.addExtraInfo('image')
.setLabel(_('Color map texture for the effect'))
.setDescription(
_(
'You can change colors of pixels by modifing a reference color image, containing each colors, called the *Color Map Texture*. To get started, **download** [a default color map texture here](http://wiki.compilgames.net/doku.php/gdevelop5/interface/scene-editor/layer-effects).'
)
)
);
colorMapProperties.set(
'nearest',
new gd.PropertyDescriptor(/* defaultValue= */ 'false')
.setLabel(_('Disable anti-aliasing ("nearest" pixel rounding)'))
.setType('boolean')
);
colorMapProperties.set(
'mix',
new gd.PropertyDescriptor(/* defaultValue= */ '100')
.setLabel(_('Mix'))
.setType('number')
.setDescription(_('Mix value of the effect on the layer (in percent)'))
);
const colorReplaceEffect = extension
.addEffect('ColorReplace')
.setFullName(_('Color Replace'))
.setDescription(_('Effect replacing a color (or similar) by another.'))
.addIncludeFile('Extensions/Effects/pixi-filters/filter-color-replace.js')
.addIncludeFile('Extensions/Effects/color-replace-pixi-filter.js');
const colorReplaceProperties = colorReplaceEffect.getProperties();
colorReplaceProperties.set(
'originalColor',
new gd.PropertyDescriptor(/* defaultValue= */ '#ff0000')
.setLabel(_('Original Color'))
.setType('color')
.setDescription('The color that will be changed')
);
colorReplaceProperties.set(
'newColor',
new gd.PropertyDescriptor(/* defaultValue= */ '#000000')
.setLabel(_('New Color'))
.setType('color')
.setDescription('The new color')
);
colorReplaceProperties.set(
'epsilon',
new gd.PropertyDescriptor(/* defaultValue= */ '0.4')
.setLabel(_('Epsilon (between 0 and 1)'))
.setType('number')
.setDescription(
_(
'Tolerance/sensitivity of the floating-point comparison between colors (lower = more exact, higher = more inclusive)'
)
)
);
const crtEffect = extension
.addEffect('CRT')
.setFullName(_('CRT'))
.setDescription(_('Apply an effect resembling old CRT monitors.'))
.addIncludeFile('Extensions/Effects/pixi-filters/filter-crt.js')
.addIncludeFile('Extensions/Effects/crt-pixi-filter.js');
const crtProperties = crtEffect.getProperties();
crtProperties.set(
'lineWidth',
new gd.PropertyDescriptor(/* defaultValue= */ '1')
.setLabel(_('Line width (between 0 and 5)'))
.setType('number')
);
crtProperties.set(
'lineContrast',
new gd.PropertyDescriptor(/* defaultValue= */ '0.25')
.setLabel(_('Line contrast (between 0 and 1)'))
.setType('number')
);
crtProperties.set(
'noise',
new gd.PropertyDescriptor(/* defaultValue= */ '0.3')
.setLabel(_('Noise (between 0 and 1)'))
.setType('number')
);
crtProperties.set(
'curvature',
new gd.PropertyDescriptor(/* defaultValue= */ '1')
.setLabel(_('Curvature (between 0 and 10)'))
.setType('number')
);
crtProperties.set(
'verticalLine',
new gd.PropertyDescriptor(/* defaultValue= */ 'false')
.setLabel(_('Show vertical lines'))
.setType('boolean')
);
crtProperties.set(
'noiseSize',
new gd.PropertyDescriptor(/* defaultValue= */ '1')
.setLabel(_('Noise size (between 0 and 10)'))
.setType('number')
);
crtProperties.set(
'vignetting',
new gd.PropertyDescriptor(/* defaultValue= */ '0.3')
.setLabel(_('Vignetting (between 0 and 1)'))
.setType('number')
);
crtProperties.set(
'vignettingAlpha',
new gd.PropertyDescriptor(/* defaultValue= */ '1')
.setLabel(_('Vignetting alpha (between 0 and 1)'))
.setType('number')
);
crtProperties.set(
'vignettingBlur',
new gd.PropertyDescriptor(/* defaultValue= */ '0.3')
.setLabel(_('Vignetting blur (between 0 and 1)'))
.setType('number')
);
crtProperties.set(
'animationSpeed',
new gd.PropertyDescriptor(/* defaultValue= */ '1')
.setLabel(_('Interlaced Lines Speed'))
.setType('number')
.setDescription(
_(
'0: Pause, 0.5: Half speed, 1: Normal speed, 2: Double speed, etc...'
)
)
);
crtProperties.set(
'animationFrequency',
new gd.PropertyDescriptor(/* defaultValue= */ '60')
.setLabel(_('Noise Frequency'))
.setType('number')
.setDescription('Number of updates per second (0: no updates)')
);
const displacementEffect = extension
.addEffect('Displacement')
.setFullName(_('Displacement'))
.setDescription(
_(
'Uses the pixel values from the specified texture (called the displacement map) to perform a displacement of an object.'
)
)
.addIncludeFile('Extensions/Effects/displacement-pixi-filter.js');
const displacementProperties = displacementEffect.getProperties();
displacementProperties.set(
'displacementMapTexture',
new gd.PropertyDescriptor('')
.setType('resource')
.addExtraInfo('image')
.setLabel(_('Displacement map texture'))
.setDescription(
_(
'Displacement map texture for the effect. To get started, **download** [a default displacement map texture here](http://wiki.compilgames.net/doku.php/gdevelop5/interface/scene-editor/layer-effects).'
)
)
);
displacementProperties.set(
'scaleX',
new gd.PropertyDescriptor(/* defaultValue= */ '20')
.setLabel(_('Scale on X axis'))
.setType('number')
);
displacementProperties.set(
'scaleY',
new gd.PropertyDescriptor(/* defaultValue= */ '20')
.setLabel(_('Scale on Y axis'))
.setType('number')
);
const dotEffect = extension
.addEffect('Dot')
.setFullName(_('Dot'))
.setDescription(
_(
'Applies a dotscreen effect making objects appear to be made out of black and white halftone dots like an old printer.'
)
)
.addIncludeFile('Extensions/Effects/pixi-filters/filter-dot.js')
.addIncludeFile('Extensions/Effects/dot-pixi-filter.js');
const dotProperties = dotEffect.getProperties();
dotProperties.set(
'scale',
new gd.PropertyDescriptor(/* defaultValue= */ '1')
.setLabel(_('Scale (between 0.3 and 1)'))
.setType('number')
.setDescription('The scale of the effect')
);
dotProperties.set(
'angle',
new gd.PropertyDescriptor(/* defaultValue= */ '5')
.setLabel(_('Angle (between 0 and 5)'))
.setType('number')
.setDescription('The radius of the effect')
);
const dropShadowEffect = extension
.addEffect('DropShadow')
.setFullName(_('Drop shadow'))
.setDescription(_('Add a shadow around the rendered image.'))
.addIncludeFile('Extensions/Effects/pixi-filters/filter-kawase-blur.js')
.addIncludeFile('Extensions/Effects/pixi-filters/filter-drop-shadow.js')
.addIncludeFile('Extensions/Effects/drop-shadow-pixi-filter.js');
const dropShadowProperties = dropShadowEffect.getProperties();
dropShadowProperties.set(
'blur',
new gd.PropertyDescriptor(/* defaultValue= */ '2')
.setLabel(_('Blur (between 0 and 20)'))
.setType('number')
);
dropShadowProperties.set(
'quality',
new gd.PropertyDescriptor(/* defaultValue= */ '3')
.setLabel(_('Quality (between 1 and 20)'))
.setType('number')
);
dropShadowProperties.set(
'alpha',
new gd.PropertyDescriptor(/* defaultValue= */ '1')
.setLabel(_('Alpha (between 0 and 1)'))
.setType('number')
);
dropShadowProperties.set(
'distance',
new gd.PropertyDescriptor(/* defaultValue= */ '1')
.setLabel(_('Distance (between 0 and 50)'))
.setType('number')
);
dropShadowProperties.set(
'rotation',
new gd.PropertyDescriptor(/* defaultValue= */ '0')
.setLabel(_('Rotation (between 0 and 360)'))
.setType('number')
);
dropShadowProperties.set(
'color',
new gd.PropertyDescriptor(/* defaultValue= */ '#000000')
.setLabel(_('Color of the shadow'))
.setType('color')
);
dropShadowProperties.set(
'shadowOnly',
new gd.PropertyDescriptor(/* defaultValue= */ 'false')
.setLabel(_('Shadow only (shows only the shadow when enabled)'))
.setType('boolean')
);
const glitchEffect = extension
.addEffect('Glitch')
.setFullName(_('Glitch'))
.setDescription(_('Applies a glitch effect to an object.'))
.addIncludeFile('Extensions/Effects/pixi-filters/filter-glitch.js')
.addIncludeFile('Extensions/Effects/glitch-pixi-filter.js');
const glitchProperties = glitchEffect.getProperties();
glitchProperties.set(
'slices',
new gd.PropertyDescriptor(/* defaultValue= */ '5')
.setLabel(_('Slices (between 2 and infinite)'))
.setType('number')
.setDescription('The maximum number of slices')
);
glitchProperties.set(
'offset',
new gd.PropertyDescriptor(/* defaultValue= */ '100')
.setLabel(_('Offset (between -400 and 400)'))
.setType('number')
.setDescription('The maximum offset amount of slices')
);
glitchProperties.set(
'direction',
new gd.PropertyDescriptor(/* defaultValue= */ '0')
.setLabel(_('Direction (between -180 and 180)'))
.setType('number')
.setDescription('The angle in degree of the offset of slices')
);
glitchProperties.set(
'fillMode',
new gd.PropertyDescriptor(/* defaultValue= */ '0')
.setLabel(_('Fill Mode (between 0 and 4)'))
.setType('number')
.setDescription(
_(
'The fill mode of the space after the offset.(0: TRANSPARENT, 1: ORIGINAL, 2: LOOP, 3: CLAMP, 4: MIRROR)'
)
)
);
glitchProperties.set(
'average',
new gd.PropertyDescriptor(/* defaultValue= */ 'false')
.setLabel(_('Average'))
.setType('boolean')
.setDescription('Divide the bands roughly based on equal amounts')
);
glitchProperties.set(
'minSize',
new gd.PropertyDescriptor(/* defaultValue= */ '8')
.setLabel(_('Min Size'))
.setType('number')
.setDescription('Minimum size of individual slice')
);
glitchProperties.set(
'sampleSize',
new gd.PropertyDescriptor(/* defaultValue= */ '512')
.setLabel(_('Sample Size'))
.setType('number')
.setDescription('The resolution of the displacement image')
);
glitchProperties.set(
'animationFrequency',
new gd.PropertyDescriptor(/* defaultValue= */ '60')
.setLabel(_('Animation Frequency'))
.setType('number')
.setDescription('Number of updates per second (0: no updates)')
);
glitchProperties.set(
'redX',
new gd.PropertyDescriptor(/* defaultValue= */ '2')
.setLabel(_('Red X offset (between -50 and 50)'))
.setType('number')
);
glitchProperties.set(
'redY',
new gd.PropertyDescriptor(/* defaultValue= */ '2')
.setLabel(_('Red Y offset (between -50 and 50)'))
.setType('number')
);
glitchProperties.set(
'greenX',
new gd.PropertyDescriptor(/* defaultValue= */ '10')
.setLabel(_('Green X offset (between -50 and 50)'))
.setType('number')
);
glitchProperties.set(
'greenY',
new gd.PropertyDescriptor(/* defaultValue= */ '-4')
.setLabel(_('Green Y offset (between -50 and 50)'))
.setType('number')
);
glitchProperties.set(
'blueX',
new gd.PropertyDescriptor(/* defaultValue= */ '10')
.setLabel(_('Blue X offset (between -50 and 50)'))
.setType('number')
);
glitchProperties.set(
'blueY',
new gd.PropertyDescriptor(/* defaultValue= */ '-4')
.setLabel(_('Blue Y offset (between -50 and 50)'))
.setType('number')
);
const glowEffect = extension
.addEffect('Glow')
.setFullName(_('Glow'))
.setDescription(_('Add a glow effect around the rendered image.'))
.addIncludeFile('Extensions/Effects/pixi-filters/filter-glow.js')
.addIncludeFile('Extensions/Effects/glow-pixi-filter.js');
const glowProperties = glowEffect.getProperties();
glowProperties.set(
'innerStrength',
new gd.PropertyDescriptor(/* defaultValue= */ '1')
.setLabel(_('Inner strength (between 0 and 20)'))
.setType('number')
);
glowProperties.set(
'outerStrength',
new gd.PropertyDescriptor(/* defaultValue= */ '2')
.setLabel(_('Outer strength (between 0 and 20)'))
.setType('number')
);
glowProperties.set(
'distance',
new gd.PropertyDescriptor(/* defaultValue= */ '15')
.setLabel(_('Distance (between 10 and 20)'))
.setType('number')
);
glowProperties.set(
'color',
new gd.PropertyDescriptor(/* defaultValue= */ '#ffffff')
.setLabel(_('Color of the outline)'))
.setType('color')
);
const godrayEffect = extension
.addEffect('Godray')
.setFullName(_('Godray'))
.setDescription(_('Apply and animate atmospheric light rays.'))
.addIncludeFile('Extensions/Effects/pixi-filters/filter-godray.js')
.addIncludeFile('Extensions/Effects/godray-pixi-filter.js');
const godrayProperties = godrayEffect.getProperties();
godrayProperties.set(
'parallel',
new gd.PropertyDescriptor(/* defaultValue= */ 'true')
.setLabel(_('Parallel (parallel rays)'))
.setType('boolean')
);
godrayProperties.set(
'animationSpeed',
new gd.PropertyDescriptor(/* defaultValue= */ '1')
.setLabel(_('Animation Speed'))
.setType('number')
.setDescription(
_(
'0: Pause, 0.5: Half speed, 1: Normal speed, 2: Double speed, etc...'
)
)
);
godrayProperties.set(
'lacunarity',
new gd.PropertyDescriptor(/* defaultValue= */ '2.75')
.setLabel(_('Lacunarity (between 0 and 5)'))
.setType('number')
);
godrayProperties.set(
'angle',
new gd.PropertyDescriptor(/* defaultValue= */ '30')
.setLabel(_('Angle (between -60 and 60)'))
.setType('number')
);
godrayProperties.set(
'gain',
new gd.PropertyDescriptor(/* defaultValue= */ '0.6')
.setLabel(_('Gain (between 0 and 1)'))
.setType('number')
);
godrayProperties.set(
'light',
new gd.PropertyDescriptor(/* defaultValue= */ '30')
.setLabel(_('Light (between 0 and 60)'))
.setType('number')
);
godrayProperties.set(
'x',
new gd.PropertyDescriptor(/* defaultValue= */ '100')
.setLabel(_('Center X (between 100 and 1000)'))
.setType('number')
);
godrayProperties.set(
'y',
new gd.PropertyDescriptor(/* defaultValue= */ '100')
.setLabel(_('Center Y (between -1000 and 100)'))
.setType('number')
);
const kawaseBlurEffect = extension
.addEffect('KawaseBlur')
.setFullName(_('Kawase blur'))
.setDescription(
_('A much faster blur than Gaussian blur, but more complicated to use.')
)
.addIncludeFile('Extensions/Effects/pixi-filters/filter-kawase-blur.js')
.addIncludeFile('Extensions/Effects/kawase-blur-pixi-filter.js');
const kawaseBlurProperties = kawaseBlurEffect.getProperties();
kawaseBlurProperties.set(
'pixelizeX',
new gd.PropertyDescriptor(/* defaultValue= */ '1')
.setLabel(_('Pixelize X (between 0 and 10)'))
.setType('number')
);
kawaseBlurProperties.set(
'pixelizeY',
new gd.PropertyDescriptor(/* defaultValue= */ '1')
.setLabel(_('Pixelize Y (between 0 and 10)'))
.setType('number')
);
kawaseBlurProperties.set(
'blur',
new gd.PropertyDescriptor(/* defaultValue= */ '0.5')
.setLabel(_('Blur (between 0 and 20)'))
.setType('number')
);
kawaseBlurProperties.set(
'quality',
new gd.PropertyDescriptor(/* defaultValue= */ '3')
.setLabel(_('Quality (between 1 and 20)'))
.setType('number')
);
const lightNightEffect = extension
.addEffect('LightNight')
.setFullName(_('Light Night'))
.setDescription(_('Alter the colors to simulate night.'))
.addIncludeFile('Extensions/Effects/light-night-pixi-filter.js');
const lightNightProperties = lightNightEffect.getProperties();
lightNightProperties.set(
'opacity',
new gd.PropertyDescriptor(/* defaultValue= */ '1')
.setLabel(_('Opacity (between 0 and 1)'))
.setType('number')
);
const nightEffect = extension
.addEffect('Night')
.setFullName(_('Dark Night'))
.setDescription(_('Alter the colors to simulate a dark night.'))
.addIncludeFile('Extensions/Effects/night-pixi-filter.js');
const nightProperties = nightEffect.getProperties();
nightProperties.set(
'intensity',
new gd.PropertyDescriptor(/* defaultValue= */ '0.5')
.setLabel(_('Intensity (between 0 and 1)'))
.setType('number')
);
nightProperties.set(
'opacity',
new gd.PropertyDescriptor(/* defaultValue= */ '0.5')
.setLabel(_('Opacity (between 0 and 1)'))
.setType('number')
);
const noiseEffect = extension
.addEffect('Noise')
.setFullName(_('Noise'))
.setDescription(_('Add some noise on the rendered image.'))
.addIncludeFile('Extensions/Effects/noise-pixi-filter.js');
const noiseProperties = noiseEffect.getProperties();
noiseProperties.set(
'noise',
new gd.PropertyDescriptor(/* defaultValue= */ '0.5')
.setLabel(_('Noise intensity (between 0 and 1)'))
.setType('number')
);
const oldFilmEffect = extension
.addEffect('OldFilm')
.setFullName(_('Old Film'))
.setDescription(_('Add a Old film effect around the rendered image.'))
.addIncludeFile('Extensions/Effects/pixi-filters/filter-old-film.js')
.addIncludeFile('Extensions/Effects/old-film-pixi-filter.js');
const oldFilmProperties = oldFilmEffect.getProperties();
oldFilmProperties.set(
'sepia',
new gd.PropertyDescriptor(/* defaultValue= */ '0.3')
.setLabel(_('Sepia (between 0 and 1)'))
.setType('number')
.setDescription(
_(
'The amount of saturation of sepia effect, a value of 1 is more saturation and closer to 0 is less, and a value of 0 produces no sepia effect'
)
)
);
oldFilmProperties.set(
'noise',
new gd.PropertyDescriptor(/* defaultValue= */ '0.3')
.setLabel(_('Noise (between 0 and 1)'))
.setType('number')
.setDescription('Opacity/intensity of the noise effect')
);
oldFilmProperties.set(
'noiseSize',
new gd.PropertyDescriptor(/* defaultValue= */ '1')
.setLabel(_('Noise Size (between 0 and 10)'))
.setType('number')
.setDescription('The size of the noise particles')
);
oldFilmProperties.set(
'scratch',
new gd.PropertyDescriptor(/* defaultValue= */ '0.5')
.setLabel(_('Scratch (between -1 and 1)'))
.setType('number')
.setDescription('How often scratches appear')
);
oldFilmProperties.set(
'scratchDensity',
new gd.PropertyDescriptor(/* defaultValue= */ '0.3')
.setLabel(_('Scratch Density (between 0 and 1)'))
.setType('number')
.setDescription('The density of the number of scratches')
);
oldFilmProperties.set(
'scratchWidth',
new gd.PropertyDescriptor(/* defaultValue= */ '1.0')
.setLabel(_('Scratch Width (between 1 and 20)'))
.setType('number')
.setDescription('The width of the scratches')
);
oldFilmProperties.set(
'vignetting',
new gd.PropertyDescriptor(/* defaultValue= */ '0.3')
.setLabel(_('Vignetting (between 0 and 1)'))
.setType('number')
.setDescription('The radius of the vignette effect')
);
oldFilmProperties.set(
'vignettingAlpha',
new gd.PropertyDescriptor(/* defaultValue= */ '1.0')
.setLabel(_('Vignetting Alpha (between 0 and 1)'))
.setType('number')
);
oldFilmProperties.set(
'vignettingBlur',
new gd.PropertyDescriptor(/* defaultValue= */ '0.3')
.setLabel(_('Vignetting Blur (between 0 and 1)'))
.setType('number')
);
oldFilmProperties.set(
'animationFrequency',
new gd.PropertyDescriptor(/* defaultValue= */ '60')
.setLabel(_('Animation Frequency'))
.setType('number')
.setDescription('Number of updates per second (0: no updates)')
);
const outlineEffect = extension
.addEffect('Outline')
.setFullName(_('Outline'))
.setDescription(_('Draws an outline around the rendered image.'))
.addIncludeFile('Extensions/Effects/pixi-filters/filter-outline.js')
.addIncludeFile('Extensions/Effects/outline-pixi-filter.js');
const outlineProperties = outlineEffect.getProperties();
outlineProperties.set(
'thickness',
new gd.PropertyDescriptor(/* defaultValue= */ '2')
.setLabel(_('Thickness (between 0 and 20)'))
.setType('number')
);
outlineProperties.set(
'color',
new gd.PropertyDescriptor(/* defaultValue= */ '1')
.setLabel(_('Color of the outline'))
.setType('color')
);
const pixelateEffect = extension
.addEffect('Pixelate')
.setFullName(_('Pixelate'))
.setDescription(
_("Applies a pixelate effect, making display objects appear 'blocky'.")
)
.addIncludeFile('Extensions/Effects/pixelate-pixi-filter.js')
.addIncludeFile('Extensions/Effects/pixi-filters/filter-pixelate.js');
const pixelateProperties = pixelateEffect.getProperties();
pixelateProperties.set(
'size',
new gd.PropertyDescriptor(/* defaultValue= */ '10')
.setLabel(_('Size'))
.setType('number')
.setDescription(_('Size of the pixels (10 pixels by default)'))
);
const radialBlurEffect = extension
.addEffect('RadialBlur')
.setFullName(_('Radial Blur'))
.setDescription(_('Applies a Motion blur to an object.'))
.addIncludeFile('Extensions/Effects/pixi-filters/filter-radial-blur.js')
.addIncludeFile('Extensions/Effects/radial-blur-pixi-filter.js');
const radialBlurProperties = radialBlurEffect.getProperties();
radialBlurProperties.set(
'radius',
new gd.PropertyDescriptor(/* defaultValue= */ '-1')
.setLabel(_('Radius'))
.setType('number')
.setDescription(_('The maximum size of the blur radius, -1 is infinite'))
);
radialBlurProperties.set(
'angle',
new gd.PropertyDescriptor(/* defaultValue= */ '0')
.setLabel(_('Angle (between -180 and 180)'))
.setType('number')
.setDescription(_('The angle in degree of the motion for blur effect'))
);
radialBlurProperties.set(
'kernelSize',
new gd.PropertyDescriptor(/* defaultValue= */ '5')
.setLabel(_('Kernel Size (between 3 and 25)'))
.setType('number')
.setDescription(_('The kernel size of the blur filter (Odd number)'))
);
radialBlurProperties.set(
'centerX',
new gd.PropertyDescriptor(/* defaultValue= */ '0.5')
.setLabel(_('Center X (between 0 and 1, 0.5 is image middle)'))
.setType('number')
);
radialBlurProperties.set(
'centerY',
new gd.PropertyDescriptor(/* defaultValue= */ '0.5')
.setLabel(_('Center Y (between 0 and 1, 0.5 is image middle)'))
.setType('number')
);
const reflectionEffect = extension
.addEffect('Reflection')
.setFullName(_('Reflection'))
.setDescription(
_(
'Applies a reflection effect to simulate the reflection on water with waves.'
)
)
.addIncludeFile('Extensions/Effects/reflection-pixi-filter.js')
.addIncludeFile('Extensions/Effects/pixi-filters/filter-reflection.js');
const reflectionProperties = reflectionEffect.getProperties();
reflectionProperties.set(
'mirror',
new gd.PropertyDescriptor(/* defaultValue= */ 'true')
.setLabel(_('Reflect the image on the waves'))
.setType('boolean')
);
reflectionProperties.set(
'boundary',
new gd.PropertyDescriptor(/* defaultValue= */ '0.5')
.setLabel(_('Vertical position of the reflection point'))
.setType('number')
.setDescription(
_(
'Default is 50% (middle). Smaller numbers produce a larger reflection, larger numbers produce a smaller reflection.'
)
)
);
reflectionProperties.set(
'amplitudeStart',
new gd.PropertyDescriptor(/* defaultValue= */ '0')
.setLabel(_('Amplitude start'))
.setType('number')
.setDescription(_('Starting amplitude of waves (0 by default)'))
);
reflectionProperties.set(
'amplitudeEnding',
new gd.PropertyDescriptor(/* defaultValue= */ '20')
.setLabel(_('Amplitude ending'))
.setType('number')
.setDescription(_('Ending amplitude of waves (20 by default)'))
);
reflectionProperties.set(
'waveLengthStart',
new gd.PropertyDescriptor(/* defaultValue= */ '30')
.setLabel(_('Wave length start'))
.setType('number')
.setDescription(_('Starting wave length (30 by default)'))
);
reflectionProperties.set(
'waveLengthEnding',
new gd.PropertyDescriptor(/* defaultValue= */ '100')
.setLabel(_('Wave length ending'))
.setType('number')
.setDescription(_('Ending wave length (100 by default)'))
);
reflectionProperties.set(
'alphaStart',
new gd.PropertyDescriptor(/* defaultValue= */ '1')
.setLabel(_('Alpha start'))
.setType('number')
.setDescription(_('Starting alpha (1 by default)'))
);
reflectionProperties.set(
'alphaEnding',
new gd.PropertyDescriptor(/* defaultValue= */ '1')
.setLabel(_('Alpha ending'))
.setType('number')
.setDescription(_('Ending alpha (1 by default)'))
);
reflectionProperties.set(
'animationSpeed',
new gd.PropertyDescriptor(/* defaultValue= */ '1')
.setLabel(_('Animation Speed'))
.setType('number')
.setDescription(
_(
'0: Pause, 0.5: Half speed, 1: Normal speed, 2: Double speed, etc...'
)
)
);
const rgbSplitEffect = extension
.addEffect('RGBSplit')
.setFullName(_('RGB split (chromatic aberration)'))
.setDescription(
_('Applies a RGB split effect also known as chromatic aberration.')
)
.addIncludeFile('Extensions/Effects/pixi-filters/filter-rgb-split.js')
.addIncludeFile('Extensions/Effects/rgb-split-pixi-filter.js');
const rgbSplitProperties = rgbSplitEffect.getProperties();
rgbSplitProperties.set(
'redX',
new gd.PropertyDescriptor(/* defaultValue= */ '-10')
.setLabel(_('Red X offset (between -20 and 20)'))
.setType('number')
);
rgbSplitProperties.set(
'redY',
new gd.PropertyDescriptor(/* defaultValue= */ '1')
.setLabel(_('Red Y offset (between -20 and 20)'))
.setType('number')
);
rgbSplitProperties.set(
'greenX',
new gd.PropertyDescriptor(/* defaultValue= */ '0')
.setLabel(_('Green X offset (between -20 and 20)'))
.setType('number')
);
rgbSplitProperties.set(
'greenY',
new gd.PropertyDescriptor(/* defaultValue= */ '0')
.setLabel(_('Green Y offset (between -20 and 20)'))
.setType('number')
);
rgbSplitProperties.set(
'blueX',
new gd.PropertyDescriptor(/* defaultValue= */ '0')
.setLabel(_('Blue X offset (between -20 and 20)'))
.setType('number')
);
rgbSplitProperties.set(
'blueY',
new gd.PropertyDescriptor(/* defaultValue= */ '10')
.setLabel(_('Blue Y offset (between -20 and 20)'))
.setType('number')
);
const sepiaEffect = extension
.addEffect('Sepia')
.setFullName(_('Sepia'))
.setDescription(_('Alter the colors to sepia.'))
.addIncludeFile('Extensions/Effects/sepia-pixi-filter.js');
const sepiaProperties = sepiaEffect.getProperties();
sepiaProperties.set(
'opacity',
new gd.PropertyDescriptor(/* defaultValue= */ '1')
.setLabel(_('Opacity (between 0 and 1)'))
.setType('number')
);
const tiltShiftEffect = extension
.addEffect('TiltShift')
.setFullName(_('Tilt shift'))
.setDescription(_('Render a tilt-shift-like camera effect.'))
.addIncludeFile('Extensions/Effects/pixi-filters/filter-tilt-shift.js')
.addIncludeFile('Extensions/Effects/tilt-shift-pixi-filter.js');
const tiltShiftProperties = tiltShiftEffect.getProperties();
tiltShiftProperties.set(
'blur',
new gd.PropertyDescriptor(/* defaultValue= */ '30')
.setLabel(_('Blur (between 0 and 200)'))
.setType('number')
);
tiltShiftProperties.set(
'gradientBlur',
new gd.PropertyDescriptor(/* defaultValue= */ '1000')
.setLabel(_('Gradient blur (between 0 and 2000)'))
.setType('number')
);
const twistEffect = extension
.addEffect('Twist')
.setFullName(_('Twist'))
.setDescription(
_(
'Applies a twist effect making objects appear twisted in the given direction.'
)
)
.addIncludeFile('Extensions/Effects/pixi-filters/filter-twist.js')
.addIncludeFile('Extensions/Effects/twist-pixi-filter.js');
const twistProperties = twistEffect.getProperties();
twistProperties.set(
'radius',
new gd.PropertyDescriptor(/* defaultValue= */ '200')
.setLabel(_('Radius'))
.setType('number')
.setDescription(_('The radius of the twist'))
);
twistProperties.set(
'angle',
new gd.PropertyDescriptor(/* defaultValue= */ '4')
.setLabel(_('Angle (between -10 and 10)'))
.setType('number')
.setDescription(_('The angle in degree of the twist'))
);
twistProperties.set(
'padding',
new gd.PropertyDescriptor(/* defaultValue= */ '20')
.setLabel(_('Padding'))
.setType('number')
.setDescription(_('Padding for filter area'))
);
twistProperties.set(
'offsetX',
new gd.PropertyDescriptor(/* defaultValue= */ '0.5')
.setLabel(_('Offset X (between 0 and 1, 0.5 is image middle)'))
.setType('number')
);
twistProperties.set(
'offsetY',
new gd.PropertyDescriptor(/* defaultValue= */ '0.5')
.setLabel(_('Offset Y (between 0 and 1, 0.5 is image middle)'))
.setType('number')
);
const zoomBlurEffect = extension
.addEffect('ZoomBlur')
.setFullName(_('Zoom blur'))
.setDescription(_('Applies a Zoom blur.'))
.addIncludeFile('Extensions/Effects/pixi-filters/filter-zoom-blur.js')
.addIncludeFile('Extensions/Effects/zoom-blur-pixi-filter.js');
const zoomBlurProperties = zoomBlurEffect.getProperties();
zoomBlurProperties.set(
'centerX',
new gd.PropertyDescriptor(/* defaultValue= */ '0.5')
.setLabel(_('Center X (between 0 and 1, 0.5 is image middle)'))
.setType('number')
);
zoomBlurProperties.set(
'centerY',
new gd.PropertyDescriptor(/* defaultValue= */ '0.5')
.setLabel(_('Center Y (between 0 and 1, 0.5 is image middle)'))
.setType('number')
);
zoomBlurProperties.set(
'innerRadius',
new gd.PropertyDescriptor(/* defaultValue= */ '200')
.setLabel(_('Inner radius'))
.setType('number')
);
zoomBlurProperties.set(
'strength',
new gd.PropertyDescriptor(/* defaultValue= */ '0.3')
.setLabel(_('strength (between 0 and 5)'))
.setType('number')
);
return extension;
},
runExtensionSanityTests: function(gd, extension) {
return [];
},
};