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/SpritesList.js b/newIDE/app/src/ObjectEditor/Editors/SpriteEditor/SpritesList.js index 3138cc85d991..0dfa9711bb7f 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); // Call the callback before `addSprite`, as `addSprite` will store a copy of it. 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/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 && ( <> { + 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); + sprite.setFullImageCollisionMask(firstSprite.isFullImageCollisionMask()); + sprite.setCustomCollisionMask(firstSprite.getCustomCollisionMask()); + + forceUpdate(); + }, + [spriteConfiguration, forceUpdate] + ); + const moveAnimation = React.useCallback( (targetIndex: number) => { const draggedIndex = draggedAnimationIndex.current; @@ -538,6 +553,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 + ); + } + }} /> ); }