Skip to content

Commit

Permalink
Allow to swap assets of any object type (#7365)
Browse files Browse the repository at this point in the history
  • Loading branch information
D8H authored Feb 4, 2025
1 parent 4d56333 commit 8c98239
Show file tree
Hide file tree
Showing 4 changed files with 68 additions and 17 deletions.
11 changes: 10 additions & 1 deletion newIDE/app/src/AssetStore/AssetStoreSearchFilter.js
Original file line number Diff line number Diff line change
Expand Up @@ -262,7 +262,16 @@ export class ColorAssetStoreSearchFilter
}

const toAssetStoreType = (type: string) => {
return type === 'Sprite' ? 'sprite' : type;
switch (type) {
case 'Sprite':
return 'sprite';
case 'TiledSpriteObject::TiledSprite':
return 'tiled';
case 'PanelSpriteObject::PanelSprite':
return '9patch';
default:
return type;
}
};

// Thematic tags are noise for asset swapping as changing the theme may be what
Expand Down
28 changes: 23 additions & 5 deletions newIDE/app/src/AssetStore/AssetSwapper.js
Original file line number Diff line number Diff line change
Expand Up @@ -81,10 +81,18 @@ type SpriteObjectDataType = {
animations: Array<SpriteAnimationData>,
};

export const canSwapAssetOfObject = (object: gdObject) => {
const type = object.getType();
return type === 'Scene3D::Model3DObject' || type === 'Sprite';
};
const unswappableObjectTypes = [
'BBText::BBText',
'TextObject::Text',
'Lighting::LightObject',
'PrimitiveDrawing::Drawer',
'TileMap::TileMap',
'TileMap::CollisionMask',
'TileMap::SimpleTileMap',
'Video::VideoObject',
];
export const canSwapAssetOfObject = (object: gdObject) =>
!unswappableObjectTypes.includes(object.getType());

const mergeAnimations = function<A: { name: string }>(
project: gdProject,
Expand Down Expand Up @@ -312,7 +320,7 @@ export const swapAsset = (
assetObject: gdObject,
assetShortHeader?: ?AssetShortHeader
) => {
const serializedObject = serializeToJSObject(object);
let serializedObject = serializeToJSObject(object);
const serializedAssetObject = serializeToJSObject(assetObject);

if (object.getType() === 'Sprite') {
Expand All @@ -338,6 +346,7 @@ export const swapAsset = (
scaleX,
scaleY
);
serializedObject.assetStoreId = serializedAssetObject.assetStoreId;
} else if (object.getType() === 'Scene3D::Model3DObject') {
const objectVolume =
serializedObject.content.width *
Expand Down Expand Up @@ -365,6 +374,15 @@ export const swapAsset = (
centerLocation: serializedObject.content.centerLocation,
};
serializedObject.assetStoreId = serializedAssetObject.assetStoreId;
} else {
serializedObject = {
...serializedAssetObject,
name: serializedObject.name,
type: serializedObject.type,
variables: serializedObject.variables,
behaviors: serializedObject.behaviors,
effects: serializedObject.effects,
};
}
unserializeFromJSObject(object, serializedObject, 'unserializeFrom', project);
};
Original file line number Diff line number Diff line change
Expand Up @@ -90,22 +90,22 @@ const sortedContentType: PrivateAssetPackAssetType[] = [
'TileMap::SimpleTileMap',
'ParticleSystem::ParticleEmitter',
'font',
'bitmapFont',
'audio',
'partial',
];

const contentTypeToMessageDescriptor: {
[PrivateAssetPackAssetType]: MessageDescriptor,
} = {
sprite: t`Sprites`,
'9patch': t`Panel sprites`,
tiled: t`Tiled sprites`,
sprite: t`sprites`,
'9patch': t`panel sprites`,
tiled: t`tiled sprites`,
'Scene3D::Model3DObject': t`3D models`,
'TileMap::SimpleTileMap': t`Tilemaps`,
'ParticleSystem::ParticleEmitter': t`Particle emitters`,
font: t`Fonts`,
audio: t`Audios`,
partial: t`Other`,
'TileMap::SimpleTileMap': t`tile maps`,
'ParticleSystem::ParticleEmitter': t`particle emitters`,
font: t`fonts`,
bitmapFont: t`bitmap fonts`,
audio: t`audios`,
};

const styles = {
Expand Down Expand Up @@ -521,6 +521,23 @@ const PrivateAssetPackInformationPage = ({
{ subscription, privateAssetPackListingData, isAlreadyReceived }
);

const smartObjectsCount = React.useMemo(
() => {
if (!assetPack) {
return 0;
}
let smartObjectsCount = 0;
for (const type in assetPack.content) {
const assetCount = assetPack.content[type];
if (!sortedContentType.includes(type)) {
smartObjectsCount += assetCount;
}
}
return smartObjectsCount;
},
[assetPack]
);

return (
<I18n>
{({ i18n }) => (
Expand Down Expand Up @@ -714,6 +731,13 @@ const PrivateAssetPackInformationPage = ({
}
return null;
})}
{smartObjectsCount > 0 ? (
<li>
<Text displayInlineAsSpan noMargin>
<Trans>{smartObjectsCount} smart objects</Trans>
</Text>
</li>
) : null}
</Column>
{bundlesContainingPackTiles &&
bundlesContainingPackTiles.length ? (
Expand Down
4 changes: 2 additions & 2 deletions newIDE/app/src/Utils/GDevelopServices/Asset.js
Original file line number Diff line number Diff line change
Expand Up @@ -102,10 +102,10 @@ export type PrivateAssetPackAssetType =
| 'sprite'
| '9patch'
| 'tiled'
| 'partial'
| 'Scene3D::Model3DObject'
| 'TileMap::SimpleTileMap'
| 'ParticleSystem::ParticleEmitter';
| 'ParticleSystem::ParticleEmitter'
| string;

export type PrivateAssetPackContent = { [PrivateAssetPackAssetType]: number };

Expand Down

0 comments on commit 8c98239

Please sign in to comment.