From 4cc7f57b10027a51cd19edcb4bbc6f3b7a1b9e4f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Davy=20H=C3=A9lard?= Date: Sat, 2 Dec 2023 22:25:52 +0100 Subject: [PATCH 01/13] Add actions to tween effect properties --- .../Metadata/ExpressionMetadata.cpp | 19 +- .../Metadata/InstructionMetadata.cpp | 20 +- Core/GDCore/Extensions/PlatformExtension.h | 4 + Extensions/3D/AmbientLight.ts | 19 +- Extensions/3D/DirectionalLight.ts | 21 + Extensions/3D/ExponentialFog.ts | 17 + Extensions/3D/HemisphereLight.ts | 27 + Extensions/3D/LinearFog.ts | 19 + Extensions/Effects/adjustment-pixi-filter.ts | 36 + .../Effects/advanced-bloom-pixi-filter.ts | 30 + Extensions/Effects/ascii-pixi-filter.ts | 15 + Extensions/Effects/bevel-pixi-filter.ts | 43 ++ .../Effects/black-and-white-pixi-filter.ts | 15 + .../Effects/blending-mode-pixi-filter.ts | 18 + Extensions/Effects/blur-pixi-filter.ts | 11 + Extensions/Effects/brightness-pixi-filter.ts | 24 +- Extensions/Effects/bulge-pinch-pixi-filter.ts | 24 + Extensions/Effects/color-map-pixi-filter.ts | 15 + .../Effects/color-replace-pixi-filter.ts | 30 + Extensions/Effects/crt-pixi-filter.ts | 102 ++- .../Effects/displacement-pixi-filter.ts | 18 + Extensions/Effects/dot-pixi-filter.ts | 18 + Extensions/Effects/drop-shadow-pixi-filter.ts | 39 + Extensions/Effects/glitch-pixi-filter.ts | 109 ++- Extensions/Effects/glow-pixi-filter.ts | 43 +- Extensions/Effects/godray-pixi-filter.ts | 75 +- .../Effects/hsl-adjustment-pixi-filter.ts | 24 + Extensions/Effects/kawase-blur-pixi-filter.ts | 24 + Extensions/Effects/light-night-pixi-filter.ts | 23 +- Extensions/Effects/motion-blur-pixi-filter.ts | 34 +- Extensions/Effects/night-pixi-filter.ts | 11 + Extensions/Effects/noise-pixi-filter.ts | 20 +- Extensions/Effects/old-film-pixi-filter.ts | 90 ++- Extensions/Effects/outline-pixi-filter.ts | 27 + Extensions/Effects/pixelate-pixi-filter.ts | 16 + .../Effects/pixi-filters/types/crt/types.d.ts | 4 +- .../pixi-filters/types/glitch/types.d.ts | 9 +- Extensions/Effects/radial-blur-pixi-filter.ts | 46 +- Extensions/Effects/reflection-pixi-filter.ts | 90 ++- Extensions/Effects/rgb-split-pixi-filter.ts | 30 + Extensions/Effects/sepia-pixi-filter.ts | 24 +- Extensions/Effects/shockwave-pixi-filter.ts | 52 +- Extensions/Effects/tilt-shift-pixi-filter.ts | 18 + Extensions/Effects/twist-pixi-filter.ts | 43 +- Extensions/Effects/zoom-blur-pixi-filter.ts | 43 +- Extensions/ExampleJsExtension/dummyeffect.ts | 14 + Extensions/TweenBehavior/JsExtension.js | 180 +++-- Extensions/TweenBehavior/TweenManager.ts | 678 ++++++++++++++++++ .../standard-easing-functions.ts | 210 ------ .../TweenBehavior/tweenruntimebehavior.ts | 636 ++++------------ Extensions/TweenBehavior/tweentools.ts | 115 ++- GDJS/Runtime/RuntimeLayer.ts | 9 + .../pixi-renderers/pixi-filters-tools.ts | 47 +- .../EnumerateInstructions.js | 42 +- 54 files changed, 2431 insertions(+), 939 deletions(-) create mode 100644 Extensions/TweenBehavior/TweenManager.ts delete mode 100644 Extensions/TweenBehavior/standard-easing-functions.ts diff --git a/Core/GDCore/Extensions/Metadata/ExpressionMetadata.cpp b/Core/GDCore/Extensions/Metadata/ExpressionMetadata.cpp index 91efe21b841e..fc89aa872806 100644 --- a/Core/GDCore/Extensions/Metadata/ExpressionMetadata.cpp +++ b/Core/GDCore/Extensions/Metadata/ExpressionMetadata.cpp @@ -5,6 +5,7 @@ */ #include "ExpressionMetadata.h" #include "GDCore/CommonTools.h" +#include "GDCore/Extensions/PlatformExtension.h" #include "GDCore/String.h" namespace gd { @@ -46,16 +47,14 @@ gd::ExpressionMetadata& ExpressionMetadata::AddParameter( // For objects/behavior, the supplementary information // parameter is an object/behavior type... ((gd::ParameterMetadata::IsObject(type) || - gd::ParameterMetadata::IsBehavior(type)) - // Prefix with the namespace if it's not already there. - && !(supplementaryInformation.rfind(extensionNamespace, 0) == 0)) - ? (supplementaryInformation.empty() - ? "" - : extensionNamespace + - supplementaryInformation //... so prefix it with the extension - // namespace. - ) - : supplementaryInformation); // Otherwise don't change anything + gd::ParameterMetadata::IsBehavior(type)) + // Prefix with the namespace if it's not already there. + && (supplementaryInformation.find( + PlatformExtension::GetNamespaceSeparator()) != gd::String::npos) + ? supplementaryInformation + : (supplementaryInformation.empty() + ? "" + : extensionNamespace + supplementaryInformation))); // TODO: Assert against supplementaryInformation === "emsc" (when running with // Emscripten), and warn about a missing argument when calling addParameter. diff --git a/Core/GDCore/Extensions/Metadata/InstructionMetadata.cpp b/Core/GDCore/Extensions/Metadata/InstructionMetadata.cpp index 6b864b636b19..20862ebbefd7 100644 --- a/Core/GDCore/Extensions/Metadata/InstructionMetadata.cpp +++ b/Core/GDCore/Extensions/Metadata/InstructionMetadata.cpp @@ -8,6 +8,7 @@ #include #include "GDCore/CommonTools.h" +#include "GDCore/Extensions/PlatformExtension.h" #include "GDCore/Serialization/SerializerElement.h" #include "GDCore/Tools/Localization.h" #include "GDCore/Tools/Log.h" @@ -64,17 +65,14 @@ InstructionMetadata& InstructionMetadata::AddParameter( // For objects/behavior, the supplementary information // parameter is an object/behavior type... ((gd::ParameterMetadata::IsObject(type) || - gd::ParameterMetadata::IsBehavior(type)) - // Prefix with the namespace if it's not already there. - && !(supplementaryInformation.rfind(extensionNamespace, 0) == 0)) - ? (supplementaryInformation.empty() - ? "" - : extensionNamespace + - supplementaryInformation //... so prefix it with the - // extension - // namespace. - ) - : supplementaryInformation); // Otherwise don't change anything + gd::ParameterMetadata::IsBehavior(type)) + // Prefix with the namespace if it's not already there. + && (supplementaryInformation.find( + PlatformExtension::GetNamespaceSeparator()) != gd::String::npos) + ? supplementaryInformation + : (supplementaryInformation.empty() + ? "" + : extensionNamespace + supplementaryInformation))); // TODO: Assert against supplementaryInformation === "emsc" (when running with // Emscripten), and warn about a missing argument when calling addParameter. diff --git a/Core/GDCore/Extensions/PlatformExtension.h b/Core/GDCore/Extensions/PlatformExtension.h index 233c627f4a96..c56d0b8fe2a4 100644 --- a/Core/GDCore/Extensions/PlatformExtension.h +++ b/Core/GDCore/Extensions/PlatformExtension.h @@ -264,8 +264,11 @@ class GD_CORE_API PlatformExtension { * * \param name The name of the behavior * \param fullname The user friendly name of the behavior + * \param defaultName The default name of behavior instances * \param description The user friendly description of the behavior + * \param group The behavior category label * \param icon The icon of the behavior. + * \param className The name of the class implementing the behavior * \param instance An instance of the behavior that * will be used to create the behavior * \param sharedDatasInstance Optional @@ -288,6 +291,7 @@ class GD_CORE_API PlatformExtension { * \param name The name of the behavior * \param fullname The user friendly name of the behavior * \param description The user friendly description of the behavior + * \param group The behavior category label * \param icon The icon of the behavior. */ gd::BehaviorMetadata& AddEventsBasedBehavior( diff --git a/Extensions/3D/AmbientLight.ts b/Extensions/3D/AmbientLight.ts index f70cb41800cc..329cbee2d4a1 100644 --- a/Extensions/3D/AmbientLight.ts +++ b/Extensions/3D/AmbientLight.ts @@ -61,13 +61,30 @@ namespace gdjs { this.light.intensity = value; } } + getDoubleParameter(parameterName: string): number { + if (parameterName === 'intensity') { + return this.light.intensity; + } + return 0; + } updateStringParameter(parameterName: string, value: string): void { if (parameterName === 'color') { - this.light.color = new THREE.Color( + this.light.color.setHex( gdjs.PixiFiltersTools.rgbOrHexToHexNumber(value) ); } } + updateColorParameter(parameterName: string, value: number): void { + if (parameterName === 'color') { + this.light.color.setHex(value); + } + } + getColorParameter(parameterName: string): number { + if (parameterName === 'color') { + return this.light.color.getHex(); + } + return 0; + } updateBooleanParameter(parameterName: string, value: boolean): void {} })(); } diff --git a/Extensions/3D/DirectionalLight.ts b/Extensions/3D/DirectionalLight.ts index 1fc8ae025b10..5186f957784a 100644 --- a/Extensions/3D/DirectionalLight.ts +++ b/Extensions/3D/DirectionalLight.ts @@ -74,6 +74,16 @@ namespace gdjs { this.updateRotation(); } } + getDoubleParameter(parameterName: string): number { + if (parameterName === 'intensity') { + return this.light.intensity; + } else if (parameterName === 'elevation') { + return this.elevation; + } else if (parameterName === 'rotation') { + return this.rotation; + } + return 0; + } updateStringParameter(parameterName: string, value: string): void { if (parameterName === 'color') { this.light.color = new THREE.Color( @@ -85,6 +95,17 @@ namespace gdjs { this.updateRotation(); } } + updateColorParameter(parameterName: string, value: number): void { + if (parameterName === 'color') { + this.light.color.setHex(value); + } + } + getColorParameter(parameterName: string): number { + if (parameterName === 'color') { + return this.light.color.getHex(); + } + return 0; + } updateBooleanParameter(parameterName: string, value: boolean): void {} updateRotation() { if (this.top === 'Z+') { diff --git a/Extensions/3D/ExponentialFog.ts b/Extensions/3D/ExponentialFog.ts index 4045a00e6dd3..f4ca0a5d425a 100644 --- a/Extensions/3D/ExponentialFog.ts +++ b/Extensions/3D/ExponentialFog.ts @@ -58,6 +58,12 @@ namespace gdjs { this.fog.density = value; } } + getDoubleParameter(parameterName: string): number { + if (parameterName === 'density') { + return this.fog.density; + } + return 0; + } updateStringParameter(parameterName: string, value: string): void { if (parameterName === 'color') { this.fog.color = new THREE.Color( @@ -65,6 +71,17 @@ namespace gdjs { ); } } + updateColorParameter(parameterName: string, value: number): void { + if (parameterName === 'color') { + this.fog.color.setHex(value); + } + } + getColorParameter(parameterName: string): number { + if (parameterName === 'color') { + return this.fog.color.getHex(); + } + return 0; + } updateBooleanParameter(parameterName: string, value: boolean): void {} })(); } diff --git a/Extensions/3D/HemisphereLight.ts b/Extensions/3D/HemisphereLight.ts index 16b47fb05a63..321141f07c80 100644 --- a/Extensions/3D/HemisphereLight.ts +++ b/Extensions/3D/HemisphereLight.ts @@ -74,6 +74,16 @@ namespace gdjs { this.updateRotation(); } } + getDoubleParameter(parameterName: string): number { + if (parameterName === 'intensity') { + return this.light.intensity; + } else if (parameterName === 'elevation') { + return this.elevation; + } else if (parameterName === 'rotation') { + return this.rotation; + } + return 0; + } updateStringParameter(parameterName: string, value: string): void { if (parameterName === 'skyColor') { this.light.color = new THREE.Color( @@ -90,6 +100,23 @@ namespace gdjs { this.updateRotation(); } } + updateColorParameter(parameterName: string, value: number): void { + if (parameterName === 'skyColor') { + this.light.color.setHex(value); + } + if (parameterName === 'groundColor') { + this.light.groundColor.setHex(value); + } + } + getColorParameter(parameterName: string): number { + if (parameterName === 'skyColor') { + return this.light.color.getHex(); + } + if (parameterName === 'groundColor') { + return this.light.groundColor.getHex(); + } + return 0; + } updateBooleanParameter(parameterName: string, value: boolean): void {} updateRotation() { if (this.top === 'Z+') { diff --git a/Extensions/3D/LinearFog.ts b/Extensions/3D/LinearFog.ts index 09825405e1eb..c2b9a92d3d9f 100644 --- a/Extensions/3D/LinearFog.ts +++ b/Extensions/3D/LinearFog.ts @@ -60,6 +60,14 @@ namespace gdjs { this.fog.far = value; } } + getDoubleParameter(parameterName: string): number { + if (parameterName === 'near') { + return this.fog.near; + } else if (parameterName === 'far') { + return this.fog.far; + } + return 0; + } updateStringParameter(parameterName: string, value: string): void { if (parameterName === 'color') { this.fog.color = new THREE.Color( @@ -67,6 +75,17 @@ namespace gdjs { ); } } + updateColorParameter(parameterName: string, value: number): void { + if (parameterName === 'color') { + this.fog.color.setHex(value); + } + } + getColorParameter(parameterName: string): number { + if (parameterName === 'color') { + return this.fog.color.getHex(); + } + return 0; + } updateBooleanParameter(parameterName: string, value: boolean): void {} })(); } diff --git a/Extensions/Effects/adjustment-pixi-filter.ts b/Extensions/Effects/adjustment-pixi-filter.ts index 9e7276d02f75..a784c012414f 100644 --- a/Extensions/Effects/adjustment-pixi-filter.ts +++ b/Extensions/Effects/adjustment-pixi-filter.ts @@ -31,11 +31,47 @@ namespace gdjs { adjustmentFilter.alpha = value; } } + getDoubleParameter(filter: PIXI.Filter, parameterName: string): number { + const adjustmentFilter = (filter as unknown) as PIXI.filters.AdjustmentFilter; + if (parameterName === 'gamma') { + return adjustmentFilter.gamma; + } + if (parameterName === 'saturation') { + return adjustmentFilter.saturation; + } + if (parameterName === 'contrast') { + return adjustmentFilter.contrast; + } + if (parameterName === 'brightness') { + return adjustmentFilter.brightness; + } + if (parameterName === 'red') { + return adjustmentFilter.red; + } + if (parameterName === 'green') { + return adjustmentFilter.green; + } + if (parameterName === 'blue') { + return adjustmentFilter.blue; + } + if (parameterName === 'alpha') { + return adjustmentFilter.alpha; + } + return 0; + } updateStringParameter( filter: PIXI.Filter, parameterName: string, value: string ) {} + updateColorParameter( + filter: PIXI.Filter, + parameterName: string, + value: number + ): void {} + getColorParameter(filter: PIXI.Filter, parameterName: string): number { + return 0; + } updateBooleanParameter( filter: PIXI.Filter, parameterName: string, diff --git a/Extensions/Effects/advanced-bloom-pixi-filter.ts b/Extensions/Effects/advanced-bloom-pixi-filter.ts index dc33f77cb0ef..aef261d2ef9e 100644 --- a/Extensions/Effects/advanced-bloom-pixi-filter.ts +++ b/Extensions/Effects/advanced-bloom-pixi-filter.ts @@ -27,11 +27,41 @@ namespace gdjs { advancedBloomFilter.padding = value; } } + getDoubleParameter(filter: PIXI.Filter, parameterName: string): number { + const advancedBloomFilter = (filter as unknown) as PIXI.filters.AdvancedBloomFilter; + if (parameterName === 'threshold') { + return advancedBloomFilter.threshold; + } + if (parameterName === 'bloomScale') { + return advancedBloomFilter.bloomScale; + } + if (parameterName === 'brightness') { + return advancedBloomFilter.brightness; + } + if (parameterName === 'blur') { + return advancedBloomFilter.blur; + } + if (parameterName === 'quality') { + return advancedBloomFilter.quality; + } + if (parameterName === 'padding') { + return advancedBloomFilter.padding; + } + return 0; + } updateStringParameter( filter: PIXI.Filter, parameterName: string, value: string ) {} + updateColorParameter( + filter: PIXI.Filter, + parameterName: string, + value: number + ): void {} + getColorParameter(filter: PIXI.Filter, parameterName: string): number { + return 0; + } updateBooleanParameter( filter: PIXI.Filter, parameterName: string, diff --git a/Extensions/Effects/ascii-pixi-filter.ts b/Extensions/Effects/ascii-pixi-filter.ts index 1313cafd06c7..d92fe1ae66f6 100644 --- a/Extensions/Effects/ascii-pixi-filter.ts +++ b/Extensions/Effects/ascii-pixi-filter.ts @@ -17,11 +17,26 @@ namespace gdjs { asciiFilter.size = value; } } + getDoubleParameter(filter: PIXI.Filter, parameterName: string): number { + const asciiFilter = (filter as unknown) as PIXI.filters.AsciiFilter; + if (parameterName === 'size') { + return asciiFilter.size; + } + return 0; + } updateStringParameter( filter: PIXI.Filter, parameterName: string, value: string ) {} + updateColorParameter( + filter: PIXI.Filter, + parameterName: string, + value: number + ): void {} + getColorParameter(filter: PIXI.Filter, parameterName: string): number { + return 0; + } updateBooleanParameter( filter: PIXI.Filter, parameterName: string, diff --git a/Extensions/Effects/bevel-pixi-filter.ts b/Extensions/Effects/bevel-pixi-filter.ts index 05f4fb791045..40d37a2e0c25 100644 --- a/Extensions/Effects/bevel-pixi-filter.ts +++ b/Extensions/Effects/bevel-pixi-filter.ts @@ -26,6 +26,26 @@ namespace gdjs { bevelFilter.shadowAlpha = value; } } + getDoubleParameter(filter: PIXI.Filter, parameterName: string): number { + const bevelFilter = (filter as unknown) as PIXI.filters.BevelFilter; + if (parameterName === 'rotation') { + return bevelFilter.rotation; + } + if (parameterName === 'thickness') { + return bevelFilter.thickness; + } + if (parameterName === 'distance') { + // @ts-ignore + return bevelFilter.distance; + } + if (parameterName === 'lightAlpha') { + return bevelFilter.lightAlpha; + } + if (parameterName === 'shadowAlpha') { + return bevelFilter.shadowAlpha; + } + return 0; + } updateStringParameter( filter: PIXI.Filter, parameterName: string, @@ -43,6 +63,29 @@ namespace gdjs { ); } } + updateColorParameter( + filter: PIXI.Filter, + parameterName: string, + value: number + ): void { + const bevelFilter = (filter as unknown) as PIXI.filters.BevelFilter; + if (parameterName === 'lightColor') { + bevelFilter.lightColor = value; + } + if (parameterName === 'shadowColor') { + bevelFilter.shadowColor = value; + } + } + getColorParameter(filter: PIXI.Filter, parameterName: string): number { + const bevelFilter = (filter as unknown) as PIXI.filters.BevelFilter; + if (parameterName === 'lightColor') { + return bevelFilter.lightColor; + } + if (parameterName === 'shadowColor') { + return bevelFilter.shadowColor; + } + return 0; + } updateBooleanParameter( filter: PIXI.Filter, parameterName: string, diff --git a/Extensions/Effects/black-and-white-pixi-filter.ts b/Extensions/Effects/black-and-white-pixi-filter.ts index 9318d8898d52..31df8c588a01 100644 --- a/Extensions/Effects/black-and-white-pixi-filter.ts +++ b/Extensions/Effects/black-and-white-pixi-filter.ts @@ -19,11 +19,26 @@ namespace gdjs { } colorMatrix.alpha = gdjs.PixiFiltersTools.clampValue(value, 0, 1); } + getDoubleParameter(filter: PIXI.Filter, parameterName: string): number { + const colorMatrix = (filter as unknown) as PIXI.ColorMatrixFilter; + if (parameterName === 'opacity') { + return colorMatrix.alpha; + } + return 0; + } updateStringParameter( filter: PIXI.Filter, parameterName: string, value: string ) {} + updateColorParameter( + filter: PIXI.Filter, + parameterName: string, + value: number + ): void {} + getColorParameter(filter: PIXI.Filter, parameterName: string): number { + return 0; + } updateBooleanParameter( filter: PIXI.Filter, parameterName: string, diff --git a/Extensions/Effects/blending-mode-pixi-filter.ts b/Extensions/Effects/blending-mode-pixi-filter.ts index 79356461556b..128384db3b1f 100644 --- a/Extensions/Effects/blending-mode-pixi-filter.ts +++ b/Extensions/Effects/blending-mode-pixi-filter.ts @@ -19,11 +19,29 @@ namespace gdjs { blendingModeFilter.blendMode = value; } } + getDoubleParameter(filter: PIXI.Filter, parameterName: string): number { + const blendingModeFilter = (filter as unknown) as PIXI.AlphaFilter; + if (parameterName === 'alpha') { + return blendingModeFilter.alpha; + } + if (parameterName === 'blendmode') { + return blendingModeFilter.blendMode; + } + return 0; + } updateStringParameter( filter: PIXI.Filter, parameterName: string, value: string ) {} + updateColorParameter( + filter: PIXI.Filter, + parameterName: string, + value: number + ): void {} + getColorParameter(filter: PIXI.Filter, parameterName: string): number { + return 0; + } updateBooleanParameter( filter: PIXI.Filter, parameterName: string, diff --git a/Extensions/Effects/blur-pixi-filter.ts b/Extensions/Effects/blur-pixi-filter.ts index 24d1af3b229b..259477ddb3aa 100644 --- a/Extensions/Effects/blur-pixi-filter.ts +++ b/Extensions/Effects/blur-pixi-filter.ts @@ -25,11 +25,22 @@ namespace gdjs { } filter[parameterName] = value; } + getDoubleParameter(filter: PIXI.Filter, parameterName: string): number { + return filter[parameterName] || 0; + } updateStringParameter( filter: PIXI.Filter, parameterName: string, value: string ) {} + updateColorParameter( + filter: PIXI.Filter, + parameterName: string, + value: number + ): void {} + getColorParameter(filter: PIXI.Filter, parameterName: string): number { + return 0; + } updateBooleanParameter( filter: PIXI.Filter, parameterName: string, diff --git a/Extensions/Effects/brightness-pixi-filter.ts b/Extensions/Effects/brightness-pixi-filter.ts index c20b94320ff3..5e8239cf6dbf 100644 --- a/Extensions/Effects/brightness-pixi-filter.ts +++ b/Extensions/Effects/brightness-pixi-filter.ts @@ -17,16 +17,32 @@ namespace gdjs { if (parameterName !== 'brightness') { return; } - brightnessFilter.brightness( - gdjs.PixiFiltersTools.clampValue(value, 0, 1), - false - ); + const brightness = gdjs.PixiFiltersTools.clampValue(value, 0, 1); + //@ts-ignore + brightnessFilter.__brightness = brightness; + brightnessFilter.brightness(brightness, false); + } + getDoubleParameter(filter: PIXI.Filter, parameterName: string): number { + const brightnessFilter = (filter as unknown) as PIXI.ColorMatrixFilter; + if (parameterName === 'brightness') { + //@ts-ignore + return brightnessFilter.__brightness; + } + return 0; } updateStringParameter( filter: PIXI.Filter, parameterName: string, value: string ) {} + updateColorParameter( + filter: PIXI.Filter, + parameterName: string, + value: number + ): void {} + getColorParameter(filter: PIXI.Filter, parameterName: string): number { + return 0; + } updateBooleanParameter( filter: PIXI.Filter, parameterName: string, diff --git a/Extensions/Effects/bulge-pinch-pixi-filter.ts b/Extensions/Effects/bulge-pinch-pixi-filter.ts index 00c23fea3617..ac5a529a692c 100644 --- a/Extensions/Effects/bulge-pinch-pixi-filter.ts +++ b/Extensions/Effects/bulge-pinch-pixi-filter.ts @@ -27,11 +27,35 @@ namespace gdjs { ); } } + getDoubleParameter(filter: PIXI.Filter, parameterName: string): number { + const bulgePinchFilter = (filter as unknown) as PIXI.filters.BulgePinchFilter; + if (parameterName === 'centerX') { + return bulgePinchFilter.center[0]; + } + if (parameterName === 'centerY') { + return bulgePinchFilter.center[1]; + } + if (parameterName === 'radius') { + return bulgePinchFilter.radius; + } + if (parameterName === 'strength') { + return bulgePinchFilter.strength; + } + return 0; + } updateStringParameter( filter: PIXI.Filter, parameterName: string, value: string ) {} + updateColorParameter( + filter: PIXI.Filter, + parameterName: string, + value: number + ): void {} + getColorParameter(filter: PIXI.Filter, parameterName: string): number { + return 0; + } updateBooleanParameter( filter: PIXI.Filter, parameterName: string, diff --git a/Extensions/Effects/color-map-pixi-filter.ts b/Extensions/Effects/color-map-pixi-filter.ts index 1795a3ee520b..15008496809f 100644 --- a/Extensions/Effects/color-map-pixi-filter.ts +++ b/Extensions/Effects/color-map-pixi-filter.ts @@ -34,11 +34,26 @@ namespace gdjs { ); } } + getDoubleParameter(filter: PIXI.Filter, parameterName: string): number { + const colorMapFilter = (filter as unknown) as PIXI.filters.ColorMapFilter; + if (parameterName === 'mix') { + return colorMapFilter.mix; + } + return 0; + } updateStringParameter( filter: PIXI.Filter, parameterName: string, value: string ) {} + updateColorParameter( + filter: PIXI.Filter, + parameterName: string, + value: number + ): void {} + getColorParameter(filter: PIXI.Filter, parameterName: string): number { + return 0; + } updateBooleanParameter( filter: PIXI.Filter, parameterName: string, diff --git a/Extensions/Effects/color-replace-pixi-filter.ts b/Extensions/Effects/color-replace-pixi-filter.ts index 4d1a5c093a99..555f143435b9 100644 --- a/Extensions/Effects/color-replace-pixi-filter.ts +++ b/Extensions/Effects/color-replace-pixi-filter.ts @@ -17,6 +17,13 @@ namespace gdjs { colorReplaceFilter.epsilon = value; } } + getDoubleParameter(filter: PIXI.Filter, parameterName: string): number { + const colorReplaceFilter = (filter as unknown) as PIXI.filters.ColorReplaceFilter; + if (parameterName === 'epsilon') { + return colorReplaceFilter.epsilon; + } + return 0; + } updateStringParameter( filter: PIXI.Filter, parameterName: string, @@ -33,6 +40,29 @@ namespace gdjs { ); } } + updateColorParameter( + filter: PIXI.Filter, + parameterName: string, + value: number + ): void { + const colorReplaceFilter = (filter as unknown) as PIXI.filters.ColorReplaceFilter; + if (parameterName === 'originalColor') { + colorReplaceFilter.originalColor = value; + } else if (parameterName === 'newColor') { + colorReplaceFilter.newColor = value; + } + } + getColorParameter(filter: PIXI.Filter, parameterName: string): number { + const colorReplaceFilter = (filter as unknown) as PIXI.filters.ColorReplaceFilter; + if (parameterName === 'originalColor') { + //@ts-ignore + return colorReplaceFilter.originalColor; + } else if (parameterName === 'newColor') { + //@ts-ignore + return colorReplaceFilter.newColor; + } + return 0; + } updateBooleanParameter( filter: PIXI.Filter, parameterName: string, diff --git a/Extensions/Effects/crt-pixi-filter.ts b/Extensions/Effects/crt-pixi-filter.ts index 53194a821311..96fa781dbb57 100644 --- a/Extensions/Effects/crt-pixi-filter.ts +++ b/Extensions/Effects/crt-pixi-filter.ts @@ -1,25 +1,32 @@ -// @ts-nocheck - TODO: fix typings in this file - namespace gdjs { + interface CRTFilterExtra { + _animationTimer: number; + animationSpeed: number; + animationFrequency: number; + } gdjs.PixiFiltersTools.registerFilterCreator( 'CRT', new (class extends gdjs.PixiFiltersTools.PixiFilterCreator { makePIXIFilter(layer, effectData) { - const crtFilter = new PIXI.filters.CRTFilter(); + const filter = new PIXI.filters.CRTFilter(); + const crtFilter = (filter as unknown) as PIXI.filters.CRTFilter & + CRTFilterExtra; crtFilter._animationTimer = 0; return crtFilter; } updatePreRender(filter: PIXI.Filter, target: EffectsTarget) { - if (filter.animationSpeed !== 0) { + const crtFilter = (filter as unknown) as PIXI.filters.CRTFilter & + CRTFilterExtra; + if (crtFilter.animationSpeed !== 0) { // Multiply by 10 so that the default value is a sensible speed - filter.time += - (target.getElapsedTime() / 1000) * 10 * filter.animationSpeed; + crtFilter.time += + (target.getElapsedTime() / 1000) * 10 * crtFilter.animationSpeed; } - if (filter.animationFrequency !== 0) { - filter._animationTimer += target.getElapsedTime() / 1000; - if (filter._animationTimer >= 1 / filter.animationFrequency) { - filter.seed = Math.random(); - filter._animationTimer = 0; + if (crtFilter.animationFrequency !== 0) { + crtFilter._animationTimer += target.getElapsedTime() / 1000; + if (crtFilter._animationTimer >= 1 / crtFilter.animationFrequency) { + crtFilter.seed = Math.random(); + crtFilter._animationTimer = 0; } } } @@ -28,42 +35,91 @@ namespace gdjs { parameterName: string, value: number ) { + const crtFilter = (filter as unknown) as PIXI.filters.CRTFilter & + CRTFilterExtra; if (parameterName === 'lineWidth') { - filter.lineWidth = value; + crtFilter.lineWidth = value; } else if (parameterName === 'lineContrast') { - filter.lineContrast = value; + crtFilter.lineContrast = value; } else if (parameterName === 'noise') { - filter.noise = value; + crtFilter.noise = value; } else if (parameterName === 'curvature') { - filter.curvature = value; + crtFilter.curvature = value; } else if (parameterName === 'noiseSize') { - filter.noiseSize = value; + crtFilter.noiseSize = value; } else if (parameterName === 'vignetting') { - filter.vignetting = value; + crtFilter.vignetting = value; } else if (parameterName === 'vignettingAlpha') { - filter.vignettingAlpha = value; + crtFilter.vignettingAlpha = value; } else if (parameterName === 'vignettingBlur') { - filter.vignettingBlur = value; + crtFilter.vignettingBlur = value; } else if (parameterName === 'animationSpeed') { - filter.animationSpeed = value; + crtFilter.animationSpeed = value; } else if (parameterName === 'animationFrequency') { - filter.animationFrequency = value; + crtFilter.animationFrequency = value; } else if (parameterName === 'padding') { - filter.padding = value; + crtFilter.padding = value; } } + getDoubleParameter(filter: PIXI.Filter, parameterName: string): number { + const crtFilter = (filter as unknown) as PIXI.filters.CRTFilter & + CRTFilterExtra; + if (parameterName === 'lineWidth') { + return crtFilter.lineWidth; + } + if (parameterName === 'lineContrast') { + return crtFilter.lineContrast; + } + if (parameterName === 'noise') { + return crtFilter.noise; + } + if (parameterName === 'curvature') { + return crtFilter.curvature; + } + if (parameterName === 'noiseSize') { + return crtFilter.noiseSize; + } + if (parameterName === 'vignetting') { + return crtFilter.vignetting; + } + if (parameterName === 'vignettingAlpha') { + return crtFilter.vignettingAlpha; + } + if (parameterName === 'vignettingBlur') { + return crtFilter.vignettingBlur; + } + if (parameterName === 'animationSpeed') { + return crtFilter.animationSpeed; + } + if (parameterName === 'animationFrequency') { + return crtFilter.animationFrequency; + } + if (parameterName === 'padding') { + return crtFilter.padding; + } + return 0; + } updateStringParameter( filter: PIXI.Filter, parameterName: string, value: string ) {} + updateColorParameter( + filter: PIXI.Filter, + parameterName: string, + value: number + ): void {} + getColorParameter(filter: PIXI.Filter, parameterName: string): number { + return 0; + } updateBooleanParameter( filter: PIXI.Filter, parameterName: string, value: boolean ) { + const crtFilter = (filter as unknown) as PIXI.filters.CRTFilter; if (parameterName === 'verticalLine') { - filter.verticalLine = value; + crtFilter.verticalLine = value; } } })() diff --git a/Extensions/Effects/displacement-pixi-filter.ts b/Extensions/Effects/displacement-pixi-filter.ts index ebdff8955e6f..7134d4900e7c 100644 --- a/Extensions/Effects/displacement-pixi-filter.ts +++ b/Extensions/Effects/displacement-pixi-filter.ts @@ -29,11 +29,29 @@ namespace gdjs { displacementFilter.scale.y = value; } } + getDoubleParameter(filter: PIXI.Filter, parameterName: string): number { + const displacementFilter = (filter as unknown) as PIXI.DisplacementFilter; + if (parameterName === 'scaleX') { + return displacementFilter.scale.x; + } + if (parameterName === 'scaleY') { + return displacementFilter.scale.y; + } + return 0; + } updateStringParameter( filter: PIXI.Filter, parameterName: string, value: string ) {} + updateColorParameter( + filter: PIXI.Filter, + parameterName: string, + value: number + ): void {} + getColorParameter(filter: PIXI.Filter, parameterName: string): number { + return 0; + } updateBooleanParameter( filter: PIXI.Filter, parameterName: string, diff --git a/Extensions/Effects/dot-pixi-filter.ts b/Extensions/Effects/dot-pixi-filter.ts index 85f6ef27bdfd..1438ecf0a5e9 100644 --- a/Extensions/Effects/dot-pixi-filter.ts +++ b/Extensions/Effects/dot-pixi-filter.ts @@ -19,11 +19,29 @@ namespace gdjs { dotFilter.angle = value; } } + getDoubleParameter(filter: PIXI.Filter, parameterName: string): number { + const dotFilter = (filter as unknown) as PIXI.filters.DotFilter; + if (parameterName === 'scale') { + return dotFilter.scale; + } + if (parameterName === 'angle') { + return dotFilter.angle; + } + return 0; + } updateStringParameter( filter: PIXI.Filter, parameterName: string, value: string ) {} + updateColorParameter( + filter: PIXI.Filter, + parameterName: string, + value: number + ): void {} + getColorParameter(filter: PIXI.Filter, parameterName: string): number { + return 0; + } updateBooleanParameter( filter: PIXI.Filter, parameterName: string, diff --git a/Extensions/Effects/drop-shadow-pixi-filter.ts b/Extensions/Effects/drop-shadow-pixi-filter.ts index 75b010af85be..a68629852c30 100644 --- a/Extensions/Effects/drop-shadow-pixi-filter.ts +++ b/Extensions/Effects/drop-shadow-pixi-filter.ts @@ -27,6 +27,28 @@ namespace gdjs { dropShadowFilter.padding = value; } } + getDoubleParameter(filter: PIXI.Filter, parameterName: string): number { + const dropShadowFilter = (filter as unknown) as PIXI.filters.DropShadowFilter; + if (parameterName === 'blur') { + return dropShadowFilter.blur; + } + if (parameterName === 'quality') { + return dropShadowFilter.quality; + } + if (parameterName === 'alpha') { + return dropShadowFilter.alpha; + } + if (parameterName === 'distance') { + return dropShadowFilter.distance; + } + if (parameterName === 'rotation') { + return dropShadowFilter.rotation; + } + if (parameterName === 'padding') { + return dropShadowFilter.padding; + } + return 0; + } updateStringParameter( filter: PIXI.Filter, parameterName: string, @@ -39,6 +61,23 @@ namespace gdjs { ); } } + updateColorParameter( + filter: PIXI.Filter, + parameterName: string, + value: number + ): void { + const dropShadowFilter = (filter as unknown) as PIXI.filters.DropShadowFilter; + if (parameterName === 'color') { + dropShadowFilter.color = value; + } + } + getColorParameter(filter: PIXI.Filter, parameterName: string): number { + const dropShadowFilter = (filter as unknown) as PIXI.filters.DropShadowFilter; + if (parameterName === 'color') { + return dropShadowFilter.color; + } + return 0; + } updateBooleanParameter( filter: PIXI.Filter, parameterName: string, diff --git a/Extensions/Effects/glitch-pixi-filter.ts b/Extensions/Effects/glitch-pixi-filter.ts index 3a784438a7d5..09269af5e1f5 100644 --- a/Extensions/Effects/glitch-pixi-filter.ts +++ b/Extensions/Effects/glitch-pixi-filter.ts @@ -1,20 +1,29 @@ -// @ts-nocheck - TODO: fix typings in this file - namespace gdjs { + interface GlitchFilterExtra { + _animationTimer: number; + animationFrequency: number; + } gdjs.PixiFiltersTools.registerFilterCreator( 'Glitch', new (class extends gdjs.PixiFiltersTools.PixiFilterCreator { makePIXIFilter(layer, effectData) { - const glitchFilter = new PIXI.filters.GlitchFilter(); + const filter = new PIXI.filters.GlitchFilter(); + const glitchFilter = (filter as unknown) as PIXI.filters.GlitchFilter & + GlitchFilterExtra; glitchFilter._animationTimer = 0; return glitchFilter; } updatePreRender(filter: PIXI.Filter, target: EffectsTarget) { - if (filter.animationFrequency !== 0) { - filter._animationTimer += target.getElapsedTime() / 1000; - if (filter._animationTimer >= 1 / filter.animationFrequency) { - filter.seed = Math.random(); - filter._animationTimer = 0; + const glitchFilter = (filter as unknown) as PIXI.filters.GlitchFilter & + GlitchFilterExtra; + if (glitchFilter.animationFrequency !== 0) { + glitchFilter._animationTimer += target.getElapsedTime() / 1000; + if ( + glitchFilter._animationTimer >= + 1 / glitchFilter.animationFrequency + ) { + glitchFilter.seed = Math.random(); + glitchFilter._animationTimer = 0; } } } @@ -23,46 +32,102 @@ namespace gdjs { parameterName: string, value: number ) { + const glitchFilter = (filter as unknown) as PIXI.filters.GlitchFilter & + GlitchFilterExtra; if (parameterName === 'slices') { - filter.slices = value; + glitchFilter.slices = value; } else if (parameterName === 'offset') { - filter.offset = value; + glitchFilter.offset = value; } else if (parameterName === 'direction') { - filter.direction = value; + glitchFilter.direction = value; } else if (parameterName === 'fillMode') { - filter.fillMode = value; + glitchFilter.fillMode = value; } else if (parameterName === 'minSize') { - filter.minSize = value; + glitchFilter.minSize = value; } else if (parameterName === 'sampleSize') { - filter.sampleSize = value; + glitchFilter.sampleSize = value; } else if (parameterName === 'redX') { - filter.red.x = value; + glitchFilter.red.x = value; } else if (parameterName === 'redY') { - filter.red.y = value; + glitchFilter.red.y = value; } else if (parameterName === 'greenX') { - filter.green.x = value; + glitchFilter.green.x = value; } else if (parameterName === 'greenY') { - filter.green.y = value; + glitchFilter.green.y = value; } else if (parameterName === 'blueX') { - filter.blue.x = value; + glitchFilter.blue.x = value; } else if (parameterName === 'blueY') { - filter.blue.y = value; + glitchFilter.blue.y = value; } else if (parameterName === 'animationFrequency') { - filter.animationFrequency = value; + glitchFilter.animationFrequency = value; } } + getDoubleParameter(filter: PIXI.Filter, parameterName: string): number { + const glitchFilter = (filter as unknown) as PIXI.filters.GlitchFilter & + GlitchFilterExtra; + if (parameterName === 'slices') { + return glitchFilter.slices; + } + if (parameterName === 'offset') { + return glitchFilter.offset; + } + if (parameterName === 'direction') { + return glitchFilter.direction; + } + if (parameterName === 'fillMode') { + return glitchFilter.fillMode; + } + if (parameterName === 'minSize') { + return glitchFilter.minSize; + } + if (parameterName === 'sampleSize') { + return glitchFilter.sampleSize; + } + if (parameterName === 'redX') { + return glitchFilter.red.x; + } + if (parameterName === 'redY') { + return glitchFilter.red.y; + } + if (parameterName === 'greenX') { + return glitchFilter.green.x; + } + if (parameterName === 'greenY') { + return glitchFilter.green.y; + } + if (parameterName === 'blueX') { + return glitchFilter.blue.x; + } + if (parameterName === 'blueY') { + return glitchFilter.blue.y; + } + if (parameterName === 'animationFrequency') { + return glitchFilter.animationFrequency; + } + return 0; + } updateStringParameter( filter: PIXI.Filter, parameterName: string, value: string ) {} + updateColorParameter( + filter: PIXI.Filter, + parameterName: string, + value: number + ): void {} + getColorParameter(filter: PIXI.Filter, parameterName: string): number { + return 0; + } updateBooleanParameter( filter: PIXI.Filter, parameterName: string, value: boolean ) { + const glitchFilter = (filter as unknown) as PIXI.filters.GlitchFilter & + GlitchFilterExtra; if (parameterName === 'average') { - filter.average = value; + glitchFilter.average = value; } } })() diff --git a/Extensions/Effects/glow-pixi-filter.ts b/Extensions/Effects/glow-pixi-filter.ts index c978cc560992..a57eb3e641e8 100644 --- a/Extensions/Effects/glow-pixi-filter.ts +++ b/Extensions/Effects/glow-pixi-filter.ts @@ -1,4 +1,7 @@ namespace gdjs { + interface GlowFilterExtra { + distance: number; + } gdjs.PixiFiltersTools.registerFilterCreator( 'Glow', new (class extends gdjs.PixiFiltersTools.PixiFilterCreator { @@ -12,26 +15,60 @@ namespace gdjs { parameterName: string, value: number ) { - const glowFilter = (filter as unknown) as PIXI.filters.GlowFilter; + const glowFilter = (filter as unknown) as PIXI.filters.GlowFilter & + GlowFilterExtra; if (parameterName === 'innerStrength') { glowFilter.innerStrength = value; } else if (parameterName === 'outerStrength') { glowFilter.outerStrength = value; } else if (parameterName === 'distance') { - // @ts-ignore glowFilter.distance = value; } } + getDoubleParameter(filter: PIXI.Filter, parameterName: string): number { + const glowFilter = (filter as unknown) as PIXI.filters.GlowFilter & + GlowFilterExtra; + if (parameterName === 'innerStrength') { + return glowFilter.innerStrength; + } + if (parameterName === 'outerStrength') { + return glowFilter.outerStrength; + } + if (parameterName === 'distance') { + return glowFilter.distance; + } + return 0; + } updateStringParameter( filter: PIXI.Filter, parameterName: string, value: string ) { - const glowFilter = (filter as unknown) as PIXI.filters.GlowFilter; + const glowFilter = (filter as unknown) as PIXI.filters.GlowFilter & + GlowFilterExtra; if (parameterName === 'color') { glowFilter.color = gdjs.PixiFiltersTools.rgbOrHexToHexNumber(value); } } + updateColorParameter( + filter: PIXI.Filter, + parameterName: string, + value: number + ): void { + const glowFilter = (filter as unknown) as PIXI.filters.GlowFilter & + GlowFilterExtra; + if (parameterName === 'color') { + glowFilter.color = value; + } + } + getColorParameter(filter: PIXI.Filter, parameterName: string): number { + const glowFilter = (filter as unknown) as PIXI.filters.GlowFilter & + GlowFilterExtra; + if (parameterName === 'color') { + return glowFilter.color; + } + return 0; + } updateBooleanParameter( filter: PIXI.Filter, parameterName: string, diff --git a/Extensions/Effects/godray-pixi-filter.ts b/Extensions/Effects/godray-pixi-filter.ts index 97f639d27f2c..95bf54e34fe0 100644 --- a/Extensions/Effects/godray-pixi-filter.ts +++ b/Extensions/Effects/godray-pixi-filter.ts @@ -1,6 +1,10 @@ -// @ts-nocheck - TODO: fix typings in this file - namespace gdjs { + interface GodrayFilterExtra { + animationSpeed: number; + light: number; + x: number; + y: number; + } gdjs.PixiFiltersTools.registerFilterCreator( 'Godray', new (class extends gdjs.PixiFiltersTools.PixiFilterCreator { @@ -9,9 +13,11 @@ namespace gdjs { return godrayFilter; } updatePreRender(filter: PIXI.Filter, target: EffectsTarget) { - if (filter.animationSpeed !== 0) { - filter.time += - (target.getElapsedTime() / 1000) * filter.animationSpeed; + const godrayFilter = (filter as unknown) as PIXI.filters.GodrayFilter & + GodrayFilterExtra; + if (godrayFilter.animationSpeed !== 0) { + godrayFilter.time += + (target.getElapsedTime() / 1000) * godrayFilter.animationSpeed; } } updateDoubleParameter( @@ -19,36 +25,77 @@ namespace gdjs { parameterName: string, value: number ) { + const godrayFilter = (filter as unknown) as PIXI.filters.GodrayFilter & + GodrayFilterExtra; if (parameterName === 'lacunarity') { - filter.lacunarity = value; + godrayFilter.lacunarity = value; } else if (parameterName === 'angle') { - filter.angle = value; + godrayFilter.angle = value; } else if (parameterName === 'gain') { - filter.gain = value; + godrayFilter.gain = value; } else if (parameterName === 'light') { - filter.light = value; + godrayFilter.light = value; } else if (parameterName === 'x') { - filter.x = value; + godrayFilter.x = value; } else if (parameterName === 'y') { - filter.y = value; + godrayFilter.y = value; } else if (parameterName === 'animationSpeed') { - filter.animationSpeed = value; + godrayFilter.animationSpeed = value; } else if (parameterName === 'padding') { - filter.padding = value; + godrayFilter.padding = value; } } + getDoubleParameter(filter: PIXI.Filter, parameterName: string): number { + const godrayFilter = (filter as unknown) as PIXI.filters.GodrayFilter & + GodrayFilterExtra; + if (parameterName === 'lacunarity') { + return godrayFilter.lacunarity; + } + if (parameterName === 'angle') { + return godrayFilter.angle; + } + if (parameterName === 'gain') { + return godrayFilter.gain; + } + if (parameterName === 'light') { + return godrayFilter.light; + } + if (parameterName === 'x') { + return godrayFilter.x; + } + if (parameterName === 'y') { + return godrayFilter.y; + } + if (parameterName === 'animationSpeed') { + return godrayFilter.animationSpeed; + } + if (parameterName === 'padding') { + return godrayFilter.padding; + } + return 0; + } updateStringParameter( filter: PIXI.Filter, parameterName: string, value: string ) {} + updateColorParameter( + filter: PIXI.Filter, + parameterName: string, + value: number + ): void {} + getColorParameter(filter: PIXI.Filter, parameterName: string): number { + return 0; + } updateBooleanParameter( filter: PIXI.Filter, parameterName: string, value: boolean ) { + const godrayFilter = (filter as unknown) as PIXI.filters.GodrayFilter & + GodrayFilterExtra; if (parameterName === 'parallel') { - filter.parallel = value; + godrayFilter.parallel = value; } } })() diff --git a/Extensions/Effects/hsl-adjustment-pixi-filter.ts b/Extensions/Effects/hsl-adjustment-pixi-filter.ts index ac3b68b129ef..5d4858ab07d6 100644 --- a/Extensions/Effects/hsl-adjustment-pixi-filter.ts +++ b/Extensions/Effects/hsl-adjustment-pixi-filter.ts @@ -23,11 +23,35 @@ namespace gdjs { hslAdjustmentFilter.alpha = value; } } + getDoubleParameter(filter: PIXI.Filter, parameterName: string): number { + const hslAdjustmentFilter = filter as PIXI.filters.HslAdjustmentFilter; + if (parameterName === 'hue') { + return hslAdjustmentFilter.hue; + } + if (parameterName === 'saturation') { + return hslAdjustmentFilter.saturation; + } + if (parameterName === 'lightness') { + return hslAdjustmentFilter.lightness; + } + if (parameterName === 'alpha') { + return hslAdjustmentFilter.alpha; + } + return 0; + } updateStringParameter( filter: PIXI.Filter, parameterName: string, value: string ) {} + updateColorParameter( + filter: PIXI.Filter, + parameterName: string, + value: number + ): void {} + getColorParameter(filter: PIXI.Filter, parameterName: string): number { + return 0; + } updateBooleanParameter( filter: PIXI.Filter, parameterName: string, diff --git a/Extensions/Effects/kawase-blur-pixi-filter.ts b/Extensions/Effects/kawase-blur-pixi-filter.ts index 71bfd1a41563..6b6012245586 100644 --- a/Extensions/Effects/kawase-blur-pixi-filter.ts +++ b/Extensions/Effects/kawase-blur-pixi-filter.ts @@ -23,11 +23,35 @@ namespace gdjs { kawaseBlurFilter.quality = value; } } + getDoubleParameter(filter: PIXI.Filter, parameterName: string): number { + const kawaseBlurFilter = (filter as unknown) as PIXI.filters.KawaseBlurFilter; + if (parameterName === 'pixelizeX') { + return kawaseBlurFilter.pixelSize[0]; + } + if (parameterName === 'pixelizeY') { + return kawaseBlurFilter.pixelSize[1]; + } + if (parameterName === 'blur') { + return kawaseBlurFilter.blur; + } + if (parameterName === 'quality') { + return kawaseBlurFilter.quality; + } + return 0; + } updateStringParameter( filter: PIXI.Filter, parameterName: string, value: string ) {} + updateColorParameter( + filter: PIXI.Filter, + parameterName: string, + value: number + ): void {} + getColorParameter(filter: PIXI.Filter, parameterName: string): number { + return 0; + } updateBooleanParameter( filter: PIXI.Filter, parameterName: string, diff --git a/Extensions/Effects/light-night-pixi-filter.ts b/Extensions/Effects/light-night-pixi-filter.ts index 12ab607c7745..94f97a3bd6bc 100644 --- a/Extensions/Effects/light-night-pixi-filter.ts +++ b/Extensions/Effects/light-night-pixi-filter.ts @@ -34,16 +34,33 @@ namespace gdjs { parameterName: string, value: number ) { - if (parameterName !== 'opacity') { - return; + if (parameterName === 'opacity') { + filter.uniforms.opacity = gdjs.PixiFiltersTools.clampValue( + value, + 0, + 1 + ); } - filter.uniforms.opacity = gdjs.PixiFiltersTools.clampValue(value, 0, 1); + } + getDoubleParameter(filter: PIXI.Filter, parameterName: string): number { + if (parameterName === 'opacity') { + return filter.uniforms.opacity; + } + return 0; } updateStringParameter( filter: PIXI.Filter, parameterName: string, value: string ) {} + updateColorParameter( + filter: PIXI.Filter, + parameterName: string, + value: number + ): void {} + getColorParameter(filter: PIXI.Filter, parameterName: string): number { + return 0; + } updateBooleanParameter( filter: PIXI.Filter, parameterName: string, diff --git a/Extensions/Effects/motion-blur-pixi-filter.ts b/Extensions/Effects/motion-blur-pixi-filter.ts index a79fd08fb3da..c7369c0be268 100644 --- a/Extensions/Effects/motion-blur-pixi-filter.ts +++ b/Extensions/Effects/motion-blur-pixi-filter.ts @@ -1,4 +1,8 @@ namespace gdjs { + interface MotionBlurFilterExtra { + /**Use the private member avoids to instantiate Arrays.*/ + _velocity: PIXI.Point; + } gdjs.PixiFiltersTools.registerFilterCreator( 'MotionBlur', new (class extends gdjs.PixiFiltersTools.PixiFilterCreator { @@ -12,12 +16,11 @@ namespace gdjs { parameterName: string, value: number ) { - const motionBlurFilter = filter as PIXI.filters.MotionBlurFilter; + const motionBlurFilter = filter as PIXI.filters.MotionBlurFilter & + MotionBlurFilterExtra; if (parameterName === 'velocityX') { - // @ts-ignore Using the private member avoids to instantiate Arrays. motionBlurFilter._velocity.x = value; } else if (parameterName === 'velocityY') { - // @ts-ignore Using the private member avoids to instantiate Arrays. motionBlurFilter._velocity.y = value; } else if (parameterName === 'kernelSize') { motionBlurFilter.kernelSize = value; @@ -25,11 +28,36 @@ namespace gdjs { motionBlurFilter.offset = value; } } + getDoubleParameter(filter: PIXI.Filter, parameterName: string): number { + const motionBlurFilter = filter as PIXI.filters.MotionBlurFilter & + MotionBlurFilterExtra; + if (parameterName === 'velocityX') { + return motionBlurFilter._velocity.x; + } + if (parameterName === 'velocityY') { + return motionBlurFilter._velocity.y; + } + if (parameterName === 'kernelSize') { + return motionBlurFilter.kernelSize; + } + if (parameterName === 'offset') { + return motionBlurFilter.offset; + } + return 0; + } updateStringParameter( filter: PIXI.Filter, parameterName: string, value: string ) {} + updateColorParameter( + filter: PIXI.Filter, + parameterName: string, + value: number + ): void {} + getColorParameter(filter: PIXI.Filter, parameterName: string): number { + return 0; + } updateBooleanParameter( filter: PIXI.Filter, parameterName: string, diff --git a/Extensions/Effects/night-pixi-filter.ts b/Extensions/Effects/night-pixi-filter.ts index d64bf2278f87..ba736b769a1b 100644 --- a/Extensions/Effects/night-pixi-filter.ts +++ b/Extensions/Effects/night-pixi-filter.ts @@ -47,11 +47,22 @@ namespace gdjs { 1 ); } + getDoubleParameter(filter: PIXI.Filter, parameterName: string): number { + return filter.uniforms[parameterName] || 0; + } updateStringParameter( filter: PIXI.Filter, parameterName: string, value: string ) {} + updateColorParameter( + filter: PIXI.Filter, + parameterName: string, + value: number + ): void {} + getColorParameter(filter: PIXI.Filter, parameterName: string): number { + return 0; + } updateBooleanParameter( filter: PIXI.Filter, parameterName: string, diff --git a/Extensions/Effects/noise-pixi-filter.ts b/Extensions/Effects/noise-pixi-filter.ts index 99303a665737..d8b14b697113 100644 --- a/Extensions/Effects/noise-pixi-filter.ts +++ b/Extensions/Effects/noise-pixi-filter.ts @@ -13,16 +13,30 @@ namespace gdjs { value: number ) { const noiseFilter = (filter as unknown) as PIXI.NoiseFilter; - if (parameterName !== 'noise') { - return; + if (parameterName === 'noise') { + noiseFilter.noise = gdjs.PixiFiltersTools.clampValue(value, 0, 1); } - noiseFilter.noise = gdjs.PixiFiltersTools.clampValue(value, 0, 1); + } + getDoubleParameter(filter: PIXI.Filter, parameterName: string): number { + const noiseFilter = (filter as unknown) as PIXI.NoiseFilter; + if (parameterName === 'noise') { + return noiseFilter.noise; + } + return 0; } updateStringParameter( filter: PIXI.Filter, parameterName: string, value: string ) {} + updateColorParameter( + filter: PIXI.Filter, + parameterName: string, + value: number + ): void {} + getColorParameter(filter: PIXI.Filter, parameterName: string): number { + return 0; + } updateBooleanParameter( filter: PIXI.Filter, parameterName: string, diff --git a/Extensions/Effects/old-film-pixi-filter.ts b/Extensions/Effects/old-film-pixi-filter.ts index 23c7061f0faa..67e309ff056b 100644 --- a/Extensions/Effects/old-film-pixi-filter.ts +++ b/Extensions/Effects/old-film-pixi-filter.ts @@ -1,20 +1,29 @@ -// @ts-nocheck - TODO: fix typings in this file - namespace gdjs { + interface OldFilmFilterExtra { + _animationTimer: number; + animationFrequency: number; + } gdjs.PixiFiltersTools.registerFilterCreator( 'OldFilm', new (class extends gdjs.PixiFiltersTools.PixiFilterCreator { makePIXIFilter(layer, effectData) { - const oldFilmFilter = new PIXI.filters.OldFilmFilter(); + const filter = new PIXI.filters.OldFilmFilter(); + const oldFilmFilter = (filter as unknown) as PIXI.filters.OldFilmFilter & + OldFilmFilterExtra; oldFilmFilter._animationTimer = 0; return oldFilmFilter; } updatePreRender(filter: PIXI.Filter, target: EffectsTarget) { - if (filter.animationFrequency !== 0) { - filter._animationTimer += target.getElapsedTime() / 1000; - if (filter._animationTimer >= 1 / filter.animationFrequency) { - filter.seed = Math.random(); - filter._animationTimer = 0; + const oldFilmFilter = (filter as unknown) as PIXI.filters.OldFilmFilter & + OldFilmFilterExtra; + if (oldFilmFilter.animationFrequency !== 0) { + oldFilmFilter._animationTimer += target.getElapsedTime() / 1000; + if ( + oldFilmFilter._animationTimer >= + 1 / oldFilmFilter.animationFrequency + ) { + oldFilmFilter.seed = Math.random(); + oldFilmFilter._animationTimer = 0; } } } @@ -23,33 +32,78 @@ namespace gdjs { parameterName: string, value: number ) { + const oldFilmFilter = (filter as unknown) as PIXI.filters.OldFilmFilter & + OldFilmFilterExtra; if (parameterName === 'sepia') { - filter.sepia = value; + oldFilmFilter.sepia = value; } else if (parameterName === 'noise') { - filter.noise = value; + oldFilmFilter.noise = value; } else if (parameterName === 'noiseSize') { - filter.noiseSize = value; + oldFilmFilter.noiseSize = value; } else if (parameterName === 'scratch') { - filter.scratch = value; + oldFilmFilter.scratch = value; } else if (parameterName === 'scratchDensity') { - filter.scratchDensity = value; + oldFilmFilter.scratchDensity = value; } else if (parameterName === 'scratchWidth') { - filter.scratchWidth = value; + oldFilmFilter.scratchWidth = value; } else if (parameterName === 'vignetting') { - filter.vignetting = value; + oldFilmFilter.vignetting = value; } else if (parameterName === 'vignettingAlpha') { - filter.vignettingAlpha = value; + oldFilmFilter.vignettingAlpha = value; } else if (parameterName === 'vignettingBlur') { - filter.vignettingBlur = value; + oldFilmFilter.vignettingBlur = value; } else if (parameterName === 'animationFrequency') { - filter.animationFrequency = value; + oldFilmFilter.animationFrequency = value; } } + getDoubleParameter(filter: PIXI.Filter, parameterName: string): number { + const oldFilmFilter = (filter as unknown) as PIXI.filters.OldFilmFilter & + OldFilmFilterExtra; + if (parameterName === 'sepia') { + return oldFilmFilter.sepia; + } + if (parameterName === 'noise') { + return oldFilmFilter.noise; + } + if (parameterName === 'noiseSize') { + return oldFilmFilter.noiseSize; + } + if (parameterName === 'scratch') { + return oldFilmFilter.scratch; + } + if (parameterName === 'scratchDensity') { + return oldFilmFilter.scratchDensity; + } + if (parameterName === 'scratchWidth') { + return oldFilmFilter.scratchWidth; + } + if (parameterName === 'vignetting') { + return oldFilmFilter.vignetting; + } + if (parameterName === 'vignettingAlpha') { + return oldFilmFilter.vignettingAlpha; + } + if (parameterName === 'vignettingBlur') { + return oldFilmFilter.vignettingBlur; + } + if (parameterName === 'animationFrequency') { + return oldFilmFilter.animationFrequency; + } + return 0; + } updateStringParameter( filter: PIXI.Filter, parameterName: string, value: string ) {} + updateColorParameter( + filter: PIXI.Filter, + parameterName: string, + value: number + ): void {} + getColorParameter(filter: PIXI.Filter, parameterName: string): number { + return 0; + } updateBooleanParameter( filter: PIXI.Filter, parameterName: string, diff --git a/Extensions/Effects/outline-pixi-filter.ts b/Extensions/Effects/outline-pixi-filter.ts index 6957f8aa62e1..9b04ffa5fee7 100644 --- a/Extensions/Effects/outline-pixi-filter.ts +++ b/Extensions/Effects/outline-pixi-filter.ts @@ -19,6 +19,16 @@ namespace gdjs { outlineFilter.padding = value; } } + getDoubleParameter(filter: PIXI.Filter, parameterName: string): number { + const outlineFilter = (filter as unknown) as PIXI.filters.OutlineFilter; + if (parameterName === 'thickness') { + return outlineFilter.thickness; + } + if (parameterName === 'padding') { + return outlineFilter.padding; + } + return 0; + } updateStringParameter( filter: PIXI.Filter, parameterName: string, @@ -31,6 +41,23 @@ namespace gdjs { ); } } + updateColorParameter( + filter: PIXI.Filter, + parameterName: string, + value: number + ): void { + const outlineFilter = (filter as unknown) as PIXI.filters.OutlineFilter; + if (parameterName === 'color') { + outlineFilter.color = value; + } + } + getColorParameter(filter: PIXI.Filter, parameterName: string): number { + const outlineFilter = (filter as unknown) as PIXI.filters.OutlineFilter; + if (parameterName === 'color') { + return outlineFilter.color; + } + return 0; + } updateBooleanParameter( filter: PIXI.Filter, parameterName: string, diff --git a/Extensions/Effects/pixelate-pixi-filter.ts b/Extensions/Effects/pixelate-pixi-filter.ts index 4d4cffc651d4..fd81ae60b50b 100644 --- a/Extensions/Effects/pixelate-pixi-filter.ts +++ b/Extensions/Effects/pixelate-pixi-filter.ts @@ -19,11 +19,27 @@ namespace gdjs { pixelateFilter.size = value; } } + getDoubleParameter(filter: PIXI.Filter, parameterName: string): number { + const pixelateFilter = (filter as unknown) as PIXI.filters.PixelateFilter; + if (parameterName === 'size') { + //@ts-ignore + return pixelateFilter.size; + } + return 0; + } updateStringParameter( filter: PIXI.Filter, parameterName: string, value: string ) {} + updateColorParameter( + filter: PIXI.Filter, + parameterName: string, + value: number + ): void {} + getColorParameter(filter: PIXI.Filter, parameterName: string): number { + return 0; + } updateBooleanParameter( filter: PIXI.Filter, parameterName: string, diff --git a/Extensions/Effects/pixi-filters/types/crt/types.d.ts b/Extensions/Effects/pixi-filters/types/crt/types.d.ts index ab4e9ad35bfa..0620af2f2195 100644 --- a/Extensions/Effects/pixi-filters/types/crt/types.d.ts +++ b/Extensions/Effects/pixi-filters/types/crt/types.d.ts @@ -4,7 +4,7 @@ declare namespace PIXI.filters { curvature: number; lineWidth: number; lineContrast: number; - verticalLine: number; + verticalLine: boolean; noise: number; noiseSize: number; seed: number; @@ -17,7 +17,7 @@ declare namespace PIXI.filters { curvature?: number; lineWidth?: number; lineContrast?: number; - verticalLine?: number; + verticalLine?: boolean; noise?: number; noiseSize?: number; seed?: number; diff --git a/Extensions/Effects/pixi-filters/types/glitch/types.d.ts b/Extensions/Effects/pixi-filters/types/glitch/types.d.ts index 7fbe4b3c612c..c13896d9372f 100644 --- a/Extensions/Effects/pixi-filters/types/glitch/types.d.ts +++ b/Extensions/Effects/pixi-filters/types/glitch/types.d.ts @@ -6,6 +6,9 @@ declare namespace PIXI.filters { direction: number; fillMode: number; seed: number; + average: boolean; + minSize: number; + sampleSize: number; red: PIXI.Point; green: PIXI.Point; blue: PIXI.Point; @@ -21,13 +24,13 @@ declare namespace PIXI.filters { offset: number; direction: number; fillMode: number; - average: boolean; seed: number; + average: boolean; + minSize: number; + sampleSize: number; red: PIXI.Point; green: PIXI.Point; blue: PIXI.Point; - minSize: number; - sampleSize: number; } } diff --git a/Extensions/Effects/radial-blur-pixi-filter.ts b/Extensions/Effects/radial-blur-pixi-filter.ts index dfa02f6ead50..3d2ec2034b46 100644 --- a/Extensions/Effects/radial-blur-pixi-filter.ts +++ b/Extensions/Effects/radial-blur-pixi-filter.ts @@ -1,4 +1,9 @@ namespace gdjs { + interface RadialBlurFilterExtra { + // @ts-ignore - extra properties are stored on the filter. + _centerX: number; + _centerY: number; + } gdjs.PixiFiltersTools.registerFilterCreator( 'RadialBlur', new (class extends gdjs.PixiFiltersTools.PixiFilterCreator { @@ -7,13 +12,12 @@ namespace gdjs { return radialBlurFilter; } updatePreRender(filter: PIXI.Filter, target: EffectsTarget) { - const radialBlurFilter = (filter as unknown) as PIXI.filters.RadialBlurFilter; + const radialBlurFilter = (filter as unknown) as PIXI.filters.RadialBlurFilter & + RadialBlurFilterExtra; radialBlurFilter.center[0] = Math.round( - // @ts-ignore - extra properties are stored on the filter. radialBlurFilter._centerX * target.getWidth() ); radialBlurFilter.center[1] = Math.round( - // @ts-ignore - extra properties are stored on the filter. radialBlurFilter._centerY * target.getHeight() ); } @@ -22,7 +26,8 @@ namespace gdjs { parameterName: string, value: number ) { - const radialBlurFilter = (filter as unknown) as PIXI.filters.RadialBlurFilter; + const radialBlurFilter = (filter as unknown) as PIXI.filters.RadialBlurFilter & + RadialBlurFilterExtra; if (parameterName === 'radius') { radialBlurFilter.radius = value < 0 ? -1 : value; } else if (parameterName === 'angle') { @@ -34,20 +39,49 @@ namespace gdjs { 25 ); } else if (parameterName === 'centerX') { - // @ts-ignore - extra properties are stored on the filter. radialBlurFilter._centerX = value; } else if (parameterName === 'centerY') { - // @ts-ignore - extra properties are stored on the filter. radialBlurFilter._centerY = value; } else if (parameterName === 'padding') { radialBlurFilter.padding = value; } } + getDoubleParameter(filter: PIXI.Filter, parameterName: string): number { + const radialBlurFilter = (filter as unknown) as PIXI.filters.RadialBlurFilter & + RadialBlurFilterExtra; + if (parameterName === 'radius') { + radialBlurFilter.radius; + } + if (parameterName === 'angle') { + radialBlurFilter.angle; + } + if (parameterName === 'kernelSize') { + radialBlurFilter.kernelSize; + } + if (parameterName === 'centerX') { + radialBlurFilter._centerX; + } + if (parameterName === 'centerY') { + radialBlurFilter._centerY; + } + if (parameterName === 'padding') { + radialBlurFilter.padding; + } + return 0; + } updateStringParameter( filter: PIXI.Filter, parameterName: string, value: string ) {} + updateColorParameter( + filter: PIXI.Filter, + parameterName: string, + value: number + ): void {} + getColorParameter(filter: PIXI.Filter, parameterName: string): number { + return 0; + } updateBooleanParameter( filter: PIXI.Filter, parameterName: string, diff --git a/Extensions/Effects/reflection-pixi-filter.ts b/Extensions/Effects/reflection-pixi-filter.ts index 3dbf9c7b44a0..31f0f7a9f974 100644 --- a/Extensions/Effects/reflection-pixi-filter.ts +++ b/Extensions/Effects/reflection-pixi-filter.ts @@ -1,34 +1,39 @@ -// @ts-nocheck - TODO: fix typings in this file - namespace gdjs { + interface ReflectionFilterExtra { + _animationTimer: number; + animationSpeed: number; + animationFrequency: number; + } gdjs.PixiFiltersTools.registerFilterCreator( 'Reflection', new (class extends gdjs.PixiFiltersTools.PixiFilterCreator { makePIXIFilter(layer, effectData) { let time = 0; - const reflectionFilter = new PIXI.filters.ReflectionFilter( - effectData.booleanParameters.mirror, - effectData.doubleParameters.boundary, - [ + const reflectionFilter = new PIXI.filters.ReflectionFilter({ + mirror: effectData.booleanParameters.mirror, + boundary: effectData.doubleParameters.boundary, + amplitude: [ effectData.doubleParameters.amplitudeStart, effectData.doubleParameters.amplitudeEnding, ], - [ + waveLength: [ effectData.doubleParameters.waveLengthStart, effectData.doubleParameters.waveLengthEnding, ], - [ + alpha: [ effectData.doubleParameters.alphaStart, effectData.doubleParameters.alphaEnding, ], - time - ); + time, + }); return reflectionFilter; } updatePreRender(filter: PIXI.Filter, target: EffectsTarget) { - if (filter.animationSpeed !== 0) { - filter.time += - (target.getElapsedTime() / 1000) * filter.animationSpeed; + const reflectionFilter = (filter as unknown) as PIXI.filters.ReflectionFilter & + ReflectionFilterExtra; + if (reflectionFilter.animationSpeed !== 0) { + reflectionFilter.time += + (target.getElapsedTime() / 1000) * reflectionFilter.animationSpeed; } } updateDoubleParameter( @@ -36,43 +41,84 @@ namespace gdjs { parameterName: string, value: number ) { + const reflectionFilter = (filter as unknown) as PIXI.filters.ReflectionFilter & + ReflectionFilterExtra; if (parameterName === 'boundary') { - filter.boundary = value; + reflectionFilter.boundary = value; } if (parameterName === 'amplitudeStart') { - filter.amplitude[0] = value; + reflectionFilter.amplitude[0] = value; } if (parameterName === 'amplitudeEnding') { - filter.amplitude[1] = value; + reflectionFilter.amplitude[1] = value; } if (parameterName === 'waveLengthStart') { - filter.waveLength[0] = value; + reflectionFilter.waveLength[0] = value; } if (parameterName === 'waveLengthEnding') { - filter.waveLength[1] = value; + reflectionFilter.waveLength[1] = value; } if (parameterName === 'alphaStart') { - filter.alpha[0] = value; + reflectionFilter.alpha[0] = value; } if (parameterName === 'alphaEnding') { - filter.alpha[1] = value; + reflectionFilter.alpha[1] = value; } if (parameterName === 'animationSpeed') { - filter.animationSpeed = value; + reflectionFilter.animationSpeed = value; } } + getDoubleParameter(filter: PIXI.Filter, parameterName: string): number { + const reflectionFilter = (filter as unknown) as PIXI.filters.ReflectionFilter & + ReflectionFilterExtra; + if (parameterName === 'boundary') { + return reflectionFilter.boundary; + } + if (parameterName === 'amplitudeStart') { + return reflectionFilter.amplitude[0]; + } + if (parameterName === 'amplitudeEnding') { + return reflectionFilter.amplitude[1]; + } + if (parameterName === 'waveLengthStart') { + return reflectionFilter.waveLength[0]; + } + if (parameterName === 'waveLengthEnding') { + return reflectionFilter.waveLength[1]; + } + if (parameterName === 'alphaStart') { + return reflectionFilter.alpha[0]; + } + if (parameterName === 'alphaEnding') { + return reflectionFilter.alpha[1]; + } + if (parameterName === 'animationSpeed') { + return reflectionFilter.animationSpeed; + } + return 0; + } updateStringParameter( filter: PIXI.Filter, parameterName: string, value: string ) {} + updateColorParameter( + filter: PIXI.Filter, + parameterName: string, + value: number + ): void {} + getColorParameter(filter: PIXI.Filter, parameterName: string): number { + return 0; + } updateBooleanParameter( filter: PIXI.Filter, parameterName: string, value: boolean ) { + const reflectionFilter = (filter as unknown) as PIXI.filters.ReflectionFilter & + ReflectionFilterExtra; if (parameterName === 'mirror') { - filter.mirror = value; + reflectionFilter.mirror = value; } } })() diff --git a/Extensions/Effects/rgb-split-pixi-filter.ts b/Extensions/Effects/rgb-split-pixi-filter.ts index 774536c19b22..254548b0592c 100644 --- a/Extensions/Effects/rgb-split-pixi-filter.ts +++ b/Extensions/Effects/rgb-split-pixi-filter.ts @@ -27,11 +27,41 @@ namespace gdjs { rgbSplitFilter.blue.y = value; } } + getDoubleParameter(filter: PIXI.Filter, parameterName: string): number { + const rgbSplitFilter = (filter as unknown) as PIXI.filters.RGBSplitFilter; + if (parameterName === 'redX') { + return rgbSplitFilter.red.x; + } + if (parameterName === 'redY') { + return rgbSplitFilter.red.y; + } + if (parameterName === 'greenX') { + return rgbSplitFilter.green.x; + } + if (parameterName === 'greenY') { + return rgbSplitFilter.green.y; + } + if (parameterName === 'blueX') { + return rgbSplitFilter.blue.x; + } + if (parameterName === 'blueY') { + return rgbSplitFilter.blue.y; + } + return 0; + } updateStringParameter( filter: PIXI.Filter, parameterName: string, value: string ) {} + updateColorParameter( + filter: PIXI.Filter, + parameterName: string, + value: number + ): void {} + getColorParameter(filter: PIXI.Filter, parameterName: string): number { + return 0; + } updateBooleanParameter( filter: PIXI.Filter, parameterName: string, diff --git a/Extensions/Effects/sepia-pixi-filter.ts b/Extensions/Effects/sepia-pixi-filter.ts index 2d8a05e9e0e2..84e373219206 100644 --- a/Extensions/Effects/sepia-pixi-filter.ts +++ b/Extensions/Effects/sepia-pixi-filter.ts @@ -14,16 +14,34 @@ namespace gdjs { value: number ) { const colorMatrixFilter = (filter as unknown) as PIXI.ColorMatrixFilter; - if (parameterName !== 'opacity') { - return; + if (parameterName === 'opacity') { + colorMatrixFilter.alpha = gdjs.PixiFiltersTools.clampValue( + value, + 0, + 1 + ); } - colorMatrixFilter.alpha = gdjs.PixiFiltersTools.clampValue(value, 0, 1); + } + getDoubleParameter(filter: PIXI.Filter, parameterName: string): number { + const colorMatrixFilter = (filter as unknown) as PIXI.ColorMatrixFilter; + if (parameterName === 'opacity') { + return colorMatrixFilter.alpha; + } + return 0; } updateStringParameter( filter: PIXI.Filter, parameterName: string, value: string ) {} + updateColorParameter( + filter: PIXI.Filter, + parameterName: string, + value: number + ): void {} + getColorParameter(filter: PIXI.Filter, parameterName: string): number { + return 0; + } updateBooleanParameter( filter: PIXI.Filter, parameterName: string, diff --git a/Extensions/Effects/shockwave-pixi-filter.ts b/Extensions/Effects/shockwave-pixi-filter.ts index 3fad49ee71a3..c16e0ef2599e 100644 --- a/Extensions/Effects/shockwave-pixi-filter.ts +++ b/Extensions/Effects/shockwave-pixi-filter.ts @@ -1,4 +1,9 @@ namespace gdjs { + interface ShockwaveFilterExtra { + // @ts-ignore - extra properties are stored on the filter. + _centerX: number; + _centerY: number; + } gdjs.PixiFiltersTools.registerFilterCreator( 'Shockwave', new (class extends gdjs.PixiFiltersTools.PixiFilterCreator { @@ -7,16 +12,15 @@ namespace gdjs { return shockwaveFilter; } updatePreRender(filter: PIXI.Filter, target: EffectsTarget) { - const shockwaveFilter = (filter as unknown) as PIXI.filters.ShockwaveFilter; + const shockwaveFilter = (filter as unknown) as PIXI.filters.ShockwaveFilter & + ShockwaveFilterExtra; if (shockwaveFilter.speed !== 0) { shockwaveFilter.time += target.getElapsedTime() / 1000; } shockwaveFilter.center[0] = Math.round( - // @ts-ignore - extra properties are stored on the filter. shockwaveFilter._centerX * target.getWidth() ); shockwaveFilter.center[1] = Math.round( - // @ts-ignore - extra properties are stored on the filter. shockwaveFilter._centerY * target.getHeight() ); } @@ -25,12 +29,11 @@ namespace gdjs { parameterName: string, value: number ) { - const shockwaveFilter = filter as PIXI.filters.ShockwaveFilter; + const shockwaveFilter = filter as PIXI.filters.ShockwaveFilter & + ShockwaveFilterExtra; if (parameterName === 'centerX') { - // @ts-ignore - extra properties are stored on the filter. shockwaveFilter._centerX = value; } else if (parameterName === 'centerY') { - // @ts-ignore - extra properties are stored on the filter. shockwaveFilter._centerY = value; } else if (parameterName === 'time') { shockwaveFilter.time = value; @@ -46,11 +49,48 @@ namespace gdjs { shockwaveFilter.radius = value; } } + getDoubleParameter(filter: PIXI.Filter, parameterName: string): number { + const shockwaveFilter = filter as PIXI.filters.ShockwaveFilter & + ShockwaveFilterExtra; + if (parameterName === 'centerX') { + return shockwaveFilter._centerX; + } + if (parameterName === 'centerY') { + return shockwaveFilter._centerY; + } + if (parameterName === 'time') { + return shockwaveFilter.time; + } + if (parameterName === 'speed') { + return shockwaveFilter.speed; + } + if (parameterName === 'amplitude') { + return shockwaveFilter.amplitude; + } + if (parameterName === 'wavelength') { + return shockwaveFilter.wavelength; + } + if (parameterName === 'brightness') { + return shockwaveFilter.brightness; + } + if (parameterName === 'radius') { + return shockwaveFilter.radius; + } + return 0; + } updateStringParameter( filter: PIXI.Filter, parameterName: string, value: string ) {} + updateColorParameter( + filter: PIXI.Filter, + parameterName: string, + value: number + ): void {} + getColorParameter(filter: PIXI.Filter, parameterName: string): number { + return 0; + } updateBooleanParameter( filter: PIXI.Filter, parameterName: string, diff --git a/Extensions/Effects/tilt-shift-pixi-filter.ts b/Extensions/Effects/tilt-shift-pixi-filter.ts index 37b9e91dfb92..ec6eb8578f6c 100644 --- a/Extensions/Effects/tilt-shift-pixi-filter.ts +++ b/Extensions/Effects/tilt-shift-pixi-filter.ts @@ -19,11 +19,29 @@ namespace gdjs { tiltShiftFilter.gradientBlur = value; } } + getDoubleParameter(filter: PIXI.Filter, parameterName: string): number { + const tiltShiftFilter = (filter as unknown) as PIXI.filters.TiltShiftFilter; + if (parameterName === 'blur') { + return tiltShiftFilter.blur; + } + if (parameterName === 'gradientBlur') { + return tiltShiftFilter.gradientBlur; + } + return 0; + } updateStringParameter( filter: PIXI.Filter, parameterName: string, value: string ) {} + updateColorParameter( + filter: PIXI.Filter, + parameterName: string, + value: number + ): void {} + getColorParameter(filter: PIXI.Filter, parameterName: string): number { + return 0; + } updateBooleanParameter( filter: PIXI.Filter, parameterName: string, diff --git a/Extensions/Effects/twist-pixi-filter.ts b/Extensions/Effects/twist-pixi-filter.ts index 6a0ead992ac6..82e5c1e10d6b 100644 --- a/Extensions/Effects/twist-pixi-filter.ts +++ b/Extensions/Effects/twist-pixi-filter.ts @@ -1,4 +1,9 @@ namespace gdjs { + interface TwistFilterExtra { + // @ts-ignore - extra properties are stored on the filter. + _offsetX: number; + _offsetY: number; + } gdjs.PixiFiltersTools.registerFilterCreator( 'Twist', new (class extends gdjs.PixiFiltersTools.PixiFilterCreator { @@ -8,13 +13,12 @@ namespace gdjs { return twistFilter; } updatePreRender(filter: PIXI.Filter, target: EffectsTarget) { - const twistFilter = (filter as unknown) as PIXI.filters.TwistFilter; + const twistFilter = (filter as unknown) as PIXI.filters.TwistFilter & + TwistFilterExtra; twistFilter.offset.x = Math.round( - // @ts-ignore - extra properties are stored on the filter. twistFilter._offsetX * target.getWidth() ); twistFilter.offset.y = Math.round( - // @ts-ignore - extra properties are stored on the filter. twistFilter._offsetY * target.getHeight() ); } @@ -23,7 +27,8 @@ namespace gdjs { parameterName: string, value: number ) { - const twistFilter = (filter as unknown) as PIXI.filters.TwistFilter; + const twistFilter = (filter as unknown) as PIXI.filters.TwistFilter & + TwistFilterExtra; if (parameterName === 'radius') { twistFilter.radius = value; } else if (parameterName === 'angle') { @@ -31,18 +36,44 @@ namespace gdjs { } else if (parameterName === 'padding') { twistFilter.padding = value; } else if (parameterName === 'offsetX') { - // @ts-ignore - extra properties are stored on the filter. twistFilter._offsetX = value; } else if (parameterName === 'offsetY') { - // @ts-ignore - extra properties are stored on the filter. twistFilter._offsetY = value; } } + getDoubleParameter(filter: PIXI.Filter, parameterName: string): number { + const twistFilter = (filter as unknown) as PIXI.filters.TwistFilter & + TwistFilterExtra; + if (parameterName === 'radius') { + return twistFilter.radius; + } + if (parameterName === 'angle') { + return twistFilter.angle; + } + if (parameterName === 'padding') { + return twistFilter.padding; + } + if (parameterName === 'offsetX') { + return twistFilter._offsetX; + } + if (parameterName === 'offsetY') { + return twistFilter._offsetY; + } + return 0; + } updateStringParameter( filter: PIXI.Filter, parameterName: string, value: string ) {} + updateColorParameter( + filter: PIXI.Filter, + parameterName: string, + value: number + ): void {} + getColorParameter(filter: PIXI.Filter, parameterName: string): number { + return 0; + } updateBooleanParameter( filter: PIXI.Filter, parameterName: string, diff --git a/Extensions/Effects/zoom-blur-pixi-filter.ts b/Extensions/Effects/zoom-blur-pixi-filter.ts index 4ddc2cd063bd..762d7676e9f6 100644 --- a/Extensions/Effects/zoom-blur-pixi-filter.ts +++ b/Extensions/Effects/zoom-blur-pixi-filter.ts @@ -1,4 +1,9 @@ namespace gdjs { + interface ZoomBlurFilterExtra { + // @ts-ignore - extra properties are stored on the filter. + _centerX: number; + _centerY: number; + } gdjs.PixiFiltersTools.registerFilterCreator( 'ZoomBlur', new (class extends gdjs.PixiFiltersTools.PixiFilterCreator { @@ -7,13 +12,12 @@ namespace gdjs { return zoomBlurFilter; } updatePreRender(filter: PIXI.Filter, target: EffectsTarget) { - const zoomBlurFilter = (filter as unknown) as PIXI.filters.ZoomBlurFilter; + const zoomBlurFilter = (filter as unknown) as PIXI.filters.ZoomBlurFilter & + ZoomBlurFilterExtra; zoomBlurFilter.center[0] = Math.round( - // @ts-ignore - extra properties are stored on the filter. zoomBlurFilter._centerX * target.getWidth() ); zoomBlurFilter.center[1] = Math.round( - // @ts-ignore - extra properties are stored on the filter. zoomBlurFilter._centerY * target.getHeight() ); } @@ -22,12 +26,11 @@ namespace gdjs { parameterName: string, value: number ) { - const zoomBlurFilter = (filter as unknown) as PIXI.filters.ZoomBlurFilter; + const zoomBlurFilter = (filter as unknown) as PIXI.filters.ZoomBlurFilter & + ZoomBlurFilterExtra; if (parameterName === 'centerX') { - // @ts-ignore - extra properties are stored on the filter. zoomBlurFilter._centerX = value; } else if (parameterName === 'centerY') { - // @ts-ignore - extra properties are stored on the filter. zoomBlurFilter._centerY = value; } else if (parameterName === 'innerRadius') { zoomBlurFilter.innerRadius = value; @@ -41,11 +44,39 @@ namespace gdjs { zoomBlurFilter.padding = value; } } + getDoubleParameter(filter: PIXI.Filter, parameterName: string): number { + const zoomBlurFilter = (filter as unknown) as PIXI.filters.ZoomBlurFilter & + ZoomBlurFilterExtra; + if (parameterName === 'centerX') { + return zoomBlurFilter._centerX; + } + if (parameterName === 'centerY') { + return zoomBlurFilter._centerY; + } + if (parameterName === 'innerRadius') { + return zoomBlurFilter.innerRadius; + } + if (parameterName === 'strength') { + return zoomBlurFilter.strength; + } + if (parameterName === 'padding') { + return zoomBlurFilter.padding; + } + return 0; + } updateStringParameter( filter: PIXI.Filter, parameterName: string, value: string ) {} + updateColorParameter( + filter: PIXI.Filter, + parameterName: string, + value: number + ): void {} + getColorParameter(filter: PIXI.Filter, parameterName: string): number { + return 0; + } updateBooleanParameter( filter: PIXI.Filter, parameterName: string, diff --git a/Extensions/ExampleJsExtension/dummyeffect.ts b/Extensions/ExampleJsExtension/dummyeffect.ts index 462e24723fb6..298a16f53a77 100644 --- a/Extensions/ExampleJsExtension/dummyeffect.ts +++ b/Extensions/ExampleJsExtension/dummyeffect.ts @@ -79,12 +79,26 @@ namespace gdjs { ); } } + getDoubleParameter(filter: PIXI.Filter, parameterName: string): number { + if (parameterName === 'opacity') { + return filter.uniforms.opacity; + } + return 0; + } // Function that will be called to update a (string) parameter of the PIXI filter with a new value updateStringParameter( filter: PIXI.Filter, parameterName: string, value: string ) {} + updateColorParameter( + filter: PIXI.Filter, + parameterName: string, + value: number + ): void {} + getColorParameter(filter: PIXI.Filter, parameterName: string): number { + return 0; + } // Function that will be called to update a (boolean) parameter of the PIXI filter with a new value updateBooleanParameter( filter: PIXI.Filter, diff --git a/Extensions/TweenBehavior/JsExtension.js b/Extensions/TweenBehavior/JsExtension.js index 389c40e3d496..c0bacab19c95 100644 --- a/Extensions/TweenBehavior/JsExtension.js +++ b/Extensions/TweenBehavior/JsExtension.js @@ -95,7 +95,7 @@ module.exports = { .addParameter('expression', _('Weighting')) .setParameterLongDescription(_('From 0 to 1.')) .getCodeExtraInformation() - .setIncludeFile('Extensions/TweenBehavior/standard-easing-functions.js') + .setIncludeFile('Extensions/TweenBehavior/TweenManager.js') .setFunctionName('gdjs.evtTools.tween.ease'); // Deprecated @@ -122,8 +122,7 @@ module.exports = { .addParameter('expression', _('Duration (in milliseconds)'), '', false) .addParameter('stringWithSelector', _('Easing'), easingChoices, false) .getCodeExtraInformation() - .setIncludeFile('Extensions/TweenBehavior/standard-easing-functions.js') - .addIncludeFile('Extensions/TweenBehavior/tweenruntimebehavior.js') + .setIncludeFile('Extensions/TweenBehavior/TweenManager.js') .addIncludeFile('Extensions/TweenBehavior/tweentools.js') .setFunctionName('gdjs.evtTools.tween.tweenVariableNumber'); @@ -150,8 +149,7 @@ module.exports = { .addParameter('expression', _('Duration (in milliseconds)'), '', false) .addParameter('stringWithSelector', _('Easing'), easingChoices, false) .getCodeExtraInformation() - .setIncludeFile('Extensions/TweenBehavior/standard-easing-functions.js') - .addIncludeFile('Extensions/TweenBehavior/tweenruntimebehavior.js') + .setIncludeFile('Extensions/TweenBehavior/TweenManager.js') .addIncludeFile('Extensions/TweenBehavior/tweentools.js') .setFunctionName('gdjs.evtTools.tween.tweenVariableNumber2'); @@ -177,8 +175,7 @@ module.exports = { .setDefaultValue('linear') .addParameter('expression', _('Duration (in seconds)'), '', false) .getCodeExtraInformation() - .setIncludeFile('Extensions/TweenBehavior/standard-easing-functions.js') - .addIncludeFile('Extensions/TweenBehavior/tweenruntimebehavior.js') + .setIncludeFile('Extensions/TweenBehavior/TweenManager.js') .addIncludeFile('Extensions/TweenBehavior/tweentools.js') .setFunctionName('gdjs.evtTools.tween.tweenVariableNumber3'); @@ -207,8 +204,7 @@ module.exports = { .setDefaultValue('no') .markAsAdvanced() .getCodeExtraInformation() - .setIncludeFile('Extensions/TweenBehavior/standard-easing-functions.js') - .addIncludeFile('Extensions/TweenBehavior/tweenruntimebehavior.js') + .setIncludeFile('Extensions/TweenBehavior/TweenManager.js') .addIncludeFile('Extensions/TweenBehavior/tweentools.js') .setFunctionName('gdjs.evtTools.tween.addLayoutValueTween'); @@ -238,8 +234,7 @@ module.exports = { .setDefaultValue('no') .markAsAdvanced() .getCodeExtraInformation() - .setIncludeFile('Extensions/TweenBehavior/standard-easing-functions.js') - .addIncludeFile('Extensions/TweenBehavior/tweenruntimebehavior.js') + .setIncludeFile('Extensions/TweenBehavior/TweenManager.js') .addIncludeFile('Extensions/TweenBehavior/tweentools.js') .setFunctionName('gdjs.evtTools.tween.addLayerValueTween'); @@ -265,8 +260,7 @@ module.exports = { .addParameter('expression', _('Duration (in milliseconds)'), '', false) .addParameter('stringWithSelector', _('Easing'), easingChoices, false) .getCodeExtraInformation() - .setIncludeFile('Extensions/TweenBehavior/standard-easing-functions.js') - .addIncludeFile('Extensions/TweenBehavior/tweenruntimebehavior.js') + .setIncludeFile('Extensions/TweenBehavior/TweenManager.js') .addIncludeFile('Extensions/TweenBehavior/tweentools.js') .setFunctionName('gdjs.evtTools.tween.tweenCamera'); @@ -291,8 +285,7 @@ module.exports = { .setDefaultValue('linear') .addParameter('expression', _('Duration (in seconds)'), '', false) .getCodeExtraInformation() - .setIncludeFile('Extensions/TweenBehavior/standard-easing-functions.js') - .addIncludeFile('Extensions/TweenBehavior/tweenruntimebehavior.js') + .setIncludeFile('Extensions/TweenBehavior/TweenManager.js') .addIncludeFile('Extensions/TweenBehavior/tweentools.js') .setFunctionName('gdjs.evtTools.tween.tweenCamera2'); @@ -317,8 +310,7 @@ module.exports = { .addParameter('expression', _('Duration (in milliseconds)'), '', false) .addParameter('stringWithSelector', _('Easing'), easingChoices, false) .getCodeExtraInformation() - .setIncludeFile('Extensions/TweenBehavior/standard-easing-functions.js') - .addIncludeFile('Extensions/TweenBehavior/tweenruntimebehavior.js') + .setIncludeFile('Extensions/TweenBehavior/TweenManager.js') .addIncludeFile('Extensions/TweenBehavior/tweentools.js') .setFunctionName('gdjs.evtTools.tween.tweenCameraZoom'); @@ -342,8 +334,7 @@ module.exports = { .setDefaultValue('linear') .addParameter('expression', _('Duration (in seconds)'), '', false) .getCodeExtraInformation() - .setIncludeFile('Extensions/TweenBehavior/standard-easing-functions.js') - .addIncludeFile('Extensions/TweenBehavior/tweenruntimebehavior.js') + .setIncludeFile('Extensions/TweenBehavior/TweenManager.js') .addIncludeFile('Extensions/TweenBehavior/tweentools.js') .setFunctionName('gdjs.evtTools.tween.tweenCameraZoom2'); @@ -368,8 +359,7 @@ module.exports = { .addParameter('expression', _('Duration (in milliseconds)'), '', false) .addParameter('stringWithSelector', _('Easing'), easingChoices, false) .getCodeExtraInformation() - .setIncludeFile('Extensions/TweenBehavior/standard-easing-functions.js') - .addIncludeFile('Extensions/TweenBehavior/tweenruntimebehavior.js') + .setIncludeFile('Extensions/TweenBehavior/TweenManager.js') .addIncludeFile('Extensions/TweenBehavior/tweentools.js') .setFunctionName('gdjs.evtTools.tween.tweenCameraRotation'); @@ -393,11 +383,62 @@ module.exports = { .setDefaultValue('linear') .addParameter('expression', _('Duration (in seconds)'), '', false) .getCodeExtraInformation() - .setIncludeFile('Extensions/TweenBehavior/standard-easing-functions.js') - .addIncludeFile('Extensions/TweenBehavior/tweenruntimebehavior.js') + .setIncludeFile('Extensions/TweenBehavior/TweenManager.js') .addIncludeFile('Extensions/TweenBehavior/tweentools.js') .setFunctionName('gdjs.evtTools.tween.tweenCameraRotation2'); + extension + .addAction( + 'TweenNumberEffectPropertyTween', + _('Tween number effect property'), + _('Tweens a number effect property from its current value to a new one.'), + _( + 'Tween the property _PARAM5_ for effect _PARAM4_ of _PARAM0_ to _PARAM3_ with easing _PARAM6_ over _PARAM7_ seconds as _PARAM2_' + ), + _('Scene Tweens'), + 'JsPlatform/Extensions/tween_behavior24.png', + 'JsPlatform/Extensions/tween_behavior32.png' + ) + .addCodeOnlyParameter('currentScene', '') + .addParameter('identifier', _('Tween Identifier'), 'sceneTween') + .addParameter('expression', _('To value'), '', false) + .addParameter('layer', _('Layer'), '', true) + .addParameter("layerEffectName", _("Effect name")) + .addParameter("layerEffectParameterName", _("Property name")) + .addParameter('stringWithSelector', _('Easing'), easingChoices, false) + .setDefaultValue('linear') + .addParameter('expression', _('Duration (in seconds)'), '', false) + .getCodeExtraInformation() + .setIncludeFile('Extensions/TweenBehavior/TweenManager.js') + .addIncludeFile('Extensions/TweenBehavior/tweentools.js') + .setFunctionName('gdjs.evtTools.tween.tweenNumberEffectPropertyTween'); + + extension + .addAction( + 'TweenColorEffectPropertyTween', + _('Tween color effect property'), + _('Tweens a color effect property from its current value to a new one.'), + _( + 'Tween the color property _PARAM5_ for effect _PARAM4_ of _PARAM0_ to _PARAM3_ with easing _PARAM6_ over _PARAM7_ seconds as _PARAM2_' + ), + _('Scene Tweens'), + 'JsPlatform/Extensions/tween_behavior24.png', + 'JsPlatform/Extensions/tween_behavior32.png' + ) + .addCodeOnlyParameter('currentScene', '') + .addParameter('identifier', _('Tween Identifier'), 'sceneTween') + .addParameter('color', _('To color'), '', false) + .addParameter('layer', _('Layer'), '', true) + .addParameter("layerEffectName", _("Effect name")) + .addParameter("layerEffectParameterName", _("Property name")) + .addParameter('stringWithSelector', _('Easing'), easingChoices, false) + .setDefaultValue('linear') + .addParameter('expression', _('Duration (in seconds)'), '', false) + .getCodeExtraInformation() + .setIncludeFile('Extensions/TweenBehavior/TweenManager.js') + .addIncludeFile('Extensions/TweenBehavior/tweentools.js') + .setFunctionName('gdjs.evtTools.tween.tweenColorEffectPropertyTween'); + extension .addCondition( 'SceneTweenExists', @@ -411,8 +452,7 @@ module.exports = { .addCodeOnlyParameter('currentScene', '') .addParameter('identifier', _('Tween Identifier'), 'sceneTween') .getCodeExtraInformation() - .setIncludeFile('Extensions/TweenBehavior/standard-easing-functions.js') - .addIncludeFile('Extensions/TweenBehavior/tweenruntimebehavior.js') + .setIncludeFile('Extensions/TweenBehavior/TweenManager.js') .addIncludeFile('Extensions/TweenBehavior/tweentools.js') .setFunctionName('gdjs.evtTools.tween.sceneTweenExists'); @@ -429,8 +469,7 @@ module.exports = { .addCodeOnlyParameter('currentScene', '') .addParameter('identifier', _('Tween Identifier'), 'sceneTween') .getCodeExtraInformation() - .setIncludeFile('Extensions/TweenBehavior/standard-easing-functions.js') - .addIncludeFile('Extensions/TweenBehavior/tweenruntimebehavior.js') + .setIncludeFile('Extensions/TweenBehavior/TweenManager.js') .addIncludeFile('Extensions/TweenBehavior/tweentools.js') .setFunctionName('gdjs.evtTools.tween.sceneTweenIsPlaying'); @@ -447,8 +486,7 @@ module.exports = { .addCodeOnlyParameter('currentScene', '') .addParameter('identifier', _('Tween Identifier'), 'sceneTween') .getCodeExtraInformation() - .setIncludeFile('Extensions/TweenBehavior/standard-easing-functions.js') - .addIncludeFile('Extensions/TweenBehavior/tweenruntimebehavior.js') + .setIncludeFile('Extensions/TweenBehavior/TweenManager.js') .addIncludeFile('Extensions/TweenBehavior/tweentools.js') .setFunctionName('gdjs.evtTools.tween.sceneTweenHasFinished'); @@ -465,8 +503,7 @@ module.exports = { .addCodeOnlyParameter('currentScene', '') .addParameter('identifier', _('Tween Identifier'), 'sceneTween') .getCodeExtraInformation() - .setIncludeFile('Extensions/TweenBehavior/standard-easing-functions.js') - .addIncludeFile('Extensions/TweenBehavior/tweenruntimebehavior.js') + .setIncludeFile('Extensions/TweenBehavior/TweenManager.js') .addIncludeFile('Extensions/TweenBehavior/tweentools.js') .setFunctionName('gdjs.evtTools.tween.pauseSceneTween'); @@ -484,8 +521,7 @@ module.exports = { .addParameter('identifier', _('Tween Identifier'), 'sceneTween') .addParameter('yesorno', _('Jump to the end'), '', false) .getCodeExtraInformation() - .setIncludeFile('Extensions/TweenBehavior/standard-easing-functions.js') - .addIncludeFile('Extensions/TweenBehavior/tweenruntimebehavior.js') + .setIncludeFile('Extensions/TweenBehavior/TweenManager.js') .addIncludeFile('Extensions/TweenBehavior/tweentools.js') .setFunctionName('gdjs.evtTools.tween.stopSceneTween'); @@ -502,8 +538,7 @@ module.exports = { .addCodeOnlyParameter('currentScene', '') .addParameter('identifier', _('Tween Identifier'), 'sceneTween') .getCodeExtraInformation() - .setIncludeFile('Extensions/TweenBehavior/standard-easing-functions.js') - .addIncludeFile('Extensions/TweenBehavior/tweenruntimebehavior.js') + .setIncludeFile('Extensions/TweenBehavior/TweenManager.js') .addIncludeFile('Extensions/TweenBehavior/tweentools.js') .setFunctionName('gdjs.evtTools.tween.resumeSceneTween'); @@ -522,8 +557,7 @@ module.exports = { .addCodeOnlyParameter('currentScene', '') .addParameter('identifier', _('Tween Identifier'), 'sceneTween') .getCodeExtraInformation() - .setIncludeFile('Extensions/TweenBehavior/standard-easing-functions.js') - .addIncludeFile('Extensions/TweenBehavior/tweenruntimebehavior.js') + .setIncludeFile('Extensions/TweenBehavior/TweenManager.js') .addIncludeFile('Extensions/TweenBehavior/tweentools.js') .setFunctionName('gdjs.evtTools.tween.removeSceneTween'); @@ -540,8 +574,7 @@ module.exports = { .addCodeOnlyParameter('currentScene', '') .addParameter('identifier', _('Tween Identifier'), 'sceneTween') .useStandardParameters('number', gd.ParameterOptions.makeNewOptions()) - .setIncludeFile('Extensions/TweenBehavior/standard-easing-functions.js') - .addIncludeFile('Extensions/TweenBehavior/tweenruntimebehavior.js') + .setIncludeFile('Extensions/TweenBehavior/TweenManager.js') .addIncludeFile('Extensions/TweenBehavior/tweentools.js') .setFunctionName('gdjs.evtTools.tween.getProgress'); @@ -558,8 +591,7 @@ module.exports = { .addCodeOnlyParameter('currentScene', '') .addParameter('identifier', _('Tween Identifier'), 'sceneTween') .getCodeExtraInformation() - .setIncludeFile('Extensions/TweenBehavior/standard-easing-functions.js') - .addIncludeFile('Extensions/TweenBehavior/tweenruntimebehavior.js') + .setIncludeFile('Extensions/TweenBehavior/TweenManager.js') .addIncludeFile('Extensions/TweenBehavior/tweentools.js') .setFunctionName('gdjs.evtTools.tween.getValue'); @@ -597,7 +629,7 @@ module.exports = { tweenBehavior, new gd.BehaviorsSharedData() ) - .setIncludeFile('Extensions/TweenBehavior/standard-easing-functions.js') + .setIncludeFile('Extensions/TweenBehavior/TweenManager.js') .addIncludeFile('Extensions/TweenBehavior/tweenruntimebehavior.js'); // Behavior related @@ -1505,6 +1537,70 @@ module.exports = { .getCodeExtraInformation() .setFunctionName('addObjectOpacityTween2'); + behavior + .addScopedAction( + 'AddNumberEffectPropertyTween', + _('Tween number effect property'), + _('Tweens a number effect property from its current value to a new one.'), + _( + 'Tween the property _PARAM5_ for effect _PARAM4_ of _PARAM0_ to _PARAM3_ with easing _PARAM6_ over _PARAM7_ seconds as _PARAM2_' + ), + _('Effects'), + 'JsPlatform/Extensions/tween_behavior24.png', + 'JsPlatform/Extensions/tween_behavior32.png' + ) + .addParameter('object', _('Object'), '', false) + .addParameter('behavior', _('Behavior'), 'TweenBehavior', false) + .addParameter("behavior", _("Effect capability"), "EffectCapability::EffectBehavior") + .addParameter('identifier', _('Tween Identifier'), 'objectTween') + .addParameter('expression', _('To value'), '', false) + .addParameter("objectEffectName", _("Effect name")) + .addParameter("objectEffectParameterName", _("Property name")) + .addParameter('stringWithSelector', _('Easing'), easingChoices, false) + .setDefaultValue('linear') + .addParameter('expression', _('Duration (in seconds)'), '', false) + .addParameter( + 'yesorno', + _('Destroy this object when tween finishes'), + '', + false + ) + .setDefaultValue('no') + .getCodeExtraInformation() + .setFunctionName('addNumberEffectPropertyTween'); + + behavior + .addScopedAction( + 'AddColorEffectPropertyTween', + _('Tween color effect property'), + _('Tweens a color effect property from its current value to a new one.'), + _( + 'Tween the color property _PARAM5_ for effect _PARAM4_ of _PARAM0_ to _PARAM3_ with easing _PARAM6_ over _PARAM7_ seconds as _PARAM2_' + ), + _('Effects'), + 'JsPlatform/Extensions/tween_behavior24.png', + 'JsPlatform/Extensions/tween_behavior32.png' + ) + .addParameter('object', _('Object'), '', false) + .addParameter('behavior', _('Behavior'), 'TweenBehavior', false) + .addParameter("behavior", _("Effect capability"), "EffectCapability::EffectBehavior") + .addParameter('identifier', _('Tween Identifier'), 'objectTween') + .addParameter('color', _('To color'), '', false) + .addParameter("objectEffectName", _("Effect name")) + .addParameter("objectEffectParameterName", _("Property name")) + .addParameter('stringWithSelector', _('Easing'), easingChoices, false) + .setDefaultValue('linear') + .addParameter('expression', _('Duration (in seconds)'), '', false) + .addParameter( + 'yesorno', + _('Destroy this object when tween finishes'), + '', + false + ) + .setDefaultValue('no') + .getCodeExtraInformation() + .setFunctionName('addNumberEffectPropertyTween'); + // deprecated behavior .addAction( diff --git a/Extensions/TweenBehavior/TweenManager.ts b/Extensions/TweenBehavior/TweenManager.ts new file mode 100644 index 000000000000..323341d3adc4 --- /dev/null +++ b/Extensions/TweenBehavior/TweenManager.ts @@ -0,0 +1,678 @@ +namespace gdjs { + export namespace evtTools { + export namespace tween { + /** + * A tween manager that is used for layout tweens or object tweens. + * @ignore + */ + export class TweenManager { + /** + * All the tweens of a layout or a behavior. + */ + private _tweens = new Map(); + /** + * Allow fast iteration on tween that are active. + */ + private _activeTweens = new Array(); + + constructor() {} + + /** + * Make all active tween step toward the end. + * @param timeDelta the duration from the previous step in seconds + * @param layoutTimeDelta the duration from the previous step ignoring layer time scale in seconds + */ + step(): void { + let writeIndex = 0; + for ( + let readIndex = 0; + readIndex < this._activeTweens.length; + readIndex++ + ) { + const tween = this._activeTweens[readIndex]; + + tween.step(); + if (!tween.hasFinished()) { + this._activeTweens[writeIndex] = tween; + writeIndex++; + } + } + this._activeTweens.length = writeIndex; + } + + /** + * Add a tween on one value. + */ + addSimpleTween( + identifier: string, + timeSource: TimeSource, + totalDuration: number, + easingIdentifier: string, + interpolate: Interpolation, + initialValue: float, + targetedValue: float, + setValue: (value: float) => void, + onFinish?: (() => void) | null + ): void { + const easing = easingFunctions[easingIdentifier]; + if (!easing) return; + + // Remove any prior tween + this.removeTween(identifier); + + // Initialize the tween instance + const tween = new SimpleTweenInstance( + timeSource, + totalDuration, + easing, + interpolate, + initialValue, + targetedValue, + setValue, + onFinish + ); + this._tweens.set(identifier, tween); + this._addActiveTween(tween); + } + + /** + * Add a tween on several values. + */ + addMultiTween( + identifier: string, + timeSource: TimeSource, + totalDuration: number, + easingIdentifier: string, + interpolate: Interpolation, + initialValue: Array, + targetedValue: Array, + setValue: (value: Array) => void, + onFinish?: (() => void) | null + ): void { + const easing = easingFunctions[easingIdentifier]; + if (!easing) return; + + // Remove any prior tween + this.removeTween(identifier); + + // Initialize the tween instance + const tween = new MultiTweenInstance( + timeSource, + totalDuration, + easing, + interpolate, + initialValue, + targetedValue, + setValue, + onFinish + ); + this._tweens.set(identifier, tween); + this._addActiveTween(tween); + } + + /** + * Tween exists. + * @param identifier Unique id to identify the tween + * @returns The tween exists + */ + exists(identifier: string): boolean { + return this._tweens.has(identifier); + } + + /** + * Tween is playing. + * @param identifier Unique id to identify the tween + */ + isPlaying(identifier: string): boolean { + const tween = this._tweens.get(identifier); + return !!tween && tween.isPlaying(); + } + + /** + * Tween has finished. + * @param identifier Unique id to identify the tween + */ + hasFinished(identifier: string): boolean { + const tween = this._tweens.get(identifier); + return !!tween && tween.hasFinished(); + } + + /** + * Pause a tween. + * @param identifier Unique id to identify the tween + */ + pauseTween(identifier: string) { + const tween = this._tweens.get(identifier); + if (!tween || !tween.isPlaying() || tween.hasFinished()) { + return; + } + this._removeActiveTween(tween); + tween.pause(); + } + + /** + * Resume a tween. + * @param identifier Unique id to identify the tween + */ + resumeTween(identifier: string) { + const tween = this._tweens.get(identifier); + if (!tween || tween.isPlaying() || tween.hasFinished()) { + return; + } + this._addActiveTween(tween); + tween.resume(); + } + + /** + * Stop a tween. + * @param identifier Unique id to identify the tween + * @param jumpToDest Move to destination + */ + stopTween(identifier: string, jumpToDest: boolean) { + const tween = this._tweens.get(identifier); + if (!tween || tween.hasFinished()) { + return; + } + if (tween.isPlaying()) { + this._removeActiveTween(tween); + } + tween.stop(jumpToDest); + } + + /** + * Remove a tween. + * @param identifier Unique id to identify the tween + */ + removeTween(identifier: string) { + const tween = this._tweens.get(identifier); + if (!tween) { + return; + } + if (tween.isPlaying()) { + this._removeActiveTween(tween); + } + this._tweens.delete(identifier); + } + + _addActiveTween(tween: TweenInstance): void { + this._activeTweens.push(tween); + } + + _removeActiveTween(tween: TweenInstance): void { + const index = this._activeTweens.findIndex( + (activeTween) => activeTween === tween + ); + this._activeTweens.splice(index, 1); + } + + /** + * Get tween progress. + * @param identifier Unique id to identify the tween + * @returns Progress of playing tween animation (between 0.0 and 1.0) + */ + getProgress(identifier: string): float { + const tween = this._tweens.get(identifier); + if (!tween) { + return 0; + } + return tween.getProgress(); + } + + /** + * Get tween value. + * + * It returns 0 for tweens with several values. + * + * @param identifier Unique id to identify the tween + * @returns Value of playing tween animation + */ + getValue(identifier: string): float { + const tween = this._tweens.get(identifier); + if (!tween) { + return 0; + } + return tween.getValue(); + } + } + + export interface TimeSource { + getElapsedTime(): float; + } + + /** + * An interpolation function. + * @ignore + */ + export type Interpolation = ( + from: float, + to: float, + progress: float + ) => float; + + const noEffect = () => {}; + + /** + * A tween. + * @ignore + */ + export interface TweenInstance { + /** + * Step toward the end. + * @param timeDelta the duration from the previous step in seconds + * @param layoutTimeDelta the duration from the previous step ignoring layer time scale in seconds + */ + step(): void; + isPlaying(): boolean; + hasFinished(): boolean; + stop(jumpToDest: boolean): void; + resume(): void; + pause(): void; + getProgress(): float; + getValue(): float; + } + + /** + * A tween. + * @ignore + */ + export abstract class AbstractTweenInstance implements TweenInstance { + protected elapsedTime: float; + protected totalDuration: float; + protected easing: (progress: float) => float; + protected interpolate: Interpolation; + protected onFinish: () => void; + protected timeSource: TimeSource; + protected isPaused = false; + + constructor( + timeSource: TimeSource, + totalDuration: float, + easing: (progress: float) => float, + interpolate: Interpolation, + onFinish?: (() => void) | null + ) { + this.timeSource = timeSource; + this.totalDuration = totalDuration; + this.easing = easing; + this.interpolate = interpolate; + this.elapsedTime = 0; + this.onFinish = onFinish || noEffect; + } + + step(): void { + if (!this.isPlaying()) { + return; + } + this.elapsedTime = Math.min( + this.elapsedTime + this.timeSource.getElapsedTime() / 1000, + this.totalDuration + ); + this._updateValue(); + } + + protected abstract _updateValue(): void; + abstract getValue(): float; + + isPlaying(): boolean { + return !this.isPaused && !this.hasFinished(); + } + + hasFinished(): boolean { + return this.elapsedTime === this.totalDuration; + } + + stop(jumpToDest: boolean): void { + this.elapsedTime = this.totalDuration; + if (jumpToDest) { + this._updateValue(); + } + } + + resume(): void { + this.isPaused = false; + } + + pause(): void { + this.isPaused = true; + } + + getProgress(): float { + return this.elapsedTime / this.totalDuration; + } + } + + /** + * A tween with only one value. + * @ignore + */ + export class SimpleTweenInstance extends AbstractTweenInstance { + initialValue: float; + targetedValue: float; + setValue: (value: float) => void; + currentValue: float; + + constructor( + timeSource: TimeSource, + totalDuration: float, + easing: (progress: float) => float, + interpolate: Interpolation, + initialValue: float, + targetedValue: float, + setValue: (value: float) => void, + onFinish?: (() => void) | null + ) { + super(timeSource, totalDuration, easing, interpolate, onFinish); + this.initialValue = initialValue; + this.currentValue = initialValue; + this.targetedValue = targetedValue; + this.setValue = setValue; + } + + protected _updateValue() { + const easedProgress = this.easing(this.getProgress()); + const value = this.interpolate( + this.initialValue, + this.targetedValue, + easedProgress + ); + this.currentValue = value; + this.setValue(value); + if (this.hasFinished()) { + this.onFinish(); + } + } + + getValue(): float { + return this.currentValue; + } + } + + /** + * A tween with multiple values. + * @ignore + */ + export class MultiTweenInstance extends AbstractTweenInstance { + initialValue: Array; + targetedValue: Array; + setValue: (value: Array) => void; + + currentValues = new Array(); + + constructor( + timeSource: TimeSource, + totalDuration: float, + easing: (progress: float) => float, + interpolate: Interpolation, + initialValue: Array, + targetedValue: Array, + setValue: (value: Array) => void, + onFinish?: (() => void) | null + ) { + super(timeSource, totalDuration, easing, interpolate, onFinish); + this.initialValue = initialValue; + this.targetedValue = targetedValue; + this.setValue = setValue; + } + + protected _updateValue() { + const easedProgress = this.easing(this.getProgress()); + const length = this.initialValue.length; + this.currentValues.length = length; + for (let index = 0; index < length; index++) { + this.currentValues[index] = this.interpolate( + this.initialValue[index], + this.targetedValue[index], + easedProgress + ); + } + this.setValue(this.currentValues); + if (this.hasFinished()) { + this.onFinish(); + } + } + + getValue(): float { + return 0; + } + } + + export const rgbToHsl = (r: number, g: number, b: number): number[] => { + r /= 255; + g /= 255; + b /= 255; + let v = Math.max(r, g, b), + c = v - Math.min(r, g, b), + f = 1 - Math.abs(v + v - c - 1); + let h = + c && + (v === r ? (g - b) / c : v === g ? 2 + (b - r) / c : 4 + (r - g) / c); + return [ + Math.round(60 * (h < 0 ? h + 6 : h)), + Math.round((f ? c / f : 0) * 100), + Math.round(((v + v - c) / 2) * 100), + ]; + }; + + export const hslToRgb = (h: number, s: number, l: number): number[] => { + h = h %= 360; + if (h < 0) { + h += 360; + } + s = s / 100; + l = l / 100; + const a = s * Math.min(l, 1 - l); + const f = (n = 0, k = (n + h / 30) % 12) => + l - a * Math.max(Math.min(k - 3, 9 - k, 1), -1); + return [ + Math.round(f(0) * 255), + Math.round(f(8) * 255), + Math.round(f(4) * 255), + ]; + }; + + /** + * Tween between 2 values according to an easing function. + * @param fromValue Start value + * @param toValue End value + * @param easingValue Type of easing + * @param weighting from 0 to 1 + */ + export const ease = ( + easingValue: string, + fromValue: float, + toValue: float, + weighting: float + ) => { + // This local declaration is needed because otherwise the transpiled + // code doesn't know it. + const easingFunctions = gdjs.evtTools.tween.easingFunctions; + + const easingFunction = easingFunctions.hasOwnProperty(easingValue) + ? easingFunctions[easingValue] + : easingFunctions.linear; + return fromValue + (toValue - fromValue) * easingFunction(weighting); + }; + + export type EasingFunction = (progress: float) => float; + + /*! + * All equations are adapted from Thomas Fuchs' + * [Scripty2](https://github.com/madrobby/scripty2/blob/master/src/effects/transitions/penner.js). + * + * Based on Easing Equations (c) 2003 [Robert + * Penner](http://www.robertpenner.com/), all rights reserved. This work is + * [subject to terms](http://www.robertpenner.com/easing_terms_of_use.html). + */ + + /*! + * TERMS OF USE - EASING EQUATIONS + * Open source under the BSD License. + * Easing Equations (c) 2003 Robert Penner, all rights reserved. + */ + + /*! Shifty 3.0.3 - https://github.com/jeremyckahn/shifty */ + export const easingFunctions: Record = { + linear: (pos: number) => pos, + + easeInQuad: (pos: number) => Math.pow(pos, 2), + + easeOutQuad: (pos: number) => -(Math.pow(pos - 1, 2) - 1), + + easeInOutQuad: (pos: number) => + (pos /= 0.5) < 1 + ? 0.5 * Math.pow(pos, 2) + : -0.5 * ((pos -= 2) * pos - 2), + + easeInCubic: (pos: number) => Math.pow(pos, 3), + + easeOutCubic: (pos: number) => Math.pow(pos - 1, 3) + 1, + + easeInOutCubic: (pos: number) => + (pos /= 0.5) < 1 + ? 0.5 * Math.pow(pos, 3) + : 0.5 * (Math.pow(pos - 2, 3) + 2), + + easeInQuart: (pos: number) => Math.pow(pos, 4), + + easeOutQuart: (pos: number) => -(Math.pow(pos - 1, 4) - 1), + + easeInOutQuart: (pos: number) => + (pos /= 0.5) < 1 + ? 0.5 * Math.pow(pos, 4) + : -0.5 * ((pos -= 2) * Math.pow(pos, 3) - 2), + + easeInQuint: (pos: number) => Math.pow(pos, 5), + + easeOutQuint: (pos: number) => Math.pow(pos - 1, 5) + 1, + + easeInOutQuint: (pos: number) => + (pos /= 0.5) < 1 + ? 0.5 * Math.pow(pos, 5) + : 0.5 * (Math.pow(pos - 2, 5) + 2), + + easeInSine: (pos: number) => -Math.cos(pos * (Math.PI / 2)) + 1, + + easeOutSine: (pos: number) => Math.sin(pos * (Math.PI / 2)), + + easeInOutSine: (pos: number) => -0.5 * (Math.cos(Math.PI * pos) - 1), + + easeInExpo: (pos: number) => + pos === 0 ? 0 : Math.pow(2, 10 * (pos - 1)), + + easeOutExpo: (pos: number) => + pos === 1 ? 1 : -Math.pow(2, -10 * pos) + 1, + + easeInOutExpo: (pos: number) => { + if (pos === 0) { + return 0; + } + + if (pos === 1) { + return 1; + } + + if ((pos /= 0.5) < 1) { + return 0.5 * Math.pow(2, 10 * (pos - 1)); + } + + return 0.5 * (-Math.pow(2, -10 * --pos) + 2); + }, + + easeInCirc: (pos: number) => -(Math.sqrt(1 - pos * pos) - 1), + + easeOutCirc: (pos: number) => Math.sqrt(1 - Math.pow(pos - 1, 2)), + + easeInOutCirc: (pos: number) => + (pos /= 0.5) < 1 + ? -0.5 * (Math.sqrt(1 - pos * pos) - 1) + : 0.5 * (Math.sqrt(1 - (pos -= 2) * pos) + 1), + + easeOutBounce: (pos: number) => { + if (pos < 1 / 2.75) { + return 7.5625 * pos * pos; + } else if (pos < 2 / 2.75) { + return 7.5625 * (pos -= 1.5 / 2.75) * pos + 0.75; + } else if (pos < 2.5 / 2.75) { + return 7.5625 * (pos -= 2.25 / 2.75) * pos + 0.9375; + } else { + return 7.5625 * (pos -= 2.625 / 2.75) * pos + 0.984375; + } + }, + + easeInBack: (pos: number) => { + const s = 1.70158; + return pos * pos * ((s + 1) * pos - s); + }, + + easeOutBack: (pos: number) => { + const s = 1.70158; + return (pos = pos - 1) * pos * ((s + 1) * pos + s) + 1; + }, + + easeInOutBack: (pos: number) => { + let s = 1.70158; + if ((pos /= 0.5) < 1) { + return 0.5 * (pos * pos * (((s *= 1.525) + 1) * pos - s)); + } + return 0.5 * ((pos -= 2) * pos * (((s *= 1.525) + 1) * pos + s) + 2); + }, + + elastic: (pos: number) => + -1 * + Math.pow(4, -8 * pos) * + Math.sin(((pos * 6 - 1) * (2 * Math.PI)) / 2) + + 1, + + swingFromTo: (pos: number) => { + let s = 1.70158; + return (pos /= 0.5) < 1 + ? 0.5 * (pos * pos * (((s *= 1.525) + 1) * pos - s)) + : 0.5 * ((pos -= 2) * pos * (((s *= 1.525) + 1) * pos + s) + 2); + }, + + swingFrom: (pos: number) => { + const s = 1.70158; + return pos * pos * ((s + 1) * pos - s); + }, + + swingTo: (pos: number) => { + const s = 1.70158; + return (pos -= 1) * pos * ((s + 1) * pos + s) + 1; + }, + + bounce: (pos: number) => { + if (pos < 1 / 2.75) { + return 7.5625 * pos * pos; + } else if (pos < 2 / 2.75) { + return 7.5625 * (pos -= 1.5 / 2.75) * pos + 0.75; + } else if (pos < 2.5 / 2.75) { + return 7.5625 * (pos -= 2.25 / 2.75) * pos + 0.9375; + } else { + return 7.5625 * (pos -= 2.625 / 2.75) * pos + 0.984375; + } + }, + + bouncePast: (pos: number) => { + if (pos < 1 / 2.75) { + return 7.5625 * pos * pos; + } else if (pos < 2 / 2.75) { + return 2 - (7.5625 * (pos -= 1.5 / 2.75) * pos + 0.75); + } else if (pos < 2.5 / 2.75) { + return 2 - (7.5625 * (pos -= 2.25 / 2.75) * pos + 0.9375); + } else { + return 2 - (7.5625 * (pos -= 2.625 / 2.75) * pos + 0.984375); + } + }, + + easeFromTo: (pos: number) => + (pos /= 0.5) < 1 + ? 0.5 * Math.pow(pos, 4) + : -0.5 * ((pos -= 2) * Math.pow(pos, 3) - 2), + + easeFrom: (pos: number) => Math.pow(pos, 4), + + easeTo: (pos: number) => Math.pow(pos, 0.25), + }; + } + } +} diff --git a/Extensions/TweenBehavior/standard-easing-functions.ts b/Extensions/TweenBehavior/standard-easing-functions.ts deleted file mode 100644 index 3349dc487c3e..000000000000 --- a/Extensions/TweenBehavior/standard-easing-functions.ts +++ /dev/null @@ -1,210 +0,0 @@ -/*! - * All equations are adapted from Thomas Fuchs' - * [Scripty2](https://github.com/madrobby/scripty2/blob/master/src/effects/transitions/penner.js). - * - * Based on Easing Equations (c) 2003 [Robert - * Penner](http://www.robertpenner.com/), all rights reserved. This work is - * [subject to terms](http://www.robertpenner.com/easing_terms_of_use.html). - */ - -/*! - * TERMS OF USE - EASING EQUATIONS - * Open source under the BSD License. - * Easing Equations (c) 2003 Robert Penner, all rights reserved. - */ - -/*! Shifty 3.0.3 - https://github.com/jeremyckahn/shifty */ - -namespace gdjs { - export namespace evtTools { - export namespace tween { - /** - * Tween between 2 values according to an easing function. - * @param fromValue Start value - * @param toValue End value - * @param easingValue Type of easing - * @param weighting from 0 to 1 - */ - export const ease = ( - easingValue: string, - fromValue: float, - toValue: float, - weighting: float - ) => { - // This local declaration is needed because otherwise the transpiled - // code doesn't know it. - const easingFunctions = gdjs.evtTools.tween.easingFunctions; - - const easingFunction = easingFunctions.hasOwnProperty(easingValue) - ? easingFunctions[easingValue] - : easingFunctions.linear; - return fromValue + (toValue - fromValue) * easingFunction(weighting); - }; - - export type EasingFunction = (progress: float) => float; - - export const easingFunctions: Record = { - linear: (pos: number) => pos, - - easeInQuad: (pos: number) => Math.pow(pos, 2), - - easeOutQuad: (pos: number) => -(Math.pow(pos - 1, 2) - 1), - - easeInOutQuad: (pos: number) => - (pos /= 0.5) < 1 - ? 0.5 * Math.pow(pos, 2) - : -0.5 * ((pos -= 2) * pos - 2), - - easeInCubic: (pos: number) => Math.pow(pos, 3), - - easeOutCubic: (pos: number) => Math.pow(pos - 1, 3) + 1, - - easeInOutCubic: (pos: number) => - (pos /= 0.5) < 1 - ? 0.5 * Math.pow(pos, 3) - : 0.5 * (Math.pow(pos - 2, 3) + 2), - - easeInQuart: (pos: number) => Math.pow(pos, 4), - - easeOutQuart: (pos: number) => -(Math.pow(pos - 1, 4) - 1), - - easeInOutQuart: (pos: number) => - (pos /= 0.5) < 1 - ? 0.5 * Math.pow(pos, 4) - : -0.5 * ((pos -= 2) * Math.pow(pos, 3) - 2), - - easeInQuint: (pos: number) => Math.pow(pos, 5), - - easeOutQuint: (pos: number) => Math.pow(pos - 1, 5) + 1, - - easeInOutQuint: (pos: number) => - (pos /= 0.5) < 1 - ? 0.5 * Math.pow(pos, 5) - : 0.5 * (Math.pow(pos - 2, 5) + 2), - - easeInSine: (pos: number) => -Math.cos(pos * (Math.PI / 2)) + 1, - - easeOutSine: (pos: number) => Math.sin(pos * (Math.PI / 2)), - - easeInOutSine: (pos: number) => -0.5 * (Math.cos(Math.PI * pos) - 1), - - easeInExpo: (pos: number) => - pos === 0 ? 0 : Math.pow(2, 10 * (pos - 1)), - - easeOutExpo: (pos: number) => - pos === 1 ? 1 : -Math.pow(2, -10 * pos) + 1, - - easeInOutExpo: (pos: number) => { - if (pos === 0) { - return 0; - } - - if (pos === 1) { - return 1; - } - - if ((pos /= 0.5) < 1) { - return 0.5 * Math.pow(2, 10 * (pos - 1)); - } - - return 0.5 * (-Math.pow(2, -10 * --pos) + 2); - }, - - easeInCirc: (pos: number) => -(Math.sqrt(1 - pos * pos) - 1), - - easeOutCirc: (pos: number) => Math.sqrt(1 - Math.pow(pos - 1, 2)), - - easeInOutCirc: (pos: number) => - (pos /= 0.5) < 1 - ? -0.5 * (Math.sqrt(1 - pos * pos) - 1) - : 0.5 * (Math.sqrt(1 - (pos -= 2) * pos) + 1), - - easeOutBounce: (pos: number) => { - if (pos < 1 / 2.75) { - return 7.5625 * pos * pos; - } else if (pos < 2 / 2.75) { - return 7.5625 * (pos -= 1.5 / 2.75) * pos + 0.75; - } else if (pos < 2.5 / 2.75) { - return 7.5625 * (pos -= 2.25 / 2.75) * pos + 0.9375; - } else { - return 7.5625 * (pos -= 2.625 / 2.75) * pos + 0.984375; - } - }, - - easeInBack: (pos: number) => { - const s = 1.70158; - return pos * pos * ((s + 1) * pos - s); - }, - - easeOutBack: (pos: number) => { - const s = 1.70158; - return (pos = pos - 1) * pos * ((s + 1) * pos + s) + 1; - }, - - easeInOutBack: (pos: number) => { - let s = 1.70158; - if ((pos /= 0.5) < 1) { - return 0.5 * (pos * pos * (((s *= 1.525) + 1) * pos - s)); - } - return 0.5 * ((pos -= 2) * pos * (((s *= 1.525) + 1) * pos + s) + 2); - }, - - elastic: (pos: number) => - -1 * - Math.pow(4, -8 * pos) * - Math.sin(((pos * 6 - 1) * (2 * Math.PI)) / 2) + - 1, - - swingFromTo: (pos: number) => { - let s = 1.70158; - return (pos /= 0.5) < 1 - ? 0.5 * (pos * pos * (((s *= 1.525) + 1) * pos - s)) - : 0.5 * ((pos -= 2) * pos * (((s *= 1.525) + 1) * pos + s) + 2); - }, - - swingFrom: (pos: number) => { - const s = 1.70158; - return pos * pos * ((s + 1) * pos - s); - }, - - swingTo: (pos: number) => { - const s = 1.70158; - return (pos -= 1) * pos * ((s + 1) * pos + s) + 1; - }, - - bounce: (pos: number) => { - if (pos < 1 / 2.75) { - return 7.5625 * pos * pos; - } else if (pos < 2 / 2.75) { - return 7.5625 * (pos -= 1.5 / 2.75) * pos + 0.75; - } else if (pos < 2.5 / 2.75) { - return 7.5625 * (pos -= 2.25 / 2.75) * pos + 0.9375; - } else { - return 7.5625 * (pos -= 2.625 / 2.75) * pos + 0.984375; - } - }, - - bouncePast: (pos: number) => { - if (pos < 1 / 2.75) { - return 7.5625 * pos * pos; - } else if (pos < 2 / 2.75) { - return 2 - (7.5625 * (pos -= 1.5 / 2.75) * pos + 0.75); - } else if (pos < 2.5 / 2.75) { - return 2 - (7.5625 * (pos -= 2.25 / 2.75) * pos + 0.9375); - } else { - return 2 - (7.5625 * (pos -= 2.625 / 2.75) * pos + 0.984375); - } - }, - - easeFromTo: (pos: number) => - (pos /= 0.5) < 1 - ? 0.5 * Math.pow(pos, 4) - : -0.5 * ((pos -= 2) * Math.pow(pos, 3) - 2), - - easeFrom: (pos: number) => Math.pow(pos, 4), - - easeTo: (pos: number) => Math.pow(pos, 0.25), - }; - } - } -} diff --git a/Extensions/TweenBehavior/tweenruntimebehavior.ts b/Extensions/TweenBehavior/tweenruntimebehavior.ts index 2d693d42767c..ec1e2c7b560e 100644 --- a/Extensions/TweenBehavior/tweenruntimebehavior.ts +++ b/Extensions/TweenBehavior/tweenruntimebehavior.ts @@ -37,46 +37,12 @@ namespace gdjs { return o.setCharacterSize && o.getCharacterSize; } - function rgbToHsl(r: number, g: number, b: number): number[] { - r /= 255; - g /= 255; - b /= 255; - let v = Math.max(r, g, b), - c = v - Math.min(r, g, b), - f = 1 - Math.abs(v + v - c - 1); - let h = - c && - (v === r ? (g - b) / c : v === g ? 2 + (b - r) / c : 4 + (r - g) / c); - return [ - Math.round(60 * (h < 0 ? h + 6 : h)), - Math.round((f ? c / f : 0) * 100), - Math.round(((v + v - c) / 2) * 100), - ]; - } - - function hslToRgb(h: number, s: number, l: number): number[] { - h = h %= 360; - if (h < 0) { - h += 360; - } - s = s / 100; - l = l / 100; - const a = s * Math.min(l, 1 - l); - const f = (n = 0, k = (n + h / 30) % 12) => - l - a * Math.max(Math.min(k - 3, 9 - k, 1), -1); - return [ - Math.round(f(0) * 255), - Math.round(f(8) * 255), - Math.round(f(4) * 255), - ]; - } - const linearInterpolation = gdjs.evtTools.common.lerp; const exponentialInterpolation = gdjs.evtTools.common.exponentialInterpolation; export class TweenRuntimeBehavior extends gdjs.RuntimeBehavior { - private _tweens = new gdjs.TweenRuntimeBehavior.TweenManager(); + private _tweens = new gdjs.evtTools.tween.TweenManager(); private _isActive: boolean = true; /** @@ -211,7 +177,7 @@ namespace gdjs { easing: string, duration: float, destroyObjectWhenFinished: boolean, - timeSource: gdjs.TweenRuntimeBehavior.TimeSource + timeSource: gdjs.evtTools.tween.TimeSource ) { if (variable.getType() !== 'number') { return; @@ -328,7 +294,7 @@ namespace gdjs { easing: string, duration: float, destroyObjectWhenFinished: boolean, - timeSource: gdjs.TweenRuntimeBehavior.TimeSource + timeSource: gdjs.evtTools.tween.TimeSource ) { this._tweens.addMultiTween( identifier, @@ -400,7 +366,7 @@ namespace gdjs { easing: string, duration: float, destroyObjectWhenFinished: boolean, - timeSource: gdjs.TweenRuntimeBehavior.TimeSource + timeSource: gdjs.evtTools.tween.TimeSource ) { this._tweens.addSimpleTween( identifier, @@ -472,7 +438,7 @@ namespace gdjs { easing: string, duration: float, destroyObjectWhenFinished: boolean, - timeSource: gdjs.TweenRuntimeBehavior.TimeSource + timeSource: gdjs.evtTools.tween.TimeSource ) { this._tweens.addSimpleTween( identifier, @@ -576,7 +542,7 @@ namespace gdjs { easing: string, duration: float, destroyObjectWhenFinished: boolean, - timeSource: gdjs.TweenRuntimeBehavior.TimeSource + timeSource: gdjs.evtTools.tween.TimeSource ) { this._tweens.addSimpleTween( identifier, @@ -664,8 +630,8 @@ namespace gdjs { duration: float, destroyObjectWhenFinished: boolean, scaleFromCenterOfObject: boolean, - timeSource: gdjs.TweenRuntimeBehavior.TimeSource, - interpolation: gdjs.TweenRuntimeBehavior.Interpolation + timeSource: gdjs.evtTools.tween.TimeSource, + interpolation: gdjs.evtTools.tween.Interpolation ) { const owner = this.owner; if (!isScalable(owner)) return; @@ -765,8 +731,8 @@ namespace gdjs { duration: float, destroyObjectWhenFinished: boolean, scaleFromCenterOfObject: boolean, - timeSource: gdjs.TweenRuntimeBehavior.TimeSource, - interpolation: gdjs.TweenRuntimeBehavior.Interpolation + timeSource: gdjs.evtTools.tween.TimeSource, + interpolation: gdjs.evtTools.tween.Interpolation ) { const owner = this.owner; if (!isScalable(owner)) return; @@ -858,8 +824,8 @@ namespace gdjs { duration: float, destroyObjectWhenFinished: boolean, scaleFromCenterOfObject: boolean, - timeSource: gdjs.TweenRuntimeBehavior.TimeSource, - interpolation: gdjs.TweenRuntimeBehavior.Interpolation + timeSource: gdjs.evtTools.tween.TimeSource, + interpolation: gdjs.evtTools.tween.Interpolation ) { const owner = this.owner; if (!isScalable(owner)) return; @@ -942,7 +908,7 @@ namespace gdjs { easing: string, duration: float, destroyObjectWhenFinished: boolean, - timeSource: gdjs.TweenRuntimeBehavior.TimeSource + timeSource: gdjs.evtTools.tween.TimeSource ) { const owner = this.owner; if (!isOpaque(owner)) return; @@ -960,6 +926,109 @@ namespace gdjs { ); } + /** + * Tween a numeric object effect property. + * @param effectBehavior Only used by events can be set to null + * @param identifier Unique id to identify the tween + * @param toValue The targeted value + * @param effectName Effect name + * @param propertyName Property name + * @param easing Easing function identifier + * @param duration Duration in seconds + * @param destroyObjectWhenFinished Destroy this object when the tween ends + */ + addNumberEffectPropertyTween( + effectBehavior: any, + identifier: string, + toValue: float, + effectName: string, + propertyName: string, + easing: string, + duration: float, + destroyObjectWhenFinished: boolean + ) { + const effect = this.owner.getRendererEffects()[effectName]; + this._tweens.addSimpleTween( + identifier, + this.owner, + duration, + easing, + linearInterpolation, + effect.getDoubleParameter(propertyName), + toValue, + (value: float) => { + if (effect) { + effect.updateDoubleParameter(propertyName, value); + } + }, + destroyObjectWhenFinished ? () => this._deleteFromScene() : null + ); + } + + /** + * Tween a numeric object effect property. + * @param effectBehavior Only used by events can be set to null + * @param identifier Unique id to identify the tween + * @param toColorStr The target RGB color (format "128;200;255" with values between 0 and 255 for red, green and blue) + * @param effectName Effect name + * @param propertyName Property name + * @param easing Easing function identifier + * @param duration Duration in seconds + * @param destroyObjectWhenFinished Destroy this object when the tween ends + */ + addColorEffectPropertyTween( + effectBehavior: any, + identifier: string, + toColorStr: string, + effectName: string, + propertyName: string, + easing: string, + duration: float, + destroyObjectWhenFinished: boolean + ) { + const effect = this.owner.getRendererEffects()[effectName]; + const rgbFromColor = gdjs.hexNumberToRGB( + effect.getColorParameter(propertyName) + ); + const rgbToColor: float[] = gdjs.rgbOrHexToRGBColor(toColorStr); + + this._tweens.addMultiTween( + identifier, + this.owner, + duration, + easing, + linearInterpolation, + gdjs.evtTools.tween.rgbToHsl( + rgbFromColor.r, + rgbFromColor.g, + rgbFromColor.b + ), + gdjs.evtTools.tween.rgbToHsl( + rgbToColor[0], + rgbToColor[1], + rgbToColor[2] + ), + ([hue, saturation, lightness]) => { + if (effect) { + const rgbFromHslColor = gdjs.evtTools.tween.hslToRgb( + hue, + saturation, + lightness + ); + effect.updateColorParameter( + propertyName, + gdjs.rgbToHexNumber( + rgbFromHslColor[0], + rgbFromHslColor[1], + rgbFromHslColor[2] + ) + ); + } + }, + destroyObjectWhenFinished ? () => this._deleteFromScene() : null + ); + } + /** * Tween an object color. * @deprecated Use addObjectColorTween2 instead. @@ -1024,7 +1093,7 @@ namespace gdjs { duration: float, destroyObjectWhenFinished: boolean, useHSLColorTransition: boolean, - timeSource: gdjs.TweenRuntimeBehavior.TimeSource + timeSource: gdjs.evtTools.tween.TimeSource ) { const owner = this.owner; if (!isColorable(owner)) { @@ -1038,14 +1107,22 @@ namespace gdjs { let targetedValue; let setValue; if (useHSLColorTransition) { - initialValue = rgbToHsl( + initialValue = gdjs.evtTools.tween.rgbToHsl( rgbFromColor[0], rgbFromColor[1], rgbFromColor[2] ); - targetedValue = rgbToHsl(rgbToColor[0], rgbToColor[1], rgbToColor[2]); + targetedValue = gdjs.evtTools.tween.rgbToHsl( + rgbToColor[0], + rgbToColor[1], + rgbToColor[2] + ); setValue = ([hue, saturation, lightness]) => { - const rgbFromHslColor = hslToRgb(hue, saturation, lightness); + const rgbFromHslColor = gdjs.evtTools.tween.hslToRgb( + hue, + saturation, + lightness + ); owner.setColor( Math.floor(rgbFromHslColor[0]) + ';' + @@ -1155,14 +1232,14 @@ namespace gdjs { easing: string, duration: float, destroyObjectWhenFinished: boolean, - timeSource: gdjs.TweenRuntimeBehavior.TimeSource + timeSource: gdjs.evtTools.tween.TimeSource ) { if (!isColorable(this.owner)) return; const owner = this.owner; const rgbFromColor: string[] = owner.getColor().split(';'); if (rgbFromColor.length < 3) return; - const hslFromColor = rgbToHsl( + const hslFromColor = gdjs.evtTools.tween.rgbToHsl( parseFloat(rgbFromColor[0]), parseFloat(rgbFromColor[1]), parseFloat(rgbFromColor[2]) @@ -1188,7 +1265,11 @@ namespace gdjs { hslFromColor, [toH, toS, toL], ([hue, saturation, lightness]) => { - const rgbFromHslColor = hslToRgb(hue, saturation, lightness); + const rgbFromHslColor = gdjs.evtTools.tween.hslToRgb( + hue, + saturation, + lightness + ); owner.setColor( Math.floor(rgbFromHslColor[0]) + @@ -1262,8 +1343,8 @@ namespace gdjs { easing: string, duration: float, destroyObjectWhenFinished: boolean, - timeSource: gdjs.TweenRuntimeBehavior.TimeSource, - interpolation: gdjs.TweenRuntimeBehavior.Interpolation + timeSource: gdjs.evtTools.tween.TimeSource, + interpolation: gdjs.evtTools.tween.Interpolation ) { const owner = this.owner; if (!isCharacterScalable(owner)) return; @@ -1338,7 +1419,7 @@ namespace gdjs { easing: string, duration: float, destroyObjectWhenFinished: boolean, - timeSource: gdjs.TweenRuntimeBehavior.TimeSource + timeSource: gdjs.evtTools.tween.TimeSource ) { this._tweens.addSimpleTween( identifier, @@ -1410,7 +1491,7 @@ namespace gdjs { easing: string, duration: float, destroyObjectWhenFinished: boolean, - timeSource: gdjs.TweenRuntimeBehavior.TimeSource + timeSource: gdjs.evtTools.tween.TimeSource ) { this._tweens.addSimpleTween( identifier, @@ -1551,443 +1632,4 @@ namespace gdjs { } } gdjs.registerBehavior('Tween::TweenBehavior', gdjs.TweenRuntimeBehavior); - - export namespace TweenRuntimeBehavior { - const easingFunctions = gdjs.evtTools.tween.easingFunctions; - - /** - * A tween manager that is used for layout tweens or object tweens. - * @ignore - */ - export class TweenManager { - /** - * All the tweens of a layout or a behavior. - */ - private _tweens = new Map(); - /** - * Allow fast iteration on tween that are active. - */ - private _activeTweens = new Array(); - - constructor() {} - - /** - * Make all active tween step toward the end. - * @param timeDelta the duration from the previous step in seconds - * @param layoutTimeDelta the duration from the previous step ignoring layer time scale in seconds - */ - step(): void { - let writeIndex = 0; - for ( - let readIndex = 0; - readIndex < this._activeTweens.length; - readIndex++ - ) { - const tween = this._activeTweens[readIndex]; - - tween.step(); - if (!tween.hasFinished()) { - this._activeTweens[writeIndex] = tween; - writeIndex++; - } - } - this._activeTweens.length = writeIndex; - } - - /** - * Add a tween on one value. - */ - addSimpleTween( - identifier: string, - timeSource: TimeSource, - totalDuration: number, - easingIdentifier: string, - interpolate: Interpolation, - initialValue: float, - targetedValue: float, - setValue: (value: float) => void, - onFinish?: (() => void) | null - ): void { - const easing = easingFunctions[easingIdentifier]; - if (!easing) return; - - // Remove any prior tween - this.removeTween(identifier); - - // Initialize the tween instance - const tween = new TweenRuntimeBehavior.SimpleTweenInstance( - timeSource, - totalDuration, - easing, - interpolate, - initialValue, - targetedValue, - setValue, - onFinish - ); - this._tweens.set(identifier, tween); - this._addActiveTween(tween); - } - - /** - * Add a tween on several values. - */ - addMultiTween( - identifier: string, - timeSource: TimeSource, - totalDuration: number, - easingIdentifier: string, - interpolate: Interpolation, - initialValue: Array, - targetedValue: Array, - setValue: (value: Array) => void, - onFinish?: (() => void) | null - ): void { - const easing = easingFunctions[easingIdentifier]; - if (!easing) return; - - // Remove any prior tween - this.removeTween(identifier); - - // Initialize the tween instance - const tween = new TweenRuntimeBehavior.MultiTweenInstance( - timeSource, - totalDuration, - easing, - interpolate, - initialValue, - targetedValue, - setValue, - onFinish - ); - this._tweens.set(identifier, tween); - this._addActiveTween(tween); - } - - /** - * Tween exists. - * @param identifier Unique id to identify the tween - * @returns The tween exists - */ - exists(identifier: string): boolean { - return this._tweens.has(identifier); - } - - /** - * Tween is playing. - * @param identifier Unique id to identify the tween - */ - isPlaying(identifier: string): boolean { - const tween = this._tweens.get(identifier); - return !!tween && tween.isPlaying(); - } - - /** - * Tween has finished. - * @param identifier Unique id to identify the tween - */ - hasFinished(identifier: string): boolean { - const tween = this._tweens.get(identifier); - return !!tween && tween.hasFinished(); - } - - /** - * Pause a tween. - * @param identifier Unique id to identify the tween - */ - pauseTween(identifier: string) { - const tween = this._tweens.get(identifier); - if (!tween || !tween.isPlaying() || tween.hasFinished()) { - return; - } - this._removeActiveTween(tween); - tween.pause(); - } - - /** - * Resume a tween. - * @param identifier Unique id to identify the tween - */ - resumeTween(identifier: string) { - const tween = this._tweens.get(identifier); - if (!tween || tween.isPlaying() || tween.hasFinished()) { - return; - } - this._addActiveTween(tween); - tween.resume(); - } - - /** - * Stop a tween. - * @param identifier Unique id to identify the tween - * @param jumpToDest Move to destination - */ - stopTween(identifier: string, jumpToDest: boolean) { - const tween = this._tweens.get(identifier); - if (!tween || tween.hasFinished()) { - return; - } - if (tween.isPlaying()) { - this._removeActiveTween(tween); - } - tween.stop(jumpToDest); - } - - /** - * Remove a tween. - * @param identifier Unique id to identify the tween - */ - removeTween(identifier: string) { - const tween = this._tweens.get(identifier); - if (!tween) { - return; - } - if (tween.isPlaying()) { - this._removeActiveTween(tween); - } - this._tweens.delete(identifier); - } - - _addActiveTween(tween: TweenInstance): void { - this._activeTweens.push(tween); - } - - _removeActiveTween(tween: TweenInstance): void { - const index = this._activeTweens.findIndex( - (activeTween) => activeTween === tween - ); - this._activeTweens.splice(index, 1); - } - - /** - * Get tween progress. - * @param identifier Unique id to identify the tween - * @returns Progress of playing tween animation (between 0.0 and 1.0) - */ - getProgress(identifier: string): float { - const tween = this._tweens.get(identifier); - if (!tween) { - return 0; - } - return tween.getProgress(); - } - - /** - * Get tween value. - * - * It returns 0 for tweens with several values. - * - * @param identifier Unique id to identify the tween - * @returns Value of playing tween animation - */ - getValue(identifier: string): float { - const tween = this._tweens.get(identifier); - if (!tween) { - return 0; - } - return tween.getValue(); - } - } - - export interface TimeSource { - getElapsedTime(): float; - } - - /** - * An interpolation function. - * @ignore - */ - export type Interpolation = ( - from: float, - to: float, - progress: float - ) => float; - - const noEffect = () => {}; - - /** - * A tween. - * @ignore - */ - export interface TweenInstance { - /** - * Step toward the end. - * @param timeDelta the duration from the previous step in seconds - * @param layoutTimeDelta the duration from the previous step ignoring layer time scale in seconds - */ - step(): void; - isPlaying(): boolean; - hasFinished(): boolean; - stop(jumpToDest: boolean): void; - resume(): void; - pause(): void; - getProgress(): float; - getValue(): float; - } - - /** - * A tween. - * @ignore - */ - export abstract class AbstractTweenInstance implements TweenInstance { - protected elapsedTime: float; - protected totalDuration: float; - protected easing: (progress: float) => float; - protected interpolate: Interpolation; - protected onFinish: () => void; - protected timeSource: TimeSource; - protected isPaused = false; - - constructor( - timeSource: TimeSource, - totalDuration: float, - easing: (progress: float) => float, - interpolate: Interpolation, - onFinish?: (() => void) | null - ) { - this.timeSource = timeSource; - this.totalDuration = totalDuration; - this.easing = easing; - this.interpolate = interpolate; - this.elapsedTime = 0; - this.onFinish = onFinish || noEffect; - } - - step(): void { - if (!this.isPlaying()) { - return; - } - this.elapsedTime = Math.min( - this.elapsedTime + this.timeSource.getElapsedTime() / 1000, - this.totalDuration - ); - this._updateValue(); - } - - protected abstract _updateValue(): void; - abstract getValue(): float; - - isPlaying(): boolean { - return !this.isPaused && !this.hasFinished(); - } - - hasFinished(): boolean { - return this.elapsedTime === this.totalDuration; - } - - stop(jumpToDest: boolean): void { - this.elapsedTime = this.totalDuration; - if (jumpToDest) { - this._updateValue(); - } - } - - resume(): void { - this.isPaused = false; - } - - pause(): void { - this.isPaused = true; - } - - getProgress(): float { - return this.elapsedTime / this.totalDuration; - } - } - - /** - * A tween with only one value. - * @ignore - */ - export class SimpleTweenInstance extends AbstractTweenInstance { - initialValue: float; - targetedValue: float; - setValue: (value: float) => void; - currentValue: float; - - constructor( - timeSource: TimeSource, - totalDuration: float, - easing: (progress: float) => float, - interpolate: Interpolation, - initialValue: float, - targetedValue: float, - setValue: (value: float) => void, - onFinish?: (() => void) | null - ) { - super(timeSource, totalDuration, easing, interpolate, onFinish); - this.initialValue = initialValue; - this.currentValue = initialValue; - this.targetedValue = targetedValue; - this.setValue = setValue; - } - - protected _updateValue() { - const easedProgress = this.easing(this.getProgress()); - const value = this.interpolate( - this.initialValue, - this.targetedValue, - easedProgress - ); - this.currentValue = value; - this.setValue(value); - if (this.hasFinished()) { - this.onFinish(); - } - } - - getValue(): float { - return this.currentValue; - } - } - - /** - * A tween with multiple values. - * @ignore - */ - export class MultiTweenInstance extends AbstractTweenInstance { - initialValue: Array; - targetedValue: Array; - setValue: (value: Array) => void; - - currentValues = new Array(); - - constructor( - timeSource: TimeSource, - totalDuration: float, - easing: (progress: float) => float, - interpolate: Interpolation, - initialValue: Array, - targetedValue: Array, - setValue: (value: Array) => void, - onFinish?: (() => void) | null - ) { - super(timeSource, totalDuration, easing, interpolate, onFinish); - this.initialValue = initialValue; - this.targetedValue = targetedValue; - this.setValue = setValue; - } - - protected _updateValue() { - const easedProgress = this.easing(this.getProgress()); - const length = this.initialValue.length; - this.currentValues.length = length; - for (let index = 0; index < length; index++) { - this.currentValues[index] = this.interpolate( - this.initialValue[index], - this.targetedValue[index], - easedProgress - ); - } - this.setValue(this.currentValues); - if (this.hasFinished()) { - this.onFinish(); - } - } - - getValue(): float { - return 0; - } - } - } } diff --git a/Extensions/TweenBehavior/tweentools.ts b/Extensions/TweenBehavior/tweentools.ts index 1a70e54a388c..5e7a00383e48 100644 --- a/Extensions/TweenBehavior/tweentools.ts +++ b/Extensions/TweenBehavior/tweentools.ts @@ -4,13 +4,13 @@ Copyright (c) 2010-2023 Florian Rival (Florian.Rival@gmail.com) */ namespace gdjs { export interface RuntimeScene { - _tweens: gdjs.TweenRuntimeBehavior.TweenManager; + _tweens: gdjs.evtTools.tween.TweenManager; } export namespace evtTools { export namespace tween { export const getTweensMap = (runtimeScene: RuntimeScene) => runtimeScene._tweens || - (runtimeScene._tweens = new gdjs.TweenRuntimeBehavior.TweenManager()); + (runtimeScene._tweens = new gdjs.evtTools.tween.TweenManager()); // Layout tweens from event-based objects won't step, but it's fine // because they don't have cameras anyway. @@ -316,7 +316,7 @@ namespace gdjs { layerName: string, duration: number, easing: string, - timeSource: gdjs.TweenRuntimeBehavior.TimeSource + timeSource: gdjs.evtTools.tween.TimeSource ) => { const layer = runtimeScene.getLayer(layerName); getTweensMap(runtimeScene).addMultiTween( @@ -394,8 +394,8 @@ namespace gdjs { layerName: string, duration: number, easing: string, - timeSource: gdjs.TweenRuntimeBehavior.TimeSource, - interpolation: gdjs.TweenRuntimeBehavior.Interpolation + timeSource: gdjs.evtTools.tween.TimeSource, + interpolation: gdjs.evtTools.tween.Interpolation ) => { const layer = runtimeScene.getLayer(layerName); getTweensMap(runtimeScene).addSimpleTween( @@ -465,7 +465,7 @@ namespace gdjs { layerName: string, duration: number, easing: string, - timeSource: gdjs.TweenRuntimeBehavior.TimeSource + timeSource: gdjs.evtTools.tween.TimeSource ) => { const layer = runtimeScene.getLayer(layerName); getTweensMap(runtimeScene).addSimpleTween( @@ -479,6 +479,109 @@ namespace gdjs { (value: float) => layer.setCameraRotation(value) ); }; + + /** + * Tween a numeric object effect property. + * @param runtimeScene The scene + * @param identifier Unique id to identify the tween + * @param toValue The targeted value + * @param layerName Layer name + * @param effectName Effect name + * @param propertyName Property name + * @param easing Easing function identifier + * @param duration Duration in seconds + */ + export const tweenNumberEffectPropertyTween = ( + runtimeScene: RuntimeScene, + identifier: string, + toValue: float, + layerName: string, + effectName: string, + propertyName: string, + easing: string, + duration: float + ) => { + const layer = runtimeScene.getLayer(layerName); + const effect = layer.getRendererEffects()[effectName]; + getTweensMap(runtimeScene).addSimpleTween( + identifier, + layer, + duration, + easing, + linearInterpolation, + effect.getDoubleParameter(propertyName), + toValue, + (value: float) => { + if (effect) { + effect.updateDoubleParameter(propertyName, value); + } + } + ); + }; + + /** + * Tween a numeric object effect property. + * @param runtimeScene The scene + * @param identifier Unique id to identify the tween + * @param toColorStr The target RGB color (format "128;200;255" with values between 0 and 255 for red, green and blue) + * @param layerName Layer name + * @param effectName Effect name + * @param propertyName Property name + * @param easing Easing function identifier + * @param duration Duration in seconds + */ + export const tweenColorEffectPropertyTween = ( + runtimeScene: RuntimeScene, + identifier: string, + toColorStr: string, + layerName: string, + effectName: string, + propertyName: string, + easing: string, + duration: float + ) => { + const layer = runtimeScene.getLayer(layerName); + const effect = layer.getRendererEffects()[effectName]; + const rgbFromColor = gdjs.hexNumberToRGB( + effect.getColorParameter(propertyName) + ); + const rgbToColor: float[] = gdjs.rgbOrHexToRGBColor(toColorStr); + + getTweensMap(runtimeScene).addMultiTween( + identifier, + layer, + duration, + easing, + linearInterpolation, + gdjs.evtTools.tween.rgbToHsl( + rgbFromColor.r, + rgbFromColor.g, + rgbFromColor.b + ), + gdjs.evtTools.tween.rgbToHsl( + rgbToColor[0], + rgbToColor[1], + rgbToColor[2] + ), + ([hue, saturation, lightness]) => { + if (effect) { + const rgbFromHslColor = gdjs.evtTools.tween.hslToRgb( + hue, + saturation, + lightness + ); + effect.updateColorParameter( + propertyName, + gdjs.rgbToHexNumber( + rgbFromHslColor[0], + rgbFromHslColor[1], + rgbFromHslColor[2] + ) + ); + } + } + ); + }; } } } diff --git a/GDJS/Runtime/RuntimeLayer.ts b/GDJS/Runtime/RuntimeLayer.ts index 1507a20842da..3e3bb7d583e6 100644 --- a/GDJS/Runtime/RuntimeLayer.ts +++ b/GDJS/Runtime/RuntimeLayer.ts @@ -370,6 +370,15 @@ namespace gdjs { return this._initialEffectsData; } + /** + * Returns the collection of effects to be rendered by the + * underlying renderer. + * @returns The renderer effects. + */ + getRendererEffects() { + return this._rendererEffects; + } + /** * Add a new effect, or replace the one with the same name. * @param effectData The data of the effect to add. diff --git a/GDJS/Runtime/pixi-renderers/pixi-filters-tools.ts b/GDJS/Runtime/pixi-renderers/pixi-filters-tools.ts index 798801afd0dc..43ca6fa41e2f 100644 --- a/GDJS/Runtime/pixi-renderers/pixi-filters-tools.ts +++ b/GDJS/Runtime/pixi-renderers/pixi-filters-tools.ts @@ -106,6 +106,9 @@ namespace gdjs { updateStringParameter(parameterName: string, value: string): void; /** The function to be called to update a parameter (with a boolean) */ updateBooleanParameter(parameterName: string, value: boolean): void; + updateColorParameter(parameterName: string, value: number): void; + getDoubleParameter(parameterName: string): number; + getColorParameter(parameterName: string): number; } /** A wrapper allowing to create a PIXI filter and update it using a common interface */ @@ -146,6 +149,19 @@ namespace gdjs { parameterName: string, value: boolean ): void; + abstract updateColorParameter( + filter: PIXI.Filter, + parameterName: string, + value: number + ): void; + abstract getDoubleParameter( + filter: PIXI.Filter, + parameterName: string + ): number; + abstract getColorParameter( + filter: PIXI.Filter, + parameterName: string + ): number; } /**An effect used to manipulate a Pixi filter. */ @@ -225,9 +241,31 @@ namespace gdjs { value ); } + + updateColorParameter(parameterName: string, value: number): void { + this.filterCreator.updateColorParameter( + this.pixiFilter, + parameterName, + value + ); + } + + getDoubleParameter(parameterName: string): number { + return this.filterCreator.getDoubleParameter( + this.pixiFilter, + parameterName + ); + } + + getColorParameter(parameterName: string): number { + return this.filterCreator.getColorParameter( + this.pixiFilter, + parameterName + ); + } } - export class EmptyFilter { + export class EmptyFilter implements Filter { isEnabled(target: EffectsTarget): boolean { return false; } @@ -244,6 +282,13 @@ namespace gdjs { updateDoubleParameter(parameterName: string, value: number): void {} updateStringParameter(parameterName: string, value: string): void {} updateBooleanParameter(parameterName: string, value: boolean): void {} + updateColorParameter(parameterName: string, value: number): void {} + getDoubleParameter(parameterName: string): number { + return 0; + } + getColorParameter(parameterName: string): number { + return 0; + } } } } diff --git a/newIDE/app/src/InstructionOrExpression/EnumerateInstructions.js b/newIDE/app/src/InstructionOrExpression/EnumerateInstructions.js index 434e8eb7080c..6e6937072494 100644 --- a/newIDE/app/src/InstructionOrExpression/EnumerateInstructions.js +++ b/newIDE/app/src/InstructionOrExpression/EnumerateInstructions.js @@ -23,7 +23,8 @@ const freeInstructionsToKeep = { const isObjectInstruction = ( instructionMetadata: gdInstructionMetadata, - objectType?: string + objectType?: string, + objectBehaviorTypes?: Set ): boolean => { let firstParameterIndex = -1; for ( @@ -51,13 +52,19 @@ const isObjectInstruction = ( ) { return false; } - if (firstParameterIndex === instructionMetadata.getParametersCount() - 1) { - return true; + + for (let parameterIndex = firstParameterIndex + 1; parameterIndex < instructionMetadata.getParametersCount(); parameterIndex++) { + const parameter = instructionMetadata.getParameter( + parameterIndex + ); + if (!gd.ParameterMetadata.isBehavior(parameter.getType())) { + return true; + } + if (!objectBehaviorTypes || !objectBehaviorTypes.has(parameter.getExtraInfo())) { + return false; + } } - const secondParameter = instructionMetadata.getParameter( - firstParameterIndex + 1 - ); - return !gd.ParameterMetadata.isBehavior(secondParameter.getType()); + return true; }; const isBehaviorInstruction = ( @@ -267,7 +274,9 @@ const enumerateExtensionInstructions = ( prefix: string, instructions: gdMapStringInstructionMetadata, scope: InstructionOrExpressionScope, - i18n: I18nType + i18n: I18nType, + objectType?: string, + objectBehaviorTypes?: Set ): Array => { //Get the map containing the metadata of the instructions provided by the extension... const instructionsTypes = instructions.keys(); @@ -277,11 +286,12 @@ const enumerateExtensionInstructions = ( for (let j = 0; j < instructionsTypes.size(); ++j) { const type = instructionsTypes.at(j); const instrMetadata = instructions.get(type); - if (instrMetadata.isHidden()) continue; - - allInstructions.push( - enumerateInstruction(prefix, type, instrMetadata, scope, i18n) - ); + if (!instrMetadata.isHidden() && + isObjectInstruction(instrMetadata, objectType, objectBehaviorTypes)) { + allInstructions.push( + enumerateInstruction(prefix, type, instrMetadata, scope, i18n) + ); + } } return allInstructions; @@ -514,7 +524,11 @@ export const enumerateObjectAndBehaviorsInstructions = ( ? extension.getAllConditionsForBehavior(behaviorType) : extension.getAllActionsForBehavior(behaviorType), scope, - i18n + i18n, + // Allow behaviors to have some of their instruction to be restricted + // to some type of object. + objectType, + objectBehaviorTypes, ), ...freeBehaviorInstructions, ...allInstructions, From 851830fe50df6c16535a5ce4503c47f4cbfc2c2e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Davy=20H=C3=A9lard?= Date: Sun, 3 Dec 2023 18:07:51 +0100 Subject: [PATCH 02/13] Fix tests. --- GDJS/tests/karma.conf.js | 2 +- .../EnumerateInstructions.js | 24 ++++++++++++------- 2 files changed, 17 insertions(+), 9 deletions(-) diff --git a/GDJS/tests/karma.conf.js b/GDJS/tests/karma.conf.js index c14839fef2e6..da2b2eff95a0 100644 --- a/GDJS/tests/karma.conf.js +++ b/GDJS/tests/karma.conf.js @@ -121,7 +121,7 @@ module.exports = function (config) { './newIDE/app/resources/GDJS/Runtime/Extensions/TextObject/textruntimeobject.js', './newIDE/app/resources/GDJS/Runtime/Extensions/TextObject/textruntimeobject-pixi-renderer.js', './newIDE/app/resources/GDJS/Runtime/Extensions/TopDownMovementBehavior/topdownmovementruntimebehavior.js', - './newIDE/app/resources/GDJS/Runtime/Extensions/TweenBehavior/standard-easing-functions.js', + './newIDE/app/resources/GDJS/Runtime/Extensions/TweenBehavior/TweenManager.js', './newIDE/app/resources/GDJS/Runtime/Extensions/TweenBehavior/tweentools.js', './newIDE/app/resources/GDJS/Runtime/Extensions/TweenBehavior/tweenruntimebehavior.js', './newIDE/app/resources/GDJS/Runtime/Extensions/Firebase/A_firebasejs/*.js', diff --git a/newIDE/app/src/InstructionOrExpression/EnumerateInstructions.js b/newIDE/app/src/InstructionOrExpression/EnumerateInstructions.js index 6e6937072494..7dbd79c4531b 100644 --- a/newIDE/app/src/InstructionOrExpression/EnumerateInstructions.js +++ b/newIDE/app/src/InstructionOrExpression/EnumerateInstructions.js @@ -53,14 +53,19 @@ const isObjectInstruction = ( return false; } - for (let parameterIndex = firstParameterIndex + 1; parameterIndex < instructionMetadata.getParametersCount(); parameterIndex++) { - const parameter = instructionMetadata.getParameter( - parameterIndex - ); + if (!objectBehaviorTypes) { + return true; + } + for ( + let parameterIndex = firstParameterIndex + 1; + parameterIndex < instructionMetadata.getParametersCount(); + parameterIndex++ + ) { + const parameter = instructionMetadata.getParameter(parameterIndex); if (!gd.ParameterMetadata.isBehavior(parameter.getType())) { return true; } - if (!objectBehaviorTypes || !objectBehaviorTypes.has(parameter.getExtraInfo())) { + if (!objectBehaviorTypes.has(parameter.getExtraInfo())) { return false; } } @@ -286,8 +291,11 @@ const enumerateExtensionInstructions = ( for (let j = 0; j < instructionsTypes.size(); ++j) { const type = instructionsTypes.at(j); const instrMetadata = instructions.get(type); - if (!instrMetadata.isHidden() && - isObjectInstruction(instrMetadata, objectType, objectBehaviorTypes)) { + if ( + !instrMetadata.isHidden() && + (!objectType || + isObjectInstruction(instrMetadata, objectType, objectBehaviorTypes)) + ) { allInstructions.push( enumerateInstruction(prefix, type, instrMetadata, scope, i18n) ); @@ -528,7 +536,7 @@ export const enumerateObjectAndBehaviorsInstructions = ( // Allow behaviors to have some of their instruction to be restricted // to some type of object. objectType, - objectBehaviorTypes, + objectBehaviorTypes ), ...freeBehaviorInstructions, ...allInstructions, From 0a7db4f292c9b77f4b1858c5cd5ed3f0c611649f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Davy=20H=C3=A9lard?= Date: Sun, 3 Dec 2023 20:51:40 +0100 Subject: [PATCH 03/13] Add tests on effect tweens. --- .../TweenBehavior/tests/LayoutTween.spec.js | 54 +++++++++++++++++++ .../TweenBehavior/tests/TweenBehavior.spec.js | 52 ++++++++++++++++++ .../TweenBehavior/tweenruntimebehavior.ts | 4 +- Extensions/TweenBehavior/tweentools.ts | 4 +- GDJS/Runtime/runtimeobject.ts | 4 +- GDJS/tests/karma.conf.js | 2 + 6 files changed, 115 insertions(+), 5 deletions(-) diff --git a/Extensions/TweenBehavior/tests/LayoutTween.spec.js b/Extensions/TweenBehavior/tests/LayoutTween.spec.js index f4df635126cf..46189826c0a8 100644 --- a/Extensions/TweenBehavior/tests/LayoutTween.spec.js +++ b/Extensions/TweenBehavior/tests/LayoutTween.spec.js @@ -300,4 +300,58 @@ describe('gdjs.TweenRuntimeBehavior', () => { checkProgress(6, () => camera.getCameraRotation(layout, '', 0)); expect(camera.getCameraRotation(layout, '', 0)).to.be(440); }); + + it('can tween a number effect property', () => { + const layer = layout.getLayer(''); + layer.addEffect({ + effectType: 'Outline', + name: 'MyEffect', + doubleParameters: { padding: 0, thickness: 200 }, + stringParameters: { color: '16;32;64' }, + booleanParameters: {}, + }); + tween.tweenNumberEffectPropertyTween( + layout, + 'MyTween', + 600, + '', + 'MyEffect', + 'thickness', + 'linear', + 0.25 + ); + checkProgress(6, () => + layer.getRendererEffects()['MyEffect'].getDoubleParameter('thickness') + ); + expect( + layer.getRendererEffects()['MyEffect'].getDoubleParameter('thickness') + ).to.be(440); + }); + + it('can tween a color effect property', () => { + const layer = layout.getLayer(''); + layer.addEffect({ + effectType: 'Outline', + name: 'MyEffect', + doubleParameters: { padding: 0, thickness: 200 }, + stringParameters: { color: '16;32;64' }, + booleanParameters: {}, + }); + tween.tweenColorEffectPropertyTween( + layout, + 'MyTween', + '255;192;128', + '', + 'MyEffect', + 'color', + 'linear', + 0.25 + ); + checkProgress(6, () => + layer.getRendererEffects()['MyEffect'].getColorParameter('color') + ); + expect( + layer.getRendererEffects()['MyEffect'].getColorParameter('color') + ).to.be(gdjs.rgbOrHexStringToNumber('76;235;27')); + }); }); diff --git a/Extensions/TweenBehavior/tests/TweenBehavior.spec.js b/Extensions/TweenBehavior/tests/TweenBehavior.spec.js index 1ea7161eaddc..641c3e086243 100644 --- a/Extensions/TweenBehavior/tests/TweenBehavior.spec.js +++ b/Extensions/TweenBehavior/tests/TweenBehavior.spec.js @@ -425,6 +425,58 @@ describe('gdjs.TweenRuntimeBehavior', () => { expect(object.getHeight()).to.be(440); }); + it('can tween a number effect property', () => { + sprite.addEffect({ + effectType: 'Outline', + name: 'MyEffect', + doubleParameters: { padding: 0, thickness: 200 }, + stringParameters: { color: '16;32;64' }, + booleanParameters: {}, + }); + spriteBehavior.addNumberEffectPropertyTween( + null, + 'MyTween', + 600, + 'MyEffect', + 'thickness', + 'linear', + 0.25, + false + ); + checkProgress(6, () => + sprite.getRendererEffects()['MyEffect'].getDoubleParameter('thickness') + ); + expect( + sprite.getRendererEffects()['MyEffect'].getDoubleParameter('thickness') + ).to.be(440); + }); + + it('can tween a color effect property', () => { + sprite.addEffect({ + effectType: 'Outline', + name: 'MyEffect', + doubleParameters: { padding: 0, thickness: 200 }, + stringParameters: { color: '16;32;64' }, + booleanParameters: {}, + }); + spriteBehavior.addColorEffectPropertyTween( + null, + 'MyTween', + '255;192;128', + 'MyEffect', + 'color', + 'linear', + 0.25, + false + ); + checkProgress(6, () => + sprite.getRendererEffects()['MyEffect'].getColorParameter('color') + ); + expect( + sprite.getRendererEffects()['MyEffect'].getColorParameter('color') + ).to.be(gdjs.rgbOrHexStringToNumber('76;235;27')); + }); + it('can tween the opacity', () => { sprite.setOpacity(128); spriteBehavior.addObjectOpacityTween2( diff --git a/Extensions/TweenBehavior/tweenruntimebehavior.ts b/Extensions/TweenBehavior/tweenruntimebehavior.ts index ec1e2c7b560e..b13cc6811ca3 100644 --- a/Extensions/TweenBehavior/tweenruntimebehavior.ts +++ b/Extensions/TweenBehavior/tweenruntimebehavior.ts @@ -954,7 +954,7 @@ namespace gdjs { duration, easing, linearInterpolation, - effect.getDoubleParameter(propertyName), + effect ? effect.getDoubleParameter(propertyName) : 0, toValue, (value: float) => { if (effect) { @@ -988,7 +988,7 @@ namespace gdjs { ) { const effect = this.owner.getRendererEffects()[effectName]; const rgbFromColor = gdjs.hexNumberToRGB( - effect.getColorParameter(propertyName) + effect ? effect.getColorParameter(propertyName) : 0 ); const rgbToColor: float[] = gdjs.rgbOrHexToRGBColor(toColorStr); diff --git a/Extensions/TweenBehavior/tweentools.ts b/Extensions/TweenBehavior/tweentools.ts index 5e7a00383e48..b402815a45df 100644 --- a/Extensions/TweenBehavior/tweentools.ts +++ b/Extensions/TweenBehavior/tweentools.ts @@ -509,7 +509,7 @@ namespace gdjs { duration, easing, linearInterpolation, - effect.getDoubleParameter(propertyName), + effect ? effect.getDoubleParameter(propertyName) : 0, toValue, (value: float) => { if (effect) { @@ -543,7 +543,7 @@ namespace gdjs { const layer = runtimeScene.getLayer(layerName); const effect = layer.getRendererEffects()[effectName]; const rgbFromColor = gdjs.hexNumberToRGB( - effect.getColorParameter(propertyName) + effect ? effect.getColorParameter(propertyName) : 0 ); const rgbToColor: float[] = gdjs.rgbOrHexToRGBColor(toColorStr); diff --git a/GDJS/Runtime/runtimeobject.ts b/GDJS/Runtime/runtimeobject.ts index 7d84b6064a14..68c912d4cede 100644 --- a/GDJS/Runtime/runtimeobject.ts +++ b/GDJS/Runtime/runtimeobject.ts @@ -1042,7 +1042,9 @@ namespace gdjs { */ addEffect(effectData: EffectData): boolean { const rendererObject = this.getRendererObject(); - if (!rendererObject) return false; + if (!rendererObject) { + return false; + } return this._runtimeScene .getGame() diff --git a/GDJS/tests/karma.conf.js b/GDJS/tests/karma.conf.js index da2b2eff95a0..72e8e2d3ecc5 100644 --- a/GDJS/tests/karma.conf.js +++ b/GDJS/tests/karma.conf.js @@ -126,6 +126,8 @@ module.exports = function (config) { './newIDE/app/resources/GDJS/Runtime/Extensions/TweenBehavior/tweenruntimebehavior.js', './newIDE/app/resources/GDJS/Runtime/Extensions/Firebase/A_firebasejs/*.js', './newIDE/app/resources/GDJS/Runtime/Extensions/Firebase/B_firebasetools/*.js', + './newIDE/app/resources/GDJS/Runtime/Extensions/Effects/outline-pixi-filter.js', + './newIDE/app/resources/GDJS/Runtime/Extensions/Effects/pixi-filters/filter-outline.js', './newIDE/app/resources/GDJS/Runtime/Extensions/Effects/kawase-blur-pixi-filter.js', './newIDE/app/resources/GDJS/Runtime/Extensions/Effects/pixi-filters/filter-kawase-blur.js', './newIDE/app/resources/GDJS/Runtime/Extensions/TileMap/tilemapcollisionmaskruntimeobject.js', From 7da125e149b13380bf28832e36e16801845112e1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Davy=20H=C3=A9lard?= Date: Sun, 3 Dec 2023 21:39:49 +0100 Subject: [PATCH 04/13] Fix sentences. --- Extensions/TweenBehavior/JsExtension.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Extensions/TweenBehavior/JsExtension.js b/Extensions/TweenBehavior/JsExtension.js index c0bacab19c95..d38ebed8626c 100644 --- a/Extensions/TweenBehavior/JsExtension.js +++ b/Extensions/TweenBehavior/JsExtension.js @@ -393,7 +393,7 @@ module.exports = { _('Tween number effect property'), _('Tweens a number effect property from its current value to a new one.'), _( - 'Tween the property _PARAM5_ for effect _PARAM4_ of _PARAM0_ to _PARAM3_ with easing _PARAM6_ over _PARAM7_ seconds as _PARAM2_' + 'Tween the property _PARAM5_ for effect _PARAM4_ of _PARAM3_ to _PARAM2_ with easing _PARAM6_ over _PARAM7_ seconds as _PARAM2_' ), _('Scene Tweens'), 'JsPlatform/Extensions/tween_behavior24.png', @@ -419,7 +419,7 @@ module.exports = { _('Tween color effect property'), _('Tweens a color effect property from its current value to a new one.'), _( - 'Tween the color property _PARAM5_ for effect _PARAM4_ of _PARAM0_ to _PARAM3_ with easing _PARAM6_ over _PARAM7_ seconds as _PARAM2_' + 'Tween the color property _PARAM5_ for effect _PARAM4_ of _PARAM3_ to _PARAM2_ with easing _PARAM6_ over _PARAM7_ seconds as _PARAM2_' ), _('Scene Tweens'), 'JsPlatform/Extensions/tween_behavior24.png', From dccd6e540ee6b3019097c3326889b343ef268763 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Davy=20H=C3=A9lard?= Date: Mon, 4 Dec 2023 11:49:03 +0100 Subject: [PATCH 05/13] Fix behavior check on free instructions. --- .../app/src/InstructionOrExpression/EnumerateInstructions.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/newIDE/app/src/InstructionOrExpression/EnumerateInstructions.js b/newIDE/app/src/InstructionOrExpression/EnumerateInstructions.js index 7dbd79c4531b..00c209bc119a 100644 --- a/newIDE/app/src/InstructionOrExpression/EnumerateInstructions.js +++ b/newIDE/app/src/InstructionOrExpression/EnumerateInstructions.js @@ -157,6 +157,7 @@ const enumerateExtraObjectInstructions = ( isCondition: boolean, extension: gdPlatformExtension, objectType: string, + objectBehaviorTypes?: Set, scope: InstructionOrExpressionScope, i18n: I18nType ): Array => { @@ -174,7 +175,7 @@ const enumerateExtraObjectInstructions = ( const instrMetadata = instructions.get(type); if ( !instrMetadata.isHidden() && - isObjectInstruction(instrMetadata, objectType) + isObjectInstruction(instrMetadata, objectType, objectBehaviorTypes) ) { allInstructions.push( enumerateInstruction('', type, instrMetadata, scope, i18n) @@ -465,6 +466,7 @@ export const enumerateObjectAndBehaviorsInstructions = ( isCondition, extension, objectType, + objectBehaviorTypes, scope, i18n ), From f170ae768aeda6c5e534277a469ac78d3f48284b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Davy=20H=C3=A9lard?= Date: Mon, 4 Dec 2023 11:56:09 +0100 Subject: [PATCH 06/13] Review change: typo in doc --- Extensions/TweenBehavior/tweentools.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Extensions/TweenBehavior/tweentools.ts b/Extensions/TweenBehavior/tweentools.ts index b402815a45df..8e6a78ac1f69 100644 --- a/Extensions/TweenBehavior/tweentools.ts +++ b/Extensions/TweenBehavior/tweentools.ts @@ -520,7 +520,7 @@ namespace gdjs { }; /** - * Tween a numeric object effect property. + * Tween a color object effect property. * @param runtimeScene The scene * @param identifier Unique id to identify the tween * @param toColorStr The target RGB color (format "128;200;255" with values between 0 and 255 for red, green and blue) From 14698a67aff2115a7c832ad47cf9c4c408438bd3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Davy=20H=C3=A9lard?= Date: Mon, 4 Dec 2023 11:58:02 +0100 Subject: [PATCH 07/13] Forgot this --- Extensions/TweenBehavior/tweenruntimebehavior.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Extensions/TweenBehavior/tweenruntimebehavior.ts b/Extensions/TweenBehavior/tweenruntimebehavior.ts index b13cc6811ca3..1bb064c6bb8e 100644 --- a/Extensions/TweenBehavior/tweenruntimebehavior.ts +++ b/Extensions/TweenBehavior/tweenruntimebehavior.ts @@ -966,7 +966,7 @@ namespace gdjs { } /** - * Tween a numeric object effect property. + * Tween a color object effect property. * @param effectBehavior Only used by events can be set to null * @param identifier Unique id to identify the tween * @param toColorStr The target RGB color (format "128;200;255" with values between 0 and 255 for red, green and blue) From 89cb2320e8f0af59daf21bdd72aa8ddbfd57f14d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Davy=20H=C3=A9lard?= Date: Mon, 4 Dec 2023 12:04:27 +0100 Subject: [PATCH 08/13] Fix sentences. --- Extensions/TweenBehavior/JsExtension.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Extensions/TweenBehavior/JsExtension.js b/Extensions/TweenBehavior/JsExtension.js index d38ebed8626c..721b5f0d0222 100644 --- a/Extensions/TweenBehavior/JsExtension.js +++ b/Extensions/TweenBehavior/JsExtension.js @@ -393,7 +393,7 @@ module.exports = { _('Tween number effect property'), _('Tweens a number effect property from its current value to a new one.'), _( - 'Tween the property _PARAM5_ for effect _PARAM4_ of _PARAM3_ to _PARAM2_ with easing _PARAM6_ over _PARAM7_ seconds as _PARAM2_' + 'Tween the property _PARAM5_ for effect _PARAM4_ of _PARAM3_ to _PARAM2_ with easing _PARAM6_ over _PARAM7_ seconds as _PARAM1_' ), _('Scene Tweens'), 'JsPlatform/Extensions/tween_behavior24.png', @@ -419,7 +419,7 @@ module.exports = { _('Tween color effect property'), _('Tweens a color effect property from its current value to a new one.'), _( - 'Tween the color property _PARAM5_ for effect _PARAM4_ of _PARAM3_ to _PARAM2_ with easing _PARAM6_ over _PARAM7_ seconds as _PARAM2_' + 'Tween the color property _PARAM5_ for effect _PARAM4_ of _PARAM3_ to _PARAM2_ with easing _PARAM6_ over _PARAM7_ seconds as _PARAM1_' ), _('Scene Tweens'), 'JsPlatform/Extensions/tween_behavior24.png', @@ -1543,7 +1543,7 @@ module.exports = { _('Tween number effect property'), _('Tweens a number effect property from its current value to a new one.'), _( - 'Tween the property _PARAM5_ for effect _PARAM4_ of _PARAM0_ to _PARAM3_ with easing _PARAM6_ over _PARAM7_ seconds as _PARAM2_' + 'Tween the property _PARAM6_ for effect _PARAM5_ of _PARAM0_ to _PARAM4_ with easing _PARAM7_ over _PARAM8_ seconds as _PARAM3_' ), _('Effects'), 'JsPlatform/Extensions/tween_behavior24.png', @@ -1575,7 +1575,7 @@ module.exports = { _('Tween color effect property'), _('Tweens a color effect property from its current value to a new one.'), _( - 'Tween the color property _PARAM5_ for effect _PARAM4_ of _PARAM0_ to _PARAM3_ with easing _PARAM6_ over _PARAM7_ seconds as _PARAM2_' + 'Tween the color property _PARAM6_ for effect _PARAM5_ of _PARAM0_ to _PARAM4_ with easing _PARAM7_ over _PARAM8_ seconds as _PARAM3_' ), _('Effects'), 'JsPlatform/Extensions/tween_behavior24.png', From be8cf40fd15978fecb493f9820149151fa3b83c9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Davy=20H=C3=A9lard?= Date: Mon, 4 Dec 2023 13:05:09 +0100 Subject: [PATCH 09/13] Fix any ts-ignore. --- Extensions/Effects/bevel-pixi-filter.ts | 18 ++++++++++----- Extensions/Effects/brightness-pixi-filter.ts | 12 ++++++---- .../Effects/color-replace-pixi-filter.ts | 23 +++++++++++++------ Extensions/Effects/pixelate-pixi-filter.ts | 11 ++++++--- 4 files changed, 44 insertions(+), 20 deletions(-) diff --git a/Extensions/Effects/bevel-pixi-filter.ts b/Extensions/Effects/bevel-pixi-filter.ts index 40d37a2e0c25..bc83bfaa2b29 100644 --- a/Extensions/Effects/bevel-pixi-filter.ts +++ b/Extensions/Effects/bevel-pixi-filter.ts @@ -1,4 +1,8 @@ namespace gdjs { + interface BevelFilterExtra { + /** It's defined for the configuration but not for the filter. */ + distance: number; + } gdjs.PixiFiltersTools.registerFilterCreator( 'Bevel', new (class extends gdjs.PixiFiltersTools.PixiFilterCreator { @@ -12,13 +16,13 @@ namespace gdjs { parameterName: string, value: number ) { - const bevelFilter = (filter as unknown) as PIXI.filters.BevelFilter; + const bevelFilter = (filter as unknown) as PIXI.filters.BevelFilter & + BevelFilterExtra; if (parameterName === 'rotation') { bevelFilter.rotation = value; } else if (parameterName === 'thickness') { bevelFilter.thickness = value; } else if (parameterName === 'distance') { - // @ts-ignore bevelFilter.distance = value; } else if (parameterName === 'lightAlpha') { bevelFilter.lightAlpha = value; @@ -27,7 +31,8 @@ namespace gdjs { } } getDoubleParameter(filter: PIXI.Filter, parameterName: string): number { - const bevelFilter = (filter as unknown) as PIXI.filters.BevelFilter; + const bevelFilter = (filter as unknown) as PIXI.filters.BevelFilter & + BevelFilterExtra; if (parameterName === 'rotation') { return bevelFilter.rotation; } @@ -35,7 +40,6 @@ namespace gdjs { return bevelFilter.thickness; } if (parameterName === 'distance') { - // @ts-ignore return bevelFilter.distance; } if (parameterName === 'lightAlpha') { @@ -51,7 +55,8 @@ namespace gdjs { parameterName: string, value: string ) { - const bevelFilter = (filter as unknown) as PIXI.filters.BevelFilter; + const bevelFilter = (filter as unknown) as PIXI.filters.BevelFilter & + BevelFilterExtra; if (parameterName === 'lightColor') { bevelFilter.lightColor = gdjs.PixiFiltersTools.rgbOrHexToHexNumber( value @@ -68,7 +73,8 @@ namespace gdjs { parameterName: string, value: number ): void { - const bevelFilter = (filter as unknown) as PIXI.filters.BevelFilter; + const bevelFilter = (filter as unknown) as PIXI.filters.BevelFilter & + BevelFilterExtra; if (parameterName === 'lightColor') { bevelFilter.lightColor = value; } diff --git a/Extensions/Effects/brightness-pixi-filter.ts b/Extensions/Effects/brightness-pixi-filter.ts index 5e8239cf6dbf..a03ee3cf4446 100644 --- a/Extensions/Effects/brightness-pixi-filter.ts +++ b/Extensions/Effects/brightness-pixi-filter.ts @@ -1,4 +1,8 @@ namespace gdjs { + interface BrightnessFilterExtra { + /** It allows to get back the value as the filter uses a matrix. */ + __brightness: number; + } gdjs.PixiFiltersTools.registerFilterCreator( 'Brightness', new (class extends gdjs.PixiFiltersTools.PixiFilterCreator { @@ -13,19 +17,19 @@ namespace gdjs { parameterName: string, value: number ) { - const brightnessFilter = (filter as unknown) as PIXI.ColorMatrixFilter; + const brightnessFilter = (filter as unknown) as PIXI.ColorMatrixFilter & + BrightnessFilterExtra; if (parameterName !== 'brightness') { return; } const brightness = gdjs.PixiFiltersTools.clampValue(value, 0, 1); - //@ts-ignore brightnessFilter.__brightness = brightness; brightnessFilter.brightness(brightness, false); } getDoubleParameter(filter: PIXI.Filter, parameterName: string): number { - const brightnessFilter = (filter as unknown) as PIXI.ColorMatrixFilter; + const brightnessFilter = (filter as unknown) as PIXI.ColorMatrixFilter & + BrightnessFilterExtra; if (parameterName === 'brightness') { - //@ts-ignore return brightnessFilter.__brightness; } return 0; diff --git a/Extensions/Effects/color-replace-pixi-filter.ts b/Extensions/Effects/color-replace-pixi-filter.ts index 555f143435b9..ba0ecd5bab37 100644 --- a/Extensions/Effects/color-replace-pixi-filter.ts +++ b/Extensions/Effects/color-replace-pixi-filter.ts @@ -1,4 +1,10 @@ namespace gdjs { + interface ColorReplaceFilterExtra { + /** It's only set to a number. */ + originalColor: number; + /** It's only set to a number. */ + newColor: number; + } gdjs.PixiFiltersTools.registerFilterCreator( 'ColorReplace', new (class extends gdjs.PixiFiltersTools.PixiFilterCreator { @@ -12,13 +18,15 @@ namespace gdjs { parameterName: string, value: number ) { - const colorReplaceFilter = (filter as unknown) as PIXI.filters.ColorReplaceFilter; + const colorReplaceFilter = (filter as unknown) as PIXI.filters.ColorReplaceFilter & + ColorReplaceFilterExtra; if (parameterName === 'epsilon') { colorReplaceFilter.epsilon = value; } } getDoubleParameter(filter: PIXI.Filter, parameterName: string): number { - const colorReplaceFilter = (filter as unknown) as PIXI.filters.ColorReplaceFilter; + const colorReplaceFilter = (filter as unknown) as PIXI.filters.ColorReplaceFilter & + ColorReplaceFilterExtra; if (parameterName === 'epsilon') { return colorReplaceFilter.epsilon; } @@ -29,7 +37,8 @@ namespace gdjs { parameterName: string, value: string ) { - const colorReplaceFilter = (filter as unknown) as PIXI.filters.ColorReplaceFilter; + const colorReplaceFilter = (filter as unknown) as PIXI.filters.ColorReplaceFilter & + ColorReplaceFilterExtra; if (parameterName === 'originalColor') { colorReplaceFilter.originalColor = gdjs.PixiFiltersTools.rgbOrHexToHexNumber( value @@ -45,7 +54,8 @@ namespace gdjs { parameterName: string, value: number ): void { - const colorReplaceFilter = (filter as unknown) as PIXI.filters.ColorReplaceFilter; + const colorReplaceFilter = (filter as unknown) as PIXI.filters.ColorReplaceFilter & + ColorReplaceFilterExtra; if (parameterName === 'originalColor') { colorReplaceFilter.originalColor = value; } else if (parameterName === 'newColor') { @@ -53,12 +63,11 @@ namespace gdjs { } } getColorParameter(filter: PIXI.Filter, parameterName: string): number { - const colorReplaceFilter = (filter as unknown) as PIXI.filters.ColorReplaceFilter; + const colorReplaceFilter = (filter as unknown) as PIXI.filters.ColorReplaceFilter & + ColorReplaceFilterExtra; if (parameterName === 'originalColor') { - //@ts-ignore return colorReplaceFilter.originalColor; } else if (parameterName === 'newColor') { - //@ts-ignore return colorReplaceFilter.newColor; } return 0; diff --git a/Extensions/Effects/pixelate-pixi-filter.ts b/Extensions/Effects/pixelate-pixi-filter.ts index fd81ae60b50b..bcac7fd597a8 100644 --- a/Extensions/Effects/pixelate-pixi-filter.ts +++ b/Extensions/Effects/pixelate-pixi-filter.ts @@ -1,4 +1,8 @@ namespace gdjs { + interface PixelateFilterExtra { + /** It's only set to a number. */ + size: number; + } gdjs.PixiFiltersTools.registerFilterCreator( 'Pixelate', new (class extends gdjs.PixiFiltersTools.PixiFilterCreator { @@ -14,15 +18,16 @@ namespace gdjs { parameterName: string, value: number ) { - const pixelateFilter = (filter as unknown) as PIXI.filters.PixelateFilter; + const pixelateFilter = (filter as unknown) as PIXI.filters.PixelateFilter & + PixelateFilterExtra; if (parameterName === 'size') { pixelateFilter.size = value; } } getDoubleParameter(filter: PIXI.Filter, parameterName: string): number { - const pixelateFilter = (filter as unknown) as PIXI.filters.PixelateFilter; + const pixelateFilter = (filter as unknown) as PIXI.filters.PixelateFilter & + PixelateFilterExtra; if (parameterName === 'size') { - //@ts-ignore return pixelateFilter.size; } return 0; From 04008a430cae62286e750c82a989c6b38d75ad41 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Davy=20H=C3=A9lard?= Date: Mon, 4 Dec 2023 13:17:18 +0100 Subject: [PATCH 10/13] Add some comments. --- .../InstructionOrExpression/EnumerateInstructions.js | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/newIDE/app/src/InstructionOrExpression/EnumerateInstructions.js b/newIDE/app/src/InstructionOrExpression/EnumerateInstructions.js index 00c209bc119a..36c74bd75bb1 100644 --- a/newIDE/app/src/InstructionOrExpression/EnumerateInstructions.js +++ b/newIDE/app/src/InstructionOrExpression/EnumerateInstructions.js @@ -21,6 +21,13 @@ const freeInstructionsToKeep = { Scene3D: ['Scene3D::TurnCameraTowardObject'], }; +/** + * Check if the instruction can be use according to an object and its behaviors. + * @param {*} instructionMetadata The instruction being checked + * @param {*} objectType The object type + * @param {*} objectBehaviorTypes The object behaviors + * @returns + */ const isObjectInstruction = ( instructionMetadata: gdInstructionMetadata, objectType?: string, @@ -54,6 +61,7 @@ const isObjectInstruction = ( } if (!objectBehaviorTypes) { + // The object is matching and behaviors are not checked. return true; } for ( @@ -63,6 +71,8 @@ const isObjectInstruction = ( ) { const parameter = instructionMetadata.getParameter(parameterIndex); if (!gd.ParameterMetadata.isBehavior(parameter.getType())) { + // No more behavior parameter to check. + // The instruction can be used with the object. return true; } if (!objectBehaviorTypes.has(parameter.getExtraInfo())) { From bbb210996494b89d8320bcb776961b999d1f025d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Davy=20H=C3=A9lard?= Date: Mon, 4 Dec 2023 13:18:21 +0100 Subject: [PATCH 11/13] Typo --- .../src/InstructionOrExpression/EnumerateInstructions.js | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/newIDE/app/src/InstructionOrExpression/EnumerateInstructions.js b/newIDE/app/src/InstructionOrExpression/EnumerateInstructions.js index 36c74bd75bb1..5ee9deda8341 100644 --- a/newIDE/app/src/InstructionOrExpression/EnumerateInstructions.js +++ b/newIDE/app/src/InstructionOrExpression/EnumerateInstructions.js @@ -23,10 +23,9 @@ const freeInstructionsToKeep = { /** * Check if the instruction can be use according to an object and its behaviors. - * @param {*} instructionMetadata The instruction being checked - * @param {*} objectType The object type - * @param {*} objectBehaviorTypes The object behaviors - * @returns + * @param instructionMetadata The instruction being checked + * @param objectType The object type + * @param objectBehaviorTypes The object behaviors */ const isObjectInstruction = ( instructionMetadata: gdInstructionMetadata, From 5a46cc7bd94bb1ed97150b341d6a9f3eace306e6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Davy=20H=C3=A9lard?= Date: Mon, 4 Dec 2023 13:25:08 +0100 Subject: [PATCH 12/13] Forgot to save some files. --- Extensions/Effects/radial-blur-pixi-filter.ts | 2 +- Extensions/Effects/shockwave-pixi-filter.ts | 2 +- Extensions/Effects/twist-pixi-filter.ts | 2 +- Extensions/Effects/zoom-blur-pixi-filter.ts | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Extensions/Effects/radial-blur-pixi-filter.ts b/Extensions/Effects/radial-blur-pixi-filter.ts index 3d2ec2034b46..d87f5a3e8163 100644 --- a/Extensions/Effects/radial-blur-pixi-filter.ts +++ b/Extensions/Effects/radial-blur-pixi-filter.ts @@ -1,6 +1,6 @@ namespace gdjs { interface RadialBlurFilterExtra { - // @ts-ignore - extra properties are stored on the filter. + // extra properties are stored on the filter. _centerX: number; _centerY: number; } diff --git a/Extensions/Effects/shockwave-pixi-filter.ts b/Extensions/Effects/shockwave-pixi-filter.ts index c16e0ef2599e..e3eeff9a207c 100644 --- a/Extensions/Effects/shockwave-pixi-filter.ts +++ b/Extensions/Effects/shockwave-pixi-filter.ts @@ -1,6 +1,6 @@ namespace gdjs { interface ShockwaveFilterExtra { - // @ts-ignore - extra properties are stored on the filter. + // extra properties are stored on the filter. _centerX: number; _centerY: number; } diff --git a/Extensions/Effects/twist-pixi-filter.ts b/Extensions/Effects/twist-pixi-filter.ts index 82e5c1e10d6b..5ccad506d02d 100644 --- a/Extensions/Effects/twist-pixi-filter.ts +++ b/Extensions/Effects/twist-pixi-filter.ts @@ -1,6 +1,6 @@ namespace gdjs { interface TwistFilterExtra { - // @ts-ignore - extra properties are stored on the filter. + // extra properties are stored on the filter. _offsetX: number; _offsetY: number; } diff --git a/Extensions/Effects/zoom-blur-pixi-filter.ts b/Extensions/Effects/zoom-blur-pixi-filter.ts index 762d7676e9f6..cd65f8e52b28 100644 --- a/Extensions/Effects/zoom-blur-pixi-filter.ts +++ b/Extensions/Effects/zoom-blur-pixi-filter.ts @@ -1,6 +1,6 @@ namespace gdjs { interface ZoomBlurFilterExtra { - // @ts-ignore - extra properties are stored on the filter. + // extra properties are stored on the filter. _centerX: number; _centerY: number; } From eedf908bfcb6d2236a4569611cdb249882457b95 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Davy=20H=C3=A9lard?= Date: Mon, 4 Dec 2023 14:54:26 +0100 Subject: [PATCH 13/13] Add a log if the effect doesn't exist --- Extensions/TweenBehavior/tweenruntimebehavior.ts | 11 +++++++++++ Extensions/TweenBehavior/tweentools.ts | 12 ++++++++++++ 2 files changed, 23 insertions(+) diff --git a/Extensions/TweenBehavior/tweenruntimebehavior.ts b/Extensions/TweenBehavior/tweenruntimebehavior.ts index 1bb064c6bb8e..955389c8b250 100644 --- a/Extensions/TweenBehavior/tweenruntimebehavior.ts +++ b/Extensions/TweenBehavior/tweenruntimebehavior.ts @@ -3,6 +3,7 @@ GDevelop - Tween Behavior Extension Copyright (c) 2010-2023 Florian Rival (Florian.Rival@gmail.com) */ namespace gdjs { + const logger = new gdjs.Logger('Tween'); interface IColorable extends gdjs.RuntimeObject { setColor(color: string): void; getColor(): string; @@ -948,6 +949,11 @@ namespace gdjs { destroyObjectWhenFinished: boolean ) { const effect = this.owner.getRendererEffects()[effectName]; + if (!effect) { + logger.error( + `The object "${this.owner.name}" doesn't have any effect called "${effectName}"` + ); + } this._tweens.addSimpleTween( identifier, this.owner, @@ -987,6 +993,11 @@ namespace gdjs { destroyObjectWhenFinished: boolean ) { const effect = this.owner.getRendererEffects()[effectName]; + if (!effect) { + logger.error( + `The object "${this.owner.name}" doesn't have any effect called "${effectName}"` + ); + } const rgbFromColor = gdjs.hexNumberToRGB( effect ? effect.getColorParameter(propertyName) : 0 ); diff --git a/Extensions/TweenBehavior/tweentools.ts b/Extensions/TweenBehavior/tweentools.ts index 8e6a78ac1f69..5260c0bf304f 100644 --- a/Extensions/TweenBehavior/tweentools.ts +++ b/Extensions/TweenBehavior/tweentools.ts @@ -8,6 +8,8 @@ namespace gdjs { } export namespace evtTools { export namespace tween { + const logger = new gdjs.Logger('Tween'); + export const getTweensMap = (runtimeScene: RuntimeScene) => runtimeScene._tweens || (runtimeScene._tweens = new gdjs.evtTools.tween.TweenManager()); @@ -503,6 +505,11 @@ namespace gdjs { ) => { const layer = runtimeScene.getLayer(layerName); const effect = layer.getRendererEffects()[effectName]; + if (!effect) { + logger.error( + `The layer "${layer.getName()}" doesn't have any effect called "${effectName}"` + ); + } getTweensMap(runtimeScene).addSimpleTween( identifier, layer, @@ -542,6 +549,11 @@ namespace gdjs { ) => { const layer = runtimeScene.getLayer(layerName); const effect = layer.getRendererEffects()[effectName]; + if (!effect) { + logger.error( + `The layer "${layer.getName()}" doesn't have any effect called "${effectName}"` + ); + } const rgbFromColor = gdjs.hexNumberToRGB( effect ? effect.getColorParameter(propertyName) : 0 );