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 = () => (
+
+
+
+
+
+);