From 318099504ccde5dcafe5e03861a50369512ed65e Mon Sep 17 00:00:00 2001 From: D8H Date: Wed, 21 Jun 2023 14:46:34 +0200 Subject: [PATCH] Handle 3D models in the asset store (#5427) --- Core/GDCore/Project/CustomObjectConfiguration.cpp | 2 ++ GDevelop.js/scripts/generate-types.js | 4 ++-- GDevelop.js/types/gdresource.js | 4 ++-- newIDE/app/src/AssetStore/AssetStoreFilterPanel.js | 1 + newIDE/app/src/AssetStore/InstallAsset.js | 2 ++ .../PrivateAssets/PrivateAssetPackInformationPage.js | 2 ++ .../app/src/AssetStore/ResourceStore/ResourceCard.js | 11 +++++++++++ .../FileToCloudProjectResourceUploader.spec.js | 3 +++ newIDE/app/src/Utils/GDevelopServices/Asset.js | 3 ++- .../AssetStore/ResourceStore/ResourceStore.stories.js | 8 ++++++++ 10 files changed, 35 insertions(+), 5 deletions(-) diff --git a/Core/GDCore/Project/CustomObjectConfiguration.cpp b/Core/GDCore/Project/CustomObjectConfiguration.cpp index 55a83d35ca..08bdd8ab3e 100644 --- a/Core/GDCore/Project/CustomObjectConfiguration.cpp +++ b/Core/GDCore/Project/CustomObjectConfiguration.cpp @@ -153,6 +153,8 @@ void CustomObjectConfiguration::ExposeResources(gd::ArbitraryResourceWorker& wor worker.ExposeTileset(newPropertyValue); } else if (resourceType == "bitmapFont") { worker.ExposeBitmapFont(newPropertyValue); + } else if (resourceType == "model3D") { + worker.ExposeModel3D(newPropertyValue); } if (newPropertyValue != oldPropertyValue) { diff --git a/GDevelop.js/scripts/generate-types.js b/GDevelop.js/scripts/generate-types.js index f8f55c28a0..d9dc770de7 100644 --- a/GDevelop.js/scripts/generate-types.js +++ b/GDevelop.js/scripts/generate-types.js @@ -328,13 +328,13 @@ type ParticleEmitterObject_RendererType = 0 | 1 | 2` shell.sed( '-i', /setKind\(kind: string\): void/, - "setKind(kind: 'image' | 'audio' | 'font' | 'video' | 'json' | 'tilemap' | 'tileset'): void", + "setKind(kind: 'image' | 'audio' | 'font' | 'video' | 'json' | 'tilemap' | 'tileset' | 'model3D'): void", 'types/gdresource.js' ); shell.sed( '-i', /getKind\(\): string/, - "getKind(): 'image' | 'audio' | 'font' | 'video' | 'json' | 'tilemap' | 'tileset'", + "getKind(): 'image' | 'audio' | 'font' | 'video' | 'json' | 'tilemap' | 'tileset' | 'model3D'", 'types/gdresource.js' ); diff --git a/GDevelop.js/types/gdresource.js b/GDevelop.js/types/gdresource.js index 3882162bc8..bc122052f2 100644 --- a/GDevelop.js/types/gdresource.js +++ b/GDevelop.js/types/gdresource.js @@ -4,8 +4,8 @@ declare class gdResource { clone(): gdResource; setName(name: string): void; getName(): string; - setKind(kind: 'image' | 'audio' | 'font' | 'video' | 'json' | 'tilemap' | 'tileset'): void; - getKind(): 'image' | 'audio' | 'font' | 'video' | 'json' | 'tilemap' | 'tileset'; + setKind(kind: 'image' | 'audio' | 'font' | 'video' | 'json' | 'tilemap' | 'tileset' | 'model3D'): void; + getKind(): 'image' | 'audio' | 'font' | 'video' | 'json' | 'tilemap' | 'tileset' | 'model3D'; isUserAdded(): boolean; setUserAdded(yes: boolean): void; useFile(): boolean; diff --git a/newIDE/app/src/AssetStore/AssetStoreFilterPanel.js b/newIDE/app/src/AssetStore/AssetStoreFilterPanel.js index db8d4c5607..c4038cbd9e 100644 --- a/newIDE/app/src/AssetStore/AssetStoreFilterPanel.js +++ b/newIDE/app/src/AssetStore/AssetStoreFilterPanel.js @@ -307,6 +307,7 @@ export const AssetStoreFilterPanel = ({ { label: t`Sprite`, value: 'sprite' }, { label: t`Tiled sprite`, value: 'tiled' }, { label: t`Panel sprite`, value: '9patch' }, + { label: t`3D model`, value: 'model3D' }, ]} values={assetFiltersState.objectTypeFilter.objectTypes} setValues={values => { diff --git a/newIDE/app/src/AssetStore/InstallAsset.js b/newIDE/app/src/AssetStore/InstallAsset.js index ecde49ebbb..b99e162093 100644 --- a/newIDE/app/src/AssetStore/InstallAsset.js +++ b/newIDE/app/src/AssetStore/InstallAsset.js @@ -119,6 +119,8 @@ export const installResource = ( newResource = new gd.VideoResource(); } else if (serializedResource.kind === 'json') { newResource = new gd.JsonResource(); + } else if (serializedResource.kind === 'model3D') { + newResource = new gd.Model3DResource(); } else { throw new Error( `Resource of kind "${serializedResource.kind}" is not supported.` diff --git a/newIDE/app/src/AssetStore/PrivateAssets/PrivateAssetPackInformationPage.js b/newIDE/app/src/AssetStore/PrivateAssets/PrivateAssetPackInformationPage.js index a626207529..fc1797803b 100644 --- a/newIDE/app/src/AssetStore/PrivateAssets/PrivateAssetPackInformationPage.js +++ b/newIDE/app/src/AssetStore/PrivateAssets/PrivateAssetPackInformationPage.js @@ -49,6 +49,7 @@ const sortedContentType = [ 'particleEmitter', 'font', 'audio', + 'model3D', 'partial', ]; @@ -56,6 +57,7 @@ const contentTypeToMessageDescriptor = { sprite: t`Sprites`, '9patch': t`Panel sprites`, tiled: t`Tiled sprites`, + model3D: t`3D model`, particleEmitter: t`Particle emitters`, font: t`Fonts`, audio: t`Audios`, diff --git a/newIDE/app/src/AssetStore/ResourceStore/ResourceCard.js b/newIDE/app/src/AssetStore/ResourceStore/ResourceCard.js index 358ea0de13..9784869d7e 100644 --- a/newIDE/app/src/AssetStore/ResourceStore/ResourceCard.js +++ b/newIDE/app/src/AssetStore/ResourceStore/ResourceCard.js @@ -210,6 +210,17 @@ export const ResourceCard = ({ resource, onChoose, size }: Props) => { ); + case 'model3D': + return ( + + + + + + Choose} /> + + + ); default: return null; } diff --git a/newIDE/app/src/ResourcesList/FileToCloudProjectResourceUploader.spec.js b/newIDE/app/src/ResourcesList/FileToCloudProjectResourceUploader.spec.js index c8dd294f18..e5f11ab6c8 100644 --- a/newIDE/app/src/ResourcesList/FileToCloudProjectResourceUploader.spec.js +++ b/newIDE/app/src/ResourcesList/FileToCloudProjectResourceUploader.spec.js @@ -28,5 +28,8 @@ describe('FileToCloudProjectResourceUploader', () => { expect(getInputAcceptedMimesAndExtensions('video')).toMatchInlineSnapshot( `"video/mp4,video/webm,.mp4,.webm"` ); + expect(getInputAcceptedMimesAndExtensions('model3D')).toMatchInlineSnapshot( + `"model/gltf-binary,.glb"` + ); }); }); diff --git a/newIDE/app/src/Utils/GDevelopServices/Asset.js b/newIDE/app/src/Utils/GDevelopServices/Asset.js index 9e29aafefc..099a034a05 100644 --- a/newIDE/app/src/Utils/GDevelopServices/Asset.js +++ b/newIDE/app/src/Utils/GDevelopServices/Asset.js @@ -88,7 +88,8 @@ type PrivateAssetPackAssetType = | '9patch' | 'tiled' | 'partial' - | 'particleEmitter'; + | 'particleEmitter' + | 'model3D'; export type PrivateAssetPackContent = { [PrivateAssetPackAssetType]: number }; diff --git a/newIDE/app/src/stories/componentStories/AssetStore/ResourceStore/ResourceStore.stories.js b/newIDE/app/src/stories/componentStories/AssetStore/ResourceStore/ResourceStore.stories.js index 0f4643c918..c6e0aee194 100644 --- a/newIDE/app/src/stories/componentStories/AssetStore/ResourceStore/ResourceStore.stories.js +++ b/newIDE/app/src/stories/componentStories/AssetStore/ResourceStore/ResourceStore.stories.js @@ -45,3 +45,11 @@ export const SvgResource = () => ( ); + +export const Model3DResource = () => ( + + + + + +);