From bf13de3817e46bdbe065ec49712f276c8f2b70e0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Pasteau?= <4895034+ClementPasteau@users.noreply.github.com> Date: Tue, 25 Jul 2023 15:25:50 +0200 Subject: [PATCH 1/4] Fix adapting collision mask to new sprites --- .../Editors/SpriteEditor/SpritesList.js | 4 +++ .../Editors/SpriteEditor/index.js | 30 ++++++++++++++++++- 2 files changed, 33 insertions(+), 1 deletion(-) diff --git a/newIDE/app/src/ObjectEditor/Editors/SpriteEditor/SpritesList.js b/newIDE/app/src/ObjectEditor/Editors/SpriteEditor/SpritesList.js index 3138cc85d991..cf7721ce3465 100644 --- a/newIDE/app/src/ObjectEditor/Editors/SpriteEditor/SpritesList.js +++ b/newIDE/app/src/ObjectEditor/Editors/SpriteEditor/SpritesList.js @@ -172,6 +172,7 @@ type Props = {| resourcesLoader: typeof ResourcesLoader, resourceManagementProps: ResourceManagementProps, onReplaceByDirection: (newDirection: gdDirection) => void, + onSpriteAdded: (sprite: gdSprite) => void, onSpriteUpdated?: () => void, onFirstSpriteUpdated?: () => void, onChangeName: (newAnimationName: string) => void, // Used by piskel to set the name, if there is no name @@ -186,6 +187,7 @@ const SpritesList = ({ resourcesLoader, resourceManagementProps, onReplaceByDirection, + onSpriteAdded, onSpriteUpdated, onFirstSpriteUpdated, onChangeName, @@ -312,6 +314,7 @@ const SpritesList = ({ if (allDirectionSpritesHaveSameCollisionMasks) { copySpritePolygons(direction.getSprite(0), sprite); } + onSpriteAdded(sprite); // We call this before adding the sprite to the direction as it will be deleted afterwards. direction.addSprite(sprite); sprite.delete(); }); @@ -336,6 +339,7 @@ const SpritesList = ({ resourceManagementProps, forceUpdate, onSpriteUpdated, + onSpriteAdded, onFirstSpriteUpdated, ] ); diff --git a/newIDE/app/src/ObjectEditor/Editors/SpriteEditor/index.js b/newIDE/app/src/ObjectEditor/Editors/SpriteEditor/index.js index 7e9ca83344c5..a8d7819374dd 100644 --- a/newIDE/app/src/ObjectEditor/Editors/SpriteEditor/index.js +++ b/newIDE/app/src/ObjectEditor/Editors/SpriteEditor/index.js @@ -214,12 +214,29 @@ export default function SpriteEditor({ } } } - forceUpdate(); }, [spriteConfiguration, project, forceUpdate] ); + const onApplyFirstSpriteCollisionMaskToSprite = React.useCallback( + (sprite: gdSprite) => { + if (spriteConfiguration.getAnimationsCount() === 0) return; + const firstAnimation = spriteConfiguration.getAnimation(0); + if (firstAnimation.getDirectionsCount() === 0) return; + const firstDirection = firstAnimation.getDirection(0); + if (firstDirection.getSpritesCount() === 0) return; + const firstSprite = firstDirection.getSprite(0); + const firstSpriteCollisionMask = firstSprite.getCustomCollisionMask(); + sprite.setFullImageCollisionMask(!firstSpriteCollisionMask); + if (firstSpriteCollisionMask) + sprite.setCustomCollisionMask(firstSpriteCollisionMask); + + forceUpdate(); + }, + [spriteConfiguration, forceUpdate] + ); + const moveAnimation = React.useCallback( (targetIndex: number) => { const draggedIndex = draggedAnimationIndex.current; @@ -538,6 +555,17 @@ export default function SpriteEditor({ } : undefined } + onSpriteAdded={(sprite: gdSprite) => { + // If a sprite is added, we want to ensure it gets the automatic + // collision mask of the object, if the option is enabled. + if ( + spriteConfiguration.adaptCollisionMaskAutomatically() + ) { + onApplyFirstSpriteCollisionMaskToSprite( + sprite + ); + } + }} /> ); } From d9cf272e9fdfefd888cdba611081189fb35a88d7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Pasteau?= <4895034+ClementPasteau@users.noreply.github.com> Date: Tue, 25 Jul 2023 17:15:44 +0200 Subject: [PATCH 2/4] Fix copy --- newIDE/app/src/ObjectEditor/Editors/SpriteEditor/SpritesList.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/newIDE/app/src/ObjectEditor/Editors/SpriteEditor/SpritesList.js b/newIDE/app/src/ObjectEditor/Editors/SpriteEditor/SpritesList.js index cf7721ce3465..0dfa9711bb7f 100644 --- a/newIDE/app/src/ObjectEditor/Editors/SpriteEditor/SpritesList.js +++ b/newIDE/app/src/ObjectEditor/Editors/SpriteEditor/SpritesList.js @@ -314,7 +314,7 @@ const SpritesList = ({ if (allDirectionSpritesHaveSameCollisionMasks) { copySpritePolygons(direction.getSprite(0), sprite); } - onSpriteAdded(sprite); // We call this before adding the sprite to the direction as it will be deleted afterwards. + onSpriteAdded(sprite); // Call the callback before `addSprite`, as `addSprite` will store a copy of it. direction.addSprite(sprite); sprite.delete(); }); From 8ed2cdad5e65b1dfe8b787f7b219c7ecfe54f7a0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Pasteau?= <4895034+ClementPasteau@users.noreply.github.com> Date: Tue, 25 Jul 2023 17:44:45 +0200 Subject: [PATCH 3/4] Fix hiding controls for points editor --- .../Editors/SpriteEditor/CollisionMasksEditor/index.js | 4 ++++ .../Editors/SpriteEditor/Utils/SpriteSelector.js | 10 ++++++---- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/newIDE/app/src/ObjectEditor/Editors/SpriteEditor/CollisionMasksEditor/index.js b/newIDE/app/src/ObjectEditor/Editors/SpriteEditor/CollisionMasksEditor/index.js index 5c3dc3430ab7..33b87cae0a73 100644 --- a/newIDE/app/src/ObjectEditor/Editors/SpriteEditor/CollisionMasksEditor/index.js +++ b/newIDE/app/src/ObjectEditor/Editors/SpriteEditor/CollisionMasksEditor/index.js @@ -390,6 +390,10 @@ const CollisionMasksEditor = ({ animation } + hideControlsForSprite={(sprite: gdSprite) => + spriteConfiguration.adaptCollisionMaskAutomatically() || + sprite.isFullImageCollisionMask() + } /> diff --git a/newIDE/app/src/ObjectEditor/Editors/SpriteEditor/Utils/SpriteSelector.js b/newIDE/app/src/ObjectEditor/Editors/SpriteEditor/Utils/SpriteSelector.js index 3e36ff996f40..c77d0abf2406 100644 --- a/newIDE/app/src/ObjectEditor/Editors/SpriteEditor/Utils/SpriteSelector.js +++ b/newIDE/app/src/ObjectEditor/Editors/SpriteEditor/Utils/SpriteSelector.js @@ -30,6 +30,8 @@ type Props = {| setSameForAllAnimationsLabel: React.Node, setSameForAllSpritesLabel: React.Node, + + hideControlsForSprite?: (sprite: gdSprite) => boolean, |}; /** @@ -52,6 +54,7 @@ const SpriteSelector = ({ setSameForAllSprites, setSameForAllAnimationsLabel, setSameForAllSpritesLabel, + hideControlsForSprite, }: Props) => { const { animation, direction, sprite } = getCurrentElements( spriteConfiguration, @@ -60,12 +63,11 @@ const SpriteSelector = ({ spriteIndex ); - const hideControls = + const shouldHideControls = !direction || !direction.getSpritesCount() || - spriteConfiguration.adaptCollisionMaskAutomatically() || !sprite || - sprite.isFullImageCollisionMask(); + (hideControlsForSprite && hideControlsForSprite(sprite)); return ( @@ -120,7 +122,7 @@ const SpriteSelector = ({ )} - {!hideControls && ( + {!shouldHideControls && ( <> Date: Wed, 26 Jul 2023 16:11:33 +0200 Subject: [PATCH 4/4] Fix useless logic --- newIDE/app/src/ObjectEditor/Editors/SpriteEditor/index.js | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/newIDE/app/src/ObjectEditor/Editors/SpriteEditor/index.js b/newIDE/app/src/ObjectEditor/Editors/SpriteEditor/index.js index a8d7819374dd..5cbb32eea071 100644 --- a/newIDE/app/src/ObjectEditor/Editors/SpriteEditor/index.js +++ b/newIDE/app/src/ObjectEditor/Editors/SpriteEditor/index.js @@ -227,10 +227,8 @@ export default function SpriteEditor({ const firstDirection = firstAnimation.getDirection(0); if (firstDirection.getSpritesCount() === 0) return; const firstSprite = firstDirection.getSprite(0); - const firstSpriteCollisionMask = firstSprite.getCustomCollisionMask(); - sprite.setFullImageCollisionMask(!firstSpriteCollisionMask); - if (firstSpriteCollisionMask) - sprite.setCustomCollisionMask(firstSpriteCollisionMask); + sprite.setFullImageCollisionMask(firstSprite.isFullImageCollisionMask()); + sprite.setCustomCollisionMask(firstSprite.getCustomCollisionMask()); forceUpdate(); },