From ed751eaa1ff037acc834458476bca81ca4eda790 Mon Sep 17 00:00:00 2001 From: Harsimran Virk Date: Tue, 8 Jun 2021 17:42:45 +0530 Subject: [PATCH 01/28] Added effects tab in ObjectEditorDialog --- .../app/src/ObjectEditor/ObjectEditorDialog.js | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/newIDE/app/src/ObjectEditor/ObjectEditorDialog.js b/newIDE/app/src/ObjectEditor/ObjectEditorDialog.js index b2589e22a5c7..1eeadc019ec3 100644 --- a/newIDE/app/src/ObjectEditor/ObjectEditorDialog.js +++ b/newIDE/app/src/ObjectEditor/ObjectEditorDialog.js @@ -22,6 +22,7 @@ import useForceUpdate from '../Utils/UseForceUpdate'; import HotReloadPreviewButton, { type HotReloadPreviewButtonProps, } from '../HotReload/HotReloadPreviewButton'; +import EffectsList from '../EffectsList'; type Props = {| open: boolean, @@ -119,6 +120,11 @@ const InnerDialog = (props: InnerDialogProps) => { value={'behaviors'} key={'behaviors'} /> + Effects} + value={'effects'} + key={'effects'} + /> } @@ -179,6 +185,18 @@ const InnerDialog = (props: InnerDialogProps) => { onUpdateBehaviorsSharedData={props.onUpdateBehaviorsSharedData} /> )} + {currentTab === 'effects' && ( + + )} ); }; From 8f0639d4e47c0c2f56a094dc4052d8d283538c2f Mon Sep 17 00:00:00 2001 From: Harsimran Virk Date: Sat, 12 Jun 2021 11:20:16 +0530 Subject: [PATCH 02/28] Added `edit effects` and `edit behaviors` in menu and command palette --- newIDE/app/src/CommandPalette/CommandsList.js | 10 +++++++ .../src/ObjectEditor/ObjectEditorDialog.js | 8 ++++-- .../src/ObjectsList/UseObjectsListCommands.js | 28 +++++++++++++++++-- newIDE/app/src/ObjectsList/index.js | 10 ++++++- newIDE/app/src/SceneEditor/index.js | 7 ++++- 5 files changed, 56 insertions(+), 7 deletions(-) diff --git a/newIDE/app/src/CommandPalette/CommandsList.js b/newIDE/app/src/CommandPalette/CommandsList.js index 565a66e05827..f579d2ef5b50 100644 --- a/newIDE/app/src/CommandPalette/CommandsList.js +++ b/newIDE/app/src/CommandPalette/CommandsList.js @@ -44,6 +44,8 @@ export type CommandName = | 'EDIT_LAYER' | 'EDIT_NETWORK_PREVIEW' | 'EDIT_OBJECT' + | 'EDIT_OBJECT_BEHAVIORS' + | 'EDIT_OBJECT_EFFECTS' | 'EDIT_OBJECT_VARIABLES' | 'EDIT_OBJECT_GROUP' | 'ADD_STANDARD_EVENT' @@ -246,6 +248,14 @@ const commandsList: { [CommandName]: CommandMetadata } = { // Objects list commands EDIT_OBJECT: { area: 'SCENE', displayText: t`Edit object...` }, + EDIT_OBJECT_BEHAVIORS: { + area: 'SCENE', + displayText: t`Edit object behaviors...`, + }, + EDIT_OBJECT_EFFECTS: { + area: 'SCENE', + displayText: t`Edit object effects...`, + }, EDIT_OBJECT_VARIABLES: { area: 'SCENE', displayText: t`Edit object variables...`, diff --git a/newIDE/app/src/ObjectEditor/ObjectEditorDialog.js b/newIDE/app/src/ObjectEditor/ObjectEditorDialog.js index 1eeadc019ec3..2b81141654c4 100644 --- a/newIDE/app/src/ObjectEditor/ObjectEditorDialog.js +++ b/newIDE/app/src/ObjectEditor/ObjectEditorDialog.js @@ -42,6 +42,7 @@ type Props = {| resourceExternalEditors: Array, unsavedChanges?: UnsavedChanges, onUpdateBehaviorsSharedData: () => void, + initialTab: ?string, // Preview: hotReloadPreviewButtonProps: HotReloadPreviewButtonProps, @@ -56,7 +57,9 @@ type InnerDialogProps = {| |}; const InnerDialog = (props: InnerDialogProps) => { - const [currentTab, setCurrentTab] = React.useState('properties'); + const [currentTab, setCurrentTab] = React.useState( + props.initialTab || 'properties' + ); const [newObjectName, setNewObjectName] = React.useState(props.objectName); const forceUpdate = useForceUpdate(); const onCancelChanges = useSerializableObjectCancelableEditor({ @@ -251,7 +254,7 @@ export default class ObjectEditorDialog extends Component { } render() { - const { object } = this.props; + const { object, initialTab } = this.props; const { editorComponent, castToObjectType, helpPagePath } = this.state; if (!object || !castToObjectType) return null; @@ -264,6 +267,7 @@ export default class ObjectEditorDialog extends Component { helpPagePath={helpPagePath} object={castToObjectType(object)} objectName={this.state.objectName} + initialTab={initialTab} /> ); } diff --git a/newIDE/app/src/ObjectsList/UseObjectsListCommands.js b/newIDE/app/src/ObjectsList/UseObjectsListCommands.js index 6b6b2532693a..928dd14fe50f 100644 --- a/newIDE/app/src/ObjectsList/UseObjectsListCommands.js +++ b/newIDE/app/src/ObjectsList/UseObjectsListCommands.js @@ -8,11 +8,12 @@ import ObjectsRenderingService from '../ObjectsRendering/ObjectsRenderingService const generateLayoutObjectsOptions = ( project: gdProject, layout: gdLayout, - onChoose: (object: gdObject) => void + onChoose: (object: gdObject, arg: ?string) => void, + onChooseArg: ?string ): Array => { return enumerateObjects(project, layout).containerObjectsList.map(item => ({ text: item.object.getName(), - handler: () => onChoose(item.object), + handler: () => onChoose(item.object, onChooseArg), iconSrc: ObjectsRenderingService.getThumbnail.bind(ObjectsRenderingService)( project, item.object @@ -23,7 +24,7 @@ const generateLayoutObjectsOptions = ( type Props = {| project: gdProject, layout: gdLayout, - onEditObject: (object: gdObject) => void, + onEditObject: (object: gdObject, initialTab: ?string) => void, onEditObjectVariables: (object: gdObject) => void, |}; @@ -36,6 +37,27 @@ const useObjectsListCommands = (props: Props) => { ), }); + useCommandWithOptions('EDIT_OBJECT_BEHAVIORS', true, { + generateOptions: React.useCallback( + () => + generateLayoutObjectsOptions( + project, + layout, + onEditObject, + 'behaviors' + ), + [project, layout, onEditObject] + ), + }); + + useCommandWithOptions('EDIT_OBJECT_EFFECTS', true, { + generateOptions: React.useCallback( + () => + generateLayoutObjectsOptions(project, layout, onEditObject, 'effects'), + [project, layout, onEditObject] + ), + }); + useCommandWithOptions('EDIT_OBJECT_VARIABLES', true, { generateOptions: React.useCallback( () => diff --git a/newIDE/app/src/ObjectsList/index.js b/newIDE/app/src/ObjectsList/index.js index bd7f2a3e5f2a..cc42e182641f 100644 --- a/newIDE/app/src/ObjectsList/index.js +++ b/newIDE/app/src/ObjectsList/index.js @@ -106,7 +106,7 @@ type Props = {| getAllObjectTags: () => Tags, onChangeSelectedObjectTags: SelectedTags => void, - onEditObject: gdObject => void, + onEditObject: (object: gdObject, initialTab: ?string) => void, onObjectCreated: gdObject => void, onObjectSelected: string => void, onObjectPasted?: gdObject => void, @@ -466,6 +466,14 @@ export default class ObjectsList extends React.Component { label: i18n._(t`Edit object variables`), click: () => this._editVariables(object), }, + { + label: i18n._(t`Edit behaviors`), + click: () => this.props.onEditObject(object, 'behaviors'), + }, + { + label: i18n._(t`Edit effects`), + click: () => this.props.onEditObject(object, 'effects'), + }, { type: 'separator' }, { label: i18n._(t`Tags`), diff --git a/newIDE/app/src/SceneEditor/index.js b/newIDE/app/src/SceneEditor/index.js index 1706fc43b655..4668f6c72c35 100644 --- a/newIDE/app/src/SceneEditor/index.js +++ b/newIDE/app/src/SceneEditor/index.js @@ -134,6 +134,7 @@ type State = {| editedLayer: ?gdLayer, editedLayerInitialTab: 'properties' | 'effects', editedObjectWithContext: ?ObjectWithContext, + editedObjectInitialTab: ?string, variablesEditedInstance: ?gdInitialInstance, variablesEditedObject: ?gdObject, selectedObjectNames: Array, @@ -185,6 +186,7 @@ export default class SceneEditor extends React.Component { editedLayer: null, editedLayerInitialTab: 'properties', editedObjectWithContext: null, + editedObjectInitialTab: 'properties', variablesEditedInstance: null, variablesEditedObject: null, selectedObjectNames: [], @@ -364,7 +366,7 @@ export default class SceneEditor extends React.Component { this.setState({ layoutVariablesDialogOpen: open }); }; - editObject = (editedObject: ?gdObject) => { + editObject = (editedObject: ?gdObject, initialTab: ?string) => { const { project } = this.props; if (editedObject) { this.setState({ @@ -372,10 +374,12 @@ export default class SceneEditor extends React.Component { object: editedObject, global: project.hasObjectNamed(editedObject.getName()), }, + editedObjectInitialTab: initialTab || 'properties', }); } else { this.setState({ editedObjectWithContext: null, + editedObjectInitialTab: 'properties', }); } }; @@ -1170,6 +1174,7 @@ export default class SceneEditor extends React.Component { Date: Sun, 13 Jun 2021 00:54:04 +0530 Subject: [PATCH 03/28] Added PixiObjectEffectsManager, Added code in EffectsCodeGenerator.cpp to include effect files --- .../CodeGeneration/EffectsCodeGenerator.cpp | 10 ++++ GDJS/GDJS/IDE/ExporterHelper.cpp | 2 + .../pixi-renderers/pixi-filters-tools.ts | 4 +- .../pixi-object-effects-manager.ts | 49 +++++++++++++++++++ GDJS/Runtime/runtimegame.ts | 11 +++++ GDJS/Runtime/runtimeobject.ts | 12 +++++ 6 files changed, 86 insertions(+), 2 deletions(-) create mode 100644 GDJS/Runtime/pixi-renderers/pixi-object-effects-manager.ts diff --git a/Core/GDCore/Events/CodeGeneration/EffectsCodeGenerator.cpp b/Core/GDCore/Events/CodeGeneration/EffectsCodeGenerator.cpp index b16895cd7759..e16b10adf660 100644 --- a/Core/GDCore/Events/CodeGeneration/EffectsCodeGenerator.cpp +++ b/Core/GDCore/Events/CodeGeneration/EffectsCodeGenerator.cpp @@ -12,6 +12,7 @@ #include "GDCore/Project/EffectsContainer.h" #include "GDCore/Project/Layout.h" #include "GDCore/Project/Project.h" +#include "GDCore/Project/Object.h" namespace gd { @@ -34,6 +35,15 @@ void ExposeProjectEffects( } } } + + // Add object effects + for (std::size_t s = 0; s < project.GetObjectsCount(); s++) { + auto& effects = project.GetObject(s).GetEffects(); + for (std::size_t e = 0; e < effects.GetEffectsCount(); e++) { + auto& effect = effects.GetEffect(e); + worker(effect); + } + } } void EffectsCodeGenerator::GenerateEffectsIncludeFiles( diff --git a/GDJS/GDJS/IDE/ExporterHelper.cpp b/GDJS/GDJS/IDE/ExporterHelper.cpp index 8e3f92bb82b6..4a7748647867 100644 --- a/GDJS/GDJS/IDE/ExporterHelper.cpp +++ b/GDJS/GDJS/IDE/ExporterHelper.cpp @@ -672,6 +672,8 @@ void ExporterHelper::AddLibsInclude(bool pixiRenderers, "pixi-renderers/spriteruntimeobject-pixi-renderer.js"); InsertUnique(includesFiles, "pixi-renderers/loadingscreen-pixi-renderer.js"); + InsertUnique(includesFiles, + "pixi-renderers/pixi-object-effects-manager.js"); InsertUnique(includesFiles, "howler-sound-manager/howler.min.js"); InsertUnique(includesFiles, "howler-sound-manager/howler-sound-manager.js"); InsertUnique(includesFiles, diff --git a/GDJS/Runtime/pixi-renderers/pixi-filters-tools.ts b/GDJS/Runtime/pixi-renderers/pixi-filters-tools.ts index 4a3dc4738c61..1ae7b2dfe6b8 100644 --- a/GDJS/Runtime/pixi-renderers/pixi-filters-tools.ts +++ b/GDJS/Runtime/pixi-renderers/pixi-filters-tools.ts @@ -15,7 +15,7 @@ namespace gdjs { return arr.indexOf(value) !== -1 ? value : min; }; - const _filterCreators: { + export const _filterCreators: { [filterName: string]: FilterCreator; } = {}; @@ -89,7 +89,7 @@ namespace gdjs { /** A wrapper allowing to create a PIXI filter and update it using a common interface */ export type FilterCreator = { /** Function to call to create the filter */ - makePIXIFilter: (layer: gdjs.Layer, effectData: EffectData) => any; + makePIXIFilter: (layer: gdjs.Layer | gdjs.RuntimeObject, effectData: EffectData) => any; /** The function to be called to update the filter at every frame */ update: (filter: PIXI.Filter, layer: gdjs.Layer) => any; /** The function to be called to update a parameter (with a number) */ diff --git a/GDJS/Runtime/pixi-renderers/pixi-object-effects-manager.ts b/GDJS/Runtime/pixi-renderers/pixi-object-effects-manager.ts new file mode 100644 index 000000000000..f99f6f57edfe --- /dev/null +++ b/GDJS/Runtime/pixi-renderers/pixi-object-effects-manager.ts @@ -0,0 +1,49 @@ +/* + * GDevelop JS Platform + * Copyright 2013-2021 Florian Rival (Florian.Rival@gmail.com). All rights reserved. + * This project is released under the MIT License. + */ +namespace gdjs { + import PIXI = GlobalPIXIModule.PIXI; + + class PixiObjectEffectsManager { + initializeEffects( + runtimeObjectRenderer: gdjs.RuntimeObject, + effectsData: EffectData[] + ) { + for (let i = 0; i < effectsData.length; i++) { + this.addEffect(runtimeObjectRenderer, effectsData[i]); + } + } + + addEffect(runtimeObject: gdjs.RuntimeObject, effectData: EffectData) { + const filterCreator = gdjs.PixiFiltersTools.getFilterCreator( + effectData.effectType + ); + if (!filterCreator) { + console.log( + 'Filter "' + + effectData.name + + '" has an unknown effect type: "' + + effectData.effectType + + '". Was it registered properly? Is the effect type correct?' + ); + return; + } + + const filter: gdjs.PixiFiltersTools.Filter = { + pixiFilter: filterCreator.makePIXIFilter(runtimeObject, effectData), + updateDoubleParameter: filterCreator.updateDoubleParameter, + updateStringParameter: filterCreator.updateStringParameter, + updateBooleanParameter: filterCreator.updateBooleanParameter, + update: filterCreator.update, + }; + + const renderer = runtimeObject.getRendererObject(); + renderer.filters = (renderer.filters || []).concat(filter.pixiFilter); + } + } + + export const ObjectEffectsManager = PixiObjectEffectsManager; + export type ObjectEffectsManager = PixiObjectEffectsManager; +} diff --git a/GDJS/Runtime/runtimegame.ts b/GDJS/Runtime/runtimegame.ts index e43e63dc569a..76919a1ff523 100644 --- a/GDJS/Runtime/runtimegame.ts +++ b/GDJS/Runtime/runtimegame.ts @@ -40,6 +40,7 @@ namespace gdjs { _soundManager: SoundManager; _fontManager: FontManager; _jsonManager: JsonManager; + _objectEffectsManager: ObjectEffectsManager _bitmapFontManager: BitmapFontManager; _maxFPS: integer; _minFPS: integer; @@ -94,6 +95,7 @@ namespace gdjs { this._data.resources.resources, this._imageManager ); + this._objectEffectsManager = new gdjs.ObjectEffectsManager(); this._maxFPS = this._data ? this._data.properties.maxFPS : 60; this._minFPS = this._data ? this._data.properties.minFPS : 15; this._gameResolutionWidth = this._data.properties.windowWidth; @@ -201,6 +203,15 @@ namespace gdjs { return this._jsonManager; } + /** + * Get the object effects manager of the game, which allows to manage + * effects on runtime objects. + * @return The object effects manager for the game + */ + getObjectEffectsManager(): gdjs.ObjectEffectsManager { + return this._objectEffectsManager; + } + /** * Get the object containing the game data * @return The object associated to the game. diff --git a/GDJS/Runtime/runtimeobject.ts b/GDJS/Runtime/runtimeobject.ts index a9fcba20c236..efbbcb7e43c5 100644 --- a/GDJS/Runtime/runtimeobject.ts +++ b/GDJS/Runtime/runtimeobject.ts @@ -70,6 +70,9 @@ namespace gdjs { //Variables: protected _variables: gdjs.VariablesContainer; + //Effects: + protected _effects: EffectData[]; + //Forces: protected _forces: gdjs.Force[] = []; _averageForce: gdjs.Force; @@ -98,6 +101,7 @@ namespace gdjs { ); this._averageForce = new gdjs.Force(0, 0, 0); this._behaviorsTable = new Hashtable(); + this._effects = objectData.effects; //Also contains the behaviors: Used when a behavior is accessed by its name ( see getBehavior ). for (let i = 0, len = objectData.behaviors.length; i < len; ++i) { @@ -123,6 +127,14 @@ namespace gdjs { for (let i = 0; i < this._behaviors.length; ++i) { this._behaviors[i].onCreated(); } + + const objectEffectsManager = this._runtimeScene + .getGame() + .getObjectEffectsManager(); + objectEffectsManager.initializeEffects( + this, + this._effects + ); } /** From c26a0171c009cd8b215ebb64e59689c6df4a7573 Mon Sep 17 00:00:00 2001 From: Harsimran Virk Date: Thu, 1 Jul 2021 23:01:22 +0530 Subject: [PATCH 04/28] Added effect methods. --- .../CodeGeneration/EffectsCodeGenerator.cpp | 19 +- .../panelspriteruntimeobject.ts | 3 +- .../TextEntryObject/textentryruntimeobject.ts | 3 +- Extensions/TextObject/textruntimeobject.ts | 3 +- .../pixi-renderers/pixi-filters-tools.ts | 4 +- .../pixi-object-effects-manager.ts | 171 +++++++++++++++++- GDJS/Runtime/runtimeobject.ts | 144 ++++++++++++++- GDJS/Runtime/spriteruntimeobject.ts | 1 + 8 files changed, 323 insertions(+), 25 deletions(-) diff --git a/Core/GDCore/Events/CodeGeneration/EffectsCodeGenerator.cpp b/Core/GDCore/Events/CodeGeneration/EffectsCodeGenerator.cpp index e16b10adf660..313a02b74187 100644 --- a/Core/GDCore/Events/CodeGeneration/EffectsCodeGenerator.cpp +++ b/Core/GDCore/Events/CodeGeneration/EffectsCodeGenerator.cpp @@ -3,16 +3,18 @@ * Copyright 2008-present Florian Rival (Florian.Rival@gmail.com). All rights * reserved. This project is released under the MIT License. */ -#include #include "EffectsCodeGenerator.h" + +#include + #include "GDCore/Extensions/Metadata/EffectMetadata.h" #include "GDCore/Extensions/Metadata/MetadataProvider.h" #include "GDCore/Project/Effect.h" -#include "GDCore/Project/Layer.h" #include "GDCore/Project/EffectsContainer.h" +#include "GDCore/Project/Layer.h" #include "GDCore/Project/Layout.h" -#include "GDCore/Project/Project.h" #include "GDCore/Project/Object.h" +#include "GDCore/Project/Project.h" namespace gd { @@ -34,9 +36,18 @@ void ExposeProjectEffects( worker(effect); } } + + for (std::size_t i; i < layout.GetObjectsCount(); i++) { + auto& object = layout.GetObject(i); + auto& effects = object.GetEffects(); + for (std::size_t e = 0; e < effects.GetEffectsCount(); e++) { + auto& effect = effects.GetEffect(e); + worker(effect); + } + } } - // Add object effects + // Add global object effects for (std::size_t s = 0; s < project.GetObjectsCount(); s++) { auto& effects = project.GetObject(s).GetEffects(); for (std::size_t e = 0; e < effects.GetEffectsCount(); e++) { diff --git a/Extensions/PanelSpriteObject/panelspriteruntimeobject.ts b/Extensions/PanelSpriteObject/panelspriteruntimeobject.ts index 3fe2a187dec9..fbcacb343a29 100644 --- a/Extensions/PanelSpriteObject/panelspriteruntimeobject.ts +++ b/Extensions/PanelSpriteObject/panelspriteruntimeobject.ts @@ -121,7 +121,8 @@ namespace gdjs { } } - update(): void { + update(runtimeScene: gdjs.RuntimeScene): void { + super.update(runtimeScene); this._renderer.ensureUpToDate(); } diff --git a/Extensions/TextEntryObject/textentryruntimeobject.ts b/Extensions/TextEntryObject/textentryruntimeobject.ts index 0741ddd770a3..0af8b9817bd6 100644 --- a/Extensions/TextEntryObject/textentryruntimeobject.ts +++ b/Extensions/TextEntryObject/textentryruntimeobject.ts @@ -38,7 +38,8 @@ namespace gdjs { } } - update(): void { + update(runtimeScene: gdjs.RuntimeScene): void { + super.update(runtimeScene); if ((this._renderer as any).getString) { this._str = (this._renderer as any).getString(); } diff --git a/Extensions/TextObject/textruntimeobject.ts b/Extensions/TextObject/textruntimeobject.ts index 5f0366f134c5..c054bf97ce15 100644 --- a/Extensions/TextObject/textruntimeobject.ts +++ b/Extensions/TextObject/textruntimeobject.ts @@ -131,7 +131,8 @@ namespace gdjs { return this._renderer.getRendererObject(); } - update(): void { + update(runtimeScene: gdjs.RuntimeScene): void { + super.update(runtimeScene); this._renderer.ensureUpToDate(); } diff --git a/GDJS/Runtime/pixi-renderers/pixi-filters-tools.ts b/GDJS/Runtime/pixi-renderers/pixi-filters-tools.ts index 1ae7b2dfe6b8..38b02e9adffd 100644 --- a/GDJS/Runtime/pixi-renderers/pixi-filters-tools.ts +++ b/GDJS/Runtime/pixi-renderers/pixi-filters-tools.ts @@ -91,7 +91,7 @@ namespace gdjs { /** Function to call to create the filter */ makePIXIFilter: (layer: gdjs.Layer | gdjs.RuntimeObject, effectData: EffectData) => any; /** The function to be called to update the filter at every frame */ - update: (filter: PIXI.Filter, layer: gdjs.Layer) => any; + update: (filter: PIXI.Filter, layer: gdjs.Layer | gdjs.RuntimeObject) => any; /** The function to be called to update a parameter (with a number) */ updateDoubleParameter: ( filter: PIXI.Filter, @@ -117,7 +117,7 @@ namespace gdjs { /** The PIXI filter */ pixiFilter: PIXI.Filter; /** The function to be called to update the filter at every frame */ - update: (filter: PIXI.Filter, layer: gdjs.Layer) => any; + update: (filter: PIXI.Filter, layer: gdjs.Layer | gdjs.RuntimeObject) => any; /** The function to be called to update a parameter (with a number) */ updateDoubleParameter: ( filter: PIXI.Filter, diff --git a/GDJS/Runtime/pixi-renderers/pixi-object-effects-manager.ts b/GDJS/Runtime/pixi-renderers/pixi-object-effects-manager.ts index f99f6f57edfe..e6f701094b07 100644 --- a/GDJS/Runtime/pixi-renderers/pixi-object-effects-manager.ts +++ b/GDJS/Runtime/pixi-renderers/pixi-object-effects-manager.ts @@ -7,16 +7,31 @@ namespace gdjs { import PIXI = GlobalPIXIModule.PIXI; class PixiObjectEffectsManager { - initializeEffects( - runtimeObjectRenderer: gdjs.RuntimeObject, - effectsData: EffectData[] - ) { - for (let i = 0; i < effectsData.length; i++) { - this.addEffect(runtimeObjectRenderer, effectsData[i]); + protected _filters: Hashtable>; + + constructor() { + this._filters = new Hashtable(); + } + + update(runtimeObject: RuntimeObject) { + const filters: Hashtable< + PixiFiltersTools.Filter + > | void = this._filters.get(runtimeObject.getName()); + if (!filters) return; + const filterValues: PixiFiltersTools.Filter[] = []; + filters.values(filterValues); + for (const filter of filterValues) { + filter.update(filter.pixiFilter, runtimeObject); } } - addEffect(runtimeObject: gdjs.RuntimeObject, effectData: EffectData) { + /** + * Add a new effect on a runtime object, or replace the one + * with the same name. + * @param runtimeObject The runtime object + * @param effectData The data of the effect to add. + */ + addEffect(runtimeObject: RuntimeObject, effectData: EffectData) { const filterCreator = gdjs.PixiFiltersTools.getFilterCreator( effectData.effectType ); @@ -31,7 +46,7 @@ namespace gdjs { return; } - const filter: gdjs.PixiFiltersTools.Filter = { + const filter: PixiFiltersTools.Filter = { pixiFilter: filterCreator.makePIXIFilter(runtimeObject, effectData), updateDoubleParameter: filterCreator.updateDoubleParameter, updateStringParameter: filterCreator.updateStringParameter, @@ -41,6 +56,146 @@ namespace gdjs { const renderer = runtimeObject.getRendererObject(); renderer.filters = (renderer.filters || []).concat(filter.pixiFilter); + + if (!this._filters.containsKey(runtimeObject.getName())) { + this._filters.put(runtimeObject.getName(), new Hashtable()); + } + + const filtersHashtable = this._filters.get(runtimeObject.getName()); + filtersHashtable.put(effectData.name, filter); + } + + /** + * Remove the effect from a runtime object with the specified name + * @param runtimeObject The runtime object. + * @param effectName The name of the effect. + */ + removeEffect(runtimeObject: RuntimeObject, effectName: string) { + const filters: Hashtable< + PixiFiltersTools.Filter + > | void = this._filters.get(runtimeObject.getName()); + if (!filters) return; + if (!filters.containsKey(effectName)) return; + const filter = filters.get(effectName); + const renderer: PIXI.DisplayObject = runtimeObject.getRendererObject(); + renderer.filters = (renderer.filters || []).filter( + (pixiFilter) => pixiFilter !== filter.pixiFilter + ); + filters.remove(effectName); + } + + /** + * Update the parameter of an effect (with a number). + * @param runtimeObject The runtime object + * @param name The effect name + * @param parameterName The parameter name + * @param value The new value for the parameter + */ + setEffectDoubleParameter( + runtimeObject: RuntimeObject, + name: string, + parameterName: string, + value: float + ): void { + const filters = this._filters.get(runtimeObject.getName()); + if (!filters) { + return; + } + if (!filters.containsKey(name)) return; + const filter = filters.get(name); + filter.updateDoubleParameter(filter.pixiFilter, parameterName, value); + } + + /** + * Update the parameter of an effect (with a string). + * @param runtimeObject The runtime object + * @param name The effect name + * @param parameterName The parameter name + * @param value The new value for the parameter + */ + setEffectStringParameter( + runtimeObject: RuntimeObject, + name: string, + parameterName: string, + value: string + ): void { + const filters = this._filters.get(runtimeObject.getName()); + if (!filters) { + return; + } + if (!filters.containsKey(name)) return; + const filter = filters.get(name); + filter.updateStringParameter(filter.pixiFilter, parameterName, value); + } + + /** + * Enable or disable the parameter of an effect (boolean). + * @param runtimeObject The runtime object + * @param name The effect name + * @param parameterName The parameter name + * @param value The new value for the parameter + */ + setEffectBooleanParameter( + runtimeObject: RuntimeObject, + name: string, + parameterName: string, + value: boolean + ): void { + const filters = this._filters.get(runtimeObject.getName()); + if (!filters) { + return; + } + if (!filters.containsKey(name)) return; + const filter = filters.get(name); + filter.updateBooleanParameter(filter.pixiFilter, parameterName, value); + } + + /** + * Check if an effect exists. + * @param runtimeObject + * @param name The effect name + * @returns True if the effect exists, false otherwise + */ + hasEffect(runtimeObject: RuntimeObject, name: string): boolean { + const filters = this._filters.get(runtimeObject.getName()); + if (!filters) return false; + return !!filters.get(name); + } + + /** + * Enable an effect. + * @param runtimeObject The runtime object. + * @param name The effect name + * @param value Set to true to enable, false to disable + */ + enableEffect( + runtimeObject: RuntimeObject, + name: string, + value: boolean + ): void { + const filters = this._filters.get(runtimeObject.getName()); + if (!filters) { + return; + } + if (!filters.containsKey(name)) return; + const filter = filters.get(name); + gdjs.PixiFiltersTools.enableEffect(filter, value); + } + + /** + * Check if an effect is enabled. + * @param runtimeObject The runtime object + * @param name The effect name + * @return true if the filter is enabled + */ + isEffectEnabled(runtimeObject: RuntimeObject, name: string): boolean { + const filters = this._filters.get(runtimeObject.getName()); + if (!filters) { + return false; + } + if (!filters.containsKey(name)) return false; + const filter = filters.get(name); + return gdjs.PixiFiltersTools.isEffectEnabled(filter); } } diff --git a/GDJS/Runtime/runtimeobject.ts b/GDJS/Runtime/runtimeobject.ts index efbbcb7e43c5..ab928a4e75fd 100644 --- a/GDJS/Runtime/runtimeobject.ts +++ b/GDJS/Runtime/runtimeobject.ts @@ -128,13 +128,9 @@ namespace gdjs { this._behaviors[i].onCreated(); } - const objectEffectsManager = this._runtimeScene - .getGame() - .getObjectEffectsManager(); - objectEffectsManager.initializeEffects( - this, - this._effects - ); + for (let i = 0; i < this._effects.length; i++) { + this.addEffect(this._effects[i]); + } } /** @@ -212,7 +208,9 @@ namespace gdjs { * Called once during the game loop, before events and rendering. * @param runtimeScene The gdjs.RuntimeScene the object belongs to. */ - update(runtimeScene: gdjs.RuntimeScene): void {} + update(runtimeScene: gdjs.RuntimeScene): void { + this._runtimeScene.getGame().getObjectEffectsManager().update(this); + } /** * Called once during the game loop, after events and before rendering. @@ -739,6 +737,136 @@ namespace gdjs { return this._variables.has(name); } + /** + * Add a new effect, or replace the one with the same name. + * @param effectData The data of the effect to add. + */ + addEffect(effectData) { + this._runtimeScene + .getGame() + .getObjectEffectsManager() + .addEffect(this, effectData); + for (let name in effectData.doubleParameters) { + this.setEffectDoubleParameter( + effectData.name, + name, + effectData.doubleParameters[name] + ); + } + for (let name in effectData.stringParameters) { + this.setEffectStringParameter( + effectData.name, + name, + effectData.stringParameters[name] + ); + } + for (let name in effectData.booleanParameters) { + this.setEffectBooleanParameter( + effectData.name, + name, + effectData.booleanParameters[name] + ); + } + } + + /** + * Remove the effect with the specified name + * @param effectName The name of the effect. + */ + removeEffect(effectName) { + this._runtimeScene + .getGame() + .getObjectEffectsManager() + .removeEffect(this, effectName); + } + + /** + * Change an effect parameter value (for parameters that are numbers). + * @param name The name of the effect to update. + * @param parameterName The name of the parameter to update. + * @param value The new value (number). + */ + setEffectDoubleParameter( + name: string, + parameterName: string, + value: float + ) { + return this._runtimeScene + .getGame() + .getObjectEffectsManager() + .setEffectDoubleParameter(this, name, parameterName, value); + } + + /** + * Change an effect parameter value (for parameters that are strings). + * @param name The name of the effect to update. + * @param parameterName The name of the parameter to update. + * @param value The new value (string). + */ + setEffectStringParameter( + name: string, + parameterName: string, + value: string + ) { + return this._runtimeScene + .getGame() + .getObjectEffectsManager() + .setEffectStringParameter(this, name, parameterName, value); + } + + /** + * Change an effect parameter value (for parameters that are booleans). + * @param name The name of the effect to update. + * @param parameterName The name of the parameter to update. + * @param value The new value (boolean). + */ + setEffectBooleanParameter( + name: string, + parameterName: string, + value: boolean + ): void { + return this._runtimeScene + .getGame() + .getObjectEffectsManager() + .setEffectBooleanParameter(this, name, parameterName, value); + } + + /** + * Enable or disable an effect. + * @param name The name of the effect to enable or disable. + * @param enable true to enable, false to disable + */ + enableEffect(name: string, enable: boolean): void { + this._runtimeScene + .getGame() + .getObjectEffectsManager() + .enableEffect(this, name, enable); + } + + /** + * Check if an effect is enabled + * @param name The name of the effect + * @return true if the effect is enabled, false otherwise. + */ + isEffectEnabled(name: string): boolean { + return this._runtimeScene + .getGame() + .getObjectEffectsManager() + .isEffectEnabled(this, name); + } + + /** + * Check if an effect exists on this object + * @param name The name of the effect + * @return true if the effect exists, false otherwise. + */ + hasEffect(name: string): boolean { + return this._runtimeScene + .getGame() + .getObjectEffectsManager() + .hasEffect(this, name); + } + /** * Hide (or show) the object. * @param enable Set it to true to hide the object, false to show it. diff --git a/GDJS/Runtime/spriteruntimeobject.ts b/GDJS/Runtime/spriteruntimeobject.ts index 872911a9ca46..fe6cf1463ebf 100644 --- a/GDJS/Runtime/spriteruntimeobject.ts +++ b/GDJS/Runtime/spriteruntimeobject.ts @@ -438,6 +438,7 @@ namespace gdjs { * Update the current frame of the object according to the elapsed time on the scene. */ update(runtimeScene: gdjs.RuntimeScene): void { + super.update(runtimeScene); //Playing the animation of all objects including the ones outside the screen can be //costly when the scene is big with a lot of animated objects. By default, we skip //updating the object if it is not visible. From c450b63adfd72267e075761a5823c6118c98e91f Mon Sep 17 00:00:00 2001 From: Harsimran Virk Date: Fri, 2 Jul 2021 21:50:45 +0530 Subject: [PATCH 05/28] Added actions and conditions --- .../Builtin/BaseObjectExtension.cpp | 88 +++++++++++++++++++ .../Builtin/BaseObjectExtension.cpp | 21 +++++ 2 files changed, 109 insertions(+) diff --git a/Core/GDCore/Extensions/Builtin/BaseObjectExtension.cpp b/Core/GDCore/Extensions/Builtin/BaseObjectExtension.cpp index fdc9f964d35e..9e12a501521e 100644 --- a/Core/GDCore/Extensions/Builtin/BaseObjectExtension.cpp +++ b/Core/GDCore/Extensions/Builtin/BaseObjectExtension.cpp @@ -1373,6 +1373,94 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension( _("Objects"), "res/actions/layer.png") .AddParameter("object", _("Object")); + + obj.AddAction("RemoveEffect", + _("Remove an effect"), + _("Remove an effect from the object"), + _("Remove _PARAM1_ effect from the _PARAM0_"), + _("Effects"), + "res/actions/effect24.png", + "res/actions/effect.png") + .AddParameter("object", _("Object")) + .AddParameter("string", _("Effect Name")) + .MarkAsSimple(); + + obj.AddAction("EnableEffect", + _("Enable an object effect"), + _("Enable an effect on the object"), + _("Enable _PARAM1_ effect on _PARAM0_ : _PARAM2_"), + _("Effects"), + "res/actions/effect24.png", + "res/actions/effect.png") + .AddParameter("object", _("Object")) + .AddParameter("string", _("Effect Name")) + .AddParameter("yesorno", _("Enable")) + .MarkAsSimple(); + + obj.AddAction("SetEffectDoubleParameter", + _("Set a double parameter for effect"), + _("Set a double parameter for an effect of the object"), + _("Set the value of _PARAM2_ as _PARAM3_ for the " + "effect _PARAM1_ of object _PARAM0_"), + _("Effects"), + "res/actions/effect24.png", + "res/actions/effect.png") + .AddParameter("object", _("Object")) + .AddParameter("string", _("Effect Name")) + .AddParameter("string", _("Parameter Name")) + .AddParameter("number", _("Parameter Value")) + .MarkAsSimple(); + + obj.AddAction("SetEffectStringParameter", + _("Set a string parameter for effect"), + _("Set a string parameter for an effect of the object"), + _("Set the value of _PARAM2_ as _PARAM3_ for the " + "effect _PARAM1_ of object _PARAM0_"), + _("Effects"), + "res/actions/effect24.png", + "res/actions/effect.png") + .AddParameter("object", _("Object")) + .AddParameter("string", _("Effect Name")) + .AddParameter("string", _("Parameter Name")) + .AddParameter("string", _("Parameter Value")) + .MarkAsSimple(); + + obj.AddAction("SetEffectBooleanParameter", + _("Set a boolean parameter for effect"), + _("Set a boolean parameter for an effect of the object"), + _("Set the value of _PARAM2_ as _PARAM3_ for the " + "effect _PARAM1_ of object _PARAM0_"), + _("Effects"), + "res/actions/effect24.png", + "res/actions/effect.png") + .AddParameter("object", _("Object")) + .AddParameter("string", _("Effect Name")) + .AddParameter("string", _("Parameter Name")) + .AddParameter("yesorno", _("Parameter Value")) + .MarkAsSimple(); + + obj.AddCondition("IsEffectEnabled", + _("Effect Enabled"), + _("Check if effect is enabled"), + _("_PARAM1_ is enabled on _PARAM0_"), + _("Effects"), + "res/actions/effect24.png", + "res/actions/effect.png") + .AddParameter("object", _("Object")) + .AddParameter("string", _("Effect Name")) + .MarkAsSimple(); + + obj.AddCondition("HasEffect", + _("Has Enabled"), + _("Check if the object has the specified effect"), + _("_PARAM0_ has _PARAM1_ effect"), + _("Effects"), + "res/actions/effect24.png", + "res/actions/effect.png") + .AddParameter("object", _("Object")) + .AddParameter("string", _("Effect Name")) + .MarkAsSimple(); + #endif } diff --git a/GDJS/GDJS/Extensions/Builtin/BaseObjectExtension.cpp b/GDJS/GDJS/Extensions/Builtin/BaseObjectExtension.cpp index 36495e6c0e88..da87e13ef2e5 100644 --- a/GDJS/GDJS/Extensions/Builtin/BaseObjectExtension.cpp +++ b/GDJS/GDJS/Extensions/Builtin/BaseObjectExtension.cpp @@ -85,6 +85,12 @@ BaseObjectExtension::BaseObjectExtension() { objectConditions["Invisible"] .SetFunctionName("isHidden") .SetIncludeFile("runtimeobject.js"); + objectConditions["IsEffectEnabled"] + .SetFunctionName("isEffectEnabled") + .SetIncludeFile("runtimeobject.js"); + objectConditions["HasEffect"] + .SetFunctionName("hasEffect") + .SetIncludeFile("runtimeobject.js"); objectActions["Delete"].SetFunctionName("deleteFromScene"); objectActions["MettreAutourPos"].SetFunctionName("putAround"); objectActions["MettreAutour"] @@ -173,6 +179,21 @@ BaseObjectExtension::BaseObjectExtension() { objectActions["RemoveObjectTimer"] .SetFunctionName("removeTimer") .SetIncludeFile("runtimeobject.js"); + objectActions["RemoveEffect"] + .SetFunctionName("removeEffect") + .SetIncludeFile("runtimeobject.js"); + objectActions["EnableEffect"] + .SetFunctionName("enableEffect") + .SetIncludeFile("runtimeobject.js"); + objectActions["SetEffectDoubleParameter"] + .SetFunctionName("setEffectDoubleParameter") + .SetIncludeFile("runtimeobject.js"); + objectActions["SetEffectStringParameter"] + .SetFunctionName("setEffectStringParameter") + .SetIncludeFile("runtimeobject.js"); + objectActions["SetEffectBooleanParameter"] + .SetFunctionName("setEffectBooleanParameter") + .SetIncludeFile("runtimeobject.js"); objectExpressions["X"].SetFunctionName("getX"); objectExpressions["Y"].SetFunctionName("getY"); From e41a4ccadaba6ae97c33a611679254290d604b75 Mon Sep 17 00:00:00 2001 From: Harsimran Virk Date: Fri, 2 Jul 2021 22:08:58 +0530 Subject: [PATCH 06/28] Added layer parameters for compatibility with effects --- GDJS/Runtime/pixi-renderers/pixi-filters-tools.ts | 6 +++--- .../pixi-renderers/pixi-object-effects-manager.ts | 14 +++++++++----- GDJS/Runtime/runtimeobject.ts | 5 +++-- 3 files changed, 15 insertions(+), 10 deletions(-) diff --git a/GDJS/Runtime/pixi-renderers/pixi-filters-tools.ts b/GDJS/Runtime/pixi-renderers/pixi-filters-tools.ts index 38b02e9adffd..985df6aac43a 100644 --- a/GDJS/Runtime/pixi-renderers/pixi-filters-tools.ts +++ b/GDJS/Runtime/pixi-renderers/pixi-filters-tools.ts @@ -89,9 +89,9 @@ namespace gdjs { /** A wrapper allowing to create a PIXI filter and update it using a common interface */ export type FilterCreator = { /** Function to call to create the filter */ - makePIXIFilter: (layer: gdjs.Layer | gdjs.RuntimeObject, effectData: EffectData) => any; + makePIXIFilter: (layer: gdjs.Layer, effectData: EffectData) => any; /** The function to be called to update the filter at every frame */ - update: (filter: PIXI.Filter, layer: gdjs.Layer | gdjs.RuntimeObject) => any; + update: (filter: PIXI.Filter, layer: gdjs.Layer) => any; /** The function to be called to update a parameter (with a number) */ updateDoubleParameter: ( filter: PIXI.Filter, @@ -117,7 +117,7 @@ namespace gdjs { /** The PIXI filter */ pixiFilter: PIXI.Filter; /** The function to be called to update the filter at every frame */ - update: (filter: PIXI.Filter, layer: gdjs.Layer | gdjs.RuntimeObject) => any; + update: (filter: PIXI.Filter, layer: gdjs.Layer) => any; /** The function to be called to update a parameter (with a number) */ updateDoubleParameter: ( filter: PIXI.Filter, diff --git a/GDJS/Runtime/pixi-renderers/pixi-object-effects-manager.ts b/GDJS/Runtime/pixi-renderers/pixi-object-effects-manager.ts index e6f701094b07..3f47ae11d6b6 100644 --- a/GDJS/Runtime/pixi-renderers/pixi-object-effects-manager.ts +++ b/GDJS/Runtime/pixi-renderers/pixi-object-effects-manager.ts @@ -13,7 +13,7 @@ namespace gdjs { this._filters = new Hashtable(); } - update(runtimeObject: RuntimeObject) { + update(runtimeObject: RuntimeObject, layer: Layer) { const filters: Hashtable< PixiFiltersTools.Filter > | void = this._filters.get(runtimeObject.getName()); @@ -21,17 +21,21 @@ namespace gdjs { const filterValues: PixiFiltersTools.Filter[] = []; filters.values(filterValues); for (const filter of filterValues) { - filter.update(filter.pixiFilter, runtimeObject); + filter.update(filter.pixiFilter, layer); } } /** - * Add a new effect on a runtime object, or replace the one + * Add a new effect on a runtime object, or replace the one * with the same name. * @param runtimeObject The runtime object * @param effectData The data of the effect to add. */ - addEffect(runtimeObject: RuntimeObject, effectData: EffectData) { + addEffect( + runtimeObject: RuntimeObject, + effectData: EffectData, + layer: Layer + ) { const filterCreator = gdjs.PixiFiltersTools.getFilterCreator( effectData.effectType ); @@ -47,7 +51,7 @@ namespace gdjs { } const filter: PixiFiltersTools.Filter = { - pixiFilter: filterCreator.makePIXIFilter(runtimeObject, effectData), + pixiFilter: filterCreator.makePIXIFilter(layer, effectData), updateDoubleParameter: filterCreator.updateDoubleParameter, updateStringParameter: filterCreator.updateStringParameter, updateBooleanParameter: filterCreator.updateBooleanParameter, diff --git a/GDJS/Runtime/runtimeobject.ts b/GDJS/Runtime/runtimeobject.ts index ab928a4e75fd..8ff20aa2e91c 100644 --- a/GDJS/Runtime/runtimeobject.ts +++ b/GDJS/Runtime/runtimeobject.ts @@ -209,7 +209,8 @@ namespace gdjs { * @param runtimeScene The gdjs.RuntimeScene the object belongs to. */ update(runtimeScene: gdjs.RuntimeScene): void { - this._runtimeScene.getGame().getObjectEffectsManager().update(this); + const layer = this._runtimeScene.getLayer(this.layer) + this._runtimeScene.getGame().getObjectEffectsManager().update(this, layer); } /** @@ -745,7 +746,7 @@ namespace gdjs { this._runtimeScene .getGame() .getObjectEffectsManager() - .addEffect(this, effectData); + .addEffect(this, effectData, this._runtimeScene.getLayer(this.layer)); for (let name in effectData.doubleParameters) { this.setEffectDoubleParameter( effectData.name, From 5ddcc7955d130178615a16bcc3a67bdb7642bada Mon Sep 17 00:00:00 2001 From: Harsimran Virk Date: Tue, 13 Jul 2021 17:19:45 +0530 Subject: [PATCH 07/28] Added filters record in gdjs runtimeobject --- .../pixi-object-effects-manager.ts | 77 +++++-------------- GDJS/Runtime/runtimeobject.ts | 5 ++ 2 files changed, 24 insertions(+), 58 deletions(-) diff --git a/GDJS/Runtime/pixi-renderers/pixi-object-effects-manager.ts b/GDJS/Runtime/pixi-renderers/pixi-object-effects-manager.ts index 3f47ae11d6b6..c7dff64a8c35 100644 --- a/GDJS/Runtime/pixi-renderers/pixi-object-effects-manager.ts +++ b/GDJS/Runtime/pixi-renderers/pixi-object-effects-manager.ts @@ -7,20 +7,11 @@ namespace gdjs { import PIXI = GlobalPIXIModule.PIXI; class PixiObjectEffectsManager { - protected _filters: Hashtable>; - - constructor() { - this._filters = new Hashtable(); - } update(runtimeObject: RuntimeObject, layer: Layer) { - const filters: Hashtable< - PixiFiltersTools.Filter - > | void = this._filters.get(runtimeObject.getName()); - if (!filters) return; - const filterValues: PixiFiltersTools.Filter[] = []; - filters.values(filterValues); - for (const filter of filterValues) { + const filters = runtimeObject.getFilters(); + for (const filterName in filters) { + const filter = filters[filterName]; filter.update(filter.pixiFilter, layer); } } @@ -61,12 +52,8 @@ namespace gdjs { const renderer = runtimeObject.getRendererObject(); renderer.filters = (renderer.filters || []).concat(filter.pixiFilter); - if (!this._filters.containsKey(runtimeObject.getName())) { - this._filters.put(runtimeObject.getName(), new Hashtable()); - } - - const filtersHashtable = this._filters.get(runtimeObject.getName()); - filtersHashtable.put(effectData.name, filter); + const filters = runtimeObject.getFilters(); + filters[effectData.name] = filter; } /** @@ -75,17 +62,13 @@ namespace gdjs { * @param effectName The name of the effect. */ removeEffect(runtimeObject: RuntimeObject, effectName: string) { - const filters: Hashtable< - PixiFiltersTools.Filter - > | void = this._filters.get(runtimeObject.getName()); - if (!filters) return; - if (!filters.containsKey(effectName)) return; - const filter = filters.get(effectName); + const filter = runtimeObject.getFilters()[effectName]; + if (!filter) return; const renderer: PIXI.DisplayObject = runtimeObject.getRendererObject(); renderer.filters = (renderer.filters || []).filter( (pixiFilter) => pixiFilter !== filter.pixiFilter ); - filters.remove(effectName); + delete filter[effectName]; } /** @@ -101,12 +84,8 @@ namespace gdjs { parameterName: string, value: float ): void { - const filters = this._filters.get(runtimeObject.getName()); - if (!filters) { - return; - } - if (!filters.containsKey(name)) return; - const filter = filters.get(name); + const filter = runtimeObject.getFilters()[name]; + if (!filter) return; filter.updateDoubleParameter(filter.pixiFilter, parameterName, value); } @@ -123,12 +102,8 @@ namespace gdjs { parameterName: string, value: string ): void { - const filters = this._filters.get(runtimeObject.getName()); - if (!filters) { - return; - } - if (!filters.containsKey(name)) return; - const filter = filters.get(name); + const filter = runtimeObject.getFilters()[name]; + if (!filter) return; filter.updateStringParameter(filter.pixiFilter, parameterName, value); } @@ -145,12 +120,8 @@ namespace gdjs { parameterName: string, value: boolean ): void { - const filters = this._filters.get(runtimeObject.getName()); - if (!filters) { - return; - } - if (!filters.containsKey(name)) return; - const filter = filters.get(name); + const filter = runtimeObject.getFilters()[name]; + if (!filter) return; filter.updateBooleanParameter(filter.pixiFilter, parameterName, value); } @@ -161,9 +132,7 @@ namespace gdjs { * @returns True if the effect exists, false otherwise */ hasEffect(runtimeObject: RuntimeObject, name: string): boolean { - const filters = this._filters.get(runtimeObject.getName()); - if (!filters) return false; - return !!filters.get(name); + return !!runtimeObject.getFilters()[name]; } /** @@ -177,12 +146,8 @@ namespace gdjs { name: string, value: boolean ): void { - const filters = this._filters.get(runtimeObject.getName()); - if (!filters) { - return; - } - if (!filters.containsKey(name)) return; - const filter = filters.get(name); + const filter = runtimeObject.getFilters()[name]; + if (!filter) return; gdjs.PixiFiltersTools.enableEffect(filter, value); } @@ -193,12 +158,8 @@ namespace gdjs { * @return true if the filter is enabled */ isEffectEnabled(runtimeObject: RuntimeObject, name: string): boolean { - const filters = this._filters.get(runtimeObject.getName()); - if (!filters) { - return false; - } - if (!filters.containsKey(name)) return false; - const filter = filters.get(name); + const filter = runtimeObject.getFilters()[name]; + if (!filter) return false; return gdjs.PixiFiltersTools.isEffectEnabled(filter); } } diff --git a/GDJS/Runtime/runtimeobject.ts b/GDJS/Runtime/runtimeobject.ts index 8ff20aa2e91c..e98e6954ca4a 100644 --- a/GDJS/Runtime/runtimeobject.ts +++ b/GDJS/Runtime/runtimeobject.ts @@ -72,6 +72,7 @@ namespace gdjs { //Effects: protected _effects: EffectData[]; + protected _filters: Record = {}; //Forces: protected _forces: gdjs.Force[] = []; @@ -738,6 +739,10 @@ namespace gdjs { return this._variables.has(name); } + getFilters() { + return this._filters; + } + /** * Add a new effect, or replace the one with the same name. * @param effectData The data of the effect to add. From 21e1a5576aa0e0d5d0664f5a8753f1642919a20b Mon Sep 17 00:00:00 2001 From: Harsimran Virk Date: Tue, 13 Jul 2021 18:05:39 +0530 Subject: [PATCH 08/28] Fixed action/condition descriptions --- .../Builtin/BaseObjectExtension.cpp | 65 +++++++------------ .../Builtin/BaseObjectExtension.cpp | 6 -- .../pixi-renderers/pixi-filters-tools.ts | 2 +- 3 files changed, 24 insertions(+), 49 deletions(-) diff --git a/Core/GDCore/Extensions/Builtin/BaseObjectExtension.cpp b/Core/GDCore/Extensions/Builtin/BaseObjectExtension.cpp index 9e12a501521e..5516faef74b6 100644 --- a/Core/GDCore/Extensions/Builtin/BaseObjectExtension.cpp +++ b/Core/GDCore/Extensions/Builtin/BaseObjectExtension.cpp @@ -1374,21 +1374,10 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension( "res/actions/layer.png") .AddParameter("object", _("Object")); - obj.AddAction("RemoveEffect", - _("Remove an effect"), - _("Remove an effect from the object"), - _("Remove _PARAM1_ effect from the _PARAM0_"), - _("Effects"), - "res/actions/effect24.png", - "res/actions/effect.png") - .AddParameter("object", _("Object")) - .AddParameter("string", _("Effect Name")) - .MarkAsSimple(); - obj.AddAction("EnableEffect", _("Enable an object effect"), _("Enable an effect on the object"), - _("Enable _PARAM1_ effect on _PARAM0_ : _PARAM2_"), + _("Enable effect _PARAM1_ on _PARAM0_: _PARAM2_"), _("Effects"), "res/actions/effect24.png", "res/actions/effect.png") @@ -1398,38 +1387,41 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension( .MarkAsSimple(); obj.AddAction("SetEffectDoubleParameter", - _("Set a double parameter for effect"), - _("Set a double parameter for an effect of the object"), - _("Set the value of _PARAM2_ as _PARAM3_ for the " - "effect _PARAM1_ of object _PARAM0_"), + _("Effect parameter (number)"), + _("Change the value of a parameter of an effect.") + "\n" + + _("You can find the parameter names (and change the effect " + "names) in the effects window."), + _("Set _PARAM2_ to _PARAM3_ for effect _PARAM3_ of _PARAM0_"), _("Effects"), "res/actions/effect24.png", "res/actions/effect.png") .AddParameter("object", _("Object")) .AddParameter("string", _("Effect Name")) - .AddParameter("string", _("Parameter Name")) - .AddParameter("number", _("Parameter Value")) + .AddParameter("string", _("Parameter name")) + .AddParameter("expression", _("New value")) .MarkAsSimple(); obj.AddAction("SetEffectStringParameter", - _("Set a string parameter for effect"), - _("Set a string parameter for an effect of the object"), - _("Set the value of _PARAM2_ as _PARAM3_ for the " - "effect _PARAM1_ of object _PARAM0_"), + _("Effect parameter (string)"), + _("Change the value (string) of a parameter of an effect.") + "\n" + + _("You can find the parameter names (and change the effect " + "names) in the effects window."), + _("Set _PARAM2_ to _PARAM3_ for effect _PARAM3_ of _PARAM0_"), _("Effects"), "res/actions/effect24.png", "res/actions/effect.png") .AddParameter("object", _("Object")) .AddParameter("string", _("Effect Name")) - .AddParameter("string", _("Parameter Name")) - .AddParameter("string", _("Parameter Value")) + .AddParameter("string", _("Parameter name")) + .AddParameter("string", _("New value")) .MarkAsSimple(); obj.AddAction("SetEffectBooleanParameter", - _("Set a boolean parameter for effect"), - _("Set a boolean parameter for an effect of the object"), - _("Set the value of _PARAM2_ as _PARAM3_ for the " - "effect _PARAM1_ of object _PARAM0_"), + _("Effect parameter (enable or disable)"), + _("Enable or disable a parameter of an effect.") + "\n" + + _("You can find the parameter names (and change the effect " + "names) in the effects window."), + _("Enable _PARAM2_ for effect _PARAM1_ of _PARAM0_: _PARAM3_"), _("Effects"), "res/actions/effect24.png", "res/actions/effect.png") @@ -1440,20 +1432,9 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension( .MarkAsSimple(); obj.AddCondition("IsEffectEnabled", - _("Effect Enabled"), - _("Check if effect is enabled"), - _("_PARAM1_ is enabled on _PARAM0_"), - _("Effects"), - "res/actions/effect24.png", - "res/actions/effect.png") - .AddParameter("object", _("Object")) - .AddParameter("string", _("Effect Name")) - .MarkAsSimple(); - - obj.AddCondition("HasEffect", - _("Has Enabled"), - _("Check if the object has the specified effect"), - _("_PARAM0_ has _PARAM1_ effect"), + _("Effect is enabled"), + _("The effect on an object is enabled"), + _("Effect _PARAM2_ on _PARAM1_ is enabled"), _("Effects"), "res/actions/effect24.png", "res/actions/effect.png") diff --git a/GDJS/GDJS/Extensions/Builtin/BaseObjectExtension.cpp b/GDJS/GDJS/Extensions/Builtin/BaseObjectExtension.cpp index da87e13ef2e5..c53620a1b45c 100644 --- a/GDJS/GDJS/Extensions/Builtin/BaseObjectExtension.cpp +++ b/GDJS/GDJS/Extensions/Builtin/BaseObjectExtension.cpp @@ -88,9 +88,6 @@ BaseObjectExtension::BaseObjectExtension() { objectConditions["IsEffectEnabled"] .SetFunctionName("isEffectEnabled") .SetIncludeFile("runtimeobject.js"); - objectConditions["HasEffect"] - .SetFunctionName("hasEffect") - .SetIncludeFile("runtimeobject.js"); objectActions["Delete"].SetFunctionName("deleteFromScene"); objectActions["MettreAutourPos"].SetFunctionName("putAround"); objectActions["MettreAutour"] @@ -179,9 +176,6 @@ BaseObjectExtension::BaseObjectExtension() { objectActions["RemoveObjectTimer"] .SetFunctionName("removeTimer") .SetIncludeFile("runtimeobject.js"); - objectActions["RemoveEffect"] - .SetFunctionName("removeEffect") - .SetIncludeFile("runtimeobject.js"); objectActions["EnableEffect"] .SetFunctionName("enableEffect") .SetIncludeFile("runtimeobject.js"); diff --git a/GDJS/Runtime/pixi-renderers/pixi-filters-tools.ts b/GDJS/Runtime/pixi-renderers/pixi-filters-tools.ts index 985df6aac43a..4a3dc4738c61 100644 --- a/GDJS/Runtime/pixi-renderers/pixi-filters-tools.ts +++ b/GDJS/Runtime/pixi-renderers/pixi-filters-tools.ts @@ -15,7 +15,7 @@ namespace gdjs { return arr.indexOf(value) !== -1 ? value : min; }; - export const _filterCreators: { + const _filterCreators: { [filterName: string]: FilterCreator; } = {}; From 44b87378cba5e4d47122878ac733b3d80e315c18 Mon Sep 17 00:00:00 2001 From: Harsimran Virk Date: Thu, 15 Jul 2021 16:13:24 +0530 Subject: [PATCH 09/28] Fixed formatiing and renamed _filters field to _renderEffects. --- .../pixi-object-effects-manager.ts | 21 +++++++++---------- GDJS/Runtime/runtimegame.ts | 2 +- GDJS/Runtime/runtimeobject.ts | 18 +++++++++++----- 3 files changed, 24 insertions(+), 17 deletions(-) diff --git a/GDJS/Runtime/pixi-renderers/pixi-object-effects-manager.ts b/GDJS/Runtime/pixi-renderers/pixi-object-effects-manager.ts index c7dff64a8c35..0c751dedcc7a 100644 --- a/GDJS/Runtime/pixi-renderers/pixi-object-effects-manager.ts +++ b/GDJS/Runtime/pixi-renderers/pixi-object-effects-manager.ts @@ -7,9 +7,8 @@ namespace gdjs { import PIXI = GlobalPIXIModule.PIXI; class PixiObjectEffectsManager { - update(runtimeObject: RuntimeObject, layer: Layer) { - const filters = runtimeObject.getFilters(); + const filters = runtimeObject.getRenderEffects(); for (const filterName in filters) { const filter = filters[filterName]; filter.update(filter.pixiFilter, layer); @@ -52,7 +51,7 @@ namespace gdjs { const renderer = runtimeObject.getRendererObject(); renderer.filters = (renderer.filters || []).concat(filter.pixiFilter); - const filters = runtimeObject.getFilters(); + const filters = runtimeObject.getRenderEffects(); filters[effectData.name] = filter; } @@ -62,13 +61,13 @@ namespace gdjs { * @param effectName The name of the effect. */ removeEffect(runtimeObject: RuntimeObject, effectName: string) { - const filter = runtimeObject.getFilters()[effectName]; + const filter = runtimeObject.getRenderEffects()[effectName]; if (!filter) return; const renderer: PIXI.DisplayObject = runtimeObject.getRendererObject(); renderer.filters = (renderer.filters || []).filter( (pixiFilter) => pixiFilter !== filter.pixiFilter ); - delete filter[effectName]; + delete runtimeObject.getRenderEffects()[effectName]; } /** @@ -84,7 +83,7 @@ namespace gdjs { parameterName: string, value: float ): void { - const filter = runtimeObject.getFilters()[name]; + const filter = runtimeObject.getRenderEffects()[name]; if (!filter) return; filter.updateDoubleParameter(filter.pixiFilter, parameterName, value); } @@ -102,7 +101,7 @@ namespace gdjs { parameterName: string, value: string ): void { - const filter = runtimeObject.getFilters()[name]; + const filter = runtimeObject.getRenderEffects()[name]; if (!filter) return; filter.updateStringParameter(filter.pixiFilter, parameterName, value); } @@ -120,7 +119,7 @@ namespace gdjs { parameterName: string, value: boolean ): void { - const filter = runtimeObject.getFilters()[name]; + const filter = runtimeObject.getRenderEffects()[name]; if (!filter) return; filter.updateBooleanParameter(filter.pixiFilter, parameterName, value); } @@ -132,7 +131,7 @@ namespace gdjs { * @returns True if the effect exists, false otherwise */ hasEffect(runtimeObject: RuntimeObject, name: string): boolean { - return !!runtimeObject.getFilters()[name]; + return !!runtimeObject.getRenderEffects()[name]; } /** @@ -146,7 +145,7 @@ namespace gdjs { name: string, value: boolean ): void { - const filter = runtimeObject.getFilters()[name]; + const filter = runtimeObject.getRenderEffects()[name]; if (!filter) return; gdjs.PixiFiltersTools.enableEffect(filter, value); } @@ -158,7 +157,7 @@ namespace gdjs { * @return true if the filter is enabled */ isEffectEnabled(runtimeObject: RuntimeObject, name: string): boolean { - const filter = runtimeObject.getFilters()[name]; + const filter = runtimeObject.getRenderEffects()[name]; if (!filter) return false; return gdjs.PixiFiltersTools.isEffectEnabled(filter); } diff --git a/GDJS/Runtime/runtimegame.ts b/GDJS/Runtime/runtimegame.ts index 76919a1ff523..04d0e1c22d18 100644 --- a/GDJS/Runtime/runtimegame.ts +++ b/GDJS/Runtime/runtimegame.ts @@ -40,7 +40,7 @@ namespace gdjs { _soundManager: SoundManager; _fontManager: FontManager; _jsonManager: JsonManager; - _objectEffectsManager: ObjectEffectsManager + _objectEffectsManager: ObjectEffectsManager; _bitmapFontManager: BitmapFontManager; _maxFPS: integer; _minFPS: integer; diff --git a/GDJS/Runtime/runtimeobject.ts b/GDJS/Runtime/runtimeobject.ts index e98e6954ca4a..c4485f5cb563 100644 --- a/GDJS/Runtime/runtimeobject.ts +++ b/GDJS/Runtime/runtimeobject.ts @@ -72,7 +72,7 @@ namespace gdjs { //Effects: protected _effects: EffectData[]; - protected _filters: Record = {}; + protected _renderEffects: Record = {}; //Forces: protected _forces: gdjs.Force[] = []; @@ -210,8 +210,11 @@ namespace gdjs { * @param runtimeScene The gdjs.RuntimeScene the object belongs to. */ update(runtimeScene: gdjs.RuntimeScene): void { - const layer = this._runtimeScene.getLayer(this.layer) - this._runtimeScene.getGame().getObjectEffectsManager().update(this, layer); + const layer = this._runtimeScene.getLayer(this.layer); + this._runtimeScene + .getGame() + .getObjectEffectsManager() + .update(this, layer); } /** @@ -739,8 +742,13 @@ namespace gdjs { return this._variables.has(name); } - getFilters() { - return this._filters; + /** + * Returns the collection of effects to be rendered + * by the underlying renderer. + * @returns The render effects. + */ + getRenderEffects() { + return this._renderEffects; } /** From 13af0ea2c0732122210ce573d52e1a3aebe3662f Mon Sep 17 00:00:00 2001 From: Harsimran Virk Date: Thu, 15 Jul 2021 16:33:49 +0530 Subject: [PATCH 10/28] Renamed _renderEffects to _rendererEffects --- .../pixi-object-effects-manager.ts | 20 +++++++++---------- GDJS/Runtime/runtimeobject.ts | 6 +++--- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/GDJS/Runtime/pixi-renderers/pixi-object-effects-manager.ts b/GDJS/Runtime/pixi-renderers/pixi-object-effects-manager.ts index 0c751dedcc7a..b2eefe35f6aa 100644 --- a/GDJS/Runtime/pixi-renderers/pixi-object-effects-manager.ts +++ b/GDJS/Runtime/pixi-renderers/pixi-object-effects-manager.ts @@ -8,7 +8,7 @@ namespace gdjs { class PixiObjectEffectsManager { update(runtimeObject: RuntimeObject, layer: Layer) { - const filters = runtimeObject.getRenderEffects(); + const filters = runtimeObject.getRendererEffects(); for (const filterName in filters) { const filter = filters[filterName]; filter.update(filter.pixiFilter, layer); @@ -51,7 +51,7 @@ namespace gdjs { const renderer = runtimeObject.getRendererObject(); renderer.filters = (renderer.filters || []).concat(filter.pixiFilter); - const filters = runtimeObject.getRenderEffects(); + const filters = runtimeObject.getRendererEffects(); filters[effectData.name] = filter; } @@ -61,13 +61,13 @@ namespace gdjs { * @param effectName The name of the effect. */ removeEffect(runtimeObject: RuntimeObject, effectName: string) { - const filter = runtimeObject.getRenderEffects()[effectName]; + const filter = runtimeObject.getRendererEffects()[effectName]; if (!filter) return; const renderer: PIXI.DisplayObject = runtimeObject.getRendererObject(); renderer.filters = (renderer.filters || []).filter( (pixiFilter) => pixiFilter !== filter.pixiFilter ); - delete runtimeObject.getRenderEffects()[effectName]; + delete runtimeObject.getRendererEffects()[effectName]; } /** @@ -83,7 +83,7 @@ namespace gdjs { parameterName: string, value: float ): void { - const filter = runtimeObject.getRenderEffects()[name]; + const filter = runtimeObject.getRendererEffects()[name]; if (!filter) return; filter.updateDoubleParameter(filter.pixiFilter, parameterName, value); } @@ -101,7 +101,7 @@ namespace gdjs { parameterName: string, value: string ): void { - const filter = runtimeObject.getRenderEffects()[name]; + const filter = runtimeObject.getRendererEffects()[name]; if (!filter) return; filter.updateStringParameter(filter.pixiFilter, parameterName, value); } @@ -119,7 +119,7 @@ namespace gdjs { parameterName: string, value: boolean ): void { - const filter = runtimeObject.getRenderEffects()[name]; + const filter = runtimeObject.getRendererEffects()[name]; if (!filter) return; filter.updateBooleanParameter(filter.pixiFilter, parameterName, value); } @@ -131,7 +131,7 @@ namespace gdjs { * @returns True if the effect exists, false otherwise */ hasEffect(runtimeObject: RuntimeObject, name: string): boolean { - return !!runtimeObject.getRenderEffects()[name]; + return !!runtimeObject.getRendererEffects()[name]; } /** @@ -145,7 +145,7 @@ namespace gdjs { name: string, value: boolean ): void { - const filter = runtimeObject.getRenderEffects()[name]; + const filter = runtimeObject.getRendererEffects()[name]; if (!filter) return; gdjs.PixiFiltersTools.enableEffect(filter, value); } @@ -157,7 +157,7 @@ namespace gdjs { * @return true if the filter is enabled */ isEffectEnabled(runtimeObject: RuntimeObject, name: string): boolean { - const filter = runtimeObject.getRenderEffects()[name]; + const filter = runtimeObject.getRendererEffects()[name]; if (!filter) return false; return gdjs.PixiFiltersTools.isEffectEnabled(filter); } diff --git a/GDJS/Runtime/runtimeobject.ts b/GDJS/Runtime/runtimeobject.ts index c4485f5cb563..881558c5dd77 100644 --- a/GDJS/Runtime/runtimeobject.ts +++ b/GDJS/Runtime/runtimeobject.ts @@ -72,7 +72,7 @@ namespace gdjs { //Effects: protected _effects: EffectData[]; - protected _renderEffects: Record = {}; + protected _rendererEffects: Record = {}; //Forces: protected _forces: gdjs.Force[] = []; @@ -747,8 +747,8 @@ namespace gdjs { * by the underlying renderer. * @returns The render effects. */ - getRenderEffects() { - return this._renderEffects; + getRendererEffects() { + return this._rendererEffects; } /** From 72d14184152d101ebbdca2a1c3906c9e1a4caf71 Mon Sep 17 00:00:00 2001 From: Harsimran Virk Date: Thu, 15 Jul 2021 21:20:55 +0530 Subject: [PATCH 11/28] Refactored code to take RendererEffects instead of runtime object. Added hot-reload. --- .../pixi-object-effects-manager.ts | 198 +++++++++++++----- GDJS/Runtime/runtimeobject.ts | 136 ++++++++---- .../websocket-debugger-client/hot-reloader.ts | 77 ++++++- 3 files changed, 317 insertions(+), 94 deletions(-) diff --git a/GDJS/Runtime/pixi-renderers/pixi-object-effects-manager.ts b/GDJS/Runtime/pixi-renderers/pixi-object-effects-manager.ts index b2eefe35f6aa..8a2069245b73 100644 --- a/GDJS/Runtime/pixi-renderers/pixi-object-effects-manager.ts +++ b/GDJS/Runtime/pixi-renderers/pixi-object-effects-manager.ts @@ -6,26 +6,20 @@ namespace gdjs { import PIXI = GlobalPIXIModule.PIXI; - class PixiObjectEffectsManager { - update(runtimeObject: RuntimeObject, layer: Layer) { - const filters = runtimeObject.getRendererEffects(); - for (const filterName in filters) { - const filter = filters[filterName]; - filter.update(filter.pixiFilter, layer); - } - } + type RendererEffects = Record; + class PixiObjectEffectsManager { /** - * Add a new effect on a runtime object, or replace the one - * with the same name. - * @param runtimeObject The runtime object - * @param effectData The data of the effect to add. + * Initialize the renderer effects from the effect data. + * @param effectData The effect data + * @param rendererEffects The renderer effects collection + * @param layer The layer */ - addEffect( - runtimeObject: RuntimeObject, + initializeEffect( effectData: EffectData, + rendererEffects: RendererEffects, layer: Layer - ) { + ): boolean { const filterCreator = gdjs.PixiFiltersTools.getFilterCreator( effectData.effectType ); @@ -37,7 +31,7 @@ namespace gdjs { effectData.effectType + '". Was it registered properly? Is the effect type correct?' ); - return; + return false; } const filter: PixiFiltersTools.Filter = { @@ -48,116 +42,218 @@ namespace gdjs { update: filterCreator.update, }; - const renderer = runtimeObject.getRendererObject(); - renderer.filters = (renderer.filters || []).concat(filter.pixiFilter); + rendererEffects[effectData.name] = filter; + return true; + } + + /** + * Apply the effect on the renderer object. + * @param rendererObject The renderer object + * @param effect The effect to be applied. + */ + applyEffect( + rendererObject: PIXI.DisplayObject, + effect: PixiFiltersTools.Filter + ): boolean { + rendererObject.filters = (rendererObject.filters || []).concat( + effect.pixiFilter + ); + return true; + } + + /** + * Update the filters applied on an object. + * @param runtimeObject + * @param layer + */ + update(rendererEffects: RendererEffects, layer: Layer) { + for (const filterName in rendererEffects) { + const filter = rendererEffects[filterName]; + filter.update(filter.pixiFilter, layer); + } + } - const filters = runtimeObject.getRendererEffects(); - filters[effectData.name] = filter; + /** + * Add a new effect on a runtime object, or replace the one + * with the same name. + * @param effectData The effect data + * @param rendererEffects The renderer effects + * @param rendererObject The renderer object + * @param layer The Layer + */ + addEffect( + effectData: EffectData, + rendererEffects: RendererEffects, + rendererObject: PIXI.DisplayObject, + layer: Layer + ): boolean { + let effectAdded = true; + effectAdded = + this.initializeEffect(effectData, rendererEffects, layer) && + effectAdded; + effectAdded = + this.updateAllEffectParameters(rendererEffects, effectData) && + effectAdded; + effectAdded = + this.applyEffect(rendererObject, rendererEffects[effectData.name]) && + effectAdded; + return effectAdded; } /** * Remove the effect from a runtime object with the specified name - * @param runtimeObject The runtime object. + * @param rendererEffects The renderer effects of the object. + * @param rendererObject The renderer object. * @param effectName The name of the effect. */ - removeEffect(runtimeObject: RuntimeObject, effectName: string) { - const filter = runtimeObject.getRendererEffects()[effectName]; - if (!filter) return; - const renderer: PIXI.DisplayObject = runtimeObject.getRendererObject(); - renderer.filters = (renderer.filters || []).filter( + removeEffect( + rendererEffects: RendererEffects, + rendererObject: PIXI.DisplayObject, + effectName: string + ): boolean { + const filter = rendererEffects[effectName]; + if (!filter) return false; + rendererObject.filters = (rendererObject.filters || []).filter( (pixiFilter) => pixiFilter !== filter.pixiFilter ); - delete runtimeObject.getRendererEffects()[effectName]; + delete rendererEffects[effectName]; + return true; } /** * Update the parameter of an effect (with a number). - * @param runtimeObject The runtime object + * @param rendererEffects The renderer effects of the object. * @param name The effect name * @param parameterName The parameter name * @param value The new value for the parameter */ setEffectDoubleParameter( - runtimeObject: RuntimeObject, + rendererEffects: RendererEffects, name: string, parameterName: string, value: float - ): void { - const filter = runtimeObject.getRendererEffects()[name]; - if (!filter) return; + ): boolean { + const filter = rendererEffects[name]; + if (!filter) return false; filter.updateDoubleParameter(filter.pixiFilter, parameterName, value); + return true; } /** * Update the parameter of an effect (with a string). - * @param runtimeObject The runtime object + * @param rendererEffects The renderer effects of the object. * @param name The effect name * @param parameterName The parameter name * @param value The new value for the parameter */ setEffectStringParameter( - runtimeObject: RuntimeObject, + rendererEffects: RendererEffects, name: string, parameterName: string, value: string - ): void { - const filter = runtimeObject.getRendererEffects()[name]; - if (!filter) return; + ): boolean { + const filter = rendererEffects[name]; + if (!filter) return false; filter.updateStringParameter(filter.pixiFilter, parameterName, value); + return true; } /** * Enable or disable the parameter of an effect (boolean). - * @param runtimeObject The runtime object + * @param rendererEffects The renderer effects of the object. * @param name The effect name * @param parameterName The parameter name * @param value The new value for the parameter */ setEffectBooleanParameter( - runtimeObject: RuntimeObject, + rendererEffects: RendererEffects, name: string, parameterName: string, value: boolean - ): void { - const filter = runtimeObject.getRendererEffects()[name]; - if (!filter) return; + ): boolean { + const filter = rendererEffects[name]; + if (!filter) return false; filter.updateBooleanParameter(filter.pixiFilter, parameterName, value); + return true; + } + + /** + * Updates all the effect parameters. + * @param rendererEffects + * @param effectData + */ + updateAllEffectParameters( + rendererEffects: RendererEffects, + effectData: EffectData + ): boolean { + let updatedDoubles = true; + let updatedStrings = true; + let updatedBooleans = true; + for (let name in effectData.doubleParameters) { + updatedDoubles = + this.setEffectDoubleParameter( + rendererEffects, + effectData.name, + name, + effectData.doubleParameters[name] + ) && updatedDoubles; + } + for (let name in effectData.stringParameters) { + updatedStrings = + this.setEffectStringParameter( + rendererEffects, + effectData.name, + name, + effectData.stringParameters[name] + ) && updatedStrings; + } + for (let name in effectData.booleanParameters) { + updatedBooleans = + this.setEffectBooleanParameter( + rendererEffects, + effectData.name, + name, + effectData.booleanParameters[name] + ) && updatedBooleans; + } + + return updatedDoubles && updatedStrings && updatedBooleans; } /** * Check if an effect exists. - * @param runtimeObject + * @param rendererEffects The renderer effects of the object. * @param name The effect name * @returns True if the effect exists, false otherwise */ - hasEffect(runtimeObject: RuntimeObject, name: string): boolean { - return !!runtimeObject.getRendererEffects()[name]; + hasEffect(rendererEffects: RendererEffects, name: string): boolean { + return !!rendererEffects[name]; } /** * Enable an effect. - * @param runtimeObject The runtime object. + * @param rendererEffects The renderer effects of the object. * @param name The effect name * @param value Set to true to enable, false to disable */ enableEffect( - runtimeObject: RuntimeObject, + rendererEffects: RendererEffects, name: string, value: boolean ): void { - const filter = runtimeObject.getRendererEffects()[name]; + const filter = rendererEffects[name]; if (!filter) return; gdjs.PixiFiltersTools.enableEffect(filter, value); } /** * Check if an effect is enabled. - * @param runtimeObject The runtime object + * @param rendererEffects The renderer effects of the object. * @param name The effect name * @return true if the filter is enabled */ - isEffectEnabled(runtimeObject: RuntimeObject, name: string): boolean { - const filter = runtimeObject.getRendererEffects()[name]; + isEffectEnabled(rendererEffects: RendererEffects, name: string): boolean { + const filter = rendererEffects[name]; if (!filter) return false; return gdjs.PixiFiltersTools.isEffectEnabled(filter); } diff --git a/GDJS/Runtime/runtimeobject.ts b/GDJS/Runtime/runtimeobject.ts index 881558c5dd77..1274ce72b848 100644 --- a/GDJS/Runtime/runtimeobject.ts +++ b/GDJS/Runtime/runtimeobject.ts @@ -71,7 +71,6 @@ namespace gdjs { protected _variables: gdjs.VariablesContainer; //Effects: - protected _effects: EffectData[]; protected _rendererEffects: Record = {}; //Forces: @@ -102,7 +101,10 @@ namespace gdjs { ); this._averageForce = new gdjs.Force(0, 0, 0); this._behaviorsTable = new Hashtable(); - this._effects = objectData.effects; + for (let i = 0; i < objectData.effects.length; ++i) { + this.initializeEffect(objectData.effects[i]); + this.updateAllEffectParameters(objectData.effects[i]); + } //Also contains the behaviors: Used when a behavior is accessed by its name ( see getBehavior ). for (let i = 0, len = objectData.behaviors.length; i < len; ++i) { @@ -129,8 +131,14 @@ namespace gdjs { this._behaviors[i].onCreated(); } - for (let i = 0; i < this._effects.length; i++) { - this.addEffect(this._effects[i]); + const objectEffectsManager = this._runtimeScene + .getGame() + .getObjectEffectsManager(); + for (const filterName in this._rendererEffects) { + objectEffectsManager.applyEffect( + this.getRendererObject(), + this._rendererEffects[filterName] + ); } } @@ -214,7 +222,7 @@ namespace gdjs { this._runtimeScene .getGame() .getObjectEffectsManager() - .update(this, layer); + .update(this._rendererEffects, layer); } /** @@ -234,6 +242,25 @@ namespace gdjs { initialInstanceData: InstanceData ): void {} + /** + * Update the effects during hot-reload + * @param oldEffectData Old effect data + * @param newEffectData New effect data + * @returns + */ + _hotReloadRuntimeObjectEffects( + oldEffectData: EffectData[], + newEffectData: EffectData[] + ): boolean { + for (let i = 0; i < oldEffectData.length; ++i) { + this.removeEffect(oldEffectData[i].name); + } + for (let i = 0; i < newEffectData.length; ++i) { + this.addEffect(newEffectData[i]); + } + return true; + } + //Nothing to do. /** * Called when the object must be updated using the specified objectData. This is the @@ -247,8 +274,10 @@ namespace gdjs { oldObjectData: ObjectData, newObjectData: ObjectData ): boolean { - // If not redefined, mark by default the hot-reload as failed. - return false; + return this._hotReloadRuntimeObjectEffects( + oldObjectData.effects, + newObjectData.effects + ); } /** @@ -751,47 +780,44 @@ namespace gdjs { return this._rendererEffects; } + initializeEffect(effectsData: EffectData) { + const layer = this._runtimeScene.getLayer(this.layer); + this._runtimeScene + .getGame() + .getObjectEffectsManager() + .initializeEffect(effectsData, this._rendererEffects, layer); + } + /** * Add a new effect, or replace the one with the same name. * @param effectData The data of the effect to add. */ - addEffect(effectData) { - this._runtimeScene + addEffect(effectData: EffectData): boolean { + const layer = this._runtimeScene.getLayer(this.layer); + return this._runtimeScene .getGame() .getObjectEffectsManager() - .addEffect(this, effectData, this._runtimeScene.getLayer(this.layer)); - for (let name in effectData.doubleParameters) { - this.setEffectDoubleParameter( - effectData.name, - name, - effectData.doubleParameters[name] - ); - } - for (let name in effectData.stringParameters) { - this.setEffectStringParameter( - effectData.name, - name, - effectData.stringParameters[name] + .addEffect( + effectData, + this._rendererEffects, + this.getRendererObject(), + layer ); - } - for (let name in effectData.booleanParameters) { - this.setEffectBooleanParameter( - effectData.name, - name, - effectData.booleanParameters[name] - ); - } } /** * Remove the effect with the specified name * @param effectName The name of the effect. */ - removeEffect(effectName) { - this._runtimeScene + removeEffect(effectName: string): boolean { + return this._runtimeScene .getGame() .getObjectEffectsManager() - .removeEffect(this, effectName); + .removeEffect( + this._rendererEffects, + this.getRendererObject(), + effectName + ); } /** @@ -804,11 +830,16 @@ namespace gdjs { name: string, parameterName: string, value: float - ) { + ): boolean { return this._runtimeScene .getGame() .getObjectEffectsManager() - .setEffectDoubleParameter(this, name, parameterName, value); + .setEffectDoubleParameter( + this._rendererEffects, + name, + parameterName, + value + ); } /** @@ -821,11 +852,16 @@ namespace gdjs { name: string, parameterName: string, value: string - ) { + ): boolean { return this._runtimeScene .getGame() .getObjectEffectsManager() - .setEffectStringParameter(this, name, parameterName, value); + .setEffectStringParameter( + this._rendererEffects, + name, + parameterName, + value + ); } /** @@ -838,11 +874,27 @@ namespace gdjs { name: string, parameterName: string, value: boolean - ): void { + ): boolean { + return this._runtimeScene + .getGame() + .getObjectEffectsManager() + .setEffectBooleanParameter( + this._rendererEffects, + name, + parameterName, + value + ); + } + + /** + * Updates all the effect parameters. + * @param effectData + */ + updateAllEffectParameters(effectData: EffectData): boolean { return this._runtimeScene .getGame() .getObjectEffectsManager() - .setEffectBooleanParameter(this, name, parameterName, value); + .updateAllEffectParameters(this._rendererEffects, effectData); } /** @@ -854,7 +906,7 @@ namespace gdjs { this._runtimeScene .getGame() .getObjectEffectsManager() - .enableEffect(this, name, enable); + .enableEffect(this._rendererEffects, name, enable); } /** @@ -866,7 +918,7 @@ namespace gdjs { return this._runtimeScene .getGame() .getObjectEffectsManager() - .isEffectEnabled(this, name); + .isEffectEnabled(this._rendererEffects, name); } /** @@ -878,7 +930,7 @@ namespace gdjs { return this._runtimeScene .getGame() .getObjectEffectsManager() - .hasEffect(this, name); + .hasEffect(this._rendererEffects, name); } /** diff --git a/GDJS/Runtime/websocket-debugger-client/hot-reloader.ts b/GDJS/Runtime/websocket-debugger-client/hot-reloader.ts index 0bf75540a863..6fe0db89ca5f 100644 --- a/GDJS/Runtime/websocket-debugger-client/hot-reloader.ts +++ b/GDJS/Runtime/websocket-debugger-client/hot-reloader.ts @@ -791,7 +791,7 @@ namespace gdjs { hotReloadSucceeded; }); - // Don't update the variables and behaviors for each runtime object to avoid + // Don't update the variables, behaviors and effects for each runtime object to avoid // doing the check for differences for every single object. // Update variables @@ -809,6 +809,13 @@ namespace gdjs { newObjectData.behaviors, runtimeObjects ); + + // Update effects + this._hotReloadRuntimeObjectsEffects( + oldObjectData.effects, + newObjectData.effects, + runtimeObjects + ); } if (!hotReloadSucceeded) { this._logs.push({ @@ -898,6 +905,74 @@ namespace gdjs { }); } + _hotReloadRuntimeObjectsEffects( + oldEffects: EffectData[], + newEffects: EffectData[], + runtimeObjects: RuntimeObject[] + ): void { + oldEffects.forEach((oldEffectData) => { + const name = oldEffectData.name; + const newEffectData = newEffects.filter( + (effectData) => effectData.name === name + )[0]; + if (!newEffectData) { + // Effect was removed. + runtimeObjects.forEach((runtimeObject) => { + if (runtimeObject.hasEffect(name)) { + if (!runtimeObject.removeEffect(name)) { + this._logs.push({ + kind: 'error', + message: + 'Effect ' + + name + + ' could not be removed from object' + + runtimeObject.getName(), + }); + } + } + }); + } else { + if (!HotReloader.deepEqual(oldEffectData, newEffectData)) { + let hotReloadSucceeded = true; + runtimeObjects.forEach((runtimeObject) => { + hotReloadSucceeded = + runtimeObject.updateAllEffectParameters(newEffectData) && + hotReloadSucceeded; + }); + if (!hotReloadSucceeded) { + this._logs.push({ + kind: 'error', + message: + newEffectData.name + ' effect could not be hot-reloaded.', + }); + } + } + } + }); + newEffects.forEach((newEffectData) => { + const name = newEffectData.name; + const oldEffectData = oldEffects.filter( + (oldEffectData) => oldEffectData.name === name + )[0]; + if (!oldEffectData) { + // Effect was added + let hotReloadSucceeded = true; + runtimeObjects.forEach((runtimeObject) => { + hotReloadSucceeded = + runtimeObject.addEffect(newEffectData) && hotReloadSucceeded; + }); + if (!hotReloadSucceeded) { + this._logs.push({ + kind: 'error', + message: + newEffectData.name + + ' effect could not be added during hot-reload.', + }); + } + } + }); + } + /** * @returns true if hot-reload succeeded, false otherwise. */ From f65a3f6add7093226849a3efdc2a2f3315d93749 Mon Sep 17 00:00:00 2001 From: Harsimran Virk Date: Thu, 15 Jul 2021 21:34:09 +0530 Subject: [PATCH 12/28] Fixed hot-reload bug --- .../websocket-debugger-client/hot-reloader.ts | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/GDJS/Runtime/websocket-debugger-client/hot-reloader.ts b/GDJS/Runtime/websocket-debugger-client/hot-reloader.ts index 6fe0db89ca5f..0dbf6e3d5f78 100644 --- a/GDJS/Runtime/websocket-debugger-client/hot-reloader.ts +++ b/GDJS/Runtime/websocket-debugger-client/hot-reloader.ts @@ -935,9 +935,15 @@ namespace gdjs { if (!HotReloader.deepEqual(oldEffectData, newEffectData)) { let hotReloadSucceeded = true; runtimeObjects.forEach((runtimeObject) => { - hotReloadSucceeded = - runtimeObject.updateAllEffectParameters(newEffectData) && - hotReloadSucceeded; + if (oldEffectData.effectType === newEffectData.effectType) { + hotReloadSucceeded = + runtimeObject.updateAllEffectParameters(newEffectData) && + hotReloadSucceeded; + } else { + // Another effect type was applied + runtimeObject.removeEffect(oldEffectData.name); + runtimeObject.addEffect(newEffectData); + } }); if (!hotReloadSucceeded) { this._logs.push({ From 9d5e13aa8f09472a1e660e607e1e37475a5f1689 Mon Sep 17 00:00:00 2001 From: Harsimran Virk Date: Mon, 2 Aug 2021 14:24:20 +0530 Subject: [PATCH 13/28] Added EffectsTarget interface --- Extensions/Effects/crt-pixi-filter.ts | 6 +++--- Extensions/Effects/displacement-pixi-filter.ts | 6 +++--- Extensions/Effects/glitch-pixi-filter.ts | 4 ++-- Extensions/Effects/godray-pixi-filter.ts | 4 ++-- Extensions/Effects/kawase-blur-pixi-filter.ts | 2 +- Extensions/Effects/old-film-pixi-filter.ts | 4 ++-- Extensions/Effects/radial-blur-pixi-filter.ts | 6 +++--- Extensions/Effects/reflection-pixi-filter.ts | 4 ++-- Extensions/Effects/twist-pixi-filter.ts | 6 +++--- Extensions/Effects/zoom-blur-pixi-filter.ts | 6 +++--- GDJS/Runtime/layer.ts | 6 +++--- GDJS/Runtime/pixi-renderers/pixi-filters-tools.ts | 6 +++--- .../pixi-renderers/pixi-object-effects-manager.ts | 11 +++++++++-- GDJS/Runtime/runtimeobject.ts | 8 ++++++-- 14 files changed, 45 insertions(+), 34 deletions(-) diff --git a/Extensions/Effects/crt-pixi-filter.ts b/Extensions/Effects/crt-pixi-filter.ts index 525cd621ccb3..2cc7be3360f2 100644 --- a/Extensions/Effects/crt-pixi-filter.ts +++ b/Extensions/Effects/crt-pixi-filter.ts @@ -7,14 +7,14 @@ namespace gdjs { crtFilter._animationTimer = 0; return crtFilter; }, - update: function (filter, layer) { + update: function (filter, target) { if (filter.animationSpeed !== 0) { // Multiply by 10 so that the default value is a sensible speed filter.time += - (layer.getElapsedTime() / 1000) * 10 * filter.animationSpeed; + (target.getElapsedTime(target.getRuntimeScene()) / 1000) * 10 * filter.animationSpeed; } if (filter.animationFrequency !== 0) { - filter._animationTimer += layer.getElapsedTime() / 1000; + filter._animationTimer += target.getElapsedTime(target.getRuntimeScene()) / 1000; if (filter._animationTimer >= 1 / filter.animationFrequency) { filter.seed = Math.random(); filter._animationTimer = 0; diff --git a/Extensions/Effects/displacement-pixi-filter.ts b/Extensions/Effects/displacement-pixi-filter.ts index e9cf78d49362..342f8afb0cd1 100644 --- a/Extensions/Effects/displacement-pixi-filter.ts +++ b/Extensions/Effects/displacement-pixi-filter.ts @@ -1,8 +1,8 @@ namespace gdjs { import PIXI = GlobalPIXIModule.PIXI; gdjs.PixiFiltersTools.registerFilterCreator('Displacement', { - makePIXIFilter: function (layer, effectData) { - const displacementMapTexture = layer + makePIXIFilter: function (target, effectData) { + const displacementMapTexture = target .getRuntimeScene() .getGame() .getImageManager() @@ -14,7 +14,7 @@ namespace gdjs { ); return displacementFilter; }, - update: function (filter, layer) {}, + update: function (filter, target) {}, updateDoubleParameter: function (filter, parameterName, value) { // @ts-ignore - unsure why PIXI.filters is not recognised. const displacementFilter = (filter as unknown) as PIXI.filters.DisplacementFilter; diff --git a/Extensions/Effects/glitch-pixi-filter.ts b/Extensions/Effects/glitch-pixi-filter.ts index ead4950c3bcf..f23a9baf29f0 100644 --- a/Extensions/Effects/glitch-pixi-filter.ts +++ b/Extensions/Effects/glitch-pixi-filter.ts @@ -7,9 +7,9 @@ namespace gdjs { glitchFilter._animationTimer = 0; return glitchFilter; }, - update: function (filter, layer) { + update: function (filter, target) { if (filter.animationFrequency !== 0) { - filter._animationTimer += layer.getElapsedTime() / 1000; + filter._animationTimer += target.getElapsedTime(target.getRuntimeScene()) / 1000; if (filter._animationTimer >= 1 / filter.animationFrequency) { filter.seed = Math.random(); filter._animationTimer = 0; diff --git a/Extensions/Effects/godray-pixi-filter.ts b/Extensions/Effects/godray-pixi-filter.ts index 954fb3e7aafc..9d37642d9833 100644 --- a/Extensions/Effects/godray-pixi-filter.ts +++ b/Extensions/Effects/godray-pixi-filter.ts @@ -6,9 +6,9 @@ namespace gdjs { const godrayFilter = new PIXI.filters.GodrayFilter(); return godrayFilter; }, - update: function (filter, layer) { + update: function (filter, target) { if (filter.animationSpeed !== 0) { - filter.time += (layer.getElapsedTime() / 1000) * filter.animationSpeed; + filter.time += (target.getElapsedTime(target.getRuntimeScene()) / 1000) * filter.animationSpeed; } }, updateDoubleParameter: function (filter, parameterName, value) { diff --git a/Extensions/Effects/kawase-blur-pixi-filter.ts b/Extensions/Effects/kawase-blur-pixi-filter.ts index 8909d7b98578..352130e6d683 100644 --- a/Extensions/Effects/kawase-blur-pixi-filter.ts +++ b/Extensions/Effects/kawase-blur-pixi-filter.ts @@ -1,6 +1,6 @@ namespace gdjs { gdjs.PixiFiltersTools.registerFilterCreator('KawaseBlur', { - makePIXIFilter: function (layer, effectData) { + makePIXIFilter: function (target, effectData) { const kawaseBlurFilter = new PIXI.filters.KawaseBlurFilter(); return kawaseBlurFilter; }, diff --git a/Extensions/Effects/old-film-pixi-filter.ts b/Extensions/Effects/old-film-pixi-filter.ts index 3812be0f0c1d..0e0b9d3aaa97 100644 --- a/Extensions/Effects/old-film-pixi-filter.ts +++ b/Extensions/Effects/old-film-pixi-filter.ts @@ -7,9 +7,9 @@ namespace gdjs { oldFilmFilter._animationTimer = 0; return oldFilmFilter; }, - update: function (filter, layer) { + update: function (filter, target) { if (filter.animationFrequency !== 0) { - filter._animationTimer += layer.getElapsedTime() / 1000; + filter._animationTimer += target.getElapsedTime(target.getRuntimeScene()) / 1000; if (filter._animationTimer >= 1 / filter.animationFrequency) { filter.seed = Math.random(); filter._animationTimer = 0; diff --git a/Extensions/Effects/radial-blur-pixi-filter.ts b/Extensions/Effects/radial-blur-pixi-filter.ts index 20607873c4a0..28ce8835c614 100644 --- a/Extensions/Effects/radial-blur-pixi-filter.ts +++ b/Extensions/Effects/radial-blur-pixi-filter.ts @@ -4,15 +4,15 @@ namespace gdjs { const radialBlurFilter = new PIXI.filters.RadialBlurFilter(); return radialBlurFilter; }, - update: function (filter, layer) { + update: function (filter, target) { const radialBlurFilter = (filter as unknown) as PIXI.filters.RadialBlurFilter; radialBlurFilter.center[0] = Math.round( // @ts-ignore - extra properties are stored on the filter. - radialBlurFilter._centerX * layer.getWidth() + radialBlurFilter._centerX * target.getWidth() ); radialBlurFilter.center[1] = Math.round( // @ts-ignore - extra properties are stored on the filter. - radialBlurFilter._centerY * layer.getHeight() + radialBlurFilter._centerY * target.getHeight() ); }, updateDoubleParameter: function (filter, parameterName, value) { diff --git a/Extensions/Effects/reflection-pixi-filter.ts b/Extensions/Effects/reflection-pixi-filter.ts index 2433f0eca13e..b5f156353826 100644 --- a/Extensions/Effects/reflection-pixi-filter.ts +++ b/Extensions/Effects/reflection-pixi-filter.ts @@ -23,9 +23,9 @@ namespace gdjs { ); return reflectionFilter; }, - update: function (filter, layer) { + update: function (filter, target) { if (filter.animationSpeed !== 0) { - filter.time += (layer.getElapsedTime() / 1000) * filter.animationSpeed; + filter.time += (target.getElapsedTime(target.getRuntimeScene()) / 1000) * filter.animationSpeed; } }, updateDoubleParameter: function (filter, parameterName, value) { diff --git a/Extensions/Effects/twist-pixi-filter.ts b/Extensions/Effects/twist-pixi-filter.ts index fc67ed12fef1..312a2be8b219 100644 --- a/Extensions/Effects/twist-pixi-filter.ts +++ b/Extensions/Effects/twist-pixi-filter.ts @@ -10,15 +10,15 @@ namespace gdjs { twistFilter.offset = new PIXI_.Point(0, 0); return twistFilter; }, - update: function (filter, layer) { + update: function (filter, target) { const twistFilter = (filter as unknown) as PIXI.filters.TwistFilter; twistFilter.offset.x = Math.round( // @ts-ignore - extra properties are stored on the filter. - twistFilter._offsetX * layer.getWidth() + twistFilter._offsetX * target.getWidth() ); twistFilter.offset.y = Math.round( // @ts-ignore - extra properties are stored on the filter. - twistFilter._offsetY * layer.getHeight() + twistFilter._offsetY * target.getHeight() ); }, updateDoubleParameter: function (filter, parameterName, value) { diff --git a/Extensions/Effects/zoom-blur-pixi-filter.ts b/Extensions/Effects/zoom-blur-pixi-filter.ts index 2e671d733ea0..cd13942c0aef 100644 --- a/Extensions/Effects/zoom-blur-pixi-filter.ts +++ b/Extensions/Effects/zoom-blur-pixi-filter.ts @@ -4,15 +4,15 @@ namespace gdjs { const zoomBlurFilter = new PIXI.filters.ZoomBlurFilter(); return zoomBlurFilter; }, - update: function (filter, layer) { + update: function (filter, target) { const zoomBlurFilter = (filter as unknown) as PIXI.filters.ZoomBlurFilter; zoomBlurFilter.center[0] = Math.round( // @ts-ignore - extra properties are stored on the filter. - zoomBlurFilter._centerX * layer.getWidth() + zoomBlurFilter._centerX * target.getWidth() ); zoomBlurFilter.center[1] = Math.round( // @ts-ignore - extra properties are stored on the filter. - zoomBlurFilter._centerY * layer.getHeight() + zoomBlurFilter._centerY * target.getHeight() ); }, updateDoubleParameter: function (filter, parameterName, value) { diff --git a/GDJS/Runtime/layer.ts b/GDJS/Runtime/layer.ts index 8c7b6f90a368..094538db2961 100644 --- a/GDJS/Runtime/layer.ts +++ b/GDJS/Runtime/layer.ts @@ -9,7 +9,7 @@ namespace gdjs { * * Viewports and multiple cameras are not supported. */ - export class Layer { + export class Layer implements EffectsTarget { _name: string; _cameraRotation: float = 0; _zoomFactor: float = 1; @@ -463,9 +463,9 @@ namespace gdjs { * Return the time elapsed since the last frame, * in milliseconds, for objects on the layer. */ - getElapsedTime(): float { + getElapsedTime(runtimeScene: RuntimeScene): float { return ( - this._runtimeScene.getTimeManager().getElapsedTime() * this._timeScale + runtimeScene.getTimeManager().getElapsedTime() * this._timeScale ); } diff --git a/GDJS/Runtime/pixi-renderers/pixi-filters-tools.ts b/GDJS/Runtime/pixi-renderers/pixi-filters-tools.ts index 4a3dc4738c61..099579d69546 100644 --- a/GDJS/Runtime/pixi-renderers/pixi-filters-tools.ts +++ b/GDJS/Runtime/pixi-renderers/pixi-filters-tools.ts @@ -89,9 +89,9 @@ namespace gdjs { /** A wrapper allowing to create a PIXI filter and update it using a common interface */ export type FilterCreator = { /** Function to call to create the filter */ - makePIXIFilter: (layer: gdjs.Layer, effectData: EffectData) => any; + makePIXIFilter: (target: EffectsTarget, effectData: EffectData) => any; /** The function to be called to update the filter at every frame */ - update: (filter: PIXI.Filter, layer: gdjs.Layer) => any; + update: (filter: PIXI.Filter, target: gdjs.EffectsTarget) => any; /** The function to be called to update a parameter (with a number) */ updateDoubleParameter: ( filter: PIXI.Filter, @@ -117,7 +117,7 @@ namespace gdjs { /** The PIXI filter */ pixiFilter: PIXI.Filter; /** The function to be called to update the filter at every frame */ - update: (filter: PIXI.Filter, layer: gdjs.Layer) => any; + update: (filter: PIXI.Filter, target: gdjs.EffectsTarget) => any; /** The function to be called to update a parameter (with a number) */ updateDoubleParameter: ( filter: PIXI.Filter, diff --git a/GDJS/Runtime/pixi-renderers/pixi-object-effects-manager.ts b/GDJS/Runtime/pixi-renderers/pixi-object-effects-manager.ts index 8a2069245b73..dbdbdee32132 100644 --- a/GDJS/Runtime/pixi-renderers/pixi-object-effects-manager.ts +++ b/GDJS/Runtime/pixi-renderers/pixi-object-effects-manager.ts @@ -8,6 +8,13 @@ namespace gdjs { type RendererEffects = Record; + export interface EffectsTarget { + getRuntimeScene: () => RuntimeScene; + getElapsedTime: (runtimeScene: RuntimeScene) => number; + getHeight: () => number; + getWidth: () => number; + }; + class PixiObjectEffectsManager { /** * Initialize the renderer effects from the effect data. @@ -18,7 +25,7 @@ namespace gdjs { initializeEffect( effectData: EffectData, rendererEffects: RendererEffects, - layer: Layer + target: EffectsTarget ): boolean { const filterCreator = gdjs.PixiFiltersTools.getFilterCreator( effectData.effectType @@ -35,7 +42,7 @@ namespace gdjs { } const filter: PixiFiltersTools.Filter = { - pixiFilter: filterCreator.makePIXIFilter(layer, effectData), + pixiFilter: filterCreator.makePIXIFilter(target, effectData), updateDoubleParameter: filterCreator.updateDoubleParameter, updateStringParameter: filterCreator.updateStringParameter, updateBooleanParameter: filterCreator.updateBooleanParameter, diff --git a/GDJS/Runtime/runtimeobject.ts b/GDJS/Runtime/runtimeobject.ts index 1274ce72b848..3e71145feacb 100644 --- a/GDJS/Runtime/runtimeobject.ts +++ b/GDJS/Runtime/runtimeobject.ts @@ -33,7 +33,7 @@ namespace gdjs { * A `gdjs.RuntimeObject` should not be instantiated directly, always a child class * (because gdjs.RuntimeObject don't call onCreated at the end of its constructor). */ - export class RuntimeObject { + export class RuntimeObject implements EffectsTarget { name: string; type: string; x: float = 0; @@ -210,7 +210,11 @@ namespace gdjs { getElapsedTime(runtimeScene: gdjs.RuntimeScene): float { //TODO: Memoize? const theLayer = runtimeScene.getLayer(this.layer); - return theLayer.getElapsedTime(); + return theLayer.getElapsedTime(runtimeScene); + } + + getRuntimeScene(): RuntimeScene { + return this._runtimeScene; } /** From 21050403cb43ecaf537dcaf4554e82f8274f5a9b Mon Sep 17 00:00:00 2001 From: Harsimran Virk Date: Wed, 4 Aug 2021 20:35:52 +0530 Subject: [PATCH 14/28] Renamed argument from layer to target. Removed hot reloading dead code. --- Extensions/Effects/adjustment-pixi-filter.ts | 4 +- .../Effects/advanced-bloom-pixi-filter.ts | 4 +- Extensions/Effects/ascii-pixi-filter.ts | 4 +- Extensions/Effects/bevel-pixi-filter.ts | 4 +- .../Effects/black-and-white-pixi-filter.ts | 4 +- .../Effects/blending-mode-pixi-filter.ts | 4 +- Extensions/Effects/blur-pixi-filter.ts | 4 +- Extensions/Effects/brightness-pixi-filter.ts | 4 +- Extensions/Effects/bulge-pinch-pixi-filter.ts | 4 +- Extensions/Effects/color-map-pixi-filter.ts | 6 +- .../Effects/color-replace-pixi-filter.ts | 4 +- Extensions/Effects/crt-pixi-filter.ts | 7 +- Extensions/Effects/dot-pixi-filter.ts | 4 +- Extensions/Effects/drop-shadow-pixi-filter.ts | 4 +- Extensions/Effects/glitch-pixi-filter.ts | 3 +- Extensions/Effects/glow-pixi-filter.ts | 4 +- Extensions/Effects/godray-pixi-filter.ts | 4 +- Extensions/Effects/kawase-blur-pixi-filter.ts | 2 +- Extensions/Effects/light-night-pixi-filter.ts | 4 +- Extensions/Effects/night-pixi-filter.ts | 4 +- Extensions/Effects/noise-pixi-filter.ts | 4 +- Extensions/Effects/old-film-pixi-filter.ts | 3 +- Extensions/Effects/outline-pixi-filter.ts | 4 +- Extensions/Effects/pixelate-pixi-filter.ts | 4 +- Extensions/Effects/radial-blur-pixi-filter.ts | 2 +- Extensions/Effects/reflection-pixi-filter.ts | 4 +- Extensions/Effects/rgb-split-pixi-filter.ts | 4 +- Extensions/Effects/sepia-pixi-filter.ts | 4 +- Extensions/Effects/tilt-shift-pixi-filter.ts | 4 +- Extensions/Effects/twist-pixi-filter.ts | 2 +- Extensions/Effects/zoom-blur-pixi-filter.ts | 2 +- GDJS/Runtime/layer.ts | 4 +- .../pixi-object-effects-manager.ts | 12 ++-- GDJS/Runtime/runtimeobject.ts | 71 ++++++++----------- 34 files changed, 99 insertions(+), 107 deletions(-) diff --git a/Extensions/Effects/adjustment-pixi-filter.ts b/Extensions/Effects/adjustment-pixi-filter.ts index 2488f74792c4..701ab264724b 100644 --- a/Extensions/Effects/adjustment-pixi-filter.ts +++ b/Extensions/Effects/adjustment-pixi-filter.ts @@ -1,10 +1,10 @@ namespace gdjs { gdjs.PixiFiltersTools.registerFilterCreator('Adjustment', { - makePIXIFilter: function (layer, effectData) { + makePIXIFilter: function (target, effectData) { const adjustmentFilter = new PIXI.filters.AdjustmentFilter(); return adjustmentFilter; }, - update: function (filter, layer) {}, + update: function (filter, target) {}, updateDoubleParameter: function (filter, parameterName, value) { const adjustmentFilter = (filter as unknown) as PIXI.filters.AdjustmentFilter; if (parameterName === 'gamma') { diff --git a/Extensions/Effects/advanced-bloom-pixi-filter.ts b/Extensions/Effects/advanced-bloom-pixi-filter.ts index 29153075f7e0..7804a16f184c 100644 --- a/Extensions/Effects/advanced-bloom-pixi-filter.ts +++ b/Extensions/Effects/advanced-bloom-pixi-filter.ts @@ -1,10 +1,10 @@ namespace gdjs { gdjs.PixiFiltersTools.registerFilterCreator('AdvancedBloom', { - makePIXIFilter: function (layer, effectData) { + makePIXIFilter: function (target, effectData) { const advancedBloomFilter = new PIXI.filters.AdvancedBloomFilter(); return advancedBloomFilter; }, - update: function (filter, layer) {}, + update: function (filter, target) {}, updateDoubleParameter: function (filter, parameterName, value) { const advancedBloomFilter = (filter as unknown) as PIXI.filters.AdvancedBloomFilter; if (parameterName === 'threshold') { diff --git a/Extensions/Effects/ascii-pixi-filter.ts b/Extensions/Effects/ascii-pixi-filter.ts index 53faf4dbab13..7924e429b8ed 100644 --- a/Extensions/Effects/ascii-pixi-filter.ts +++ b/Extensions/Effects/ascii-pixi-filter.ts @@ -1,10 +1,10 @@ namespace gdjs { gdjs.PixiFiltersTools.registerFilterCreator('Ascii', { - makePIXIFilter: function (layer, effectData) { + makePIXIFilter: function (target, effectData) { const asciiFilter = new PIXI.filters.AsciiFilter(); return asciiFilter; }, - update: function (filter, layer) {}, + update: function (filter, target) {}, updateDoubleParameter: function (filter, parameterName, value) { const asciiFilter = (filter as unknown) as PIXI.filters.AsciiFilter; if (parameterName === 'size') { diff --git a/Extensions/Effects/bevel-pixi-filter.ts b/Extensions/Effects/bevel-pixi-filter.ts index 40a60f935f9b..563b1ce167a0 100644 --- a/Extensions/Effects/bevel-pixi-filter.ts +++ b/Extensions/Effects/bevel-pixi-filter.ts @@ -1,10 +1,10 @@ namespace gdjs { gdjs.PixiFiltersTools.registerFilterCreator('Bevel', { - makePIXIFilter: function (layer, effectData) { + makePIXIFilter: function (target, effectData) { const bevelFilter = new PIXI.filters.BevelFilter(); return bevelFilter; }, - update: function (filter, layer) {}, + update: function (filter, target) {}, updateDoubleParameter: function (filter, parameterName, value) { const bevelFilter = (filter as unknown) as PIXI.filters.BevelFilter; if (parameterName === 'rotation') { diff --git a/Extensions/Effects/black-and-white-pixi-filter.ts b/Extensions/Effects/black-and-white-pixi-filter.ts index 58199661eed5..35dfbe5b182e 100644 --- a/Extensions/Effects/black-and-white-pixi-filter.ts +++ b/Extensions/Effects/black-and-white-pixi-filter.ts @@ -1,12 +1,12 @@ namespace gdjs { import PIXI = GlobalPIXIModule.PIXI; gdjs.PixiFiltersTools.registerFilterCreator('BlackAndWhite', { - makePIXIFilter: function (layer, effectData) { + makePIXIFilter: function (target, effectData) { const colorMatrix = new PIXI.filters.ColorMatrixFilter(); colorMatrix.blackAndWhite(false); return colorMatrix; }, - update: function (filter, layer) {}, + update: function (filter, target) {}, updateDoubleParameter: function (filter, parameterName, value) { // @ts-ignore - unsure why PIXI.filters is not recognised. const colorMatrix = (filter as unknown) as PIXI.filters.ColorMatrixFilter; diff --git a/Extensions/Effects/blending-mode-pixi-filter.ts b/Extensions/Effects/blending-mode-pixi-filter.ts index ad9d8debe197..6c2134a71f3c 100644 --- a/Extensions/Effects/blending-mode-pixi-filter.ts +++ b/Extensions/Effects/blending-mode-pixi-filter.ts @@ -1,11 +1,11 @@ namespace gdjs { import PIXI = GlobalPIXIModule.PIXI; gdjs.PixiFiltersTools.registerFilterCreator('BlendingMode', { - makePIXIFilter: function (layer, effectData) { + makePIXIFilter: function (target, effectData) { const blendingModeFilter = new PIXI.filters.AlphaFilter(); return blendingModeFilter; }, - update: function (filter, layer) {}, + update: function (filter, target) {}, updateDoubleParameter: function (filter, parameterName, value) { // @ts-ignore - unsure why PIXI.filters is not recognised. const blendingModeFilter = (filter as unknown) as PIXI.filters.AlphaFilter; diff --git a/Extensions/Effects/blur-pixi-filter.ts b/Extensions/Effects/blur-pixi-filter.ts index bc41e6540833..c1ffaedfbb95 100644 --- a/Extensions/Effects/blur-pixi-filter.ts +++ b/Extensions/Effects/blur-pixi-filter.ts @@ -1,11 +1,11 @@ namespace gdjs { import PIXI = GlobalPIXIModule.PIXI; gdjs.PixiFiltersTools.registerFilterCreator('Blur', { - makePIXIFilter: function (layer, effectData) { + makePIXIFilter: function (target, effectData) { const blur = new PIXI.filters.BlurFilter(); return blur; }, - update: function (filter, layer) {}, + update: function (filter, target) {}, updateDoubleParameter: function (filter, parameterName, value) { if ( parameterName !== 'blur' && diff --git a/Extensions/Effects/brightness-pixi-filter.ts b/Extensions/Effects/brightness-pixi-filter.ts index ae59ee41e520..2587114ca0ab 100644 --- a/Extensions/Effects/brightness-pixi-filter.ts +++ b/Extensions/Effects/brightness-pixi-filter.ts @@ -1,12 +1,12 @@ namespace gdjs { import PIXI = GlobalPIXIModule.PIXI; gdjs.PixiFiltersTools.registerFilterCreator('Brightness', { - makePIXIFilter: function (layer, effectData) { + makePIXIFilter: function (target, effectData) { const brightness = new PIXI.filters.ColorMatrixFilter(); brightness.brightness(1, false); return brightness; }, - update: function (filter, layer) {}, + update: function (filter, target) {}, updateDoubleParameter: function (filter, parameterName, value) { // @ts-ignore - unsure why PIXI.filters is not recognised. const brightnessFilter = (filter as unknown) as PIXI.filters.ColorMatrixFilter; diff --git a/Extensions/Effects/bulge-pinch-pixi-filter.ts b/Extensions/Effects/bulge-pinch-pixi-filter.ts index 0aa94658f40e..e9f4ceacfe03 100644 --- a/Extensions/Effects/bulge-pinch-pixi-filter.ts +++ b/Extensions/Effects/bulge-pinch-pixi-filter.ts @@ -1,10 +1,10 @@ namespace gdjs { gdjs.PixiFiltersTools.registerFilterCreator('BulgePinch', { - makePIXIFilter: function (layer, effectData) { + makePIXIFilter: function (target, effectData) { const bulgePinchFilter = new PIXI.filters.BulgePinchFilter(); return bulgePinchFilter; }, - update: function (filter, layer) {}, + update: function (filter, target) {}, updateDoubleParameter: function (filter, parameterName, value) { const bulgePinchFilter = (filter as unknown) as PIXI.filters.BulgePinchFilter; if (parameterName === 'centerX') { diff --git a/Extensions/Effects/color-map-pixi-filter.ts b/Extensions/Effects/color-map-pixi-filter.ts index f4e443e924af..5c8b055c1dc4 100644 --- a/Extensions/Effects/color-map-pixi-filter.ts +++ b/Extensions/Effects/color-map-pixi-filter.ts @@ -1,7 +1,7 @@ namespace gdjs { gdjs.PixiFiltersTools.registerFilterCreator('ColorMap', { - makePIXIFilter: function (layer, effectData) { - const colorMapTexture = layer + makePIXIFilter: function (target, effectData) { + const colorMapTexture = target .getRuntimeScene() .getGame() .getImageManager() @@ -17,7 +17,7 @@ namespace gdjs { ); return colorMapFilter; }, - update: function (filter, layer) {}, + update: function (filter, target) {}, updateDoubleParameter: function (filter, parameterName, value) { const colorMapFilter = (filter as unknown) as PIXI.filters.ColorMapFilter; if (parameterName === 'mix') { diff --git a/Extensions/Effects/color-replace-pixi-filter.ts b/Extensions/Effects/color-replace-pixi-filter.ts index ee4475465c92..d6596e471773 100644 --- a/Extensions/Effects/color-replace-pixi-filter.ts +++ b/Extensions/Effects/color-replace-pixi-filter.ts @@ -1,10 +1,10 @@ namespace gdjs { gdjs.PixiFiltersTools.registerFilterCreator('ColorReplace', { - makePIXIFilter: function (layer, effectData) { + makePIXIFilter: function (target, effectData) { const colorReplaceFilter = new PIXI.filters.ColorReplaceFilter(); return colorReplaceFilter; }, - update: function (filter, layer) {}, + update: function (filter, target) {}, updateDoubleParameter: function (filter, parameterName, value) { const colorReplaceFilter = (filter as unknown) as PIXI.filters.ColorReplaceFilter; if (parameterName === 'epsilon') { diff --git a/Extensions/Effects/crt-pixi-filter.ts b/Extensions/Effects/crt-pixi-filter.ts index 2cc7be3360f2..0d088692668f 100644 --- a/Extensions/Effects/crt-pixi-filter.ts +++ b/Extensions/Effects/crt-pixi-filter.ts @@ -11,10 +11,13 @@ namespace gdjs { if (filter.animationSpeed !== 0) { // Multiply by 10 so that the default value is a sensible speed filter.time += - (target.getElapsedTime(target.getRuntimeScene()) / 1000) * 10 * filter.animationSpeed; + (target.getElapsedTime(target.getRuntimeScene()) / 1000) * + 10 * + filter.animationSpeed; } if (filter.animationFrequency !== 0) { - filter._animationTimer += target.getElapsedTime(target.getRuntimeScene()) / 1000; + filter._animationTimer += + target.getElapsedTime(target.getRuntimeScene()) / 1000; if (filter._animationTimer >= 1 / filter.animationFrequency) { filter.seed = Math.random(); filter._animationTimer = 0; diff --git a/Extensions/Effects/dot-pixi-filter.ts b/Extensions/Effects/dot-pixi-filter.ts index 3be1227158ec..5b2e31223374 100644 --- a/Extensions/Effects/dot-pixi-filter.ts +++ b/Extensions/Effects/dot-pixi-filter.ts @@ -1,10 +1,10 @@ namespace gdjs { gdjs.PixiFiltersTools.registerFilterCreator('Dot', { - makePIXIFilter: function (layer, effectData) { + makePIXIFilter: function (target, effectData) { const dotFilter = new PIXI.filters.DotFilter(); return dotFilter; }, - update: function (filter, layer) {}, + update: function (filter, target) {}, updateDoubleParameter: function (filter, parameterName, value) { const dotFilter = (filter as unknown) as PIXI.filters.DotFilter; if (parameterName === 'scale') { diff --git a/Extensions/Effects/drop-shadow-pixi-filter.ts b/Extensions/Effects/drop-shadow-pixi-filter.ts index 539b96ef2d01..55f730cfbf7e 100644 --- a/Extensions/Effects/drop-shadow-pixi-filter.ts +++ b/Extensions/Effects/drop-shadow-pixi-filter.ts @@ -1,10 +1,10 @@ namespace gdjs { gdjs.PixiFiltersTools.registerFilterCreator('DropShadow', { - makePIXIFilter: function (layer, effectData) { + makePIXIFilter: function (target, effectData) { const dropShadowFilter = new PIXI.filters.DropShadowFilter(); return dropShadowFilter; }, - update: function (filter, layer) {}, + update: function (filter, target) {}, updateDoubleParameter: function (filter, parameterName, value) { const dropShadowFilter = (filter as unknown) as PIXI.filters.DropShadowFilter; if (parameterName === 'blur') { diff --git a/Extensions/Effects/glitch-pixi-filter.ts b/Extensions/Effects/glitch-pixi-filter.ts index f23a9baf29f0..c489e5e672a3 100644 --- a/Extensions/Effects/glitch-pixi-filter.ts +++ b/Extensions/Effects/glitch-pixi-filter.ts @@ -9,7 +9,8 @@ namespace gdjs { }, update: function (filter, target) { if (filter.animationFrequency !== 0) { - filter._animationTimer += target.getElapsedTime(target.getRuntimeScene()) / 1000; + filter._animationTimer += + target.getElapsedTime(target.getRuntimeScene()) / 1000; if (filter._animationTimer >= 1 / filter.animationFrequency) { filter.seed = Math.random(); filter._animationTimer = 0; diff --git a/Extensions/Effects/glow-pixi-filter.ts b/Extensions/Effects/glow-pixi-filter.ts index aee043e23b4e..9354698b0c7b 100644 --- a/Extensions/Effects/glow-pixi-filter.ts +++ b/Extensions/Effects/glow-pixi-filter.ts @@ -1,10 +1,10 @@ namespace gdjs { gdjs.PixiFiltersTools.registerFilterCreator('Glow', { - makePIXIFilter: function (layer, effectData) { + makePIXIFilter: function (target, effectData) { const glowFilter = new PIXI.filters.GlowFilter(); return glowFilter; }, - update: function (filter, layer) {}, + update: function (filter, target) {}, updateDoubleParameter: function (filter, parameterName, value) { const glowFilter = (filter as unknown) as PIXI.filters.GlowFilter; if (parameterName === 'innerStrength') { diff --git a/Extensions/Effects/godray-pixi-filter.ts b/Extensions/Effects/godray-pixi-filter.ts index 9d37642d9833..3e760af191bf 100644 --- a/Extensions/Effects/godray-pixi-filter.ts +++ b/Extensions/Effects/godray-pixi-filter.ts @@ -8,7 +8,9 @@ namespace gdjs { }, update: function (filter, target) { if (filter.animationSpeed !== 0) { - filter.time += (target.getElapsedTime(target.getRuntimeScene()) / 1000) * filter.animationSpeed; + filter.time += + (target.getElapsedTime(target.getRuntimeScene()) / 1000) * + filter.animationSpeed; } }, updateDoubleParameter: function (filter, parameterName, value) { diff --git a/Extensions/Effects/kawase-blur-pixi-filter.ts b/Extensions/Effects/kawase-blur-pixi-filter.ts index 352130e6d683..0fb0814b574c 100644 --- a/Extensions/Effects/kawase-blur-pixi-filter.ts +++ b/Extensions/Effects/kawase-blur-pixi-filter.ts @@ -4,7 +4,7 @@ namespace gdjs { const kawaseBlurFilter = new PIXI.filters.KawaseBlurFilter(); return kawaseBlurFilter; }, - update: function (filter, layer) {}, + update: function (filter, target) {}, updateDoubleParameter: function (filter, parameterName, value) { const kawaseBlurFilter = (filter as unknown) as PIXI.filters.KawaseBlurFilter; if (parameterName === 'pixelizeX') { diff --git a/Extensions/Effects/light-night-pixi-filter.ts b/Extensions/Effects/light-night-pixi-filter.ts index e038c6757b04..59e1a6e059c3 100644 --- a/Extensions/Effects/light-night-pixi-filter.ts +++ b/Extensions/Effects/light-night-pixi-filter.ts @@ -23,11 +23,11 @@ namespace gdjs { } LightNightPixiFilter.prototype.constructor = gdjs.LightNightPixiFilter; gdjs.PixiFiltersTools.registerFilterCreator('LightNight', { - makePIXIFilter: function (layer, effectData) { + makePIXIFilter: function (target, effectData) { const filter = new gdjs.LightNightPixiFilter(); return filter; }, - update: function (filter, layer) {}, + update: function (filter, target) {}, updateDoubleParameter: function (filter, parameterName, value) { if (parameterName !== 'opacity') { return; diff --git a/Extensions/Effects/night-pixi-filter.ts b/Extensions/Effects/night-pixi-filter.ts index 3dd38b82e532..888f123be65d 100644 --- a/Extensions/Effects/night-pixi-filter.ts +++ b/Extensions/Effects/night-pixi-filter.ts @@ -27,11 +27,11 @@ namespace gdjs { } NightPixiFilter.prototype.constructor = gdjs.NightPixiFilter; gdjs.PixiFiltersTools.registerFilterCreator('Night', { - makePIXIFilter: function (layer, effectData) { + makePIXIFilter: function (target, effectData) { const filter = new gdjs.NightPixiFilter(); return filter; }, - update: function (filter, layer) {}, + update: function (filter, target) {}, updateDoubleParameter: function (filter, parameterName, value) { if (parameterName !== 'intensity' && parameterName !== 'opacity') { return; diff --git a/Extensions/Effects/noise-pixi-filter.ts b/Extensions/Effects/noise-pixi-filter.ts index b4dacbce1e7c..355c7572fbac 100644 --- a/Extensions/Effects/noise-pixi-filter.ts +++ b/Extensions/Effects/noise-pixi-filter.ts @@ -1,11 +1,11 @@ namespace gdjs { import PIXI = GlobalPIXIModule.PIXI; gdjs.PixiFiltersTools.registerFilterCreator('Noise', { - makePIXIFilter: function (layer, effectData) { + makePIXIFilter: function (target, effectData) { const noiseFilter = new PIXI.filters.NoiseFilter(); return noiseFilter; }, - update: function (filter, layer) {}, + update: function (filter, target) {}, updateDoubleParameter: function (filter, parameterName, value) { // @ts-ignore - unsure why PIXI.filters is not recognised. const noiseFilter = (filter as unknown) as PIXI.filters.NoiseFilter; diff --git a/Extensions/Effects/old-film-pixi-filter.ts b/Extensions/Effects/old-film-pixi-filter.ts index 0e0b9d3aaa97..ad6103d0a677 100644 --- a/Extensions/Effects/old-film-pixi-filter.ts +++ b/Extensions/Effects/old-film-pixi-filter.ts @@ -9,7 +9,8 @@ namespace gdjs { }, update: function (filter, target) { if (filter.animationFrequency !== 0) { - filter._animationTimer += target.getElapsedTime(target.getRuntimeScene()) / 1000; + filter._animationTimer += + target.getElapsedTime(target.getRuntimeScene()) / 1000; if (filter._animationTimer >= 1 / filter.animationFrequency) { filter.seed = Math.random(); filter._animationTimer = 0; diff --git a/Extensions/Effects/outline-pixi-filter.ts b/Extensions/Effects/outline-pixi-filter.ts index 2c498cc336fe..f4b0d4f1782c 100644 --- a/Extensions/Effects/outline-pixi-filter.ts +++ b/Extensions/Effects/outline-pixi-filter.ts @@ -1,10 +1,10 @@ namespace gdjs { gdjs.PixiFiltersTools.registerFilterCreator('Outline', { - makePIXIFilter: function (layer, effectData) { + makePIXIFilter: function (target, effectData) { const outlineFilter = new PIXI.filters.OutlineFilter(); return outlineFilter; }, - update: function (filter, layer) {}, + update: function (filter, target) {}, updateDoubleParameter: function (filter, parameterName, value) { const outlineFilter = (filter as unknown) as PIXI.filters.OutlineFilter; if (parameterName === 'thickness') { diff --git a/Extensions/Effects/pixelate-pixi-filter.ts b/Extensions/Effects/pixelate-pixi-filter.ts index 7aeab2a788b6..ef24ba0ee7cc 100644 --- a/Extensions/Effects/pixelate-pixi-filter.ts +++ b/Extensions/Effects/pixelate-pixi-filter.ts @@ -1,12 +1,12 @@ namespace gdjs { gdjs.PixiFiltersTools.registerFilterCreator('Pixelate', { - makePIXIFilter: function (layer, effectData) { + makePIXIFilter: function (target, effectData) { const pixelateFilter = new PIXI.filters.PixelateFilter( effectData.doubleParameters.size ); return pixelateFilter; }, - update: function (filter, layer) {}, + update: function (filter, target) {}, updateDoubleParameter: function (filter, parameterName, value) { const pixelateFilter = (filter as unknown) as PIXI.filters.PixelateFilter; if (parameterName === 'size') { diff --git a/Extensions/Effects/radial-blur-pixi-filter.ts b/Extensions/Effects/radial-blur-pixi-filter.ts index 28ce8835c614..20da7033acbf 100644 --- a/Extensions/Effects/radial-blur-pixi-filter.ts +++ b/Extensions/Effects/radial-blur-pixi-filter.ts @@ -1,6 +1,6 @@ namespace gdjs { gdjs.PixiFiltersTools.registerFilterCreator('RadialBlur', { - makePIXIFilter: function (layer, effectData) { + makePIXIFilter: function (target, effectData) { const radialBlurFilter = new PIXI.filters.RadialBlurFilter(); return radialBlurFilter; }, diff --git a/Extensions/Effects/reflection-pixi-filter.ts b/Extensions/Effects/reflection-pixi-filter.ts index b5f156353826..1f7bd2251505 100644 --- a/Extensions/Effects/reflection-pixi-filter.ts +++ b/Extensions/Effects/reflection-pixi-filter.ts @@ -25,7 +25,9 @@ namespace gdjs { }, update: function (filter, target) { if (filter.animationSpeed !== 0) { - filter.time += (target.getElapsedTime(target.getRuntimeScene()) / 1000) * filter.animationSpeed; + filter.time += + (target.getElapsedTime(target.getRuntimeScene()) / 1000) * + filter.animationSpeed; } }, updateDoubleParameter: function (filter, parameterName, value) { diff --git a/Extensions/Effects/rgb-split-pixi-filter.ts b/Extensions/Effects/rgb-split-pixi-filter.ts index ad0ef0cd7c8d..13cbb2134d83 100644 --- a/Extensions/Effects/rgb-split-pixi-filter.ts +++ b/Extensions/Effects/rgb-split-pixi-filter.ts @@ -1,10 +1,10 @@ namespace gdjs { gdjs.PixiFiltersTools.registerFilterCreator('RGBSplit', { - makePIXIFilter: function (layer, effectData) { + makePIXIFilter: function (target, effectData) { const rgbSplitFilter = new PIXI.filters.RGBSplitFilter(); return rgbSplitFilter; }, - update: function (filter, layer) {}, + update: function (filter, target) {}, updateDoubleParameter: function (filter, parameterName, value) { const rgbSplitFilter = (filter as unknown) as PIXI.filters.RGBSplitFilter; if (parameterName === 'redX') { diff --git a/Extensions/Effects/sepia-pixi-filter.ts b/Extensions/Effects/sepia-pixi-filter.ts index f30b7d6f7069..fbe11ce691b4 100644 --- a/Extensions/Effects/sepia-pixi-filter.ts +++ b/Extensions/Effects/sepia-pixi-filter.ts @@ -1,12 +1,12 @@ namespace gdjs { import PIXI = GlobalPIXIModule.PIXI; gdjs.PixiFiltersTools.registerFilterCreator('Sepia', { - makePIXIFilter: function (layer, effectData) { + makePIXIFilter: function (target, effectData) { const colorMatrixFilter = new PIXI.filters.ColorMatrixFilter(); colorMatrixFilter.sepia(false); return colorMatrixFilter; }, - update: function (filter, layer) {}, + update: function (filter, target) {}, updateDoubleParameter: function (filter, parameterName, value) { // @ts-ignore - unsure why PIXI.filters is not recognised. const colorMatrixFilter = (filter as unknown) as PIXI.filters.ColorMatrixFilter; diff --git a/Extensions/Effects/tilt-shift-pixi-filter.ts b/Extensions/Effects/tilt-shift-pixi-filter.ts index 19804a7015b0..3e46b3b9bd05 100644 --- a/Extensions/Effects/tilt-shift-pixi-filter.ts +++ b/Extensions/Effects/tilt-shift-pixi-filter.ts @@ -1,10 +1,10 @@ namespace gdjs { gdjs.PixiFiltersTools.registerFilterCreator('TiltShift', { - makePIXIFilter: function (layer, effectData) { + makePIXIFilter: function (target, effectData) { const tiltShiftFilter = new PIXI.filters.TiltShiftFilter(); return tiltShiftFilter; }, - update: function (filter, layer) {}, + update: function (filter, target) {}, updateDoubleParameter: function (filter, parameterName, value) { const tiltShiftFilter = (filter as unknown) as PIXI.filters.TiltShiftFilter; if (parameterName === 'blur') { diff --git a/Extensions/Effects/twist-pixi-filter.ts b/Extensions/Effects/twist-pixi-filter.ts index 312a2be8b219..4be2610e7ad3 100644 --- a/Extensions/Effects/twist-pixi-filter.ts +++ b/Extensions/Effects/twist-pixi-filter.ts @@ -5,7 +5,7 @@ namespace gdjs { import PIXI_ = GlobalPIXIModule.PIXI; gdjs.PixiFiltersTools.registerFilterCreator('Twist', { - makePIXIFilter: function (layer, effectData) { + makePIXIFilter: function (target, effectData) { const twistFilter = new PIXI.filters.TwistFilter(); twistFilter.offset = new PIXI_.Point(0, 0); return twistFilter; diff --git a/Extensions/Effects/zoom-blur-pixi-filter.ts b/Extensions/Effects/zoom-blur-pixi-filter.ts index cd13942c0aef..2e40dfe4ce5f 100644 --- a/Extensions/Effects/zoom-blur-pixi-filter.ts +++ b/Extensions/Effects/zoom-blur-pixi-filter.ts @@ -1,6 +1,6 @@ namespace gdjs { gdjs.PixiFiltersTools.registerFilterCreator('ZoomBlur', { - makePIXIFilter: function (layer, effectData) { + makePIXIFilter: function (target, effectData) { const zoomBlurFilter = new PIXI.filters.ZoomBlurFilter(); return zoomBlurFilter; }, diff --git a/GDJS/Runtime/layer.ts b/GDJS/Runtime/layer.ts index 094538db2961..7692f15540b4 100644 --- a/GDJS/Runtime/layer.ts +++ b/GDJS/Runtime/layer.ts @@ -464,9 +464,7 @@ namespace gdjs { * in milliseconds, for objects on the layer. */ getElapsedTime(runtimeScene: RuntimeScene): float { - return ( - runtimeScene.getTimeManager().getElapsedTime() * this._timeScale - ); + return runtimeScene.getTimeManager().getElapsedTime() * this._timeScale; } /** diff --git a/GDJS/Runtime/pixi-renderers/pixi-object-effects-manager.ts b/GDJS/Runtime/pixi-renderers/pixi-object-effects-manager.ts index dbdbdee32132..41ecf951b39e 100644 --- a/GDJS/Runtime/pixi-renderers/pixi-object-effects-manager.ts +++ b/GDJS/Runtime/pixi-renderers/pixi-object-effects-manager.ts @@ -12,8 +12,8 @@ namespace gdjs { getRuntimeScene: () => RuntimeScene; getElapsedTime: (runtimeScene: RuntimeScene) => number; getHeight: () => number; - getWidth: () => number; - }; + getWidth: () => number; + } class PixiObjectEffectsManager { /** @@ -73,10 +73,10 @@ namespace gdjs { * @param runtimeObject * @param layer */ - update(rendererEffects: RendererEffects, layer: Layer) { + update(rendererEffects: RendererEffects, target: EffectsTarget) { for (const filterName in rendererEffects) { const filter = rendererEffects[filterName]; - filter.update(filter.pixiFilter, layer); + filter.update(filter.pixiFilter, target); } } @@ -92,11 +92,11 @@ namespace gdjs { effectData: EffectData, rendererEffects: RendererEffects, rendererObject: PIXI.DisplayObject, - layer: Layer + target: EffectsTarget ): boolean { let effectAdded = true; effectAdded = - this.initializeEffect(effectData, rendererEffects, layer) && + this.initializeEffect(effectData, rendererEffects, target) && effectAdded; effectAdded = this.updateAllEffectParameters(rendererEffects, effectData) && diff --git a/GDJS/Runtime/runtimeobject.ts b/GDJS/Runtime/runtimeobject.ts index 3e71145feacb..e96b229e48c7 100644 --- a/GDJS/Runtime/runtimeobject.ts +++ b/GDJS/Runtime/runtimeobject.ts @@ -102,7 +102,10 @@ namespace gdjs { this._averageForce = new gdjs.Force(0, 0, 0); this._behaviorsTable = new Hashtable(); for (let i = 0; i < objectData.effects.length; ++i) { - this.initializeEffect(objectData.effects[i]); + // We call initializeEffect as we can't use addEffect, as the renderer is not ready yet. + // This means applyEffect will have to be called later (see onCreated). + // In all other cases, use addEffect, and avoid initialize/apply effect. + this._initializeEffect(objectData.effects[i]); this.updateAllEffectParameters(objectData.effects[i]); } @@ -127,10 +130,6 @@ namespace gdjs { * (`RuntimeObject.prototype.onCreated.call(this);`). */ onCreated(): void { - for (let i = 0; i < this._behaviors.length; ++i) { - this._behaviors[i].onCreated(); - } - const objectEffectsManager = this._runtimeScene .getGame() .getObjectEffectsManager(); @@ -140,6 +139,10 @@ namespace gdjs { this._rendererEffects[filterName] ); } + + for (let i = 0; i < this._behaviors.length; ++i) { + this._behaviors[i].onCreated(); + } } /** @@ -222,11 +225,10 @@ namespace gdjs { * @param runtimeScene The gdjs.RuntimeScene the object belongs to. */ update(runtimeScene: gdjs.RuntimeScene): void { - const layer = this._runtimeScene.getLayer(this.layer); - this._runtimeScene + runtimeScene .getGame() .getObjectEffectsManager() - .update(this._rendererEffects, layer); + .update(this._rendererEffects, this); } /** @@ -246,25 +248,6 @@ namespace gdjs { initialInstanceData: InstanceData ): void {} - /** - * Update the effects during hot-reload - * @param oldEffectData Old effect data - * @param newEffectData New effect data - * @returns - */ - _hotReloadRuntimeObjectEffects( - oldEffectData: EffectData[], - newEffectData: EffectData[] - ): boolean { - for (let i = 0; i < oldEffectData.length; ++i) { - this.removeEffect(oldEffectData[i].name); - } - for (let i = 0; i < newEffectData.length; ++i) { - this.addEffect(newEffectData[i]); - } - return true; - } - //Nothing to do. /** * Called when the object must be updated using the specified objectData. This is the @@ -278,10 +261,8 @@ namespace gdjs { oldObjectData: ObjectData, newObjectData: ObjectData ): boolean { - return this._hotReloadRuntimeObjectEffects( - oldObjectData.effects, - newObjectData.effects - ); + // If not redefined, mark by default the hot-reload as failed. + return false; } /** @@ -776,20 +757,25 @@ namespace gdjs { } /** - * Returns the collection of effects to be rendered - * by the underlying renderer. - * @returns The render effects. + * This function is used to initialize an effect, as it can't be + * applied directly in the constructor, and we won't be able to + * retain the effect data later. + * @param effectsData The effect data. */ - getRendererEffects() { - return this._rendererEffects; - } - - initializeEffect(effectsData: EffectData) { - const layer = this._runtimeScene.getLayer(this.layer); + private _initializeEffect(effectData: EffectData): void { this._runtimeScene .getGame() .getObjectEffectsManager() - .initializeEffect(effectsData, this._rendererEffects, layer); + .initializeEffect(effectData, this._rendererEffects, this); + } + + /** + * Returns the collection of effects to be rendered by the + * underlying renderer. + * @returns The render effects. + */ + getRendererEffects() { + return this._rendererEffects; } /** @@ -797,7 +783,6 @@ namespace gdjs { * @param effectData The data of the effect to add. */ addEffect(effectData: EffectData): boolean { - const layer = this._runtimeScene.getLayer(this.layer); return this._runtimeScene .getGame() .getObjectEffectsManager() @@ -805,7 +790,7 @@ namespace gdjs { effectData, this._rendererEffects, this.getRendererObject(), - layer + this ); } From 5ed9a4023e42d6538edd2fdd2b862059ff3aca7e Mon Sep 17 00:00:00 2001 From: Harsimran Virk Date: Wed, 4 Aug 2021 20:40:42 +0530 Subject: [PATCH 15/28] Fixed formating --- GDJS/Runtime/runtimeobject.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/GDJS/Runtime/runtimeobject.ts b/GDJS/Runtime/runtimeobject.ts index e96b229e48c7..00d23616b2e8 100644 --- a/GDJS/Runtime/runtimeobject.ts +++ b/GDJS/Runtime/runtimeobject.ts @@ -757,12 +757,14 @@ namespace gdjs { } /** + * This function is used to initialize an effect, as it can't be * applied directly in the constructor, and we won't be able to * retain the effect data later. + * @private * @param effectsData The effect data. */ - private _initializeEffect(effectData: EffectData): void { + private _initializeEffect(effectData: EffectData): void { this._runtimeScene .getGame() .getObjectEffectsManager() @@ -770,7 +772,7 @@ namespace gdjs { } /** - * Returns the collection of effects to be rendered by the + * Returns the collection of effects to be rendered by the * underlying renderer. * @returns The render effects. */ From fa0110fd8ce023963a411057d189a2cd2ec9131e Mon Sep 17 00:00:00 2001 From: Harsimran Virk Date: Wed, 4 Aug 2021 21:01:53 +0530 Subject: [PATCH 16/28] Added extra comments for initialize/apply effects. --- .../pixi-renderers/pixi-object-effects-manager.ts | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/GDJS/Runtime/pixi-renderers/pixi-object-effects-manager.ts b/GDJS/Runtime/pixi-renderers/pixi-object-effects-manager.ts index 41ecf951b39e..9a47fe7453fa 100644 --- a/GDJS/Runtime/pixi-renderers/pixi-object-effects-manager.ts +++ b/GDJS/Runtime/pixi-renderers/pixi-object-effects-manager.ts @@ -17,10 +17,12 @@ namespace gdjs { class PixiObjectEffectsManager { /** - * Initialize the renderer effects from the effect data. + * Initialize the renderer effect from the effect data. + * Call the applyEffect method afterwards, to correctly apply the + * initialized effects on the object. * @param effectData The effect data * @param rendererEffects The renderer effects collection - * @param layer The layer + * @param target The effects target */ initializeEffect( effectData: EffectData, @@ -55,6 +57,7 @@ namespace gdjs { /** * Apply the effect on the renderer object. + * Called after the effect is initialized. * @param rendererObject The renderer object * @param effect The effect to be applied. */ @@ -71,7 +74,7 @@ namespace gdjs { /** * Update the filters applied on an object. * @param runtimeObject - * @param layer + * @param target */ update(rendererEffects: RendererEffects, target: EffectsTarget) { for (const filterName in rendererEffects) { @@ -86,7 +89,7 @@ namespace gdjs { * @param effectData The effect data * @param rendererEffects The renderer effects * @param rendererObject The renderer object - * @param layer The Layer + * @param target The effects target */ addEffect( effectData: EffectData, From 53c4c16cb68672270ec79d1d7fd0049b6e51d5b1 Mon Sep 17 00:00:00 2001 From: Harsimran Virk Date: Thu, 12 Aug 2021 10:40:51 +0530 Subject: [PATCH 17/28] Added _objectEffectsManager field, remove _initializeEffects method, changed getElapsedTime method. --- Extensions/Effects/crt-pixi-filter.ts | 7 +- Extensions/Effects/glitch-pixi-filter.ts | 3 +- Extensions/Effects/godray-pixi-filter.ts | 4 +- Extensions/Effects/old-film-pixi-filter.ts | 3 +- Extensions/Effects/reflection-pixi-filter.ts | 4 +- .../panelspriteruntimeobject.ts | 1 - .../TextEntryObject/textentryruntimeobject.ts | 1 - Extensions/TextObject/textruntimeobject.ts | 1 - GDJS/Runtime/layer.ts | 3 +- .../pixi-object-effects-manager.ts | 2 +- GDJS/Runtime/runtimeobject.ts | 146 +++++++----------- GDJS/Runtime/runtimescene.ts | 3 + GDJS/Runtime/spriteruntimeobject.ts | 1 - 13 files changed, 68 insertions(+), 111 deletions(-) diff --git a/Extensions/Effects/crt-pixi-filter.ts b/Extensions/Effects/crt-pixi-filter.ts index 0d088692668f..1865d3315098 100644 --- a/Extensions/Effects/crt-pixi-filter.ts +++ b/Extensions/Effects/crt-pixi-filter.ts @@ -11,13 +11,10 @@ namespace gdjs { if (filter.animationSpeed !== 0) { // Multiply by 10 so that the default value is a sensible speed filter.time += - (target.getElapsedTime(target.getRuntimeScene()) / 1000) * - 10 * - filter.animationSpeed; + (target.getElapsedTime() / 1000) * 10 * filter.animationSpeed; } if (filter.animationFrequency !== 0) { - filter._animationTimer += - target.getElapsedTime(target.getRuntimeScene()) / 1000; + filter._animationTimer += target.getElapsedTime() / 1000; if (filter._animationTimer >= 1 / filter.animationFrequency) { filter.seed = Math.random(); filter._animationTimer = 0; diff --git a/Extensions/Effects/glitch-pixi-filter.ts b/Extensions/Effects/glitch-pixi-filter.ts index c489e5e672a3..e0e8b6084cd1 100644 --- a/Extensions/Effects/glitch-pixi-filter.ts +++ b/Extensions/Effects/glitch-pixi-filter.ts @@ -9,8 +9,7 @@ namespace gdjs { }, update: function (filter, target) { if (filter.animationFrequency !== 0) { - filter._animationTimer += - target.getElapsedTime(target.getRuntimeScene()) / 1000; + filter._animationTimer += target.getElapsedTime() / 1000; if (filter._animationTimer >= 1 / filter.animationFrequency) { filter.seed = Math.random(); filter._animationTimer = 0; diff --git a/Extensions/Effects/godray-pixi-filter.ts b/Extensions/Effects/godray-pixi-filter.ts index 3e760af191bf..fe785a64446e 100644 --- a/Extensions/Effects/godray-pixi-filter.ts +++ b/Extensions/Effects/godray-pixi-filter.ts @@ -8,9 +8,7 @@ namespace gdjs { }, update: function (filter, target) { if (filter.animationSpeed !== 0) { - filter.time += - (target.getElapsedTime(target.getRuntimeScene()) / 1000) * - filter.animationSpeed; + filter.time += (target.getElapsedTime() / 1000) * filter.animationSpeed; } }, updateDoubleParameter: function (filter, parameterName, value) { diff --git a/Extensions/Effects/old-film-pixi-filter.ts b/Extensions/Effects/old-film-pixi-filter.ts index ad6103d0a677..dbf710c3858a 100644 --- a/Extensions/Effects/old-film-pixi-filter.ts +++ b/Extensions/Effects/old-film-pixi-filter.ts @@ -9,8 +9,7 @@ namespace gdjs { }, update: function (filter, target) { if (filter.animationFrequency !== 0) { - filter._animationTimer += - target.getElapsedTime(target.getRuntimeScene()) / 1000; + filter._animationTimer += target.getElapsedTime() / 1000; if (filter._animationTimer >= 1 / filter.animationFrequency) { filter.seed = Math.random(); filter._animationTimer = 0; diff --git a/Extensions/Effects/reflection-pixi-filter.ts b/Extensions/Effects/reflection-pixi-filter.ts index 1f7bd2251505..9884552df9ee 100644 --- a/Extensions/Effects/reflection-pixi-filter.ts +++ b/Extensions/Effects/reflection-pixi-filter.ts @@ -25,9 +25,7 @@ namespace gdjs { }, update: function (filter, target) { if (filter.animationSpeed !== 0) { - filter.time += - (target.getElapsedTime(target.getRuntimeScene()) / 1000) * - filter.animationSpeed; + filter.time += (target.getElapsedTime() / 1000) * filter.animationSpeed; } }, updateDoubleParameter: function (filter, parameterName, value) { diff --git a/Extensions/PanelSpriteObject/panelspriteruntimeobject.ts b/Extensions/PanelSpriteObject/panelspriteruntimeobject.ts index fbcacb343a29..1874455f5d10 100644 --- a/Extensions/PanelSpriteObject/panelspriteruntimeobject.ts +++ b/Extensions/PanelSpriteObject/panelspriteruntimeobject.ts @@ -122,7 +122,6 @@ namespace gdjs { } update(runtimeScene: gdjs.RuntimeScene): void { - super.update(runtimeScene); this._renderer.ensureUpToDate(); } diff --git a/Extensions/TextEntryObject/textentryruntimeobject.ts b/Extensions/TextEntryObject/textentryruntimeobject.ts index 0af8b9817bd6..ffe3e32df5fc 100644 --- a/Extensions/TextEntryObject/textentryruntimeobject.ts +++ b/Extensions/TextEntryObject/textentryruntimeobject.ts @@ -39,7 +39,6 @@ namespace gdjs { } update(runtimeScene: gdjs.RuntimeScene): void { - super.update(runtimeScene); if ((this._renderer as any).getString) { this._str = (this._renderer as any).getString(); } diff --git a/Extensions/TextObject/textruntimeobject.ts b/Extensions/TextObject/textruntimeobject.ts index c054bf97ce15..c96039a757b5 100644 --- a/Extensions/TextObject/textruntimeobject.ts +++ b/Extensions/TextObject/textruntimeobject.ts @@ -132,7 +132,6 @@ namespace gdjs { } update(runtimeScene: gdjs.RuntimeScene): void { - super.update(runtimeScene); this._renderer.ensureUpToDate(); } diff --git a/GDJS/Runtime/layer.ts b/GDJS/Runtime/layer.ts index 7692f15540b4..4a79208418d5 100644 --- a/GDJS/Runtime/layer.ts +++ b/GDJS/Runtime/layer.ts @@ -463,7 +463,8 @@ namespace gdjs { * Return the time elapsed since the last frame, * in milliseconds, for objects on the layer. */ - getElapsedTime(runtimeScene: RuntimeScene): float { + getElapsedTime(runtimeScene?: RuntimeScene): float { + runtimeScene = runtimeScene || this._runtimeScene; return runtimeScene.getTimeManager().getElapsedTime() * this._timeScale; } diff --git a/GDJS/Runtime/pixi-renderers/pixi-object-effects-manager.ts b/GDJS/Runtime/pixi-renderers/pixi-object-effects-manager.ts index 9a47fe7453fa..13d71a8032c8 100644 --- a/GDJS/Runtime/pixi-renderers/pixi-object-effects-manager.ts +++ b/GDJS/Runtime/pixi-renderers/pixi-object-effects-manager.ts @@ -10,7 +10,7 @@ namespace gdjs { export interface EffectsTarget { getRuntimeScene: () => RuntimeScene; - getElapsedTime: (runtimeScene: RuntimeScene) => number; + getElapsedTime: (runtimeScene?: RuntimeScene) => number; getHeight: () => number; getWidth: () => number; } diff --git a/GDJS/Runtime/runtimeobject.ts b/GDJS/Runtime/runtimeobject.ts index 00d23616b2e8..3e82b8f87fec 100644 --- a/GDJS/Runtime/runtimeobject.ts +++ b/GDJS/Runtime/runtimeobject.ts @@ -71,6 +71,7 @@ namespace gdjs { protected _variables: gdjs.VariablesContainer; //Effects: + protected _objectEffectsManager: gdjs.ObjectEffectsManager; protected _rendererEffects: Record = {}; //Forces: @@ -101,11 +102,15 @@ namespace gdjs { ); this._averageForce = new gdjs.Force(0, 0, 0); this._behaviorsTable = new Hashtable(); + this._objectEffectsManager = runtimeScene + .getGame() + .getObjectEffectsManager(); for (let i = 0; i < objectData.effects.length; ++i) { - // We call initializeEffect as we can't use addEffect, as the renderer is not ready yet. - // This means applyEffect will have to be called later (see onCreated). - // In all other cases, use addEffect, and avoid initialize/apply effect. - this._initializeEffect(objectData.effects[i]); + this._objectEffectsManager.initializeEffect( + objectData.effects[i], + this._rendererEffects, + this + ); this.updateAllEffectParameters(objectData.effects[i]); } @@ -130,11 +135,8 @@ namespace gdjs { * (`RuntimeObject.prototype.onCreated.call(this);`). */ onCreated(): void { - const objectEffectsManager = this._runtimeScene - .getGame() - .getObjectEffectsManager(); for (const filterName in this._rendererEffects) { - objectEffectsManager.applyEffect( + this._objectEffectsManager.applyEffect( this.getRendererObject(), this._rendererEffects[filterName] ); @@ -210,8 +212,9 @@ namespace gdjs { * * @param runtimeScene The RuntimeScene the object belongs to. */ - getElapsedTime(runtimeScene: gdjs.RuntimeScene): float { + getElapsedTime(runtimeScene?: gdjs.RuntimeScene): float { //TODO: Memoize? + runtimeScene = runtimeScene || this._runtimeScene; const theLayer = runtimeScene.getLayer(this.layer); return theLayer.getElapsedTime(runtimeScene); } @@ -224,12 +227,7 @@ namespace gdjs { * Called once during the game loop, before events and rendering. * @param runtimeScene The gdjs.RuntimeScene the object belongs to. */ - update(runtimeScene: gdjs.RuntimeScene): void { - runtimeScene - .getGame() - .getObjectEffectsManager() - .update(this._rendererEffects, this); - } + update(runtimeScene: gdjs.RuntimeScene): void {} /** * Called once during the game loop, after events and before rendering. @@ -756,21 +754,6 @@ namespace gdjs { return this._variables.has(name); } - /** - - * This function is used to initialize an effect, as it can't be - * applied directly in the constructor, and we won't be able to - * retain the effect data later. - * @private - * @param effectsData The effect data. - */ - private _initializeEffect(effectData: EffectData): void { - this._runtimeScene - .getGame() - .getObjectEffectsManager() - .initializeEffect(effectData, this._rendererEffects, this); - } - /** * Returns the collection of effects to be rendered by the * underlying renderer. @@ -785,15 +768,12 @@ namespace gdjs { * @param effectData The data of the effect to add. */ addEffect(effectData: EffectData): boolean { - return this._runtimeScene - .getGame() - .getObjectEffectsManager() - .addEffect( - effectData, - this._rendererEffects, - this.getRendererObject(), - this - ); + return this._objectEffectsManager.addEffect( + effectData, + this._rendererEffects, + this.getRendererObject(), + this + ); } /** @@ -801,14 +781,11 @@ namespace gdjs { * @param effectName The name of the effect. */ removeEffect(effectName: string): boolean { - return this._runtimeScene - .getGame() - .getObjectEffectsManager() - .removeEffect( - this._rendererEffects, - this.getRendererObject(), - effectName - ); + return this._objectEffectsManager.removeEffect( + this._rendererEffects, + this.getRendererObject(), + effectName + ); } /** @@ -822,15 +799,12 @@ namespace gdjs { parameterName: string, value: float ): boolean { - return this._runtimeScene - .getGame() - .getObjectEffectsManager() - .setEffectDoubleParameter( - this._rendererEffects, - name, - parameterName, - value - ); + return this._objectEffectsManager.setEffectDoubleParameter( + this._rendererEffects, + name, + parameterName, + value + ); } /** @@ -844,15 +818,12 @@ namespace gdjs { parameterName: string, value: string ): boolean { - return this._runtimeScene - .getGame() - .getObjectEffectsManager() - .setEffectStringParameter( - this._rendererEffects, - name, - parameterName, - value - ); + return this._objectEffectsManager.setEffectStringParameter( + this._rendererEffects, + name, + parameterName, + value + ); } /** @@ -866,15 +837,12 @@ namespace gdjs { parameterName: string, value: boolean ): boolean { - return this._runtimeScene - .getGame() - .getObjectEffectsManager() - .setEffectBooleanParameter( - this._rendererEffects, - name, - parameterName, - value - ); + return this._objectEffectsManager.setEffectBooleanParameter( + this._rendererEffects, + name, + parameterName, + value + ); } /** @@ -882,10 +850,10 @@ namespace gdjs { * @param effectData */ updateAllEffectParameters(effectData: EffectData): boolean { - return this._runtimeScene - .getGame() - .getObjectEffectsManager() - .updateAllEffectParameters(this._rendererEffects, effectData); + return this._objectEffectsManager.updateAllEffectParameters( + this._rendererEffects, + effectData + ); } /** @@ -894,10 +862,11 @@ namespace gdjs { * @param enable true to enable, false to disable */ enableEffect(name: string, enable: boolean): void { - this._runtimeScene - .getGame() - .getObjectEffectsManager() - .enableEffect(this._rendererEffects, name, enable); + this._objectEffectsManager.enableEffect( + this._rendererEffects, + name, + enable + ); } /** @@ -906,10 +875,10 @@ namespace gdjs { * @return true if the effect is enabled, false otherwise. */ isEffectEnabled(name: string): boolean { - return this._runtimeScene - .getGame() - .getObjectEffectsManager() - .isEffectEnabled(this._rendererEffects, name); + return this._objectEffectsManager.isEffectEnabled( + this._rendererEffects, + name + ); } /** @@ -918,10 +887,7 @@ namespace gdjs { * @return true if the effect exists, false otherwise. */ hasEffect(name: string): boolean { - return this._runtimeScene - .getGame() - .getObjectEffectsManager() - .hasEffect(this._rendererEffects, name); + return this._objectEffectsManager.hasEffect(this._rendererEffects, name); } /** diff --git a/GDJS/Runtime/runtimescene.ts b/GDJS/Runtime/runtimescene.ts index 184dd58e5220..1fa4ae4ed92a 100644 --- a/GDJS/Runtime/runtimescene.ts +++ b/GDJS/Runtime/runtimescene.ts @@ -711,6 +711,9 @@ namespace gdjs { obj.setX(obj.getX() + averageForce.getX() * elapsedTimeInSeconds); obj.setY(obj.getY() + averageForce.getY() * elapsedTimeInSeconds); obj.update(this); + this._runtimeGame + .getObjectEffectsManager() + .update(obj.getRendererEffects(), obj); obj.updateForces(elapsedTimeInSeconds); } else { obj.update(this); diff --git a/GDJS/Runtime/spriteruntimeobject.ts b/GDJS/Runtime/spriteruntimeobject.ts index fe6cf1463ebf..872911a9ca46 100644 --- a/GDJS/Runtime/spriteruntimeobject.ts +++ b/GDJS/Runtime/spriteruntimeobject.ts @@ -438,7 +438,6 @@ namespace gdjs { * Update the current frame of the object according to the elapsed time on the scene. */ update(runtimeScene: gdjs.RuntimeScene): void { - super.update(runtimeScene); //Playing the animation of all objects including the ones outside the screen can be //costly when the scene is big with a lot of animated objects. By default, we skip //updating the object if it is not visible. From 60702ff5ac91ad7c9100de13e0dccd65fe236c21 Mon Sep 17 00:00:00 2001 From: Harsimran Virk Date: Thu, 12 Aug 2021 19:55:13 +0530 Subject: [PATCH 18/28] Removed _objectEffectsManager pointer from the class. --- GDJS/Runtime/runtimeobject.ts | 127 +++++++++++++++++++--------------- 1 file changed, 71 insertions(+), 56 deletions(-) diff --git a/GDJS/Runtime/runtimeobject.ts b/GDJS/Runtime/runtimeobject.ts index 3e82b8f87fec..1c297fae00e0 100644 --- a/GDJS/Runtime/runtimeobject.ts +++ b/GDJS/Runtime/runtimeobject.ts @@ -71,7 +71,6 @@ namespace gdjs { protected _variables: gdjs.VariablesContainer; //Effects: - protected _objectEffectsManager: gdjs.ObjectEffectsManager; protected _rendererEffects: Record = {}; //Forces: @@ -102,15 +101,11 @@ namespace gdjs { ); this._averageForce = new gdjs.Force(0, 0, 0); this._behaviorsTable = new Hashtable(); - this._objectEffectsManager = runtimeScene - .getGame() - .getObjectEffectsManager(); for (let i = 0; i < objectData.effects.length; ++i) { - this._objectEffectsManager.initializeEffect( - objectData.effects[i], - this._rendererEffects, - this - ); + this._runtimeScene + .getGame() + .getObjectEffectsManager() + .initializeEffect(objectData.effects[i], this._rendererEffects, this); this.updateAllEffectParameters(objectData.effects[i]); } @@ -136,10 +131,13 @@ namespace gdjs { */ onCreated(): void { for (const filterName in this._rendererEffects) { - this._objectEffectsManager.applyEffect( - this.getRendererObject(), - this._rendererEffects[filterName] - ); + this._runtimeScene + .getGame() + .getObjectEffectsManager() + .applyEffect( + this.getRendererObject(), + this._rendererEffects[filterName] + ); } for (let i = 0; i < this._behaviors.length; ++i) { @@ -768,12 +766,15 @@ namespace gdjs { * @param effectData The data of the effect to add. */ addEffect(effectData: EffectData): boolean { - return this._objectEffectsManager.addEffect( - effectData, - this._rendererEffects, - this.getRendererObject(), - this - ); + return this._runtimeScene + .getGame() + .getObjectEffectsManager() + .addEffect( + effectData, + this._rendererEffects, + this.getRendererObject(), + this + ); } /** @@ -781,11 +782,14 @@ namespace gdjs { * @param effectName The name of the effect. */ removeEffect(effectName: string): boolean { - return this._objectEffectsManager.removeEffect( - this._rendererEffects, - this.getRendererObject(), - effectName - ); + return this._runtimeScene + .getGame() + .getObjectEffectsManager() + .removeEffect( + this._rendererEffects, + this.getRendererObject(), + effectName + ); } /** @@ -799,12 +803,15 @@ namespace gdjs { parameterName: string, value: float ): boolean { - return this._objectEffectsManager.setEffectDoubleParameter( - this._rendererEffects, - name, - parameterName, - value - ); + return this._runtimeScene + .getGame() + .getObjectEffectsManager() + .setEffectDoubleParameter( + this._rendererEffects, + name, + parameterName, + value + ); } /** @@ -818,12 +825,15 @@ namespace gdjs { parameterName: string, value: string ): boolean { - return this._objectEffectsManager.setEffectStringParameter( - this._rendererEffects, - name, - parameterName, - value - ); + return this._runtimeScene + .getGame() + .getObjectEffectsManager() + .setEffectStringParameter( + this._rendererEffects, + name, + parameterName, + value + ); } /** @@ -837,12 +847,15 @@ namespace gdjs { parameterName: string, value: boolean ): boolean { - return this._objectEffectsManager.setEffectBooleanParameter( - this._rendererEffects, - name, - parameterName, - value - ); + return this._runtimeScene + .getGame() + .getObjectEffectsManager() + .setEffectBooleanParameter( + this._rendererEffects, + name, + parameterName, + value + ); } /** @@ -850,10 +863,10 @@ namespace gdjs { * @param effectData */ updateAllEffectParameters(effectData: EffectData): boolean { - return this._objectEffectsManager.updateAllEffectParameters( - this._rendererEffects, - effectData - ); + return this._runtimeScene + .getGame() + .getObjectEffectsManager() + .updateAllEffectParameters(this._rendererEffects, effectData); } /** @@ -862,11 +875,10 @@ namespace gdjs { * @param enable true to enable, false to disable */ enableEffect(name: string, enable: boolean): void { - this._objectEffectsManager.enableEffect( - this._rendererEffects, - name, - enable - ); + this._runtimeScene + .getGame() + .getObjectEffectsManager() + .enableEffect(this._rendererEffects, name, enable); } /** @@ -875,10 +887,10 @@ namespace gdjs { * @return true if the effect is enabled, false otherwise. */ isEffectEnabled(name: string): boolean { - return this._objectEffectsManager.isEffectEnabled( - this._rendererEffects, - name - ); + return this._runtimeScene + .getGame() + .getObjectEffectsManager() + .isEffectEnabled(this._rendererEffects, name); } /** @@ -887,7 +899,10 @@ namespace gdjs { * @return true if the effect exists, false otherwise. */ hasEffect(name: string): boolean { - return this._objectEffectsManager.hasEffect(this._rendererEffects, name); + return this._runtimeScene + .getGame() + .getObjectEffectsManager() + .hasEffect(this._rendererEffects, name); } /** From 2e7a0e7110d841ce1edeb4580f5336a203a7b41a Mon Sep 17 00:00:00 2001 From: Harsimran Virk Date: Thu, 12 Aug 2021 22:45:21 +0530 Subject: [PATCH 19/28] Fixing tests --- .../Lighting/tests/lightruntimeobject.spec.js | 1 + .../LinkedObjects/tests/linkedobjects.spec.js | 6 +++ .../commonpathfindingruntimebehavior.spec.js | 2 + .../legacypathfindingruntimebehavior.spec.js | 2 + .../platformerobjectruntimebehavior.spec.js | 14 ++++++ GDJS/tests/benchmarks/runtimeobject.js | 6 +-- GDJS/tests/benchmarks/spriteruntimeobject.js | 1 + GDJS/tests/games/Sprite update test/game.json | 8 +++- GDJS/tests/games/TweenBenchmark/game.json | 6 ++- GDJS/tests/games/TweenTest/game.json | 30 ++++++++++++- ...immediately check if sound is stopped.json | 4 +- .../tests/games/effects/all effects demo.json | 4 +- .../Basic EventsBasedBehavior test.json | 13 +++++- .../platformer with events functions.json | 23 +++++++++- .../events-functions-nested-create/game.json | 3 +- ...h creation and deletion benchmark.gdg.json | 6 ++- .../objects-benchmarks/rotating objects.json | 4 +- .../pin-object-to-another.json | 5 ++- ...in-object-to-another-multiple-parents.json | 5 ++- .../platformer sandbox.json | 24 +++++++++- ...t after animation is changed (simple).json | 5 ++- ...point just after animation is changed.json | 4 +- .../ship-rotate-flip.json | 4 +- .../games/rotated-objects-hitboxes/game.json | 11 ++++- ...ported just after an animation change.json | 3 +- .../Trigger Once in Behaviors.json | 3 +- GDJS/tests/tests/common.js | 44 +++++++++---------- GDJS/tests/tests/runtimescene.js | 1 + GDJS/tests/tests/spriteruntimeobject.js | 1 + ...runtimeobject.pixiruntimegamewithassets.js | 1 + 30 files changed, 199 insertions(+), 45 deletions(-) diff --git a/Extensions/Lighting/tests/lightruntimeobject.spec.js b/Extensions/Lighting/tests/lightruntimeobject.spec.js index 9b12da04f9ff..35ffc1cf6d69 100644 --- a/Extensions/Lighting/tests/lightruntimeobject.spec.js +++ b/Extensions/Lighting/tests/lightruntimeobject.spec.js @@ -41,6 +41,7 @@ const addLightObstacle = (runtimeScene, width, height) => { type: 'Lighting::LightObstacleBehavior', }, ], + effects: [], }); obstacle.getWidth = function () { return width; diff --git a/Extensions/LinkedObjects/tests/linkedobjects.spec.js b/Extensions/LinkedObjects/tests/linkedobjects.spec.js index e92c23f105ec..4fb00c5030b4 100644 --- a/Extensions/LinkedObjects/tests/linkedobjects.spec.js +++ b/Extensions/LinkedObjects/tests/linkedobjects.spec.js @@ -19,32 +19,38 @@ describe('gdjs.LinksManager', function () { name: 'obj1', type: '', behaviors: [], + effects: [], }); var object1B = new gdjs.RuntimeObject(runtimeScene, { name: 'obj1', type: '', behaviors: [], + effects: [], }); var object1C = new gdjs.RuntimeObject(runtimeScene, { name: 'obj1', type: '', behaviors: [], + effects: [], }); var object2A = new gdjs.RuntimeObject(runtimeScene, { name: 'obj1', type: '', behaviors: [], + effects: [], }); var object2B = new gdjs.RuntimeObject(runtimeScene, { name: 'obj1', type: '', behaviors: [], + effects: [], }); var object2C = new gdjs.RuntimeObject(runtimeScene, { name: 'obj1', type: '', behaviors: [], + effects: [], }); runtimeScene.addObject(object1A); diff --git a/Extensions/PathfindingBehavior/tests/commonpathfindingruntimebehavior.spec.js b/Extensions/PathfindingBehavior/tests/commonpathfindingruntimebehavior.spec.js index 783118cb0694..c2de695912de 100644 --- a/Extensions/PathfindingBehavior/tests/commonpathfindingruntimebehavior.spec.js +++ b/Extensions/PathfindingBehavior/tests/commonpathfindingruntimebehavior.spec.js @@ -66,6 +66,7 @@ describe('gdjs.PathfindingRuntimeBehavior', function () { collisionMethod: collisionMethod, }, ], + effects: [], }); player.getWidth = function () { return 90; @@ -89,6 +90,7 @@ describe('gdjs.PathfindingRuntimeBehavior', function () { cost: 2, }, ], + effects: [], }); obstacle.getWidth = function () { return 100; diff --git a/Extensions/PathfindingBehavior/tests/legacypathfindingruntimebehavior.spec.js b/Extensions/PathfindingBehavior/tests/legacypathfindingruntimebehavior.spec.js index 2b983ac6e6a4..318878b02282 100644 --- a/Extensions/PathfindingBehavior/tests/legacypathfindingruntimebehavior.spec.js +++ b/Extensions/PathfindingBehavior/tests/legacypathfindingruntimebehavior.spec.js @@ -77,6 +77,7 @@ describe('gdjs.PathfindingRuntimeBehavior', function () { ], }, ], + effects: [], behaviors: [ { type: 'PathfindingBehavior::PathfindingBehavior', @@ -131,6 +132,7 @@ describe('gdjs.PathfindingRuntimeBehavior', function () { ], }, ], + effects: [], behaviors: [ { type: 'PathfindingBehavior::PathfindingObstacleBehavior', diff --git a/Extensions/PlatformBehavior/tests/platformerobjectruntimebehavior.spec.js b/Extensions/PlatformBehavior/tests/platformerobjectruntimebehavior.spec.js index e6e4a8365344..ffd087af074a 100644 --- a/Extensions/PlatformBehavior/tests/platformerobjectruntimebehavior.spec.js +++ b/Extensions/PlatformBehavior/tests/platformerobjectruntimebehavior.spec.js @@ -34,6 +34,7 @@ describe('gdjs.PlatformerObjectRuntimeBehavior', function () { canBeGrabbed: true, }, ], + effects: [], }); platform.setCustomWidthAndHeight(60, 32); runtimeScene.addObject(platform); @@ -53,6 +54,7 @@ describe('gdjs.PlatformerObjectRuntimeBehavior', function () { canBeGrabbed: false, }, ], + effects: [], }); platform.setCustomWidthAndHeight(60, 32); runtimeScene.addObject(platform); @@ -72,6 +74,7 @@ describe('gdjs.PlatformerObjectRuntimeBehavior', function () { platformType: 'Ladder', }, ], + effects: [], }); ladder.setCustomWidthAndHeight(20, 60); runtimeScene.addObject(ladder); @@ -106,6 +109,7 @@ describe('gdjs.PlatformerObjectRuntimeBehavior', function () { slopeMaxAngle: 60, }, ], + effects: [], }); object.setCustomWidthAndHeight(10, 20); runtimeScene.addObject(object); @@ -302,6 +306,7 @@ describe('gdjs.PlatformerObjectRuntimeBehavior', function () { slopeMaxAngle: 60, }, ], + effects: [], }); object.setCustomWidthAndHeight(10, 20); runtimeScene.addObject(object); @@ -469,6 +474,7 @@ describe('gdjs.PlatformerObjectRuntimeBehavior', function () { roundCoordinates: true, }, ], + effects: [], }); object.setCustomWidthAndHeight(10, 20); runtimeScene.addObject(object); @@ -915,6 +921,7 @@ describe('gdjs.PlatformerObjectRuntimeBehavior', function () { slopeMaxAngle: 60, }, ], + effects: [], }); object.setCustomWidthAndHeight(10, 20); runtimeScene.addObject(object); @@ -937,6 +944,7 @@ describe('gdjs.PlatformerObjectRuntimeBehavior', function () { platformType: 'Jumpthru', }, ], + effects: [], }); jumpthru.setCustomWidthAndHeight(60, 5); runtimeScene.addObject(jumpthru); @@ -1051,6 +1059,7 @@ describe('gdjs.PlatformerObjectRuntimeBehavior', function () { slopeMaxAngle: 60, }, ], + effects: [], }); object.setCustomWidthAndHeight(10, 20); runtimeScene.addObject(object); @@ -1312,6 +1321,7 @@ describe('gdjs.PlatformerObjectRuntimeBehavior', function () { slopeMaxAngle: 60, }, ], + effects: [], }); object.setCustomWidthAndHeight(10, 20); runtimeScene.addObject(object); @@ -1441,6 +1451,7 @@ describe('gdjs.PlatformerObjectRuntimeBehavior', function () { slopeMaxAngle: 60, }, ], + effects: [], }); object.setCustomWidthAndHeight(10, 20); runtimeScene.addObject(object); @@ -1476,6 +1487,7 @@ describe('gdjs.PlatformerObjectRuntimeBehavior', function () { platformType: 'Platform', }, ], + effects: [], }); object2.setCustomWidthAndHeight(10, 20); runtimeScene.addObject(object2); @@ -1599,6 +1611,7 @@ describe('gdjs.PlatformerObjectRuntimeBehavior', function () { roundCoordinates: true, }, ], + effects: [], }); object.setCustomWidthAndHeight(10, 20); runtimeScene.addObject(object); @@ -1990,6 +2003,7 @@ describe('gdjs.PlatformerObjectRuntimeBehavior', function () { roundCoordinates: true, }, ], + effects: [], }); object.setCustomWidthAndHeight(10, 20); runtimeScene.addObject(object); diff --git a/GDJS/tests/benchmarks/runtimeobject.js b/GDJS/tests/benchmarks/runtimeobject.js index a551884cb5f8..32b20db99f51 100644 --- a/GDJS/tests/benchmarks/runtimeobject.js +++ b/GDJS/tests/benchmarks/runtimeobject.js @@ -3,7 +3,7 @@ describe('gdjs.RuntimeObject', function() { it('benchmark getAABB of rotated vs non rotated objects', function(){ this.timeout(20000); - var object = new gdjs.RuntimeObject(runtimeScene, {name: "obj1", type: "", behaviors: []}); + var object = new gdjs.RuntimeObject(runtimeScene, {name: "obj1", type: "", behaviors: [], effects: []}); object.getWidth = function() { return 10; }; object.getHeight = function() { return 20; }; object.setPosition(15, 20); @@ -27,7 +27,7 @@ describe('gdjs.RuntimeObject', function() { it('benchmark getAABB of rotated vs non rotated objects, with non default center', function(){ this.timeout(20000); - var object = new gdjs.RuntimeObject(runtimeScene, {name: "obj1", type: "", behaviors: []}); + var object = new gdjs.RuntimeObject(runtimeScene, {name: "obj1", type: "", behaviors: [], effects: []}); object.getWidth = function() { return 10; }; object.getHeight = function() { return 20; }; object.getCenterX = function() { return 0 }; @@ -52,4 +52,4 @@ describe('gdjs.RuntimeObject', function() { console.log(benchmarkSuite.run()); }); -}); \ No newline at end of file +}); diff --git a/GDJS/tests/benchmarks/spriteruntimeobject.js b/GDJS/tests/benchmarks/spriteruntimeobject.js index 6c79d9bb7825..f28b04f02f17 100644 --- a/GDJS/tests/benchmarks/spriteruntimeobject.js +++ b/GDJS/tests/benchmarks/spriteruntimeobject.js @@ -16,6 +16,7 @@ describe('gdjs.SpriteRuntimeObject', function () { updateIfNotVisible: false, variables: [], behaviors: [], + effects: [], animations: [ { name: 'NewObject2', diff --git a/GDJS/tests/games/Sprite update test/game.json b/GDJS/tests/games/Sprite update test/game.json index 524a08303cfb..c57bbec10a2e 100644 --- a/GDJS/tests/games/Sprite update test/game.json +++ b/GDJS/tests/games/Sprite update test/game.json @@ -356,6 +356,7 @@ "updateIfNotVisible": false, "variables": [], "behaviors": [], + "effects": [], "animations": [ { "name": "sprite1", @@ -398,6 +399,7 @@ "underlined": false, "variables": [], "behaviors": [], + "effects": [], "string": "Press any key to reload the scene\nGreen objects loaded from external layout are displaced at first and flicker\nRed objects belongs to this scene are fine", "font": "", "characterSize": 20, @@ -414,6 +416,7 @@ "updateIfNotVisible": false, "variables": [], "behaviors": [], + "effects": [], "animations": [ { "name": "sprite2", @@ -456,6 +459,7 @@ "underlined": false, "variables": [], "behaviors": [], + "effects": [], "string": "Text from external Layout seems fine, no flicker", "font": "", "characterSize": 20, @@ -650,6 +654,7 @@ "updateIfNotVisible": false, "variables": [], "behaviors": [], + "effects": [], "animations": [ { "name": "Hurt", @@ -881,6 +886,7 @@ "underlined": false, "variables": [], "behaviors": [], + "effects": [], "string": "The idle animation should be shown immediately. \nThe first \"hurt\" animation should not be visible even when the scene is just changed.", "font": "", "characterSize": 20, @@ -1206,4 +1212,4 @@ } ], "externalSourceFiles": [] -} \ No newline at end of file +} diff --git a/GDJS/tests/games/TweenBenchmark/game.json b/GDJS/tests/games/TweenBenchmark/game.json index d01f3593c9b4..2a4b9fa2ad68 100644 --- a/GDJS/tests/games/TweenBenchmark/game.json +++ b/GDJS/tests/games/TweenBenchmark/game.json @@ -4250,6 +4250,7 @@ "type": "TextObject::Text", "underlined": false, "variables": [], + "effects": [], "behaviors": [ { "name": "TweenBehavior", @@ -4275,6 +4276,7 @@ "underlined": false, "variables": [], "behaviors": [], + "effects": [], "string": "Load Sprite scene", "font": "", "characterSize": 40, @@ -7351,6 +7353,7 @@ "type": "Sprite", "updateIfNotVisible": false, "variables": [], + "effects": [], "behaviors": [ { "name": "TweenBehavior", @@ -7399,6 +7402,7 @@ "underlined": false, "variables": [], "behaviors": [], + "effects": [], "string": "Load Text scene", "font": "", "characterSize": 40, @@ -7627,4 +7631,4 @@ "eventsFunctionsExtensions": [], "externalLayouts": [], "externalSourceFiles": [] -} \ No newline at end of file +} diff --git a/GDJS/tests/games/TweenTest/game.json b/GDJS/tests/games/TweenTest/game.json index 8052ff40d3c9..6c770839d469 100644 --- a/GDJS/tests/games/TweenTest/game.json +++ b/GDJS/tests/games/TweenTest/game.json @@ -789,6 +789,7 @@ "underlined": false, "variables": [], "behaviors": [], + "effects": [], "string": "Variable tweens", "font": "", "characterSize": 20, @@ -811,6 +812,7 @@ "value": "0" } ], + "effects": [], "behaviors": [ { "name": "TweenBehavior", @@ -839,6 +841,7 @@ "underlined": false, "variables": [], "behaviors": [], + "effects": [], "string": "Position tweens", "font": "", "characterSize": 20, @@ -858,6 +861,7 @@ "value": "0" } ], + "effects": [], "behaviors": [ { "name": "TweenBehavior", @@ -909,6 +913,7 @@ "underlined": false, "variables": [], "behaviors": [], + "effects": [], "string": "Position X tweens", "font": "", "characterSize": 20, @@ -927,6 +932,7 @@ "underlined": false, "variables": [], "behaviors": [], + "effects": [], "string": "0", "font": "", "characterSize": 20, @@ -956,6 +962,7 @@ } } ], + "effects": [], "animations": [ { "name": "Sprite", @@ -997,6 +1004,7 @@ "underlined": false, "variables": [], "behaviors": [], + "effects": [], "string": "Position Y\n tweens", "font": "", "characterSize": 20, @@ -1016,6 +1024,7 @@ "value": "0" } ], + "effects": [], "behaviors": [ { "name": "TweenBehavior", @@ -1067,6 +1076,7 @@ "underlined": false, "variables": [], "behaviors": [], + "effects": [], "string": "Angle \ntweens", "font": "", "characterSize": 20, @@ -1096,6 +1106,7 @@ } } ], + "effects": [], "animations": [ { "name": "Sprite", @@ -1137,6 +1148,7 @@ "underlined": false, "variables": [], "behaviors": [], + "effects": [], "string": "Scale tweens", "font": "", "characterSize": 20, @@ -1166,6 +1178,7 @@ } } ], + "effects": [], "animations": [ { "name": "Sprite", @@ -1207,6 +1220,7 @@ "underlined": false, "variables": [], "behaviors": [], + "effects": [], "string": "Scale-X tweens", "font": "", "characterSize": 20, @@ -1236,6 +1250,7 @@ } } ], + "effects": [], "animations": [ { "name": "Sprite", @@ -1277,6 +1292,7 @@ "underlined": false, "variables": [], "behaviors": [], + "effects": [], "string": "Scale-Y\ntweens", "font": "", "characterSize": 20, @@ -1306,6 +1322,7 @@ } } ], + "effects": [], "animations": [ { "name": "Sprite", @@ -1347,6 +1364,7 @@ "underlined": false, "variables": [], "behaviors": [], + "effects": [], "string": "Opacity tweens", "font": "", "characterSize": 20, @@ -1366,6 +1384,7 @@ "value": "0" } ], + "effects": [], "behaviors": [ { "name": "TweenBehavior", @@ -1417,6 +1436,7 @@ "underlined": false, "variables": [], "behaviors": [], + "effects": [], "string": "Pause/resume tweens", "font": "", "characterSize": 20, @@ -1430,6 +1450,7 @@ "name": "PauseResumeTweenSprite", "type": "Sprite", "updateIfNotVisible": false, + "effects": [], "variables": [ { "name": "var", @@ -1487,6 +1508,7 @@ "underlined": false, "variables": [], "behaviors": [], + "effects": [], "string": "Colour tweens", "font": "", "characterSize": 20, @@ -1505,6 +1527,7 @@ "underlined": false, "variables": [], "behaviors": [], + "effects": [], "string": "0", "font": "", "characterSize": 20, @@ -1524,6 +1547,7 @@ "value": "0" } ], + "effects": [], "behaviors": [ { "name": "TweenBehavior", @@ -1575,6 +1599,7 @@ "underlined": false, "variables": [], "behaviors": [], + "effects": [], "string": "Character size", "font": "", "characterSize": 20, @@ -1599,6 +1624,7 @@ "content": {} } ], + "effects": [], "string": "Hello world", "font": "", "characterSize": 20, @@ -1614,6 +1640,7 @@ "updateIfNotVisible": false, "variables": [], "behaviors": [], + "effects": [], "animations": [ { "name": "Background", @@ -1652,6 +1679,7 @@ "updateIfNotVisible": false, "variables": [], "behaviors": [], + "effects": [], "animations": [ { "name": "Background_Wip", @@ -4680,4 +4708,4 @@ "eventsFunctionsExtensions": [], "externalLayouts": [], "externalSourceFiles": [] -} \ No newline at end of file +} diff --git a/GDJS/tests/games/audio-play-stop-condition/play then immediately check if sound is stopped.json b/GDJS/tests/games/audio-play-stop-condition/play then immediately check if sound is stopped.json index 1cbd8c89f9f7..49b4182621af 100755 --- a/GDJS/tests/games/audio-play-stop-condition/play then immediately check if sound is stopped.json +++ b/GDJS/tests/games/audio-play-stop-condition/play then immediately check if sound is stopped.json @@ -170,6 +170,7 @@ "underlined": false, "variables": [], "behaviors": [], + "effects": [], "string": "Scene1 - Audio Status", "font": "", "characterSize": 40, @@ -432,6 +433,7 @@ "underlined": false, "variables": [], "behaviors": [], + "effects": [], "string": "Scene2 - Audio status...", "font": "", "characterSize": 40, @@ -538,4 +540,4 @@ "eventsFunctionsExtensions": [], "externalLayouts": [], "externalSourceFiles": [] -} \ No newline at end of file +} diff --git a/GDJS/tests/games/effects/all effects demo.json b/GDJS/tests/games/effects/all effects demo.json index 44ed8199924e..7e8a4235c888 100644 --- a/GDJS/tests/games/effects/all effects demo.json +++ b/GDJS/tests/games/effects/all effects demo.json @@ -3467,6 +3467,7 @@ "updateIfNotVisible": false, "variables": [], "behaviors": [], + "effects": [], "animations": [ { "name": "t1", @@ -4725,6 +4726,7 @@ "updateIfNotVisible": false, "variables": [], "behaviors": [], + "effects": [], "animations": [ { "name": "", @@ -5487,4 +5489,4 @@ "eventsFunctionsExtensions": [], "externalLayouts": [], "externalSourceFiles": [] -} \ No newline at end of file +} diff --git a/GDJS/tests/games/events-based-behaviors/Basic EventsBasedBehavior test.json b/GDJS/tests/games/events-based-behaviors/Basic EventsBasedBehavior test.json index 7c2eafd1db24..ca1b621b5a34 100644 --- a/GDJS/tests/games/events-based-behaviors/Basic EventsBasedBehavior test.json +++ b/GDJS/tests/games/events-based-behaviors/Basic EventsBasedBehavior test.json @@ -312,6 +312,7 @@ "type": "TextObject::Text", "underlined": false, "variables": [], + "effects": [], "behaviors": [ { "name": "MyBehavior", @@ -338,6 +339,7 @@ "type": "TextObject::Text", "underlined": false, "variables": [], + "effects": [], "behaviors": [ { "name": "MyBehavior", @@ -362,6 +364,7 @@ "type": "TextObject::Text", "underlined": false, "variables": [], + "effects": [], "behaviors": [ { "name": "MyBehavior", @@ -390,6 +393,7 @@ "type": "TextObject::Text", "underlined": false, "variables": [], + "effects": [], "behaviors": [ { "name": "MyBehavior", @@ -430,6 +434,7 @@ "BooleanTestProperty": true } ], + "effects": [], "string": "This should be changed by MyBehavior, using ThirdBehavior of NewObject6. (seeing this is a FAIL)", "font": "", "characterSize": 20, @@ -454,6 +459,7 @@ "type": "NewEventsFunctionsExtension::ThirdBehavior" } ], + "effects": [], "string": "Unmodified text, just having ThirdBehavior (success 6)", "font": "", "characterSize": 20, @@ -485,6 +491,7 @@ "BooleanTestProperty": true } ], + "effects": [], "string": "This should be changed by MyBehavior, using \"BehaviorUsingMyBehaviorFromOtherExtension\" of the same object. (seeing this is a FAIL)", "font": "", "characterSize": 20, @@ -509,6 +516,7 @@ "type": "NewEventsFunctionsExtension::ThirdBehavior" } ], + "effects": [], "string": "Unmodified text, just having ThirdBehavior (success 8)", "font": "", "characterSize": 20, @@ -536,6 +544,7 @@ "BooleanTestProperty": true } ], + "effects": [], "string": "SHould be Modified by a function (seeing this is a FAIL)", "font": "", "characterSize": 20, @@ -563,6 +572,7 @@ "BooleanTestProperty": true } ], + "effects": [], "string": "SHould be Modified by NewObject 8 (seeing this is a FAIL)", "font": "", "characterSize": 20, @@ -590,6 +600,7 @@ "BooleanTestProperty": true } ], + "effects": [], "string": "This should rotate (if not FAIL, otherwise success 11)", "font": "", "characterSize": 20, @@ -1737,4 +1748,4 @@ ], "externalLayouts": [], "externalSourceFiles": [] -} \ No newline at end of file +} diff --git a/GDJS/tests/games/events-function (and events-functions-extensions)/platformer with events functions.json b/GDJS/tests/games/events-function (and events-functions-extensions)/platformer with events functions.json index 2b245417990c..1f43fca39064 100644 --- a/GDJS/tests/games/events-function (and events-functions-extensions)/platformer with events functions.json +++ b/GDJS/tests/games/events-function (and events-functions-extensions)/platformer with events functions.json @@ -1860,6 +1860,7 @@ "updateIfNotVisible": true, "variables": [], "behaviors": [], + "effects": [], "animations": [ { "name": "", @@ -2156,6 +2157,7 @@ "type": "Sprite", "updateIfNotVisible": true, "variables": [], + "effects": [], "behaviors": [ { "canBeGrabbed": true, @@ -2269,6 +2271,7 @@ "type": "Sprite", "updateIfNotVisible": true, "variables": [], + "effects": [], "behaviors": [ { "canBeGrabbed": true, @@ -2336,6 +2339,7 @@ "type": "TiledSpriteObject::TiledSprite", "width": 70, "variables": [], + "effects": [], "behaviors": [ { "canBeGrabbed": true, @@ -2353,6 +2357,7 @@ "type": "TiledSpriteObject::TiledSprite", "width": 70, "variables": [], + "effects": [], "behaviors": [ { "canBeGrabbed": true, @@ -2368,6 +2373,7 @@ "type": "Sprite", "updateIfNotVisible": true, "variables": [], + "effects": [], "behaviors": [ { "canBeGrabbed": true, @@ -2434,6 +2440,7 @@ "updateIfNotVisible": true, "variables": [], "behaviors": [], + "effects": [], "animations": [ { "name": "", @@ -2491,6 +2498,7 @@ "updateIfNotVisible": true, "variables": [], "behaviors": [], + "effects": [], "animations": [ { "name": "", @@ -2549,6 +2557,7 @@ "type": "TiledSpriteObject::TiledSprite", "width": 70, "variables": [], + "effects": [], "behaviors": [ { "canBeGrabbed": true, @@ -2564,6 +2573,7 @@ "type": "Sprite", "updateIfNotVisible": true, "variables": [], + "effects": [], "behaviors": [ { "acceleration": 1500, @@ -2642,6 +2652,7 @@ "value": "0" } ], + "effects": [], "behaviors": [ { "acceleration": 5000, @@ -2799,6 +2810,7 @@ "type": "Sprite", "updateIfNotVisible": true, "variables": [], + "effects": [], "behaviors": [ { "acceleration": 500, @@ -2956,6 +2968,7 @@ "type": "Sprite", "updateIfNotVisible": true, "variables": [], + "effects": [], "behaviors": [], "animations": [ { @@ -3109,6 +3122,7 @@ "type": "Sprite", "updateIfNotVisible": true, "variables": [], + "effects": [], "behaviors": [], "animations": [ { @@ -3265,6 +3279,7 @@ "type": "TextObject::Text", "underlined": false, "variables": [], + "effects": [], "behaviors": [], "string": "x 0", "font": "Bimbo_JVE.ttf", @@ -3280,6 +3295,7 @@ "type": "Sprite", "updateIfNotVisible": true, "variables": [], + "effects": [], "behaviors": [], "animations": [ { @@ -3337,6 +3353,7 @@ "type": "Sprite", "updateIfNotVisible": true, "variables": [], + "effects": [], "behaviors": [], "animations": [ { @@ -3394,6 +3411,7 @@ "type": "Sprite", "updateIfNotVisible": true, "variables": [], + "effects": [], "behaviors": [], "animations": [ { @@ -3451,6 +3469,7 @@ "type": "Sprite", "updateIfNotVisible": true, "variables": [], + "effects": [], "behaviors": [], "animations": [ { @@ -3508,6 +3527,7 @@ "type": "Sprite", "updateIfNotVisible": true, "variables": [], + "effects": [], "behaviors": [ { "bottomEdgeAnchor": 0, @@ -3575,6 +3595,7 @@ "type": "Sprite", "updateIfNotVisible": true, "variables": [], + "effects": [], "behaviors": [], "animations": [ { @@ -5430,4 +5451,4 @@ ], "externalLayouts": [], "externalSourceFiles": [] -} \ No newline at end of file +} diff --git a/GDJS/tests/games/events-functions-nested-create/game.json b/GDJS/tests/games/events-functions-nested-create/game.json index 2ba9ffc6666a..2eab7bc45d3f 100644 --- a/GDJS/tests/games/events-functions-nested-create/game.json +++ b/GDJS/tests/games/events-functions-nested-create/game.json @@ -149,6 +149,7 @@ "type": "Sprite", "updateIfNotVisible": false, "variables": [], + "effects": [], "behaviors": [], "animations": [ { @@ -357,4 +358,4 @@ ], "externalLayouts": [], "externalSourceFiles": [] -} \ No newline at end of file +} diff --git a/GDJS/tests/games/memory-benchmarks/Collisions with creation and deletion benchmark.gdg.json b/GDJS/tests/games/memory-benchmarks/Collisions with creation and deletion benchmark.gdg.json index 15a48c9d63d7..57bfa963198a 100644 --- a/GDJS/tests/games/memory-benchmarks/Collisions with creation and deletion benchmark.gdg.json +++ b/GDJS/tests/games/memory-benchmarks/Collisions with creation and deletion benchmark.gdg.json @@ -202,6 +202,7 @@ "updateIfNotVisible": false, "variables": [], "behaviors": [], + "effects": [], "animations": [ { "name": "NewObject", @@ -241,6 +242,7 @@ "updateIfNotVisible": false, "variables": [], "behaviors": [], + "effects": [], "animations": [ { "name": "NewObject2", @@ -280,6 +282,7 @@ "updateIfNotVisible": false, "variables": [], "behaviors": [], + "effects": [], "animations": [ { "name": "NewObject3", @@ -322,6 +325,7 @@ "underlined": false, "variables": [], "behaviors": [], + "effects": [], "string": "Text", "font": "", "characterSize": 20, @@ -557,4 +561,4 @@ "eventsFunctionsExtensions": [], "externalLayouts": [], "externalSourceFiles": [] -} \ No newline at end of file +} diff --git a/GDJS/tests/games/objects-benchmarks/rotating objects.json b/GDJS/tests/games/objects-benchmarks/rotating objects.json index a4ba2ee9b570..580ab7e1cd0a 100644 --- a/GDJS/tests/games/objects-benchmarks/rotating objects.json +++ b/GDJS/tests/games/objects-benchmarks/rotating objects.json @@ -163,6 +163,7 @@ "updateIfNotVisible": false, "variables": [], "behaviors": [], + "effects": [], "animations": [ { "name": "", @@ -202,6 +203,7 @@ "updateIfNotVisible": false, "variables": [], "behaviors": [], + "effects": [], "animations": [ { "name": "", @@ -403,4 +405,4 @@ "eventsFunctionsExtensions": [], "externalLayouts": [], "externalSourceFiles": [] -} \ No newline at end of file +} diff --git a/GDJS/tests/games/pin-object-to-another (distance and put around)/pin-object-to-another.json b/GDJS/tests/games/pin-object-to-another (distance and put around)/pin-object-to-another.json index d8d637b05c60..1d45e31c5f1e 100644 --- a/GDJS/tests/games/pin-object-to-another (distance and put around)/pin-object-to-another.json +++ b/GDJS/tests/games/pin-object-to-another (distance and put around)/pin-object-to-another.json @@ -272,6 +272,7 @@ "underlined": false, "variables": [], "behaviors": [], + "effects": [], "string": "Add child objects in the editor and position, scale and rotate them as you like.\nIn preview, rotate the parent using A and S keys and drag the parent with the mouse.\nAll child object should keep it relative rotation and position to the parent object.", "font": "", "characterSize": 20, @@ -286,6 +287,7 @@ "type": "Sprite", "updateIfNotVisible": true, "variables": [], + "effects": [], "behaviors": [ { "name": "Draggable", @@ -349,6 +351,7 @@ "updateIfNotVisible": true, "variables": [], "behaviors": [], + "effects": [], "animations": [ { "name": "", @@ -685,4 +688,4 @@ "externalEvents": [], "externalLayouts": [], "externalSourceFiles": [] -} \ No newline at end of file +} diff --git a/GDJS/tests/games/pin-object-to-another-multiple-parents (linked objects, distance and put around)/pin-object-to-another-multiple-parents.json b/GDJS/tests/games/pin-object-to-another-multiple-parents (linked objects, distance and put around)/pin-object-to-another-multiple-parents.json index 36ce78df9db6..ba098a60c94e 100644 --- a/GDJS/tests/games/pin-object-to-another-multiple-parents (linked objects, distance and put around)/pin-object-to-another-multiple-parents.json +++ b/GDJS/tests/games/pin-object-to-another-multiple-parents (linked objects, distance and put around)/pin-object-to-another-multiple-parents.json @@ -342,6 +342,7 @@ "underlined": false, "variables": [], "behaviors": [], + "effects": [], "string": "Add child objects in the editor and position, scale and rotate them as you like.\nAdd a variable \"parent\" to each child object and a variable \"id\" to its parent.\nThe value of this variable must be the same, in order to have the child choose to which it belongs.\nIn preview, move the pointer over a parent, then you can rotate the parent using A and S keys.\nYou can also drag the parent with the mouse.\nAll child objects should keep its relative rotation and position to the parent object they belong to.", "font": "", "characterSize": 18, @@ -356,6 +357,7 @@ "type": "Sprite", "updateIfNotVisible": true, "variables": [], + "effects": [], "behaviors": [ { "name": "Draggable", @@ -419,6 +421,7 @@ "updateIfNotVisible": true, "variables": [], "behaviors": [], + "effects": [], "animations": [ { "name": "", @@ -1077,4 +1080,4 @@ ], "externalLayouts": [], "externalSourceFiles": [] -} \ No newline at end of file +} diff --git a/GDJS/tests/games/platformer sandbox/platformer sandbox.json b/GDJS/tests/games/platformer sandbox/platformer sandbox.json index 40c6e1183506..e18d2809211d 100644 --- a/GDJS/tests/games/platformer sandbox/platformer sandbox.json +++ b/GDJS/tests/games/platformer sandbox/platformer sandbox.json @@ -983,6 +983,7 @@ "updateIfNotVisible": true, "variables": [], "behaviors": [], + "effects": [], "animations": [ { "name": "", @@ -1280,6 +1281,7 @@ "type": "Sprite", "updateIfNotVisible": true, "variables": [], + "effects": [], "behaviors": [ { "name": "Platform", @@ -1403,6 +1405,7 @@ "yGrabOffset": 0 } ], + "effects": [], "animations": [ { "name": "", @@ -1462,6 +1465,7 @@ "type": "TiledSpriteObject::TiledSprite", "width": 70, "variables": [], + "effects": [], "behaviors": [ { "name": "Platform", @@ -1480,6 +1484,7 @@ "type": "TiledSpriteObject::TiledSprite", "width": 70, "variables": [], + "effects": [], "behaviors": [ { "name": "Platform", @@ -1496,6 +1501,7 @@ "type": "Sprite", "updateIfNotVisible": true, "variables": [], + "effects": [], "behaviors": [ { "name": "Platform", @@ -1572,6 +1578,7 @@ "type": "Sprite", "updateIfNotVisible": true, "variables": [], + "effects": [], "behaviors": [ { "name": "Platform", @@ -1649,6 +1656,7 @@ "updateIfNotVisible": true, "variables": [], "behaviors": [], + "effects": [], "animations": [ { "name": "", @@ -1707,6 +1715,7 @@ "updateIfNotVisible": true, "variables": [], "behaviors": [], + "effects": [], "animations": [ { "name": "", @@ -1766,6 +1775,7 @@ "type": "TiledSpriteObject::TiledSprite", "width": 70, "variables": [], + "effects": [], "behaviors": [ { "name": "Platform", @@ -1782,6 +1792,7 @@ "type": "Sprite", "updateIfNotVisible": true, "variables": [], + "effects": [], "behaviors": [ { "name": "PlatformerObject", @@ -1862,6 +1873,7 @@ "value": "0" } ], + "effects": [], "behaviors": [ { "name": "PlatformerObject", @@ -2021,6 +2033,7 @@ "type": "Sprite", "updateIfNotVisible": true, "variables": [], + "effects": [], "behaviors": [ { "name": "PlatformerObject", @@ -2181,6 +2194,7 @@ "updateIfNotVisible": true, "variables": [], "behaviors": [], + "effects": [], "animations": [ { "name": "", @@ -2335,6 +2349,7 @@ "updateIfNotVisible": true, "variables": [], "behaviors": [], + "effects": [], "animations": [ { "name": "", @@ -2492,6 +2507,7 @@ "underlined": false, "variables": [], "behaviors": [], + "effects": [], "string": "x 0", "font": "Bimbo_JVE.ttf", "characterSize": 40, @@ -2508,6 +2524,7 @@ "updateIfNotVisible": true, "variables": [], "behaviors": [], + "effects": [], "animations": [ { "name": "", @@ -2566,6 +2583,7 @@ "updateIfNotVisible": true, "variables": [], "behaviors": [], + "effects": [], "animations": [ { "name": "", @@ -2624,6 +2642,7 @@ "updateIfNotVisible": true, "variables": [], "behaviors": [], + "effects": [], "animations": [ { "name": "", @@ -2682,6 +2701,7 @@ "updateIfNotVisible": true, "variables": [], "behaviors": [], + "effects": [], "animations": [ { "name": "", @@ -2739,6 +2759,7 @@ "type": "Sprite", "updateIfNotVisible": true, "variables": [], + "effects": [], "behaviors": [ { "name": "Anchor", @@ -2808,6 +2829,7 @@ "updateIfNotVisible": true, "variables": [], "behaviors": [], + "effects": [], "animations": [ { "name": "", @@ -4712,4 +4734,4 @@ ], "externalLayouts": [], "externalSourceFiles": [] -} \ No newline at end of file +} diff --git a/GDJS/tests/games/points-and-changing-animations-tests/Create an object at a point just after animation is changed (simple).json b/GDJS/tests/games/points-and-changing-animations-tests/Create an object at a point just after animation is changed (simple).json index 673e06b2020f..132946415a10 100644 --- a/GDJS/tests/games/points-and-changing-animations-tests/Create an object at a point just after animation is changed (simple).json +++ b/GDJS/tests/games/points-and-changing-animations-tests/Create an object at a point just after animation is changed (simple).json @@ -290,6 +290,7 @@ "value": "3" } ], + "effects": [], "behaviors": [ { "name": "TopDownMovement", @@ -384,6 +385,7 @@ "updateIfNotVisible": false, "variables": [], "behaviors": [], + "effects": [], "animations": [ { "name": "", @@ -481,6 +483,7 @@ "updateIfNotVisible": false, "variables": [], "behaviors": [], + "effects": [], "animations": [ { "name": "", @@ -760,4 +763,4 @@ "eventsFunctionsExtensions": [], "externalLayouts": [], "externalSourceFiles": [] -} \ No newline at end of file +} diff --git a/GDJS/tests/games/points-and-changing-animations-tests/Create an object at a point just after animation is changed.json b/GDJS/tests/games/points-and-changing-animations-tests/Create an object at a point just after animation is changed.json index 8ac61618c03c..5991d403f4ed 100644 --- a/GDJS/tests/games/points-and-changing-animations-tests/Create an object at a point just after animation is changed.json +++ b/GDJS/tests/games/points-and-changing-animations-tests/Create an object at a point just after animation is changed.json @@ -223,6 +223,7 @@ "updateIfNotVisible": false, "variables": [], "behaviors": [], + "effects": [], "animations": [ { "name": "NewObject", @@ -372,6 +373,7 @@ "type": "Sprite", "updateIfNotVisible": false, "variables": [], + "effects": [], "behaviors": [ { "name": "DestroyOutside", @@ -699,4 +701,4 @@ "eventsFunctionsExtensions": [], "externalLayouts": [], "externalSourceFiles": [] -} \ No newline at end of file +} diff --git a/GDJS/tests/games/rotate-flip-around-center-point/ship-rotate-flip.json b/GDJS/tests/games/rotate-flip-around-center-point/ship-rotate-flip.json index 26e9d30b0f54..bc8bbfdd214f 100644 --- a/GDJS/tests/games/rotate-flip-around-center-point/ship-rotate-flip.json +++ b/GDJS/tests/games/rotate-flip-around-center-point/ship-rotate-flip.json @@ -232,6 +232,7 @@ "updateIfNotVisible": false, "variables": [], "behaviors": [], + "effects": [], "animations": [ { "name": "Ship", @@ -290,6 +291,7 @@ "updateIfNotVisible": false, "variables": [], "behaviors": [], + "effects": [], "animations": [ { "name": "NewObject", @@ -578,4 +580,4 @@ "eventsFunctionsExtensions": [], "externalLayouts": [], "externalSourceFiles": [] -} \ No newline at end of file +} diff --git a/GDJS/tests/games/rotated-objects-hitboxes/game.json b/GDJS/tests/games/rotated-objects-hitboxes/game.json index 72a3958da1e9..dc8e36bc13b6 100644 --- a/GDJS/tests/games/rotated-objects-hitboxes/game.json +++ b/GDJS/tests/games/rotated-objects-hitboxes/game.json @@ -502,6 +502,7 @@ "updateIfNotVisible": false, "variables": [], "behaviors": [], + "effects": [], "animations": [ { "name": "NewObject", @@ -540,6 +541,7 @@ "updateIfNotVisible": false, "variables": [], "behaviors": [], + "effects": [], "animations": [ { "name": "NewObject2", @@ -578,6 +580,7 @@ "updateIfNotVisible": false, "variables": [], "behaviors": [], + "effects": [], "animations": [ { "name": "NewObject2", @@ -619,6 +622,7 @@ "underlined": false, "variables": [], "behaviors": [], + "effects": [], "string": "Text blabl balbalbal", "font": "", "characterSize": 20, @@ -634,6 +638,7 @@ "updateIfNotVisible": false, "variables": [], "behaviors": [], + "effects": [], "animations": [ { "name": "NewObject2", @@ -691,6 +696,7 @@ "updateIfNotVisible": false, "variables": [], "behaviors": [], + "effects": [], "animations": [ { "name": "NewObject2", @@ -730,7 +736,8 @@ "type": "TiledSpriteObject::TiledSprite", "width": 32, "variables": [], - "behaviors": [] + "behaviors": [], + "effects": [] } ], "events": [ @@ -776,4 +783,4 @@ "eventsFunctionsExtensions": [], "externalLayouts": [], "externalSourceFiles": [] -} \ No newline at end of file +} diff --git a/GDJS/tests/games/size-and-changing-animation-tests/Size is properly reported just after an animation change.json b/GDJS/tests/games/size-and-changing-animation-tests/Size is properly reported just after an animation change.json index 6ca633deaaf5..e18df0c2fc43 100644 --- a/GDJS/tests/games/size-and-changing-animation-tests/Size is properly reported just after an animation change.json +++ b/GDJS/tests/games/size-and-changing-animation-tests/Size is properly reported just after an animation change.json @@ -187,6 +187,7 @@ "updateIfNotVisible": false, "variables": [], "behaviors": [], + "effects": [], "animations": [ { "name": "Square", @@ -488,4 +489,4 @@ "eventsFunctionsExtensions": [], "externalLayouts": [], "externalSourceFiles": [] -} \ No newline at end of file +} diff --git a/GDJS/tests/games/trigger-once-in-events-based-behaviors/Trigger Once in Behaviors.json b/GDJS/tests/games/trigger-once-in-events-based-behaviors/Trigger Once in Behaviors.json index 247cfe2cdc33..c58910571585 100644 --- a/GDJS/tests/games/trigger-once-in-events-based-behaviors/Trigger Once in Behaviors.json +++ b/GDJS/tests/games/trigger-once-in-events-based-behaviors/Trigger Once in Behaviors.json @@ -199,6 +199,7 @@ "type": "Sprite", "updateIfNotVisible": false, "variables": [], + "effects": [], "behaviors": [ { "name": "MyBehavior", @@ -632,4 +633,4 @@ ], "externalLayouts": [], "externalSourceFiles": [] -} \ No newline at end of file +} diff --git a/GDJS/tests/tests/common.js b/GDJS/tests/tests/common.js index fbf3497e65d7..e3a2fdda7d93 100644 --- a/GDJS/tests/tests/common.js +++ b/GDJS/tests/tests/common.js @@ -14,12 +14,12 @@ describe('gdjs.evtTools.object.twoListsTest', function() { var map2 = new Hashtable(); var runtimeScene = new gdjs.RuntimeScene(null); - var obj1A = new gdjs.RuntimeObject(runtimeScene, {name: "obj1", type: "", behaviors: []}); - var obj1B = new gdjs.RuntimeObject(runtimeScene, {name: "obj1", type: "", behaviors: []}); - var obj1C = new gdjs.RuntimeObject(runtimeScene, {name: "obj1", type: "", behaviors: []}); - var obj2A = new gdjs.RuntimeObject(runtimeScene, {name: "obj2", type: "", behaviors: []}); - var obj2B = new gdjs.RuntimeObject(runtimeScene, {name: "obj2", type: "", behaviors: []}); - var obj2C = new gdjs.RuntimeObject(runtimeScene, {name: "obj2", type: "", behaviors: []}); + var obj1A = new gdjs.RuntimeObject(runtimeScene, {name: "obj1", type: "", behaviors: [], effects: []}); + var obj1B = new gdjs.RuntimeObject(runtimeScene, {name: "obj1", type: "", behaviors: [], effects: []}); + var obj1C = new gdjs.RuntimeObject(runtimeScene, {name: "obj1", type: "", behaviors: [], effects: []}); + var obj2A = new gdjs.RuntimeObject(runtimeScene, {name: "obj2", type: "", behaviors: [], effects: []}); + var obj2B = new gdjs.RuntimeObject(runtimeScene, {name: "obj2", type: "", behaviors: [], effects: []}); + var obj2C = new gdjs.RuntimeObject(runtimeScene, {name: "obj2", type: "", behaviors: [], effects: []}); var list1 = [obj1A, obj1B, obj1C]; var list2 = [obj2A, obj2B, obj2C]; @@ -49,9 +49,9 @@ describe('gdjs.evtTools.object.pickObjectsIf', function() { var map1 = new Hashtable(); var runtimeScene = new gdjs.RuntimeScene(null); - var obj1A = new gdjs.RuntimeObject(runtimeScene, {name: "obj1", type: "", behaviors: []}); - var obj1B = new gdjs.RuntimeObject(runtimeScene, {name: "obj1", type: "", behaviors: []}); - var obj1C = new gdjs.RuntimeObject(runtimeScene, {name: "obj1", type: "", behaviors: []}); + var obj1A = new gdjs.RuntimeObject(runtimeScene, {name: "obj1", type: "", behaviors: [], effects: []}); + var obj1B = new gdjs.RuntimeObject(runtimeScene, {name: "obj1", type: "", behaviors: [], effects: []}); + var obj1C = new gdjs.RuntimeObject(runtimeScene, {name: "obj1", type: "", behaviors: [], effects: []}); var list1 = [obj1A, obj1B, obj1C]; map1.put("obj1", list1); @@ -73,11 +73,11 @@ describe('gdjs.evtTools.object.pickObjectsIf', function() { describe('gdjs.evtTools.object.pickRandomObject', function() { it('should pick only one object', function(){ var runtimeScene = new gdjs.RuntimeScene(null); - var obj1A = new gdjs.RuntimeObject(runtimeScene, {name: "obj1", type: "", behaviors: []}); - var obj1B = new gdjs.RuntimeObject(runtimeScene, {name: "obj1", type: "", behaviors: []}); - var obj1C = new gdjs.RuntimeObject(runtimeScene, {name: "obj1", type: "", behaviors: []}); - var obj2A = new gdjs.RuntimeObject(runtimeScene, {name: "obj2", type: "", behaviors: []}); - var obj2B = new gdjs.RuntimeObject(runtimeScene, {name: "obj2", type: "", behaviors: []}); + var obj1A = new gdjs.RuntimeObject(runtimeScene, {name: "obj1", type: "", behaviors: [], effects: []}); + var obj1B = new gdjs.RuntimeObject(runtimeScene, {name: "obj1", type: "", behaviors: [], effects: []}); + var obj1C = new gdjs.RuntimeObject(runtimeScene, {name: "obj1", type: "", behaviors: [], effects: []}); + var obj2A = new gdjs.RuntimeObject(runtimeScene, {name: "obj2", type: "", behaviors: [], effects: []}); + var obj2B = new gdjs.RuntimeObject(runtimeScene, {name: "obj2", type: "", behaviors: [], effects: []}); var map1 = new Hashtable(); var list1 = [obj1A, obj1B, obj1C]; @@ -103,11 +103,11 @@ describe('gdjs.evtTools.object.pickRandomObject', function() { describe('gdjs.evtTools.object.pickOnly', function() { it('picks only the object passed as parameter', function(){ var runtimeScene = new gdjs.RuntimeScene(null); - var obj1A = new gdjs.RuntimeObject(runtimeScene, {name: "obj1", type: "", behaviors: []}); - var obj1B = new gdjs.RuntimeObject(runtimeScene, {name: "obj1", type: "", behaviors: []}); - var obj1C = new gdjs.RuntimeObject(runtimeScene, {name: "obj1", type: "", behaviors: []}); - var obj2A = new gdjs.RuntimeObject(runtimeScene, {name: "obj2", type: "", behaviors: []}); - var obj2B = new gdjs.RuntimeObject(runtimeScene, {name: "obj2", type: "", behaviors: []}); + var obj1A = new gdjs.RuntimeObject(runtimeScene, {name: "obj1", type: "", behaviors: [], effects: []}); + var obj1B = new gdjs.RuntimeObject(runtimeScene, {name: "obj1", type: "", behaviors: [], effects: []}); + var obj1C = new gdjs.RuntimeObject(runtimeScene, {name: "obj1", type: "", behaviors: [], effects: []}); + var obj2A = new gdjs.RuntimeObject(runtimeScene, {name: "obj2", type: "", behaviors: [], effects: []}); + var obj2B = new gdjs.RuntimeObject(runtimeScene, {name: "obj2", type: "", behaviors: [], effects: []}); var map1 = new Hashtable(); map1.put("obj1", [obj1A, obj1B, obj1C]); @@ -139,9 +139,9 @@ describe('gdjs.evtTools.object.pickNearestObject', function() { var map1 = new Hashtable(); var runtimeScene = new gdjs.RuntimeScene(null); - var obj1A = new gdjs.RuntimeObject(runtimeScene, {name: "obj1", type: "", behaviors: []}); - var obj1B = new gdjs.RuntimeObject(runtimeScene, {name: "obj1", type: "", behaviors: []}); - var obj1C = new gdjs.RuntimeObject(runtimeScene, {name: "obj1", type: "", behaviors: []}); + var obj1A = new gdjs.RuntimeObject(runtimeScene, {name: "obj1", type: "", behaviors: [], effects: []}); + var obj1B = new gdjs.RuntimeObject(runtimeScene, {name: "obj1", type: "", behaviors: [], effects: []}); + var obj1C = new gdjs.RuntimeObject(runtimeScene, {name: "obj1", type: "", behaviors: [], effects: []}); obj1A.setPosition(50, 50); obj1B.setPosition(160, 160); obj1C.setPosition(100, 300); diff --git a/GDJS/tests/tests/runtimescene.js b/GDJS/tests/tests/runtimescene.js index 4ce52610037d..010dc03b9357 100644 --- a/GDJS/tests/tests/runtimescene.js +++ b/GDJS/tests/tests/runtimescene.js @@ -129,6 +129,7 @@ describe('gdjs.RuntimeScene integration tests', function () { type: 'Sprite', name: 'MyObject', behaviors: [], + effects: [], // @ts-expect-error ts-migrate(2322) FIXME: Type '{ type: string; name: string; behaviors: nev... Remove this comment to see the full error message animations: [], updateIfNotVisible: false, diff --git a/GDJS/tests/tests/spriteruntimeobject.js b/GDJS/tests/tests/spriteruntimeobject.js index 2ec9a5590144..ae1e76d06c41 100644 --- a/GDJS/tests/tests/spriteruntimeobject.js +++ b/GDJS/tests/tests/spriteruntimeobject.js @@ -40,6 +40,7 @@ describe('gdjs.SpriteRuntimeObject', function() { updateIfNotVisible: false, behaviors: [], variables: [], + effects: [], animations: [ { name: 'firstAnimation', diff --git a/GDJS/tests/tests/spriteruntimeobject.pixiruntimegamewithassets.js b/GDJS/tests/tests/spriteruntimeobject.pixiruntimegamewithassets.js index 61f68b447db0..d4d876146b0f 100644 --- a/GDJS/tests/tests/spriteruntimeobject.pixiruntimegamewithassets.js +++ b/GDJS/tests/tests/spriteruntimeobject.pixiruntimegamewithassets.js @@ -25,6 +25,7 @@ describe('gdjs.SpriteRuntimeObject (using a PIXI RuntimeGame with assets)', func updateIfNotVisible: false, variables: [], behaviors: [], + effects: [], animations: [ { name: 'NewObject2', From ffc199342ffc8566a91789adc74792d7aed0f16c Mon Sep 17 00:00:00 2001 From: Harsimran Virk Date: Fri, 13 Aug 2021 12:10:36 +0530 Subject: [PATCH 20/28] Fixed tests --- Extensions/Lighting/tests/lightruntimeobject.spec.js | 1 + .../flipped and animated tiles.json | 7 ++++++- .../tests/topdownmovementbehavior.spec.js | 1 + GDJS/tests/tests/inputmanager.js | 1 + GDJS/tests/tests/spriteruntimeobject.js | 1 + 5 files changed, 10 insertions(+), 1 deletion(-) diff --git a/Extensions/Lighting/tests/lightruntimeobject.spec.js b/Extensions/Lighting/tests/lightruntimeobject.spec.js index 35ffc1cf6d69..fc51de7a08cc 100644 --- a/Extensions/Lighting/tests/lightruntimeobject.spec.js +++ b/Extensions/Lighting/tests/lightruntimeobject.spec.js @@ -14,6 +14,7 @@ const addLightObject = (runtimeScene, radius) => { type: 'Lighting::LightObject', variables: [], behaviors: [], + effects: [], content: { radius: radius, color: '#b4b4b4', diff --git a/Extensions/TileMap/tests/flipped and animated tiles/flipped and animated tiles.json b/Extensions/TileMap/tests/flipped and animated tiles/flipped and animated tiles.json index 259cba20a08b..17d198c251ef 100644 --- a/Extensions/TileMap/tests/flipped and animated tiles/flipped and animated tiles.json +++ b/Extensions/TileMap/tests/flipped and animated tiles/flipped and animated tiles.json @@ -246,6 +246,7 @@ "type": "TileMap::TileMap", "variables": [], "behaviors": [], + "effects": [], "content": { "tilemapJsonFile": "example.json", "tilesetJsonFile": "tileset.json", @@ -266,6 +267,7 @@ "underlined": false, "variables": [], "behaviors": [], + "effects": [], "string": "FlipXY", "font": "", "characterSize": 10, @@ -285,6 +287,7 @@ "underlined": false, "variables": [], "behaviors": [], + "effects": [], "string": "FlipX", "font": "", "characterSize": 10, @@ -304,6 +307,7 @@ "underlined": false, "variables": [], "behaviors": [], + "effects": [], "string": "FlipY", "font": "", "characterSize": 10, @@ -323,6 +327,7 @@ "underlined": false, "variables": [], "behaviors": [], + "effects": [], "string": "Normal", "font": "", "characterSize": 10, @@ -365,4 +370,4 @@ "eventsFunctionsExtensions": [], "externalLayouts": [], "externalSourceFiles": [] -} \ No newline at end of file +} diff --git a/Extensions/TopDownMovementBehavior/tests/topdownmovementbehavior.spec.js b/Extensions/TopDownMovementBehavior/tests/topdownmovementbehavior.spec.js index f06f54d90fef..26826dfc39a2 100644 --- a/Extensions/TopDownMovementBehavior/tests/topdownmovementbehavior.spec.js +++ b/Extensions/TopDownMovementBehavior/tests/topdownmovementbehavior.spec.js @@ -47,6 +47,7 @@ describe('gdjs.TopDownMovementRuntimeBehavior', function () { const player = new gdjs.TestRuntimeObject(runtimeScene, { name: 'player', type: '', + effects: [], behaviors: [ { type: 'TopDownMovementBehavior::TopDownMovementBehavior', diff --git a/GDJS/tests/tests/inputmanager.js b/GDJS/tests/tests/inputmanager.js index 0536c4317e41..71a2b175882a 100644 --- a/GDJS/tests/tests/inputmanager.js +++ b/GDJS/tests/tests/inputmanager.js @@ -155,6 +155,7 @@ describe('gdjs.RuntimeObject.cursorOnObject', function() { name: 'obj1', type: '', behaviors: [], + effects: [], }); object.setPosition(450, 500); diff --git a/GDJS/tests/tests/spriteruntimeobject.js b/GDJS/tests/tests/spriteruntimeobject.js index ae1e76d06c41..6d414b57647e 100644 --- a/GDJS/tests/tests/spriteruntimeobject.js +++ b/GDJS/tests/tests/spriteruntimeobject.js @@ -20,6 +20,7 @@ describe('gdjs.SpriteRuntimeObject', function() { variables: [], behaviors: [], animations: [], + effects: [], }); expect(object.getScaleX()).to.be(1); From 00b6d29e165b36462b8c8e3f9a19d0a62cc086cb Mon Sep 17 00:00:00 2001 From: Florian Rival Date: Tue, 17 Aug 2021 15:43:38 +0200 Subject: [PATCH 21/28] Fix some wordings --- .../Builtin/BaseObjectExtension.cpp | 137 +++++++++--------- 1 file changed, 68 insertions(+), 69 deletions(-) diff --git a/Core/GDCore/Extensions/Builtin/BaseObjectExtension.cpp b/Core/GDCore/Extensions/Builtin/BaseObjectExtension.cpp index 5516faef74b6..b09f5f3ccc1f 100644 --- a/Core/GDCore/Extensions/Builtin/BaseObjectExtension.cpp +++ b/Core/GDCore/Extensions/Builtin/BaseObjectExtension.cpp @@ -1072,6 +1072,74 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension( .AddParameter("expression", _("Target X position")) .AddParameter("expression", _("Target Y position")); + obj.AddAction("EnableEffect", + _("Enable an object effect"), + _("Enable an effect on the object"), + _("Enable effect _PARAM1_ on _PARAM0_: _PARAM2_"), + _("Effects"), + "res/actions/effect24.png", + "res/actions/effect.png") + .AddParameter("object", _("Object")) + .AddParameter("string", _("Effect Name")) + .AddParameter("yesorno", _("Enable?")) + .MarkAsSimple(); + + obj.AddAction("SetEffectDoubleParameter", + _("Effect parameter (number)"), + _("Change the value of a parameter of an effect.") + "\n" + + _("You can find the parameter names (and change the effect " + "names) in the effects window."), + _("Set _PARAM2_ to _PARAM3_ for effect _PARAM3_ of _PARAM0_"), + _("Effects"), + "res/actions/effect24.png", + "res/actions/effect.png") + .AddParameter("object", _("Object")) + .AddParameter("string", _("Effect Name")) + .AddParameter("string", _("Parameter name")) + .AddParameter("expression", _("New value")) + .MarkAsSimple(); + + obj.AddAction("SetEffectStringParameter", + _("Effect parameter (string)"), + _("Change the value (string) of a parameter of an effect.") + "\n" + + _("You can find the parameter names (and change the effect " + "names) in the effects window."), + _("Set _PARAM2_ to _PARAM3_ for effect _PARAM3_ of _PARAM0_"), + _("Effects"), + "res/actions/effect24.png", + "res/actions/effect.png") + .AddParameter("object", _("Object")) + .AddParameter("string", _("Effect Name")) + .AddParameter("string", _("Parameter name")) + .AddParameter("string", _("New value")) + .MarkAsSimple(); + + obj.AddAction("SetEffectBooleanParameter", + _("Effect parameter (enable or disable)"), + _("Enable or disable a parameter of an effect.") + "\n" + + _("You can find the parameter names (and change the effect " + "names) in the effects window."), + _("Enable _PARAM2_ for effect _PARAM1_ of _PARAM0_: _PARAM3_"), + _("Effects"), + "res/actions/effect24.png", + "res/actions/effect.png") + .AddParameter("object", _("Object")) + .AddParameter("string", _("Effect Name")) + .AddParameter("string", _("Parameter Name")) + .AddParameter("yesorno", _("Enable?")) + .MarkAsSimple(); + + obj.AddCondition("IsEffectEnabled", + _("Effect is enabled"), + _("Check if the effect on an object is enabled."), + _("Effect _PARAM2_ on _PARAM1_ is enabled"), + _("Effects"), + "res/actions/effect24.png", + "res/actions/effect.png") + .AddParameter("object", _("Object")) + .AddParameter("string", _("Effect Name")) + .MarkAsSimple(); + extension .AddAction("Create", _("Create an object"), @@ -1373,75 +1441,6 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension( _("Objects"), "res/actions/layer.png") .AddParameter("object", _("Object")); - - obj.AddAction("EnableEffect", - _("Enable an object effect"), - _("Enable an effect on the object"), - _("Enable effect _PARAM1_ on _PARAM0_: _PARAM2_"), - _("Effects"), - "res/actions/effect24.png", - "res/actions/effect.png") - .AddParameter("object", _("Object")) - .AddParameter("string", _("Effect Name")) - .AddParameter("yesorno", _("Enable")) - .MarkAsSimple(); - - obj.AddAction("SetEffectDoubleParameter", - _("Effect parameter (number)"), - _("Change the value of a parameter of an effect.") + "\n" + - _("You can find the parameter names (and change the effect " - "names) in the effects window."), - _("Set _PARAM2_ to _PARAM3_ for effect _PARAM3_ of _PARAM0_"), - _("Effects"), - "res/actions/effect24.png", - "res/actions/effect.png") - .AddParameter("object", _("Object")) - .AddParameter("string", _("Effect Name")) - .AddParameter("string", _("Parameter name")) - .AddParameter("expression", _("New value")) - .MarkAsSimple(); - - obj.AddAction("SetEffectStringParameter", - _("Effect parameter (string)"), - _("Change the value (string) of a parameter of an effect.") + "\n" + - _("You can find the parameter names (and change the effect " - "names) in the effects window."), - _("Set _PARAM2_ to _PARAM3_ for effect _PARAM3_ of _PARAM0_"), - _("Effects"), - "res/actions/effect24.png", - "res/actions/effect.png") - .AddParameter("object", _("Object")) - .AddParameter("string", _("Effect Name")) - .AddParameter("string", _("Parameter name")) - .AddParameter("string", _("New value")) - .MarkAsSimple(); - - obj.AddAction("SetEffectBooleanParameter", - _("Effect parameter (enable or disable)"), - _("Enable or disable a parameter of an effect.") + "\n" + - _("You can find the parameter names (and change the effect " - "names) in the effects window."), - _("Enable _PARAM2_ for effect _PARAM1_ of _PARAM0_: _PARAM3_"), - _("Effects"), - "res/actions/effect24.png", - "res/actions/effect.png") - .AddParameter("object", _("Object")) - .AddParameter("string", _("Effect Name")) - .AddParameter("string", _("Parameter Name")) - .AddParameter("yesorno", _("Parameter Value")) - .MarkAsSimple(); - - obj.AddCondition("IsEffectEnabled", - _("Effect is enabled"), - _("The effect on an object is enabled"), - _("Effect _PARAM2_ on _PARAM1_ is enabled"), - _("Effects"), - "res/actions/effect24.png", - "res/actions/effect.png") - .AddParameter("object", _("Object")) - .AddParameter("string", _("Effect Name")) - .MarkAsSimple(); - #endif } From ab3dfee7ecb41f64f6b8a96baef56210f1c139c8 Mon Sep 17 00:00:00 2001 From: Florian Rival Date: Tue, 17 Aug 2021 16:31:03 +0200 Subject: [PATCH 22/28] Fix wording and scroll in EffectsList --- GDJS/Runtime/runtimeobject.ts | 23 +- newIDE/app/src/EffectsList/index.js | 301 +++++++++--------- .../app/src/LayersList/LayerEditorDialog.js | 184 +++++------ 3 files changed, 261 insertions(+), 247 deletions(-) diff --git a/GDJS/Runtime/runtimeobject.ts b/GDJS/Runtime/runtimeobject.ts index 1c297fae00e0..3ac2757d839e 100644 --- a/GDJS/Runtime/runtimeobject.ts +++ b/GDJS/Runtime/runtimeobject.ts @@ -130,13 +130,13 @@ namespace gdjs { * (`RuntimeObject.prototype.onCreated.call(this);`). */ onCreated(): void { - for (const filterName in this._rendererEffects) { + for (const effectName in this._rendererEffects) { this._runtimeScene .getGame() .getObjectEffectsManager() .applyEffect( this.getRendererObject(), - this._rendererEffects[filterName] + this._rendererEffects[effectName] ); } @@ -208,15 +208,16 @@ namespace gdjs { * * Objects can have different elapsed time if they are on layers with different time scales. * - * @param runtimeScene The RuntimeScene the object belongs to. + * @param runtimeScene The RuntimeScene the object belongs to (deprecated - can be omitted). */ getElapsedTime(runtimeScene?: gdjs.RuntimeScene): float { - //TODO: Memoize? - runtimeScene = runtimeScene || this._runtimeScene; - const theLayer = runtimeScene.getLayer(this.layer); - return theLayer.getElapsedTime(runtimeScene); + const theLayer = this._runtimeScene.getLayer(this.layer); + return theLayer.getElapsedTime(); } + /** + * The gdjs.RuntimeScene the object belongs to. + */ getRuntimeScene(): RuntimeScene { return this._runtimeScene; } @@ -755,7 +756,7 @@ namespace gdjs { /** * Returns the collection of effects to be rendered by the * underlying renderer. - * @returns The render effects. + * @returns The renderer effects. */ getRendererEffects() { return this._rendererEffects; @@ -763,7 +764,7 @@ namespace gdjs { /** * Add a new effect, or replace the one with the same name. - * @param effectData The data of the effect to add. + * @param effectData The data describing the effect to add. */ addEffect(effectData: EffectData): boolean { return this._runtimeScene @@ -859,8 +860,8 @@ namespace gdjs { } /** - * Updates all the effect parameters. - * @param effectData + * Updates all the parameters of an effect. + * @param effectData The data describing the effect */ updateAllEffectParameters(effectData: EffectData): boolean { return this._runtimeScene diff --git a/newIDE/app/src/EffectsList/index.js b/newIDE/app/src/EffectsList/index.js index d6ab2e176325..8e39d30cfe76 100644 --- a/newIDE/app/src/EffectsList/index.js +++ b/newIDE/app/src/EffectsList/index.js @@ -33,6 +33,7 @@ import { type ChooseResourceFunction, } from '../ResourcesList/ResourceSource.flow'; import { type ResourceExternalEditor } from '../ResourcesList/ResourceExternalEditor.flow'; +import ScrollView from '../UI/ScrollView'; type Props = {| project: gdProject, @@ -107,165 +108,173 @@ export default function EffectsList(props: Props) { return ( - {({ i18n }) => { - return ( - - - - - - Effects can change how the layer is rendered on screen. - After adding an effect, set up its parameters. Launch a - preview to see the result. Using the events and the name of - the effect, you can change the parameters during the game. - - - - - {effectsContainer.getEffectsCount() > 3 && ( + {({ i18n }) => ( + + {effectsContainer.getEffectsCount() !== 0 ? ( + - Using a lot of effects can have a severe negative impact - on the rendering performance, especially on low-end or - mobile devices. Consider using less effects if possible. - You can also disable and re-enable effects as needed using - events. + Effects can change how layers or objects are rendered on + screen. + + + After adding an effect, set up its parameters. Launch a + preview to see the result. Using the events and the name + of the effect, you can change the parameters during the + game. - )} - {mapFor(0, effectsContainer.getEffectsCount(), (i: number) => { - const effect: gdEffect = effectsContainer.getEffectAt(i); - const effectType = effect.getEffectType(); - const effectMetadata = getEnumeratedEffectMetadata( - allEffectMetadata, - effectType - ); + {effectsContainer.getEffectsCount() > 3 && ( + + + + + Using a lot of effects can have a severe negative impact + on the rendering performance, especially on low-end or + mobile devices. Consider using less effects if possible. + You can also disable and re-enable effects as needed + using events. + + + + + )} + {mapFor(0, effectsContainer.getEffectsCount(), (i: number) => { + const effect: gdEffect = effectsContainer.getEffectAt(i); + const effectType = effect.getEffectType(); + const effectMetadata = getEnumeratedEffectMetadata( + allEffectMetadata, + effectType + ); - return ( - - - - Effect name: - - { - if (newName === effect.getName()) return; + return ( + + + + Effect name: + + { + if (newName === effect.getName()) return; - effect.setName(newName); - forceUpdate(); - onEffectsUpdated(); - }} - fullWidth - /> - - Type: - - - chooseEffectType(effect, newEffectType) - } - fullWidth - hintText={t`Choose the effect to apply`} - > - {allEffectMetadata.map(effectMetadata => ( - - ))} - - - - - } - buildMenuTemplate={(i18n: I18nType) => [ - { - label: i18n._(t`Delete`), - click: () => removeEffect(effect.getName()), - }, - { type: 'separator' }, - { - type: 'checkbox', - label: i18n._(t`Show Parameter Names`), - checked: showEffectParameterNames, - click: () => - setShowEffectParameterNames( - !showEffectParameterNames - ), - }, - ]} - /> - - - - {!!effectType && effectMetadata ? ( - - - - - - - - i18n._( - t`Parameter name in events: \`${parameterName}\` ` - ) - : undefined - } + effect.setName(newName); + forceUpdate(); + onEffectsUpdated(); + }} + fullWidth + /> + + Type: + + + chooseEffectType(effect, newEffectType) + } + fullWidth + hintText={t`Choose the effect to apply`} + > + {allEffectMetadata.map(effectMetadata => ( + - - ) : null} - - - - ); - })} - {effectsContainer.getEffectsCount() === 0 ? ( - - No effects applied. - - ) : null} - - - Add an effect} - onClick={addEffect} - icon={} - /> - - + ))} + + + + + } + buildMenuTemplate={(i18n: I18nType) => [ + { + label: i18n._(t`Delete`), + click: () => removeEffect(effect.getName()), + }, + { type: 'separator' }, + { + type: 'checkbox', + label: i18n._(t`Show Parameter Names`), + checked: showEffectParameterNames, + click: () => + setShowEffectParameterNames( + !showEffectParameterNames + ), + }, + ]} + /> + + + + {!!effectType && effectMetadata ? ( + + + + + + + + i18n._( + t`Parameter name in events: \`${parameterName}\` ` + ) + : undefined + } + /> + + ) : null} + + + + ); + })} + + ) : ( + + No effects applied. + + )} + + + Add an effect} + onClick={addEffect} + icon={} + /> + - ); - }} + + )} ); } diff --git a/newIDE/app/src/LayersList/LayerEditorDialog.js b/newIDE/app/src/LayersList/LayerEditorDialog.js index e43ffa50ab49..8ecdd0552cf7 100644 --- a/newIDE/app/src/LayersList/LayerEditorDialog.js +++ b/newIDE/app/src/LayersList/LayerEditorDialog.js @@ -22,7 +22,7 @@ import HotReloadPreviewButton, { import HelpButton from '../UI/HelpButton'; import { Tab, Tabs } from '../UI/Tabs'; import EffectsList from '../EffectsList'; -import { Spacer } from '../UI/Grid'; +import { Column, Spacer } from '../UI/Grid'; const gd: libGDevelop = global.gd; type Props = {| @@ -100,99 +100,103 @@ const LayerEditorDialog = (props: Props) => { />, ]} onRequestClose={onCancelChanges} + fullHeight + flexBody > - - Properties} value="properties" /> - Effects} value="effects" /> - - {currentTab === 'properties' && ( - - {layer.isLightingLayer() ? ( - - - The lighting layer renders an ambient light on the scene. All - lights should be placed on this layer so that shadows are - properly rendered. By default, the layer follows the base layer - camera. Uncheck this if you want to manually move the camera - using events. - - - ) : null} - - There are {instancesCount} instances of objects on this layer. - - {!props.project.getUseDeprecatedZeroAsDefaultZOrder() && ( + + + Properties} value="properties" /> + Effects} value="effects" /> + + {currentTab === 'properties' && ( + + {layer.isLightingLayer() ? ( + + + The lighting layer renders an ambient light on the scene. All + lights should be placed on this layer so that shadows are + properly rendered. By default, the layer follows the base + layer camera. Uncheck this if you want to manually move the + camera using events. + + + ) : null} - Objects created using events on this layer will be given a "Z - order" of {highestZOrder + 1}, so that they appear in front of all - objects of this layer. You can change this using the action to - change an object Z order, after using an action to create it. + There are {instancesCount} instances of objects on this layer. - )} - Layer visible} - checked={layer.getVisibility()} - onCheck={(e, checked) => { - layer.setVisibility(checked); - forceUpdate(); - }} - /> - {layer.isLightingLayer() ? ( - - - Lighting settings + {!props.project.getUseDeprecatedZeroAsDefaultZOrder() && ( + + Objects created using events on this layer will be given a "Z + order" of {highestZOrder + 1}, so that they appear in front of + all objects of this layer. You can change this using the action + to change an object Z order, after using an action to create it. - Automatically follow the base layer.} - checked={layer.isFollowingBaseLayerCamera()} - onCheck={(e, checked) => { - layer.setFollowBaseLayerCamera(checked); - forceUpdate(); - }} - /> - Ambient light color} - disableAlpha - color={{ - r: layer.getAmbientLightColorRed(), - g: layer.getAmbientLightColorGreen(), - b: layer.getAmbientLightColorBlue(), - }} - onChange={(color: ColorResult) => { - layer.setAmbientLightColor( - color.rgb.r, - color.rgb.g, - color.rgb.b - ); - forceUpdate(); - }} - /> - - ) : ( - // Add some space to avoid a dialog to short that would show scrollbars - - - - - )} - - )} - {currentTab === 'effects' && ( - - )} + )} + Layer visible} + checked={layer.getVisibility()} + onCheck={(e, checked) => { + layer.setVisibility(checked); + forceUpdate(); + }} + /> + {layer.isLightingLayer() ? ( + + + Lighting settings + + Automatically follow the base layer.} + checked={layer.isFollowingBaseLayerCamera()} + onCheck={(e, checked) => { + layer.setFollowBaseLayerCamera(checked); + forceUpdate(); + }} + /> + Ambient light color} + disableAlpha + color={{ + r: layer.getAmbientLightColorRed(), + g: layer.getAmbientLightColorGreen(), + b: layer.getAmbientLightColorBlue(), + }} + onChange={(color: ColorResult) => { + layer.setAmbientLightColor( + color.rgb.r, + color.rgb.g, + color.rgb.b + ); + forceUpdate(); + }} + /> + + ) : ( + // Add some space to avoid a dialog to short that would show scrollbars + + + + + )} + + )} + {currentTab === 'effects' && ( + + )} + ); }; From 8550ddbdc5ff7f360990f6cd827dd4bf5f97f1e3 Mon Sep 17 00:00:00 2001 From: Florian Rival Date: Tue, 17 Aug 2021 17:08:22 +0200 Subject: [PATCH 23/28] Fix object effects not updated/animated --- GDJS/Runtime/runtimescene.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/GDJS/Runtime/runtimescene.ts b/GDJS/Runtime/runtimescene.ts index 1fa4ae4ed92a..ee8ca8a5b8b6 100644 --- a/GDJS/Runtime/runtimescene.ts +++ b/GDJS/Runtime/runtimescene.ts @@ -710,12 +710,15 @@ namespace gdjs { const elapsedTimeInSeconds = elapsedTime / 1000; obj.setX(obj.getX() + averageForce.getX() * elapsedTimeInSeconds); obj.setY(obj.getY() + averageForce.getY() * elapsedTimeInSeconds); - obj.update(this); this._runtimeGame .getObjectEffectsManager() .update(obj.getRendererEffects(), obj); + obj.update(this); obj.updateForces(elapsedTimeInSeconds); } else { + this._runtimeGame + .getObjectEffectsManager() + .update(obj.getRendererEffects(), obj); obj.update(this); } obj.updateTimers(elapsedTime); From 5f6b0ff1b493b4689e8d13553f944ac0a8cec2a3 Mon Sep 17 00:00:00 2001 From: Florian Rival Date: Tue, 17 Aug 2021 21:11:15 +0200 Subject: [PATCH 24/28] Disable effects that are currently not working/bugged for objects See https://github.com/pixijs/filters/issues/304 --- .../Extensions/Metadata/EffectMetadata.cpp | 8 +++- .../Extensions/Metadata/EffectMetadata.h | 21 +++++++++-- Extensions/Effects/JsExtension.js | 9 +++-- GDevelop.js/Bindings/Bindings.idl | 2 + GDevelop.js/types/gdeffectmetadata.js | 2 + .../app/src/EffectsList/EnumerateEffects.js | 2 + .../src/EffectsList/EnumerateEffects.spec.js | 11 +++++- newIDE/app/src/EffectsList/index.js | 5 +++ .../app/src/LayersList/LayerEditorDialog.js | 1 + .../src/ObjectEditor/ObjectEditorDialog.js | 1 + newIDE/app/src/fixtures/TestExtensions.js | 13 +++++++ newIDE/app/src/fixtures/TestProject.js | 31 ++++++++++++++++ newIDE/app/src/stories/index.js | 37 +++++++++++++++++-- 13 files changed, 132 insertions(+), 11 deletions(-) diff --git a/Core/GDCore/Extensions/Metadata/EffectMetadata.cpp b/Core/GDCore/Extensions/Metadata/EffectMetadata.cpp index 432eba5c7ce2..0d5cad66ce8c 100644 --- a/Core/GDCore/Extensions/Metadata/EffectMetadata.cpp +++ b/Core/GDCore/Extensions/Metadata/EffectMetadata.cpp @@ -7,7 +7,8 @@ namespace gd { -EffectMetadata::EffectMetadata(const gd::String& type_) : type(type_) {} +EffectMetadata::EffectMetadata(const gd::String& type_) + : type(type_), isMarkedAsNotWorkingForObjects(false) {} EffectMetadata& EffectMetadata::SetIncludeFile(const gd::String& includeFile) { includeFiles.clear(); @@ -22,4 +23,9 @@ EffectMetadata& EffectMetadata::AddIncludeFile(const gd::String& includeFile) { return *this; } +EffectMetadata& EffectMetadata::MarkAsNotWorkingForObjects() { + isMarkedAsNotWorkingForObjects = true; + return *this; +} + } // namespace gd diff --git a/Core/GDCore/Extensions/Metadata/EffectMetadata.h b/Core/GDCore/Extensions/Metadata/EffectMetadata.h index 90d859bff0a8..7e18898afb0c 100644 --- a/Core/GDCore/Extensions/Metadata/EffectMetadata.h +++ b/Core/GDCore/Extensions/Metadata/EffectMetadata.h @@ -8,6 +8,7 @@ #include #include #include + #include "GDCore/Project/PropertyDescriptor.h" #include "GDCore/String.h" @@ -49,7 +50,8 @@ class GD_CORE_API EffectMetadata { }; /** - * Set the help path of the effect, relative to the GDevelop documentation root. + * Set the help path of the effect, relative to the GDevelop documentation + * root. */ EffectMetadata& SetHelpPath(const gd::String& path) { helpPath = path; @@ -66,6 +68,11 @@ class GD_CORE_API EffectMetadata { */ EffectMetadata& AddIncludeFile(const gd::String& includeFile); + /** + * \brief Mark the effect as not working as an object effect. + */ + EffectMetadata& MarkAsNotWorkingForObjects(); + /** * \brief Return a reference to the properties of this effect. */ @@ -81,12 +88,14 @@ class GD_CORE_API EffectMetadata { } /** - * \brief Get the help path of the effect, relative to the GDevelop documentation root. + * \brief Get the help path of the effect, relative to the GDevelop + * documentation root. */ const gd::String& GetHelpPath() const { return helpPath; } /** - * \brief Get the type of the effect (its internal name, like "BlackAndWhite"). + * \brief Get the type of the effect (its internal name, like + * "BlackAndWhite"). */ const gd::String& GetType() const { return type; } @@ -107,6 +116,11 @@ class GD_CORE_API EffectMetadata { return includeFiles; } + /** + * \brief Check if the effect is marked as not working as an object effect. + */ + bool IsMarkedAsNotWorkingForObjects() const { return isMarkedAsNotWorkingForObjects; }; + private: gd::String extensionNamespace; gd::String type; @@ -114,6 +128,7 @@ class GD_CORE_API EffectMetadata { gd::String fullname; gd::String description; std::vector includeFiles; + bool isMarkedAsNotWorkingForObjects; std::map properties; }; diff --git a/Extensions/Effects/JsExtension.js b/Extensions/Effects/JsExtension.js index c881ea356d70..424e1170b6fe 100644 --- a/Extensions/Effects/JsExtension.js +++ b/Extensions/Effects/JsExtension.js @@ -897,7 +897,8 @@ module.exports = { .setFullName(_('Radial Blur')) .setDescription(_('Applies a Motion blur to an object.')) .addIncludeFile('Extensions/Effects/pixi-filters/filter-radial-blur.js') - .addIncludeFile('Extensions/Effects/radial-blur-pixi-filter.js'); + .addIncludeFile('Extensions/Effects/radial-blur-pixi-filter.js') + .markAsNotWorkingForObjects(); // See https://github.com/pixijs/filters/issues/304 const radialBlurProperties = radialBlurEffect.getProperties(); radialBlurProperties .getOrCreate('radius') @@ -1084,7 +1085,8 @@ module.exports = { ) ) .addIncludeFile('Extensions/Effects/pixi-filters/filter-twist.js') - .addIncludeFile('Extensions/Effects/twist-pixi-filter.js'); + .addIncludeFile('Extensions/Effects/twist-pixi-filter.js') + .markAsNotWorkingForObjects(); // See https://github.com/pixijs/filters/issues/304 const twistProperties = twistEffect.getProperties(); twistProperties .getOrCreate('radius') @@ -1120,7 +1122,8 @@ module.exports = { .setFullName(_('Zoom blur')) .setDescription(_('Applies a Zoom blur.')) .addIncludeFile('Extensions/Effects/pixi-filters/filter-zoom-blur.js') - .addIncludeFile('Extensions/Effects/zoom-blur-pixi-filter.js'); + .addIncludeFile('Extensions/Effects/zoom-blur-pixi-filter.js') + .markAsNotWorkingForObjects(); // See https://github.com/pixijs/filters/issues/304 const zoomBlurProperties = zoomBlurEffect.getProperties(); zoomBlurProperties .getOrCreate('centerX') diff --git a/GDevelop.js/Bindings/Bindings.idl b/GDevelop.js/Bindings/Bindings.idl index 29d74ed75046..d7c1b8696739 100644 --- a/GDevelop.js/Bindings/Bindings.idl +++ b/GDevelop.js/Bindings/Bindings.idl @@ -1426,11 +1426,13 @@ interface EffectMetadata { [Ref] EffectMetadata SetHelpPath([Const] DOMString helpPath); [Ref] EffectMetadata SetIncludeFile([Const] DOMString includeFile); [Ref] EffectMetadata AddIncludeFile([Const] DOMString includeFile); + [Ref] EffectMetadata MarkAsNotWorkingForObjects(); [Const, Ref] DOMString GetType(); [Const, Ref] DOMString GetFullName(); [Const, Ref] DOMString GetDescription(); [Const, Ref] DOMString GetHelpPath(); + boolean IsMarkedAsNotWorkingForObjects(); [Ref] MapStringPropertyDescriptor GetProperties(); }; diff --git a/GDevelop.js/types/gdeffectmetadata.js b/GDevelop.js/types/gdeffectmetadata.js index 3c9a70789649..4633044817a6 100644 --- a/GDevelop.js/types/gdeffectmetadata.js +++ b/GDevelop.js/types/gdeffectmetadata.js @@ -5,10 +5,12 @@ declare class gdEffectMetadata { setHelpPath(helpPath: string): gdEffectMetadata; setIncludeFile(includeFile: string): gdEffectMetadata; addIncludeFile(includeFile: string): gdEffectMetadata; + markAsNotWorkingForObjects(): gdEffectMetadata; getType(): string; getFullName(): string; getDescription(): string; getHelpPath(): string; + isMarkedAsNotWorkingForObjects(): boolean; getProperties(): gdMapStringPropertyDescriptor; delete(): void; ptr: number; diff --git a/newIDE/app/src/EffectsList/EnumerateEffects.js b/newIDE/app/src/EffectsList/EnumerateEffects.js index e2daa3c3309c..395eb61509eb 100644 --- a/newIDE/app/src/EffectsList/EnumerateEffects.js +++ b/newIDE/app/src/EffectsList/EnumerateEffects.js @@ -11,6 +11,7 @@ export type EnumeratedEffectMetadata = {| fullName: string, description: string, parametersSchema: Schema, + isMarkedAsNotWorkingForObjects: boolean, |}; /** @@ -115,6 +116,7 @@ export const enumerateEffectsMetadata = ( effectMetadata, fullName: effectMetadata.getFullName(), description: effectMetadata.getDescription(), + isMarkedAsNotWorkingForObjects: effectMetadata.isMarkedAsNotWorkingForObjects(), parametersSchema, }; }); diff --git a/newIDE/app/src/EffectsList/EnumerateEffects.spec.js b/newIDE/app/src/EffectsList/EnumerateEffects.spec.js index 6b76b8ae7389..dc584ebdff2c 100644 --- a/newIDE/app/src/EffectsList/EnumerateEffects.spec.js +++ b/newIDE/app/src/EffectsList/EnumerateEffects.spec.js @@ -5,7 +5,7 @@ import { makeTestProject } from '../fixtures/TestProject'; const gd: libGDevelop = global.gd; describe('EnumerateEffects', () => { - it('can enumerate effects', () => { + it('can enumerate effects for layers', () => { makeTestExtensions(gd); const { project } = makeTestProject(gd); const enumeratedEffectsMetadata = enumerateEffectsMetadata(project); @@ -14,12 +14,21 @@ describe('EnumerateEffects', () => { expect.objectContaining({ type: 'FakeSepia', fullName: 'Fake Sepia Effect', + isMarkedAsNotWorkingForObjects: false, + }) + ); + expect(enumeratedEffectsMetadata).toContainEqual( + expect.objectContaining({ + type: 'FakeSepiaThatWouldWorkOnlyForLayers', + fullName: 'Fake Sepia Effect only for layers', + isMarkedAsNotWorkingForObjects: true, }) ); expect(enumeratedEffectsMetadata).toContainEqual( expect.objectContaining({ type: 'FakeNight', fullName: 'Fake Night Effect', + isMarkedAsNotWorkingForObjects: false, }) ); }); diff --git a/newIDE/app/src/EffectsList/index.js b/newIDE/app/src/EffectsList/index.js index 8e39d30cfe76..508f8469fd8a 100644 --- a/newIDE/app/src/EffectsList/index.js +++ b/newIDE/app/src/EffectsList/index.js @@ -42,6 +42,7 @@ type Props = {| resourceExternalEditors: Array, effectsContainer: gdEffectsContainer, onEffectsUpdated: () => void, + target: 'object' | 'layer', |}; const getEnumeratedEffectMetadata = ( @@ -194,6 +195,10 @@ export default function EffectsList(props: Props) { key={effectMetadata.type} value={effectMetadata.type} primaryText={effectMetadata.fullName} + disabled={ + props.target === 'object' && + effectMetadata.isMarkedAsNotWorkingForObjects + } /> ))} diff --git a/newIDE/app/src/LayersList/LayerEditorDialog.js b/newIDE/app/src/LayersList/LayerEditorDialog.js index 8ecdd0552cf7..639e7799ee29 100644 --- a/newIDE/app/src/LayersList/LayerEditorDialog.js +++ b/newIDE/app/src/LayersList/LayerEditorDialog.js @@ -186,6 +186,7 @@ const LayerEditorDialog = (props: Props) => { )} {currentTab === 'effects' && ( { )} {currentTab === 'effects' && ( { .setLabel('Opacity (between 0 and 1)') .setType('number'); + const layerOnlySepiaEffect = extension + .addEffect('FakeSepiaThatWouldWorkOnlyForLayers') + .setFullName('Fake Sepia Effect only for layers') + .setDescription('A fake sepia effect only for layers') + .addIncludeFile('Extensions/Effects/fake-sepia-only-for-layers.js') + .markAsNotWorkingForObjects(); + const layerOnlySepiaProperties = layerOnlySepiaEffect.getProperties(); + layerOnlySepiaProperties + .getOrCreate('opacity') + .setValue('1') + .setLabel('Opacity (between 0 and 1)') + .setType('number'); + const nightEffect = extension .addEffect('FakeNight') .setFullName('Fake Night Effect') diff --git a/newIDE/app/src/fixtures/TestProject.js b/newIDE/app/src/fixtures/TestProject.js index 4d0a3ebb2bbd..fb39b62855cb 100644 --- a/newIDE/app/src/fixtures/TestProject.js +++ b/newIDE/app/src/fixtures/TestProject.js @@ -29,6 +29,8 @@ export type TestProject = {| layerWithEffects: gdLayer, layerWithEffectWithoutEffectType: gdLayer, layerWithoutEffects: gdLayer, + spriteObjectWithEffects: gdSpriteObject, + spriteObjectWithoutEffects: gdSpriteObject, |}; */ @@ -503,6 +505,33 @@ export const makeTestProject = (gd /*: libGDevelop */) /*: TestProject */ => { const layerWithoutEffects = new gd.Layer(); + const spriteObjectWithoutEffects = new gd.SpriteObject( + 'MySpriteObjectWithoutEffects' + ); + const spriteObjectWithEffects = new gd.SpriteObject( + 'MySpriteObjectWithEffects' + ); + { + const effect1 = spriteObjectWithEffects + .getEffects() + .insertNewEffect('MyEffect1', 0); + const effect2 = spriteObjectWithEffects + .getEffects() + .insertNewEffect('MyEffect2', 1); + const effect3 = spriteObjectWithEffects + .getEffects() + .insertNewEffect('MyEffect3', 1); + + effect1.setEffectType('FakeSepia'); + effect1.setDoubleParameter('opacity', 0.6); + effect2.setEffectType('FakeNight'); + effect2.setDoubleParameter('intensity', 0.1); + effect2.setDoubleParameter('opacity', 0.2); + effect3.setEffectType('FakeEffectWithVariousParameters'); + effect3.setDoubleParameter('intensity', 0.1); + effect3.setStringParameter('image', 'my-image'); + } + return { project, shapePainterObject, @@ -531,5 +560,7 @@ export const makeTestProject = (gd /*: libGDevelop */) /*: TestProject */ => { layerWithEffects, layerWithEffectWithoutEffectType, layerWithoutEffects, + spriteObjectWithEffects, + spriteObjectWithoutEffects, }; }; diff --git a/newIDE/app/src/stories/index.js b/newIDE/app/src/stories/index.js index 3b7ea9c8bae3..3220de955cda 100644 --- a/newIDE/app/src/stories/index.js +++ b/newIDE/app/src/stories/index.js @@ -4520,8 +4520,9 @@ storiesOf('LayersList', module) storiesOf('EffectsList', module) .addDecorator(paperDecorator) .addDecorator(muiDecorator) - .add('with some effects', () => ( + .add('with some effects (for a layer)', () => ( { @@ -4533,8 +4534,23 @@ storiesOf('EffectsList', module) onEffectsUpdated={action('effects updated')} /> )) - .add('with an effect without effect type', () => ( + .add('with some effects (for an object)', () => ( { + action('onChooseResource'); + return Promise.reject(); + }} + resourceSources={[]} + effectsContainer={testProject.spriteObjectWithEffects.getEffects()} + onEffectsUpdated={action('effects updated')} + /> + )) + .add('with an effect without effect type (for a layer)', () => ( + { @@ -4546,8 +4562,9 @@ storiesOf('EffectsList', module) onEffectsUpdated={action('effects updated')} /> )) - .add('without effects', () => ( + .add('without effects (for a layer)', () => ( { @@ -4558,6 +4575,20 @@ storiesOf('EffectsList', module) effectsContainer={testProject.layerWithoutEffects.getEffects()} onEffectsUpdated={action('effects updated')} /> + )) + .add('without effects (for an object)', () => ( + { + action('onChooseResource'); + return Promise.reject(); + }} + resourceSources={[]} + effectsContainer={testProject.spriteObjectWithoutEffects.getEffects()} + onEffectsUpdated={action('effects updated')} + /> )); storiesOf('NewObjectDialog', module) From cbc0252d7028f10abff9319b1e9632915d8a70a3 Mon Sep 17 00:00:00 2001 From: Florian Rival Date: Wed, 18 Aug 2021 16:52:02 +0200 Subject: [PATCH 25/28] Refactor layers to reuse the same effects manager as objects --- GDJS/GDJS/IDE/ExporterHelper.cpp | 3 +- GDJS/Runtime/layer.ts | 57 ++++--- .../pixi-renderers/layer-pixi-renderer.ts | 146 ------------------ ...cts-manager.ts => pixi-effects-manager.ts} | 43 ++++-- GDJS/Runtime/runtimegame.ts | 14 +- GDJS/Runtime/runtimeobject.ts | 22 +-- GDJS/Runtime/runtimescene.ts | 4 +- 7 files changed, 74 insertions(+), 215 deletions(-) rename GDJS/Runtime/pixi-renderers/{pixi-object-effects-manager.ts => pixi-effects-manager.ts} (85%) diff --git a/GDJS/GDJS/IDE/ExporterHelper.cpp b/GDJS/GDJS/IDE/ExporterHelper.cpp index 4a7748647867..5feac88a4528 100644 --- a/GDJS/GDJS/IDE/ExporterHelper.cpp +++ b/GDJS/GDJS/IDE/ExporterHelper.cpp @@ -672,8 +672,7 @@ void ExporterHelper::AddLibsInclude(bool pixiRenderers, "pixi-renderers/spriteruntimeobject-pixi-renderer.js"); InsertUnique(includesFiles, "pixi-renderers/loadingscreen-pixi-renderer.js"); - InsertUnique(includesFiles, - "pixi-renderers/pixi-object-effects-manager.js"); + InsertUnique(includesFiles, "pixi-renderers/pixi-effects-manager.js"); InsertUnique(includesFiles, "howler-sound-manager/howler.min.js"); InsertUnique(includesFiles, "howler-sound-manager/howler-sound-manager.js"); InsertUnique(includesFiles, diff --git a/GDJS/Runtime/layer.ts b/GDJS/Runtime/layer.ts index 4a79208418d5..eb9bddb8601a 100644 --- a/GDJS/Runtime/layer.ts +++ b/GDJS/Runtime/layer.ts @@ -21,13 +21,16 @@ namespace gdjs { _cameraY: float; _cachedGameResolutionWidth: integer; _cachedGameResolutionHeight: integer; + _runtimeScene: gdjs.RuntimeScene; + _effectsManager: gdjs.EffectsManager; // Lighting layer properties. _isLightingLayer: boolean; _followBaseLayerCamera: boolean; _clearColor: Array; + _rendererEffects: Record = {}; _renderer: LayerRenderer; /** @@ -47,6 +50,7 @@ namespace gdjs { .getGame() .getGameResolutionHeight(); this._runtimeScene = runtimeScene; + this._effectsManager = runtimeScene.getGame().getEffectsManager(); this._isLightingLayer = layerData.isLightingLayer; this._followBaseLayerCamera = layerData.followBaseLayerCamera; this._clearColor = [ @@ -126,7 +130,8 @@ namespace gdjs { if (this._followBaseLayerCamera) { this.followBaseLayer(); } - return this._renderer.update(); + this._renderer.update(); + this._effectsManager.update(this._rendererEffects, this); } /** @@ -318,6 +323,7 @@ namespace gdjs { /** * Return the initial effects data for the layer. Only to * be used by renderers. + * @deprecated */ getInitialEffectsData(): EffectData[] { return this._initialEffectsData; @@ -328,28 +334,12 @@ namespace gdjs { * @param effectData The data of the effect to add. */ addEffect(effectData: EffectData): void { - this._renderer.addEffect(effectData); - for (let name in effectData.doubleParameters) { - this.setEffectDoubleParameter( - effectData.name, - name, - effectData.doubleParameters[name] - ); - } - for (let name in effectData.stringParameters) { - this.setEffectStringParameter( - effectData.name, - name, - effectData.stringParameters[name] - ); - } - for (let name in effectData.booleanParameters) { - this.setEffectBooleanParameter( - effectData.name, - name, - effectData.booleanParameters[name] - ); - } + this._effectsManager.addEffect( + effectData, + this._rendererEffects, + this._renderer.getRendererObject(), + this + ); } /** @@ -357,7 +347,11 @@ namespace gdjs { * @param effectName The name of the effect. */ removeEffect(effectName: string): void { - this._renderer.removeEffect(effectName); + this._effectsManager.removeEffect( + this._rendererEffects, + this._renderer.getRendererObject(), + effectName + ); } /** @@ -371,7 +365,8 @@ namespace gdjs { parameterName: string, value: float ): void { - return this._renderer.setEffectDoubleParameter( + this._effectsManager.setEffectDoubleParameter( + this._rendererEffects, name, parameterName, value @@ -389,7 +384,8 @@ namespace gdjs { parameterName: string, value: string ): void { - return this._renderer.setEffectStringParameter( + this._effectsManager.setEffectStringParameter( + this._rendererEffects, name, parameterName, value @@ -407,7 +403,8 @@ namespace gdjs { parameterName: string, value: boolean ): void { - return this._renderer.setEffectBooleanParameter( + this._effectsManager.setEffectBooleanParameter( + this._rendererEffects, name, parameterName, value @@ -420,7 +417,7 @@ namespace gdjs { * @param enable true to enable, false to disable */ enableEffect(name: string, enable: boolean): void { - this._renderer.enableEffect(name, enable); + this._effectsManager.enableEffect(this._rendererEffects, name, enable); } /** @@ -429,7 +426,7 @@ namespace gdjs { * @return true if the effect is enabled, false otherwise. */ isEffectEnabled(name: string): boolean { - return this._renderer.isEffectEnabled(name); + return this._effectsManager.isEffectEnabled(this._rendererEffects, name); } /** @@ -438,7 +435,7 @@ namespace gdjs { * @return true if the effect exists, false otherwise. */ hasEffect(name: string): boolean { - return this._renderer.hasEffect(name); + return this._effectsManager.hasEffect(this._rendererEffects, name); } /** diff --git a/GDJS/Runtime/pixi-renderers/layer-pixi-renderer.ts b/GDJS/Runtime/pixi-renderers/layer-pixi-renderer.ts index 4566ddf215c4..caca7e3ae4d9 100644 --- a/GDJS/Runtime/pixi-renderers/layer-pixi-renderer.ts +++ b/GDJS/Runtime/pixi-renderers/layer-pixi-renderer.ts @@ -13,7 +13,6 @@ namespace gdjs { export class LayerPixiRenderer { _pixiContainer: PIXI.Container; - _filters: Record = {}; _layer: any; _renderTexture: PIXI.RenderTexture | null = null; _lightingSprite: PIXI.Sprite | null = null; @@ -87,62 +86,6 @@ namespace gdjs { if (this._renderTexture) { this._updateRenderTexture(); } - for (const filterName in this._filters) { - const filter = this._filters[filterName]; - filter.update(filter.pixiFilter, this._layer); - } - } - - /** - * Add a new effect, or replace the one with the same name. - * @param effectData The data of the effect to add. - */ - addEffect(effectData: EffectData): void { - const filterCreator = gdjs.PixiFiltersTools.getFilterCreator( - effectData.effectType - ); - if (!filterCreator) { - console.log( - 'Filter "' + - effectData.name + - '" has an unknown effect type: "' + - effectData.effectType + - '". Was it registered properly? Is the effect type correct?' - ); - return; - } - - const filter: gdjs.PixiFiltersTools.Filter = { - pixiFilter: filterCreator.makePIXIFilter(this._layer, effectData), - updateDoubleParameter: filterCreator.updateDoubleParameter, - updateStringParameter: filterCreator.updateStringParameter, - updateBooleanParameter: filterCreator.updateBooleanParameter, - update: filterCreator.update, - }; - if (this._isLightingLayer) { - filter.pixiFilter.blendMode = PIXI.BLEND_MODES.ADD; - } - this._pixiContainer.filters = (this._pixiContainer.filters || []).concat( - filter.pixiFilter - ); - this._filters[effectData.name] = filter; - } - - /** - * Remove the effect with the specified name - * @param effectName The name of the effect. - */ - removeEffect(effectName: string): void { - const filter = this._filters[effectName]; - if (!filter) { - return; - } - this._pixiContainer.filters = (this._pixiContainer.filters || []).filter( - function (pixiFilter) { - return pixiFilter !== filter.pixiFilter; - } - ); - delete this._filters[effectName]; } /** @@ -188,95 +131,6 @@ namespace gdjs { this._pixiContainer.removeChild(child); } - /** - * Update the parameter of an effect (with a number). - * @param name The effect name - * @param parameterName The parameter name - * @param value The new value for the parameter - */ - setEffectDoubleParameter( - name: string, - parameterName: string, - value: float - ): void { - const filter = this._filters[name]; - if (!filter) { - return; - } - filter.updateDoubleParameter(filter.pixiFilter, parameterName, value); - } - - /** - * Update the parameter of an effect (with a string). - * @param name The effect name - * @param parameterName The parameter name - * @param value The new value for the parameter - */ - setEffectStringParameter( - name: string, - parameterName: string, - value: string - ): void { - const filter = this._filters[name]; - if (!filter) { - return; - } - filter.updateStringParameter(filter.pixiFilter, parameterName, value); - } - - /** - * Enable or disable the parameter of an effect (boolean). - * @param name The effect name - * @param parameterName The parameter name - * @param value The new value for the parameter - */ - setEffectBooleanParameter( - name: string, - parameterName: string, - value: boolean - ): void { - const filter = this._filters[name]; - if (!filter) { - return; - } - filter.updateBooleanParameter(filter.pixiFilter, parameterName, value); - } - - /** - * Check if an effect exists. - * @param name The effect name - * @returns True if the effect exists, false otherwise - */ - hasEffect(name: string): boolean { - return !!this._filters[name]; - } - - /** - * Enable an effect. - * @param name The effect name - * @param value Set to true to enable, false to disable - */ - enableEffect(name: string, value: boolean): void { - const filter = this._filters[name]; - if (!filter) { - return; - } - gdjs.PixiFiltersTools.enableEffect(filter, value); - } - - /** - * Check if an effect is enabled. - * @param name The effect name - * @return true if the filter is enabled - */ - isEffectEnabled(name: string): boolean { - const filter = this._filters[name]; - if (!filter) { - return false; - } - return gdjs.PixiFiltersTools.isEffectEnabled(filter); - } - updateClearColor(): void { this._clearColor = this._layer.getClearColor(); this._updateRenderTexture(); diff --git a/GDJS/Runtime/pixi-renderers/pixi-object-effects-manager.ts b/GDJS/Runtime/pixi-renderers/pixi-effects-manager.ts similarity index 85% rename from GDJS/Runtime/pixi-renderers/pixi-object-effects-manager.ts rename to GDJS/Runtime/pixi-renderers/pixi-effects-manager.ts index 13d71a8032c8..7c8fe9b78c84 100644 --- a/GDJS/Runtime/pixi-renderers/pixi-object-effects-manager.ts +++ b/GDJS/Runtime/pixi-renderers/pixi-effects-manager.ts @@ -13,15 +13,19 @@ namespace gdjs { getElapsedTime: (runtimeScene?: RuntimeScene) => number; getHeight: () => number; getWidth: () => number; + isLightingLayer?: () => boolean; } - class PixiObjectEffectsManager { + /** + * Handle effects (aka PixiJS "filters") on PixiJS objects. + */ + class PixiEffectsManager { /** - * Initialize the renderer effect from the effect data. + * Initialize the renderer effect (PixiJS filter) from the effect data. * Call the applyEffect method afterwards, to correctly apply the * initialized effects on the object. * @param effectData The effect data - * @param rendererEffects The renderer effects collection + * @param rendererEffects The collection of PixiJS filters * @param target The effects target */ initializeEffect( @@ -34,7 +38,7 @@ namespace gdjs { ); if (!filterCreator) { console.log( - 'Filter "' + + 'Effect "' + effectData.name + '" has an unknown effect type: "' + effectData.effectType + @@ -51,12 +55,16 @@ namespace gdjs { update: filterCreator.update, }; + if (target.isLightingLayer && target.isLightingLayer()) { + filter.pixiFilter.blendMode = PIXI.BLEND_MODES.ADD; + } + rendererEffects[effectData.name] = filter; return true; } /** - * Apply the effect on the renderer object. + * Apply the effect on the PixiJS DisplayObject. * Called after the effect is initialized. * @param rendererObject The renderer object * @param effect The effect to be applied. @@ -72,7 +80,7 @@ namespace gdjs { } /** - * Update the filters applied on an object. + * Update the filters applied on a PixiJS DisplayObject. * @param runtimeObject * @param target */ @@ -84,7 +92,7 @@ namespace gdjs { } /** - * Add a new effect on a runtime object, or replace the one + * Add a new effect on a PixiJS DisplayObject, or replace the one * with the same name. * @param effectData The effect data * @param rendererEffects The renderer effects @@ -111,8 +119,8 @@ namespace gdjs { } /** - * Remove the effect from a runtime object with the specified name - * @param rendererEffects The renderer effects of the object. + * Remove the effect with the specified name from a PixiJS DisplayObject. + * @param rendererEffects The collection of PixiJS filters. * @param rendererObject The renderer object. * @param effectName The name of the effect. */ @@ -132,7 +140,7 @@ namespace gdjs { /** * Update the parameter of an effect (with a number). - * @param rendererEffects The renderer effects of the object. + * @param rendererEffects The collection of PixiJS filters. * @param name The effect name * @param parameterName The parameter name * @param value The new value for the parameter @@ -151,7 +159,7 @@ namespace gdjs { /** * Update the parameter of an effect (with a string). - * @param rendererEffects The renderer effects of the object. + * @param rendererEffects The collection of PixiJS filters. * @param name The effect name * @param parameterName The parameter name * @param value The new value for the parameter @@ -170,7 +178,7 @@ namespace gdjs { /** * Enable or disable the parameter of an effect (boolean). - * @param rendererEffects The renderer effects of the object. + * @param rendererEffects The collection of PixiJS filters. * @param name The effect name * @param parameterName The parameter name * @param value The new value for the parameter @@ -232,7 +240,7 @@ namespace gdjs { /** * Check if an effect exists. - * @param rendererEffects The renderer effects of the object. + * @param rendererEffects The collection of PixiJS filters. * @param name The effect name * @returns True if the effect exists, false otherwise */ @@ -242,7 +250,7 @@ namespace gdjs { /** * Enable an effect. - * @param rendererEffects The renderer effects of the object. + * @param rendererEffects The collection of PixiJS filters. * @param name The effect name * @param value Set to true to enable, false to disable */ @@ -258,7 +266,7 @@ namespace gdjs { /** * Check if an effect is enabled. - * @param rendererEffects The renderer effects of the object. + * @param rendererEffects The collection of PixiJS filters. * @param name The effect name * @return true if the filter is enabled */ @@ -269,6 +277,7 @@ namespace gdjs { } } - export const ObjectEffectsManager = PixiObjectEffectsManager; - export type ObjectEffectsManager = PixiObjectEffectsManager; + // Expose the effect manager to the game engine. + export const EffectsManager = PixiEffectsManager; + export type EffectsManager = PixiEffectsManager; } diff --git a/GDJS/Runtime/runtimegame.ts b/GDJS/Runtime/runtimegame.ts index 04d0e1c22d18..ca7e26b4ee94 100644 --- a/GDJS/Runtime/runtimegame.ts +++ b/GDJS/Runtime/runtimegame.ts @@ -40,7 +40,7 @@ namespace gdjs { _soundManager: SoundManager; _fontManager: FontManager; _jsonManager: JsonManager; - _objectEffectsManager: ObjectEffectsManager; + _effectsManager: EffectsManager; _bitmapFontManager: BitmapFontManager; _maxFPS: integer; _minFPS: integer; @@ -95,7 +95,7 @@ namespace gdjs { this._data.resources.resources, this._imageManager ); - this._objectEffectsManager = new gdjs.ObjectEffectsManager(); + this._effectsManager = new gdjs.EffectsManager(); this._maxFPS = this._data ? this._data.properties.maxFPS : 60; this._minFPS = this._data ? this._data.properties.minFPS : 15; this._gameResolutionWidth = this._data.properties.windowWidth; @@ -204,12 +204,12 @@ namespace gdjs { } /** - * Get the object effects manager of the game, which allows to manage - * effects on runtime objects. - * @return The object effects manager for the game + * Get the effects manager of the game, which allows to manage + * effects on runtime objects or runtime layers. + * @return The effects manager for the game */ - getObjectEffectsManager(): gdjs.ObjectEffectsManager { - return this._objectEffectsManager; + getEffectsManager(): gdjs.EffectsManager { + return this._effectsManager; } /** diff --git a/GDJS/Runtime/runtimeobject.ts b/GDJS/Runtime/runtimeobject.ts index 3ac2757d839e..18588a295967 100644 --- a/GDJS/Runtime/runtimeobject.ts +++ b/GDJS/Runtime/runtimeobject.ts @@ -104,7 +104,7 @@ namespace gdjs { for (let i = 0; i < objectData.effects.length; ++i) { this._runtimeScene .getGame() - .getObjectEffectsManager() + .getEffectsManager() .initializeEffect(objectData.effects[i], this._rendererEffects, this); this.updateAllEffectParameters(objectData.effects[i]); } @@ -133,7 +133,7 @@ namespace gdjs { for (const effectName in this._rendererEffects) { this._runtimeScene .getGame() - .getObjectEffectsManager() + .getEffectsManager() .applyEffect( this.getRendererObject(), this._rendererEffects[effectName] @@ -769,7 +769,7 @@ namespace gdjs { addEffect(effectData: EffectData): boolean { return this._runtimeScene .getGame() - .getObjectEffectsManager() + .getEffectsManager() .addEffect( effectData, this._rendererEffects, @@ -785,7 +785,7 @@ namespace gdjs { removeEffect(effectName: string): boolean { return this._runtimeScene .getGame() - .getObjectEffectsManager() + .getEffectsManager() .removeEffect( this._rendererEffects, this.getRendererObject(), @@ -806,7 +806,7 @@ namespace gdjs { ): boolean { return this._runtimeScene .getGame() - .getObjectEffectsManager() + .getEffectsManager() .setEffectDoubleParameter( this._rendererEffects, name, @@ -828,7 +828,7 @@ namespace gdjs { ): boolean { return this._runtimeScene .getGame() - .getObjectEffectsManager() + .getEffectsManager() .setEffectStringParameter( this._rendererEffects, name, @@ -850,7 +850,7 @@ namespace gdjs { ): boolean { return this._runtimeScene .getGame() - .getObjectEffectsManager() + .getEffectsManager() .setEffectBooleanParameter( this._rendererEffects, name, @@ -866,7 +866,7 @@ namespace gdjs { updateAllEffectParameters(effectData: EffectData): boolean { return this._runtimeScene .getGame() - .getObjectEffectsManager() + .getEffectsManager() .updateAllEffectParameters(this._rendererEffects, effectData); } @@ -878,7 +878,7 @@ namespace gdjs { enableEffect(name: string, enable: boolean): void { this._runtimeScene .getGame() - .getObjectEffectsManager() + .getEffectsManager() .enableEffect(this._rendererEffects, name, enable); } @@ -890,7 +890,7 @@ namespace gdjs { isEffectEnabled(name: string): boolean { return this._runtimeScene .getGame() - .getObjectEffectsManager() + .getEffectsManager() .isEffectEnabled(this._rendererEffects, name); } @@ -902,7 +902,7 @@ namespace gdjs { hasEffect(name: string): boolean { return this._runtimeScene .getGame() - .getObjectEffectsManager() + .getEffectsManager() .hasEffect(this._rendererEffects, name); } diff --git a/GDJS/Runtime/runtimescene.ts b/GDJS/Runtime/runtimescene.ts index ee8ca8a5b8b6..b8dbd76a3c02 100644 --- a/GDJS/Runtime/runtimescene.ts +++ b/GDJS/Runtime/runtimescene.ts @@ -711,13 +711,13 @@ namespace gdjs { obj.setX(obj.getX() + averageForce.getX() * elapsedTimeInSeconds); obj.setY(obj.getY() + averageForce.getY() * elapsedTimeInSeconds); this._runtimeGame - .getObjectEffectsManager() + .getEffectsManager() .update(obj.getRendererEffects(), obj); obj.update(this); obj.updateForces(elapsedTimeInSeconds); } else { this._runtimeGame - .getObjectEffectsManager() + .getEffectsManager() .update(obj.getRendererEffects(), obj); obj.update(this); } From a19f24433d4f968f4b6cb6b2bab299f93ec3ae13 Mon Sep 17 00:00:00 2001 From: Florian Rival Date: Thu, 19 Aug 2021 10:16:33 +0200 Subject: [PATCH 26/28] Add tests for effects in GDJS --- GDJS/tests/karma.conf.js | 2 + GDJS/tests/tests/effects.js | 163 ++++++++++++++++++++++++++++++++++++ 2 files changed, 165 insertions(+) create mode 100644 GDJS/tests/tests/effects.js diff --git a/GDJS/tests/karma.conf.js b/GDJS/tests/karma.conf.js index e2305e4ebff4..9d6fd45ba626 100644 --- a/GDJS/tests/karma.conf.js +++ b/GDJS/tests/karma.conf.js @@ -76,6 +76,8 @@ module.exports = function (config) { '../../newIDE/app/resources/GDJS/Runtime/Extensions/TopDownMovementBehavior/topdownobstacleruntimebehavior.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/kawase-blur-pixi-filter.js', + '../../newIDE/app/resources/GDJS/Runtime/Extensions/Effects/pixi-filters/filter-kawase-blur.js', // Test extensions: './tests/Extensions/**.js', diff --git a/GDJS/tests/tests/effects.js b/GDJS/tests/tests/effects.js new file mode 100644 index 000000000000..4deaa10bdeb0 --- /dev/null +++ b/GDJS/tests/tests/effects.js @@ -0,0 +1,163 @@ +// @ts-check + +describe('gdjs.EffectsManager', () => { + const runtimeGame = new gdjs.RuntimeGame({ + variables: [], + // @ts-ignore TODO: make a function to create an empty game and use it across tests. + properties: { windowWidth: 800, windowHeight: 600 }, + resources: { resources: [] }, + }); + + it('can add effects on a runtime object', () => { + const runtimeScene = new gdjs.RuntimeScene(runtimeGame); + const object = new gdjs.TestRuntimeObject(runtimeScene, { + name: 'obj1', + type: '', + variables: [], + behaviors: [], + effects: [ + { + name: 'InitialKawaseBlurEffect', + effectType: 'KawaseBlur', + stringParameters: {}, + booleanParameters: {}, + doubleParameters: { + pixelizeX: 1, + pixelizeY: 2, + blur: 3, + quality: 4, + }, + }, + ], + }); + expect(object.hasEffect('NonExistingEffect')).to.be(false); + expect(object.hasEffect('InitialKawaseBlurEffect')).to.be(true); + expect(object.isEffectEnabled('NonExistingEffect')).to.be(false); + expect(object.isEffectEnabled('InitialKawaseBlurEffect')).to.be(true); + + object.enableEffect('InitialKawaseBlurEffect', false); + expect(object.isEffectEnabled('InitialKawaseBlurEffect')).to.be(false); + object.enableEffect('InitialKawaseBlurEffect', true); + expect(object.isEffectEnabled('InitialKawaseBlurEffect')).to.be(true); + + object.setEffectDoubleParameter('InitialKawaseBlurEffect', 'pixelizeX', 10); + object.setEffectStringParameter( + 'InitialKawaseBlurEffect', + 'useless', + 'will-be-ignored' + ); + object.setEffectBooleanParameter( + 'InitialKawaseBlurEffect', + 'useless', + true + ); + + object.addEffect({ + name: 'AddedKawaseBlurEffect', + effectType: 'KawaseBlur', + stringParameters: {}, + booleanParameters: {}, + doubleParameters: { + pixelizeX: 1, + pixelizeY: 2, + blur: 3, + quality: 4, + }, + }); + expect(object.hasEffect('AddedKawaseBlurEffect')).to.be(true); + expect(object.hasEffect('InitialKawaseBlurEffect')).to.be(true); + expect(object.isEffectEnabled('AddedKawaseBlurEffect')).to.be(true); + expect(object.isEffectEnabled('InitialKawaseBlurEffect')).to.be(true); + }); + + it('can add effects on a runtime layer', () => { + const runtimeScene = new gdjs.RuntimeScene(runtimeGame); + runtimeScene.loadFromScene({ + layers: [ + { + name: '', + visibility: true, + effects: [ + { + name: 'InitialKawaseBlurEffect', + effectType: 'KawaseBlur', + stringParameters: {}, + booleanParameters: {}, + doubleParameters: { + pixelizeX: 1, + pixelizeY: 2, + blur: 3, + quality: 4, + }, + }, + ], + cameras: [], + + ambientLightColorR: 0, + ambientLightColorG: 0, + ambientLightColorB: 0, + isLightingLayer: false, + followBaseLayerCamera: true, + }, + ], + variables: [], + r: 0, + v: 0, + b: 0, + mangledName: 'Scene1', + name: 'Scene1', + stopSoundsOnStartup: false, + title: '', + behaviorsSharedData: [], + objects: [], + instances: [], + }); + + const runtimeLayer = runtimeScene.getLayer(''); + + expect(runtimeLayer.hasEffect('NonExistingEffect')).to.be(false); + expect(runtimeLayer.hasEffect('InitialKawaseBlurEffect')).to.be(true); + expect(runtimeLayer.isEffectEnabled('NonExistingEffect')).to.be(false); + expect(runtimeLayer.isEffectEnabled('InitialKawaseBlurEffect')).to.be(true); + + runtimeLayer.enableEffect('InitialKawaseBlurEffect', false); + expect(runtimeLayer.isEffectEnabled('InitialKawaseBlurEffect')).to.be( + false + ); + runtimeLayer.enableEffect('InitialKawaseBlurEffect', true); + expect(runtimeLayer.isEffectEnabled('InitialKawaseBlurEffect')).to.be(true); + + runtimeLayer.setEffectDoubleParameter( + 'InitialKawaseBlurEffect', + 'pixelizeX', + 10 + ); + runtimeLayer.setEffectStringParameter( + 'InitialKawaseBlurEffect', + 'useless', + 'will-be-ignored' + ); + runtimeLayer.setEffectBooleanParameter( + 'InitialKawaseBlurEffect', + 'useless', + true + ); + + runtimeLayer.addEffect({ + name: 'AddedKawaseBlurEffect', + effectType: 'KawaseBlur', + stringParameters: {}, + booleanParameters: {}, + doubleParameters: { + pixelizeX: 1, + pixelizeY: 2, + blur: 3, + quality: 4, + }, + }); + expect(runtimeLayer.hasEffect('AddedKawaseBlurEffect')).to.be(true); + expect(runtimeLayer.hasEffect('InitialKawaseBlurEffect')).to.be(true); + expect(runtimeLayer.isEffectEnabled('AddedKawaseBlurEffect')).to.be(true); + expect(runtimeLayer.isEffectEnabled('InitialKawaseBlurEffect')).to.be(true); + }); +}); From 4a98a4a81a30531da6dfb0f56b9ded47660703a0 Mon Sep 17 00:00:00 2001 From: Florian Rival Date: Fri, 20 Aug 2021 10:35:40 +0200 Subject: [PATCH 27/28] Add more visible placeholder when no effects are present, with help button --- .../EmptyBehaviorsPlaceholder.js | 52 ++-- newIDE/app/src/BehaviorsEditor/index.js | 231 +++++++++--------- .../EffectsList/EmptyEffectsPlaceholder.js | 37 +++ newIDE/app/src/EffectsList/index.js | 27 +- .../EventsTree/EmptyEventsPlaceholder.js | 47 ++-- .../src/ObjectsList/EnumerateObjects.spec.js | 4 +- newIDE/app/src/UI/EmptyMessage.js | 4 + newIDE/app/src/UI/EmptyPlaceholder.js | 32 +++ newIDE/app/src/fixtures/TestProject.js | 6 + newIDE/app/src/stories/index.js | 12 + 10 files changed, 246 insertions(+), 206 deletions(-) create mode 100644 newIDE/app/src/EffectsList/EmptyEffectsPlaceholder.js create mode 100644 newIDE/app/src/UI/EmptyPlaceholder.js diff --git a/newIDE/app/src/BehaviorsEditor/EmptyBehaviorsPlaceholder.js b/newIDE/app/src/BehaviorsEditor/EmptyBehaviorsPlaceholder.js index 91aa357267ab..67b75da9b9f2 100644 --- a/newIDE/app/src/BehaviorsEditor/EmptyBehaviorsPlaceholder.js +++ b/newIDE/app/src/BehaviorsEditor/EmptyBehaviorsPlaceholder.js @@ -1,43 +1,29 @@ // @flow import { Trans } from '@lingui/macro'; - import * as React from 'react'; import HelpButton from '../UI/HelpButton'; import Text from '../UI/Text'; -import Paper from '@material-ui/core/Paper'; -import { Line, Column } from '../UI/Grid'; +import { EmptyPlaceholder } from '../UI/EmptyPlaceholder'; const EmptyBehaviorsPlaceholder = () => ( - - - - - There are no behaviors here. - - - - Behaviors are predefined actions that are assigned to objects. - Behaviors can have no or multiple parameters. - - - - - Add your first behavior using the button "Add a behavior to the - object". - - - - - - - - + } + > + + There are no behaviors here. + + + + Behaviors are predefined actions that are assigned to objects. Behaviors + can have no or multiple parameters. + + + + + Add your first behavior using the button "Add a behavior to the object". + + + ); export default EmptyBehaviorsPlaceholder; diff --git a/newIDE/app/src/BehaviorsEditor/index.js b/newIDE/app/src/BehaviorsEditor/index.js index 965b422bd507..28978dd697fd 100644 --- a/newIDE/app/src/BehaviorsEditor/index.js +++ b/newIDE/app/src/BehaviorsEditor/index.js @@ -109,29 +109,78 @@ const BehaviorsEditor = (props: Props) => { return ( - - {allBehaviorNames.length === 0 && ( -
- - - -
- )} - {allBehaviorNames.map((behaviorName, index) => { - const behaviorContent = object.getBehavior(behaviorName); - const behaviorTypeName = behaviorContent.getTypeName(); + {allBehaviorNames.length === 0 ? ( + + + + ) : ( + + {allBehaviorNames.map((behaviorName, index) => { + const behaviorContent = object.getBehavior(behaviorName); + const behaviorTypeName = behaviorContent.getTypeName(); + + const behaviorMetadata = gd.MetadataProvider.getBehaviorMetadata( + gd.JsPlatform.get(), + behaviorTypeName + ); + if (gd.MetadataProvider.isBadBehaviorMetadata(behaviorMetadata)) { + return ( + + { + ev.stopPropagation(); + onRemoveBehavior(behaviorName); + }} + > + + , + ]} + > + + Unknown behavior{' '} + + + + + + + + + This behavior is unknown. It might be a behavior that + was defined in an extension and that was later removed. + You should delete it. + + + + + ); + } + + const behavior = behaviorMetadata.get(); + const BehaviorComponent = BehaviorsEditorService.getEditor( + behaviorTypeName + ); + const tutorialHints = getBehaviorTutorialHints(behaviorTypeName); + const enabledTutorialHints = tutorialHints.filter( + hint => !values.hiddenTutorialHints[hint.identifier] + ); + const iconUrl = behaviorMetadata.getIconFilename(); - const behaviorMetadata = gd.MetadataProvider.getBehaviorMetadata( - gd.JsPlatform.get(), - behaviorTypeName - ); - if (gd.MetadataProvider.isBadBehaviorMetadata(behaviorMetadata)) { return ( , { ev.stopPropagation(); onRemoveBehavior(behaviorName); @@ -141,112 +190,62 @@ const BehaviorsEditor = (props: Props) => { , ]} > - - Unknown behavior{' '} - - - + {iconUrl ? ( + + ) : null} + + + onChangeBehaviorName(behaviorContent, text) + } + /> - - - This behavior is unknown. It might be a behavior that was - defined in an extension and that was later removed. You - should delete it. - - - - - ); - } - - const behavior = behaviorMetadata.get(); - const BehaviorComponent = BehaviorsEditorService.getEditor( - behaviorTypeName - ); - const tutorialHints = getBehaviorTutorialHints(behaviorTypeName); - const enabledTutorialHints = tutorialHints.filter( - hint => !values.hiddenTutorialHints[hint.identifier] - ); - const iconUrl = behaviorMetadata.getIconFilename(); - - return ( - - , - { - ev.stopPropagation(); - onRemoveBehavior(behaviorName); - }} + - - , - ]} - > - {iconUrl ? ( - - ) : null} - - - onChangeBehaviorName(behaviorContent, text) - } - /> - - - - - {enabledTutorialHints.length ? ( + {enabledTutorialHints.length ? ( + + + {tutorialHints.map(tutorialHint => ( + + ))} + + + ) : null} - - {tutorialHints.map(tutorialHint => ( - - ))} - + - ) : null} - - - - - - - ); - })} - +
+ + + ); + })} + + )} ( + ( + + )} + > + + + Effects can change how layers or objects are rendered on screen. + + + + + After adding an effect, set up its parameters. Launch a preview to see + the result. Using the events and the name of the effect, you can change + the parameters during the game. + + + +); diff --git a/newIDE/app/src/EffectsList/index.js b/newIDE/app/src/EffectsList/index.js index 508f8469fd8a..594bbe69770e 100644 --- a/newIDE/app/src/EffectsList/index.js +++ b/newIDE/app/src/EffectsList/index.js @@ -10,7 +10,6 @@ import SelectOption from '../UI/SelectOption'; import { mapFor } from '../Utils/MapFor'; import RaisedButton from '../UI/RaisedButton'; import IconButton from '../UI/IconButton'; -import EmptyMessage from '../UI/EmptyMessage'; import ElementWithMenu from '../UI/Menu/ElementWithMenu'; import MoreVert from '@material-ui/icons/MoreVert'; import SemiControlledTextField from '../UI/SemiControlledTextField'; @@ -34,6 +33,7 @@ import { } from '../ResourcesList/ResourceSource.flow'; import { type ResourceExternalEditor } from '../ResourcesList/ResourceExternalEditor.flow'; import ScrollView from '../UI/ScrollView'; +import { EmptyEffectsPlaceholder } from './EmptyEffectsPlaceholder'; type Props = {| project: gdProject, @@ -113,25 +113,6 @@ export default function EffectsList(props: Props) { {effectsContainer.getEffectsCount() !== 0 ? ( - - - - - Effects can change how layers or objects are rendered on - screen. - - - After adding an effect, set up its parameters. Launch a - preview to see the result. Using the events and the name - of the effect, you can change the parameters during the - game. - - - - {effectsContainer.getEffectsCount() > 3 && ( @@ -264,9 +245,9 @@ export default function EffectsList(props: Props) { })} ) : ( - - No effects applied. - + + + )} diff --git a/newIDE/app/src/EventsSheet/EventsTree/EmptyEventsPlaceholder.js b/newIDE/app/src/EventsSheet/EventsTree/EmptyEventsPlaceholder.js index fe65c208172b..90685e444b87 100644 --- a/newIDE/app/src/EventsSheet/EventsTree/EmptyEventsPlaceholder.js +++ b/newIDE/app/src/EventsSheet/EventsTree/EmptyEventsPlaceholder.js @@ -4,40 +4,23 @@ import { Trans } from '@lingui/macro'; import * as React from 'react'; import HelpButton from '../../UI/HelpButton'; import Text from '../../UI/Text'; -import Paper from '@material-ui/core/Paper'; -import { Line, Column } from '../../UI/Grid'; +import { EmptyPlaceholder } from '../../UI/EmptyPlaceholder'; const EmptyEventsPlaceholder = () => ( - - - - - There are no events here. - - - - Events are composed of conditions (on the left of an event) and - actions (on the right). When conditions are fulfilled, the actions - are executed. - - - - - Add your first event using the button "Add a new event". - - - - - - - - + }> + + There are no events here. + + + + Events are composed of conditions (on the left of an event) and actions + (on the right). When conditions are fulfilled, the actions are executed. + + + + Add your first event using the button "Add a new event". + + ); export default EmptyEventsPlaceholder; diff --git a/newIDE/app/src/ObjectsList/EnumerateObjects.spec.js b/newIDE/app/src/ObjectsList/EnumerateObjects.spec.js index b9e14978dead..7857532aefa0 100644 --- a/newIDE/app/src/ObjectsList/EnumerateObjects.spec.js +++ b/newIDE/app/src/ObjectsList/EnumerateObjects.spec.js @@ -11,9 +11,9 @@ describe('EnumerateObjects', () => { allObjectsList, } = enumerateObjects(project, testLayout); - expect(containerObjectsList).toHaveLength(12); + expect(containerObjectsList).toHaveLength(13); expect(projectObjectsList).toHaveLength(2); - expect(allObjectsList).toHaveLength(14); + expect(allObjectsList).toHaveLength(15); }); it('can do a case-insensitive search in the lists of objects', () => { diff --git a/newIDE/app/src/UI/EmptyMessage.js b/newIDE/app/src/UI/EmptyMessage.js index a6675c88c47a..6ffd32cf10aa 100644 --- a/newIDE/app/src/UI/EmptyMessage.js +++ b/newIDE/app/src/UI/EmptyMessage.js @@ -20,6 +20,10 @@ type Props = {| children: ?React.Node, |}; +/** + * Show a message when there is no content to display. + * Also take a look at EmptyPlaceholder for a more visible placerholder. + */ const EmptyMessage = (props: Props) => ( {muiTheme => ( diff --git a/newIDE/app/src/UI/EmptyPlaceholder.js b/newIDE/app/src/UI/EmptyPlaceholder.js new file mode 100644 index 000000000000..c551789c8d47 --- /dev/null +++ b/newIDE/app/src/UI/EmptyPlaceholder.js @@ -0,0 +1,32 @@ +// @flow +import * as React from 'react'; +import Paper from '@material-ui/core/Paper'; +import { Line, Column } from './Grid'; + +type Props = {| + children: React.Node, + renderButtons: () => React.Node, +|}; + +/** + * A placeholder for when there is no content to display. + * Also take a look at EmptyMessage for a less visible message. + */ +export const EmptyPlaceholder = (props: Props) => ( + + + + {props.children} + + {props.renderButtons()} + + + + +); diff --git a/newIDE/app/src/fixtures/TestProject.js b/newIDE/app/src/fixtures/TestProject.js index fb39b62855cb..00d30dc8c4ee 100644 --- a/newIDE/app/src/fixtures/TestProject.js +++ b/newIDE/app/src/fixtures/TestProject.js @@ -9,6 +9,7 @@ export type TestProject = {| panelSpriteObject: any, spriteObject: gdSpriteObject, spriteObjectWithBehaviors: gdSpriteObject, + spriteObjectWithoutBehaviors: gdSpriteObject, testLayout: gdLayout, group1: gdObjectGroup, group2: gdObjectGroup, @@ -75,6 +76,9 @@ export const makeTestProject = (gd /*: libGDevelop */) /*: TestProject */ => { const spriteObjectWithBehaviors = new gd.SpriteObject( 'MySpriteObjectWithBehaviors' ); + const spriteObjectWithoutBehaviors = new gd.SpriteObject( + 'MySpriteObjectWithoutBehaviors' + ); { const animation = new gd.Animation(); @@ -150,6 +154,7 @@ export const makeTestProject = (gd /*: libGDevelop */) /*: TestProject */ => { testLayout.insertObject(panelSpriteObject, 0); testLayout.insertObject(spriteObject, 0); testLayout.insertObject(spriteObjectWithBehaviors, 0); + testLayout.insertObject(spriteObjectWithoutBehaviors, 0); const group1 = new gd.ObjectGroup(); group1.setName('GroupOfSprites'); @@ -540,6 +545,7 @@ export const makeTestProject = (gd /*: libGDevelop */) /*: TestProject */ => { panelSpriteObject, spriteObject, spriteObjectWithBehaviors, + spriteObjectWithoutBehaviors, testLayout, group1, group2, diff --git a/newIDE/app/src/stories/index.js b/newIDE/app/src/stories/index.js index 3220de955cda..639c4d01505d 100644 --- a/newIDE/app/src/stories/index.js +++ b/newIDE/app/src/stories/index.js @@ -3639,6 +3639,18 @@ storiesOf('BehaviorsEditor', module) onUpdateBehaviorsSharedData={() => {}} /> + )) + .add('without any behaviors', () => ( + + Promise.reject('Unimplemented')} + resourceExternalEditors={fakeResourceExternalEditors} + onUpdateBehaviorsSharedData={() => {}} + /> + )); storiesOf('VariablesList', module) From 0572a4e1dd4d60bc99516dc5d7d4d57fee8215e9 Mon Sep 17 00:00:00 2001 From: Florian Rival Date: Fri, 20 Aug 2021 12:40:09 +0200 Subject: [PATCH 28/28] Make objects effects updated just before the rendering (like layers) * Update method names to make this very obvious * Also fix wrong parameters --- .../Builtin/BaseObjectExtension.cpp | 6 +-- Extensions/Effects/adjustment-pixi-filter.ts | 2 +- .../Effects/advanced-bloom-pixi-filter.ts | 2 +- Extensions/Effects/ascii-pixi-filter.ts | 2 +- Extensions/Effects/bevel-pixi-filter.ts | 2 +- .../Effects/black-and-white-pixi-filter.ts | 2 +- .../Effects/blending-mode-pixi-filter.ts | 2 +- Extensions/Effects/blur-pixi-filter.ts | 2 +- Extensions/Effects/brightness-pixi-filter.ts | 2 +- Extensions/Effects/bulge-pinch-pixi-filter.ts | 2 +- Extensions/Effects/color-map-pixi-filter.ts | 2 +- .../Effects/color-replace-pixi-filter.ts | 2 +- Extensions/Effects/crt-pixi-filter.ts | 2 +- .../Effects/displacement-pixi-filter.ts | 2 +- Extensions/Effects/dot-pixi-filter.ts | 2 +- Extensions/Effects/drop-shadow-pixi-filter.ts | 2 +- Extensions/Effects/glitch-pixi-filter.ts | 2 +- Extensions/Effects/glow-pixi-filter.ts | 2 +- Extensions/Effects/godray-pixi-filter.ts | 2 +- Extensions/Effects/kawase-blur-pixi-filter.ts | 2 +- Extensions/Effects/light-night-pixi-filter.ts | 2 +- Extensions/Effects/night-pixi-filter.ts | 2 +- Extensions/Effects/noise-pixi-filter.ts | 2 +- Extensions/Effects/old-film-pixi-filter.ts | 2 +- Extensions/Effects/outline-pixi-filter.ts | 2 +- Extensions/Effects/pixelate-pixi-filter.ts | 2 +- Extensions/Effects/radial-blur-pixi-filter.ts | 2 +- Extensions/Effects/reflection-pixi-filter.ts | 2 +- Extensions/Effects/rgb-split-pixi-filter.ts | 2 +- Extensions/Effects/sepia-pixi-filter.ts | 2 +- Extensions/Effects/tilt-shift-pixi-filter.ts | 2 +- Extensions/Effects/twist-pixi-filter.ts | 2 +- Extensions/Effects/zoom-blur-pixi-filter.ts | 2 +- Extensions/ExampleJsExtension/dummyeffect.ts | 11 +++-- .../cocos-renderers/layer-cocos-renderer.ts | 2 +- GDJS/Runtime/layer.ts | 7 ++- .../pixi-renderers/layer-pixi-renderer.ts | 2 +- .../pixi-renderers/pixi-effects-manager.ts | 13 +++-- .../pixi-renderers/pixi-filters-tools.ts | 8 ++-- GDJS/Runtime/runtimescene.ts | 47 ++++++++++++------- 40 files changed, 89 insertions(+), 71 deletions(-) diff --git a/Core/GDCore/Extensions/Builtin/BaseObjectExtension.cpp b/Core/GDCore/Extensions/Builtin/BaseObjectExtension.cpp index b09f5f3ccc1f..0730cda2c7be 100644 --- a/Core/GDCore/Extensions/Builtin/BaseObjectExtension.cpp +++ b/Core/GDCore/Extensions/Builtin/BaseObjectExtension.cpp @@ -1089,7 +1089,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension( _("Change the value of a parameter of an effect.") + "\n" + _("You can find the parameter names (and change the effect " "names) in the effects window."), - _("Set _PARAM2_ to _PARAM3_ for effect _PARAM3_ of _PARAM0_"), + _("Set _PARAM2_ to _PARAM3_ for effect _PARAM1_ of _PARAM0_"), _("Effects"), "res/actions/effect24.png", "res/actions/effect.png") @@ -1104,7 +1104,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension( _("Change the value (string) of a parameter of an effect.") + "\n" + _("You can find the parameter names (and change the effect " "names) in the effects window."), - _("Set _PARAM2_ to _PARAM3_ for effect _PARAM3_ of _PARAM0_"), + _("Set _PARAM2_ to _PARAM3_ for effect _PARAM1_ of _PARAM0_"), _("Effects"), "res/actions/effect24.png", "res/actions/effect.png") @@ -1132,7 +1132,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension( obj.AddCondition("IsEffectEnabled", _("Effect is enabled"), _("Check if the effect on an object is enabled."), - _("Effect _PARAM2_ on _PARAM1_ is enabled"), + _("Effect _PARAM1_ of _PARAM0_ is enabled"), _("Effects"), "res/actions/effect24.png", "res/actions/effect.png") diff --git a/Extensions/Effects/adjustment-pixi-filter.ts b/Extensions/Effects/adjustment-pixi-filter.ts index 701ab264724b..9fa37f6a4585 100644 --- a/Extensions/Effects/adjustment-pixi-filter.ts +++ b/Extensions/Effects/adjustment-pixi-filter.ts @@ -4,7 +4,7 @@ namespace gdjs { const adjustmentFilter = new PIXI.filters.AdjustmentFilter(); return adjustmentFilter; }, - update: function (filter, target) {}, + updatePreRender: function (filter, target) {}, updateDoubleParameter: function (filter, parameterName, value) { const adjustmentFilter = (filter as unknown) as PIXI.filters.AdjustmentFilter; if (parameterName === 'gamma') { diff --git a/Extensions/Effects/advanced-bloom-pixi-filter.ts b/Extensions/Effects/advanced-bloom-pixi-filter.ts index 7804a16f184c..33d249773117 100644 --- a/Extensions/Effects/advanced-bloom-pixi-filter.ts +++ b/Extensions/Effects/advanced-bloom-pixi-filter.ts @@ -4,7 +4,7 @@ namespace gdjs { const advancedBloomFilter = new PIXI.filters.AdvancedBloomFilter(); return advancedBloomFilter; }, - update: function (filter, target) {}, + updatePreRender: function (filter, target) {}, updateDoubleParameter: function (filter, parameterName, value) { const advancedBloomFilter = (filter as unknown) as PIXI.filters.AdvancedBloomFilter; if (parameterName === 'threshold') { diff --git a/Extensions/Effects/ascii-pixi-filter.ts b/Extensions/Effects/ascii-pixi-filter.ts index 7924e429b8ed..ff19558be52c 100644 --- a/Extensions/Effects/ascii-pixi-filter.ts +++ b/Extensions/Effects/ascii-pixi-filter.ts @@ -4,7 +4,7 @@ namespace gdjs { const asciiFilter = new PIXI.filters.AsciiFilter(); return asciiFilter; }, - update: function (filter, target) {}, + updatePreRender: function (filter, target) {}, updateDoubleParameter: function (filter, parameterName, value) { const asciiFilter = (filter as unknown) as PIXI.filters.AsciiFilter; if (parameterName === 'size') { diff --git a/Extensions/Effects/bevel-pixi-filter.ts b/Extensions/Effects/bevel-pixi-filter.ts index 563b1ce167a0..ae213896f0c1 100644 --- a/Extensions/Effects/bevel-pixi-filter.ts +++ b/Extensions/Effects/bevel-pixi-filter.ts @@ -4,7 +4,7 @@ namespace gdjs { const bevelFilter = new PIXI.filters.BevelFilter(); return bevelFilter; }, - update: function (filter, target) {}, + updatePreRender: function (filter, target) {}, updateDoubleParameter: function (filter, parameterName, value) { const bevelFilter = (filter as unknown) as PIXI.filters.BevelFilter; if (parameterName === 'rotation') { diff --git a/Extensions/Effects/black-and-white-pixi-filter.ts b/Extensions/Effects/black-and-white-pixi-filter.ts index 35dfbe5b182e..6d8460aaa4fc 100644 --- a/Extensions/Effects/black-and-white-pixi-filter.ts +++ b/Extensions/Effects/black-and-white-pixi-filter.ts @@ -6,7 +6,7 @@ namespace gdjs { colorMatrix.blackAndWhite(false); return colorMatrix; }, - update: function (filter, target) {}, + updatePreRender: function (filter, target) {}, updateDoubleParameter: function (filter, parameterName, value) { // @ts-ignore - unsure why PIXI.filters is not recognised. const colorMatrix = (filter as unknown) as PIXI.filters.ColorMatrixFilter; diff --git a/Extensions/Effects/blending-mode-pixi-filter.ts b/Extensions/Effects/blending-mode-pixi-filter.ts index 6c2134a71f3c..ef01f4182590 100644 --- a/Extensions/Effects/blending-mode-pixi-filter.ts +++ b/Extensions/Effects/blending-mode-pixi-filter.ts @@ -5,7 +5,7 @@ namespace gdjs { const blendingModeFilter = new PIXI.filters.AlphaFilter(); return blendingModeFilter; }, - update: function (filter, target) {}, + updatePreRender: function (filter, target) {}, updateDoubleParameter: function (filter, parameterName, value) { // @ts-ignore - unsure why PIXI.filters is not recognised. const blendingModeFilter = (filter as unknown) as PIXI.filters.AlphaFilter; diff --git a/Extensions/Effects/blur-pixi-filter.ts b/Extensions/Effects/blur-pixi-filter.ts index c1ffaedfbb95..20ae38b50cc4 100644 --- a/Extensions/Effects/blur-pixi-filter.ts +++ b/Extensions/Effects/blur-pixi-filter.ts @@ -5,7 +5,7 @@ namespace gdjs { const blur = new PIXI.filters.BlurFilter(); return blur; }, - update: function (filter, target) {}, + updatePreRender: function (filter, target) {}, updateDoubleParameter: function (filter, parameterName, value) { if ( parameterName !== 'blur' && diff --git a/Extensions/Effects/brightness-pixi-filter.ts b/Extensions/Effects/brightness-pixi-filter.ts index 2587114ca0ab..0e177539502c 100644 --- a/Extensions/Effects/brightness-pixi-filter.ts +++ b/Extensions/Effects/brightness-pixi-filter.ts @@ -6,7 +6,7 @@ namespace gdjs { brightness.brightness(1, false); return brightness; }, - update: function (filter, target) {}, + updatePreRender: function (filter, target) {}, updateDoubleParameter: function (filter, parameterName, value) { // @ts-ignore - unsure why PIXI.filters is not recognised. const brightnessFilter = (filter as unknown) as PIXI.filters.ColorMatrixFilter; diff --git a/Extensions/Effects/bulge-pinch-pixi-filter.ts b/Extensions/Effects/bulge-pinch-pixi-filter.ts index e9f4ceacfe03..a2dd4adb1edc 100644 --- a/Extensions/Effects/bulge-pinch-pixi-filter.ts +++ b/Extensions/Effects/bulge-pinch-pixi-filter.ts @@ -4,7 +4,7 @@ namespace gdjs { const bulgePinchFilter = new PIXI.filters.BulgePinchFilter(); return bulgePinchFilter; }, - update: function (filter, target) {}, + updatePreRender: function (filter, target) {}, updateDoubleParameter: function (filter, parameterName, value) { const bulgePinchFilter = (filter as unknown) as PIXI.filters.BulgePinchFilter; if (parameterName === 'centerX') { diff --git a/Extensions/Effects/color-map-pixi-filter.ts b/Extensions/Effects/color-map-pixi-filter.ts index 5c8b055c1dc4..deb43d402c72 100644 --- a/Extensions/Effects/color-map-pixi-filter.ts +++ b/Extensions/Effects/color-map-pixi-filter.ts @@ -17,7 +17,7 @@ namespace gdjs { ); return colorMapFilter; }, - update: function (filter, target) {}, + updatePreRender: function (filter, target) {}, updateDoubleParameter: function (filter, parameterName, value) { const colorMapFilter = (filter as unknown) as PIXI.filters.ColorMapFilter; if (parameterName === 'mix') { diff --git a/Extensions/Effects/color-replace-pixi-filter.ts b/Extensions/Effects/color-replace-pixi-filter.ts index d6596e471773..d1ecca500c17 100644 --- a/Extensions/Effects/color-replace-pixi-filter.ts +++ b/Extensions/Effects/color-replace-pixi-filter.ts @@ -4,7 +4,7 @@ namespace gdjs { const colorReplaceFilter = new PIXI.filters.ColorReplaceFilter(); return colorReplaceFilter; }, - update: function (filter, target) {}, + updatePreRender: function (filter, target) {}, updateDoubleParameter: function (filter, parameterName, value) { const colorReplaceFilter = (filter as unknown) as PIXI.filters.ColorReplaceFilter; if (parameterName === 'epsilon') { diff --git a/Extensions/Effects/crt-pixi-filter.ts b/Extensions/Effects/crt-pixi-filter.ts index 1865d3315098..fe8574b71558 100644 --- a/Extensions/Effects/crt-pixi-filter.ts +++ b/Extensions/Effects/crt-pixi-filter.ts @@ -7,7 +7,7 @@ namespace gdjs { crtFilter._animationTimer = 0; return crtFilter; }, - update: function (filter, target) { + updatePreRender: function (filter, target) { if (filter.animationSpeed !== 0) { // Multiply by 10 so that the default value is a sensible speed filter.time += diff --git a/Extensions/Effects/displacement-pixi-filter.ts b/Extensions/Effects/displacement-pixi-filter.ts index 342f8afb0cd1..06585538eaf0 100644 --- a/Extensions/Effects/displacement-pixi-filter.ts +++ b/Extensions/Effects/displacement-pixi-filter.ts @@ -14,7 +14,7 @@ namespace gdjs { ); return displacementFilter; }, - update: function (filter, target) {}, + updatePreRender: function (filter, target) {}, updateDoubleParameter: function (filter, parameterName, value) { // @ts-ignore - unsure why PIXI.filters is not recognised. const displacementFilter = (filter as unknown) as PIXI.filters.DisplacementFilter; diff --git a/Extensions/Effects/dot-pixi-filter.ts b/Extensions/Effects/dot-pixi-filter.ts index 5b2e31223374..1486497f82fe 100644 --- a/Extensions/Effects/dot-pixi-filter.ts +++ b/Extensions/Effects/dot-pixi-filter.ts @@ -4,7 +4,7 @@ namespace gdjs { const dotFilter = new PIXI.filters.DotFilter(); return dotFilter; }, - update: function (filter, target) {}, + updatePreRender: function (filter, target) {}, updateDoubleParameter: function (filter, parameterName, value) { const dotFilter = (filter as unknown) as PIXI.filters.DotFilter; if (parameterName === 'scale') { diff --git a/Extensions/Effects/drop-shadow-pixi-filter.ts b/Extensions/Effects/drop-shadow-pixi-filter.ts index 55f730cfbf7e..9ef270975c67 100644 --- a/Extensions/Effects/drop-shadow-pixi-filter.ts +++ b/Extensions/Effects/drop-shadow-pixi-filter.ts @@ -4,7 +4,7 @@ namespace gdjs { const dropShadowFilter = new PIXI.filters.DropShadowFilter(); return dropShadowFilter; }, - update: function (filter, target) {}, + updatePreRender: function (filter, target) {}, updateDoubleParameter: function (filter, parameterName, value) { const dropShadowFilter = (filter as unknown) as PIXI.filters.DropShadowFilter; if (parameterName === 'blur') { diff --git a/Extensions/Effects/glitch-pixi-filter.ts b/Extensions/Effects/glitch-pixi-filter.ts index e0e8b6084cd1..62b54b5d3460 100644 --- a/Extensions/Effects/glitch-pixi-filter.ts +++ b/Extensions/Effects/glitch-pixi-filter.ts @@ -7,7 +7,7 @@ namespace gdjs { glitchFilter._animationTimer = 0; return glitchFilter; }, - update: function (filter, target) { + updatePreRender: function (filter, target) { if (filter.animationFrequency !== 0) { filter._animationTimer += target.getElapsedTime() / 1000; if (filter._animationTimer >= 1 / filter.animationFrequency) { diff --git a/Extensions/Effects/glow-pixi-filter.ts b/Extensions/Effects/glow-pixi-filter.ts index 9354698b0c7b..7a8ba75e222e 100644 --- a/Extensions/Effects/glow-pixi-filter.ts +++ b/Extensions/Effects/glow-pixi-filter.ts @@ -4,7 +4,7 @@ namespace gdjs { const glowFilter = new PIXI.filters.GlowFilter(); return glowFilter; }, - update: function (filter, target) {}, + updatePreRender: function (filter, target) {}, updateDoubleParameter: function (filter, parameterName, value) { const glowFilter = (filter as unknown) as PIXI.filters.GlowFilter; if (parameterName === 'innerStrength') { diff --git a/Extensions/Effects/godray-pixi-filter.ts b/Extensions/Effects/godray-pixi-filter.ts index fe785a64446e..a7cc1215fb4e 100644 --- a/Extensions/Effects/godray-pixi-filter.ts +++ b/Extensions/Effects/godray-pixi-filter.ts @@ -6,7 +6,7 @@ namespace gdjs { const godrayFilter = new PIXI.filters.GodrayFilter(); return godrayFilter; }, - update: function (filter, target) { + updatePreRender: function (filter, target) { if (filter.animationSpeed !== 0) { filter.time += (target.getElapsedTime() / 1000) * filter.animationSpeed; } diff --git a/Extensions/Effects/kawase-blur-pixi-filter.ts b/Extensions/Effects/kawase-blur-pixi-filter.ts index 0fb0814b574c..3d0f50c1dd08 100644 --- a/Extensions/Effects/kawase-blur-pixi-filter.ts +++ b/Extensions/Effects/kawase-blur-pixi-filter.ts @@ -4,7 +4,7 @@ namespace gdjs { const kawaseBlurFilter = new PIXI.filters.KawaseBlurFilter(); return kawaseBlurFilter; }, - update: function (filter, target) {}, + updatePreRender: function (filter, target) {}, updateDoubleParameter: function (filter, parameterName, value) { const kawaseBlurFilter = (filter as unknown) as PIXI.filters.KawaseBlurFilter; if (parameterName === 'pixelizeX') { diff --git a/Extensions/Effects/light-night-pixi-filter.ts b/Extensions/Effects/light-night-pixi-filter.ts index 59e1a6e059c3..5aec36c65f80 100644 --- a/Extensions/Effects/light-night-pixi-filter.ts +++ b/Extensions/Effects/light-night-pixi-filter.ts @@ -27,7 +27,7 @@ namespace gdjs { const filter = new gdjs.LightNightPixiFilter(); return filter; }, - update: function (filter, target) {}, + updatePreRender: function (filter, target) {}, updateDoubleParameter: function (filter, parameterName, value) { if (parameterName !== 'opacity') { return; diff --git a/Extensions/Effects/night-pixi-filter.ts b/Extensions/Effects/night-pixi-filter.ts index 888f123be65d..ee258d017aa6 100644 --- a/Extensions/Effects/night-pixi-filter.ts +++ b/Extensions/Effects/night-pixi-filter.ts @@ -31,7 +31,7 @@ namespace gdjs { const filter = new gdjs.NightPixiFilter(); return filter; }, - update: function (filter, target) {}, + updatePreRender: function (filter, target) {}, updateDoubleParameter: function (filter, parameterName, value) { if (parameterName !== 'intensity' && parameterName !== 'opacity') { return; diff --git a/Extensions/Effects/noise-pixi-filter.ts b/Extensions/Effects/noise-pixi-filter.ts index 355c7572fbac..ff6bbed76938 100644 --- a/Extensions/Effects/noise-pixi-filter.ts +++ b/Extensions/Effects/noise-pixi-filter.ts @@ -5,7 +5,7 @@ namespace gdjs { const noiseFilter = new PIXI.filters.NoiseFilter(); return noiseFilter; }, - update: function (filter, target) {}, + updatePreRender: function (filter, target) {}, updateDoubleParameter: function (filter, parameterName, value) { // @ts-ignore - unsure why PIXI.filters is not recognised. const noiseFilter = (filter as unknown) as PIXI.filters.NoiseFilter; diff --git a/Extensions/Effects/old-film-pixi-filter.ts b/Extensions/Effects/old-film-pixi-filter.ts index dbf710c3858a..6353382188f7 100644 --- a/Extensions/Effects/old-film-pixi-filter.ts +++ b/Extensions/Effects/old-film-pixi-filter.ts @@ -7,7 +7,7 @@ namespace gdjs { oldFilmFilter._animationTimer = 0; return oldFilmFilter; }, - update: function (filter, target) { + updatePreRender: function (filter, target) { if (filter.animationFrequency !== 0) { filter._animationTimer += target.getElapsedTime() / 1000; if (filter._animationTimer >= 1 / filter.animationFrequency) { diff --git a/Extensions/Effects/outline-pixi-filter.ts b/Extensions/Effects/outline-pixi-filter.ts index f4b0d4f1782c..d129b9d5c514 100644 --- a/Extensions/Effects/outline-pixi-filter.ts +++ b/Extensions/Effects/outline-pixi-filter.ts @@ -4,7 +4,7 @@ namespace gdjs { const outlineFilter = new PIXI.filters.OutlineFilter(); return outlineFilter; }, - update: function (filter, target) {}, + updatePreRender: function (filter, target) {}, updateDoubleParameter: function (filter, parameterName, value) { const outlineFilter = (filter as unknown) as PIXI.filters.OutlineFilter; if (parameterName === 'thickness') { diff --git a/Extensions/Effects/pixelate-pixi-filter.ts b/Extensions/Effects/pixelate-pixi-filter.ts index ef24ba0ee7cc..0c464b22fe80 100644 --- a/Extensions/Effects/pixelate-pixi-filter.ts +++ b/Extensions/Effects/pixelate-pixi-filter.ts @@ -6,7 +6,7 @@ namespace gdjs { ); return pixelateFilter; }, - update: function (filter, target) {}, + updatePreRender: function (filter, target) {}, updateDoubleParameter: function (filter, parameterName, value) { const pixelateFilter = (filter as unknown) as PIXI.filters.PixelateFilter; if (parameterName === 'size') { diff --git a/Extensions/Effects/radial-blur-pixi-filter.ts b/Extensions/Effects/radial-blur-pixi-filter.ts index 20da7033acbf..681310b5547e 100644 --- a/Extensions/Effects/radial-blur-pixi-filter.ts +++ b/Extensions/Effects/radial-blur-pixi-filter.ts @@ -4,7 +4,7 @@ namespace gdjs { const radialBlurFilter = new PIXI.filters.RadialBlurFilter(); return radialBlurFilter; }, - update: function (filter, target) { + updatePreRender: function (filter, target) { const radialBlurFilter = (filter as unknown) as PIXI.filters.RadialBlurFilter; radialBlurFilter.center[0] = Math.round( // @ts-ignore - extra properties are stored on the filter. diff --git a/Extensions/Effects/reflection-pixi-filter.ts b/Extensions/Effects/reflection-pixi-filter.ts index 9884552df9ee..1330f9d9cabc 100644 --- a/Extensions/Effects/reflection-pixi-filter.ts +++ b/Extensions/Effects/reflection-pixi-filter.ts @@ -23,7 +23,7 @@ namespace gdjs { ); return reflectionFilter; }, - update: function (filter, target) { + updatePreRender: function (filter, target) { if (filter.animationSpeed !== 0) { filter.time += (target.getElapsedTime() / 1000) * filter.animationSpeed; } diff --git a/Extensions/Effects/rgb-split-pixi-filter.ts b/Extensions/Effects/rgb-split-pixi-filter.ts index 13cbb2134d83..f176d7d6c34a 100644 --- a/Extensions/Effects/rgb-split-pixi-filter.ts +++ b/Extensions/Effects/rgb-split-pixi-filter.ts @@ -4,7 +4,7 @@ namespace gdjs { const rgbSplitFilter = new PIXI.filters.RGBSplitFilter(); return rgbSplitFilter; }, - update: function (filter, target) {}, + updatePreRender: function (filter, target) {}, updateDoubleParameter: function (filter, parameterName, value) { const rgbSplitFilter = (filter as unknown) as PIXI.filters.RGBSplitFilter; if (parameterName === 'redX') { diff --git a/Extensions/Effects/sepia-pixi-filter.ts b/Extensions/Effects/sepia-pixi-filter.ts index fbe11ce691b4..bba31e1823e9 100644 --- a/Extensions/Effects/sepia-pixi-filter.ts +++ b/Extensions/Effects/sepia-pixi-filter.ts @@ -6,7 +6,7 @@ namespace gdjs { colorMatrixFilter.sepia(false); return colorMatrixFilter; }, - update: function (filter, target) {}, + updatePreRender: function (filter, target) {}, updateDoubleParameter: function (filter, parameterName, value) { // @ts-ignore - unsure why PIXI.filters is not recognised. const colorMatrixFilter = (filter as unknown) as PIXI.filters.ColorMatrixFilter; diff --git a/Extensions/Effects/tilt-shift-pixi-filter.ts b/Extensions/Effects/tilt-shift-pixi-filter.ts index 3e46b3b9bd05..83f3c45aaf2d 100644 --- a/Extensions/Effects/tilt-shift-pixi-filter.ts +++ b/Extensions/Effects/tilt-shift-pixi-filter.ts @@ -4,7 +4,7 @@ namespace gdjs { const tiltShiftFilter = new PIXI.filters.TiltShiftFilter(); return tiltShiftFilter; }, - update: function (filter, target) {}, + updatePreRender: function (filter, target) {}, updateDoubleParameter: function (filter, parameterName, value) { const tiltShiftFilter = (filter as unknown) as PIXI.filters.TiltShiftFilter; if (parameterName === 'blur') { diff --git a/Extensions/Effects/twist-pixi-filter.ts b/Extensions/Effects/twist-pixi-filter.ts index 4be2610e7ad3..8569ec9c0d44 100644 --- a/Extensions/Effects/twist-pixi-filter.ts +++ b/Extensions/Effects/twist-pixi-filter.ts @@ -10,7 +10,7 @@ namespace gdjs { twistFilter.offset = new PIXI_.Point(0, 0); return twistFilter; }, - update: function (filter, target) { + updatePreRender: function (filter, target) { const twistFilter = (filter as unknown) as PIXI.filters.TwistFilter; twistFilter.offset.x = Math.round( // @ts-ignore - extra properties are stored on the filter. diff --git a/Extensions/Effects/zoom-blur-pixi-filter.ts b/Extensions/Effects/zoom-blur-pixi-filter.ts index 2e40dfe4ce5f..ef9ae39591f5 100644 --- a/Extensions/Effects/zoom-blur-pixi-filter.ts +++ b/Extensions/Effects/zoom-blur-pixi-filter.ts @@ -4,7 +4,7 @@ namespace gdjs { const zoomBlurFilter = new PIXI.filters.ZoomBlurFilter(); return zoomBlurFilter; }, - update: function (filter, target) { + updatePreRender: function (filter, target) { const zoomBlurFilter = (filter as unknown) as PIXI.filters.ZoomBlurFilter; zoomBlurFilter.center[0] = Math.round( // @ts-ignore - extra properties are stored on the filter. diff --git a/Extensions/ExampleJsExtension/dummyeffect.ts b/Extensions/ExampleJsExtension/dummyeffect.ts index 403a7b7f92c2..acde7f0ba6bc 100644 --- a/Extensions/ExampleJsExtension/dummyeffect.ts +++ b/Extensions/ExampleJsExtension/dummyeffect.ts @@ -57,11 +57,12 @@ namespace gdjs { ); return filter; }, - // Function called at every frame rendered - update: function (filter, layer) {}, - // If your filter depends on the time, you can get the elapsed time - // with `layer.getElapsedTime()`. - // You can update the uniforms or other state of the filter. + // Function called at every frame, after events and before the frame is rendered. + updatePreRender: function (filter, layer) { + // If your filter depends on the time, you can get the elapsed time + // with `layer.getElapsedTime()`. + // You can update the uniforms or other state of the filter. + }, // Function that will be called to update a (number) parameter of the PIXI filter with a new value updateDoubleParameter: function (filter, parameterName, value) { if (parameterName === 'opacity') { diff --git a/GDJS/Runtime/cocos-renderers/layer-cocos-renderer.ts b/GDJS/Runtime/cocos-renderers/layer-cocos-renderer.ts index 6c5175551443..af8130c98fbf 100644 --- a/GDJS/Runtime/cocos-renderers/layer-cocos-renderer.ts +++ b/GDJS/Runtime/cocos-renderers/layer-cocos-renderer.ts @@ -140,7 +140,7 @@ namespace gdjs { this._cocosLayer.setVisible(visible); } - update(): void {} + updatePreRender(): void {} // Unimplemented updateClearColor(): void {} diff --git a/GDJS/Runtime/layer.ts b/GDJS/Runtime/layer.ts index eb9bddb8601a..d4b706f5ade9 100644 --- a/GDJS/Runtime/layer.ts +++ b/GDJS/Runtime/layer.ts @@ -124,14 +124,13 @@ namespace gdjs { /** * Called at each frame, after events are run and before rendering. - * @param [runtimeScene] The scene the layer belongs to. */ - update(runtimeScene?: gdjs.RuntimeScene): void { + updatePreRender(runtimeScene?: gdjs.RuntimeScene): void { if (this._followBaseLayerCamera) { this.followBaseLayer(); } - this._renderer.update(); - this._effectsManager.update(this._rendererEffects, this); + this._renderer.updatePreRender(); + this._effectsManager.updatePreRender(this._rendererEffects, this); } /** diff --git a/GDJS/Runtime/pixi-renderers/layer-pixi-renderer.ts b/GDJS/Runtime/pixi-renderers/layer-pixi-renderer.ts index caca7e3ae4d9..d0291e3a657f 100644 --- a/GDJS/Runtime/pixi-renderers/layer-pixi-renderer.ts +++ b/GDJS/Runtime/pixi-renderers/layer-pixi-renderer.ts @@ -82,7 +82,7 @@ namespace gdjs { this._pixiContainer.visible = !!visible; } - update(): void { + updatePreRender(): void { if (this._renderTexture) { this._updateRenderTexture(); } diff --git a/GDJS/Runtime/pixi-renderers/pixi-effects-manager.ts b/GDJS/Runtime/pixi-renderers/pixi-effects-manager.ts index 7c8fe9b78c84..0459f2197ce2 100644 --- a/GDJS/Runtime/pixi-renderers/pixi-effects-manager.ts +++ b/GDJS/Runtime/pixi-renderers/pixi-effects-manager.ts @@ -52,7 +52,7 @@ namespace gdjs { updateDoubleParameter: filterCreator.updateDoubleParameter, updateStringParameter: filterCreator.updateStringParameter, updateBooleanParameter: filterCreator.updateBooleanParameter, - update: filterCreator.update, + updatePreRender: filterCreator.updatePreRender, }; if (target.isLightingLayer && target.isLightingLayer()) { @@ -81,13 +81,16 @@ namespace gdjs { /** * Update the filters applied on a PixiJS DisplayObject. - * @param runtimeObject - * @param target + * This must be called after the events and before the rendering. + * + * This allows effects to be sure that they are up to date and ready + * to render. This is not called on objects that are not rendered on screen + * ("culling"). This is always called on layers. */ - update(rendererEffects: RendererEffects, target: EffectsTarget) { + updatePreRender(rendererEffects: RendererEffects, target: EffectsTarget) { for (const filterName in rendererEffects) { const filter = rendererEffects[filterName]; - filter.update(filter.pixiFilter, target); + filter.updatePreRender(filter.pixiFilter, target); } } diff --git a/GDJS/Runtime/pixi-renderers/pixi-filters-tools.ts b/GDJS/Runtime/pixi-renderers/pixi-filters-tools.ts index 099579d69546..492c0587f71f 100644 --- a/GDJS/Runtime/pixi-renderers/pixi-filters-tools.ts +++ b/GDJS/Runtime/pixi-renderers/pixi-filters-tools.ts @@ -90,8 +90,8 @@ namespace gdjs { export type FilterCreator = { /** Function to call to create the filter */ makePIXIFilter: (target: EffectsTarget, effectData: EffectData) => any; - /** The function to be called to update the filter at every frame */ - update: (filter: PIXI.Filter, target: gdjs.EffectsTarget) => any; + /** The function to be called to update the filter at every frame before the rendering. */ + updatePreRender: (filter: PIXI.Filter, target: gdjs.EffectsTarget) => any; /** The function to be called to update a parameter (with a number) */ updateDoubleParameter: ( filter: PIXI.Filter, @@ -116,8 +116,8 @@ namespace gdjs { export type Filter = { /** The PIXI filter */ pixiFilter: PIXI.Filter; - /** The function to be called to update the filter at every frame */ - update: (filter: PIXI.Filter, target: gdjs.EffectsTarget) => any; + /** The function to be called to update the filter at every frame before the rendering. */ + updatePreRender: (filter: PIXI.Filter, target: gdjs.EffectsTarget) => any; /** The function to be called to update a parameter (with a number) */ updateDoubleParameter: ( filter: PIXI.Filter, diff --git a/GDJS/Runtime/runtimescene.ts b/GDJS/Runtime/runtimescene.ts index b8dbd76a3c02..5ba914632fd4 100644 --- a/GDJS/Runtime/runtimescene.ts +++ b/GDJS/Runtime/runtimescene.ts @@ -509,16 +509,16 @@ namespace gdjs { this._profiler.end('callbacks and extensions (post-events)'); } if (this._profiler) { - this._profiler.begin('objects (pre-render)'); + this._profiler.begin('objects (pre-render, effects update)'); } this._updateObjectsPreRender(); if (this._profiler) { - this._profiler.end('objects (pre-render)'); + this._profiler.end('objects (pre-render, effects update)'); } if (this._profiler) { this._profiler.begin('layers (effects update)'); } - this._updateLayers(); + this._updateLayersPreRender(); if (this._profiler) { this._profiler.end('layers (effects update)'); } @@ -577,19 +577,22 @@ namespace gdjs { } } - _updateLayers() { + /** + * Called to update effects of layers before rendering. + */ + _updateLayersPreRender() { for (const name in this._layers.items) { if (this._layers.items.hasOwnProperty(name)) { - /** @type gdjs.Layer */ - const theLayer: gdjs.Layer = this._layers.items[name]; - theLayer.update(this); + const layer = this._layers.items[name]; + layer.updatePreRender(this); } } } /** * Called to update visibility of the renderers of objects - * rendered on the scene and give a last chance for objects to update before rendering. + * rendered on the scene ("culling"), update effects (of visible objects) + * and give a last chance for objects to update before rendering. * * Visibility is set to false if object is hidden, or if * object is too far from the camera of its layer ("culling"). @@ -601,8 +604,16 @@ namespace gdjs { const object = this._allInstancesList[i]; const rendererObject = object.getRendererObject(); if (rendererObject) { - object.getRendererObject().visible = !object.isHidden(); + rendererObject.visible = !object.isHidden(); + + // Update effects, only for visible objects. + if (rendererObject.visible) { + this._runtimeGame + .getEffectsManager() + .updatePreRender(object.getRendererEffects(), object); + } } + // Perform pre-render update. object.updatePreRender(this); } @@ -613,9 +624,11 @@ namespace gdjs { // TODO: For compatibility, pass a scale of `2`, // meaning that size of cameras will be multiplied by 2 and so objects // will be hidden if they are outside of this *larger* camera area. - // Useful for objects not properly reporting their visibility AABB, + // This is useful for: + // - objects not properly reporting their visibility AABB, // (so we have a "safety margin") but these objects should be fixed // instead. + // - objects having effects rendering outside of their visibility AABB. this._updateLayersCameraCoordinates(2); this._constructListOfAllInstances(); for (let i = 0, len = this._allInstancesList.length; i < len; ++i) { @@ -642,6 +655,14 @@ namespace gdjs { rendererObject.visible = true; } } + + // Update effects, only for visible objects. + if (rendererObject.visible) { + this._runtimeGame + .getEffectsManager() + .updatePreRender(object.getRendererEffects(), object); + } + // Perform pre-render update. object.updatePreRender(this); } @@ -710,15 +731,9 @@ namespace gdjs { const elapsedTimeInSeconds = elapsedTime / 1000; obj.setX(obj.getX() + averageForce.getX() * elapsedTimeInSeconds); obj.setY(obj.getY() + averageForce.getY() * elapsedTimeInSeconds); - this._runtimeGame - .getEffectsManager() - .update(obj.getRendererEffects(), obj); obj.update(this); obj.updateForces(elapsedTimeInSeconds); } else { - this._runtimeGame - .getEffectsManager() - .update(obj.getRendererEffects(), obj); obj.update(this); } obj.updateTimers(elapsedTime);