Skip to content

Commit 5d2b65b

Browse files
committed
Allow to install assets containing a variant.
1 parent a27f2f3 commit 5d2b65b

File tree

8 files changed

+104
-15
lines changed

8 files changed

+104
-15
lines changed

Diff for: Core/GDCore/Project/EventsBasedObjectVariant.cpp

+2
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ EventsBasedObjectVariant::~EventsBasedObjectVariant() {}
1818

1919
void EventsBasedObjectVariant::SerializeTo(SerializerElement &element) const {
2020
element.SetAttribute("name", name);
21+
element.SetAttribute("assetStoreId", GetAssetStoreId());
2122
element.SetIntAttribute("areaMinX", areaMinX);
2223
element.SetIntAttribute("areaMinY", areaMinY);
2324
element.SetIntAttribute("areaMinZ", areaMinZ);
@@ -38,6 +39,7 @@ void EventsBasedObjectVariant::SerializeTo(SerializerElement &element) const {
3839
void EventsBasedObjectVariant::UnserializeFrom(
3940
gd::Project &project, const SerializerElement &element) {
4041
name = element.GetStringAttribute("name");
42+
assetStoreId = element.GetStringAttribute("assetStoreId");
4143
areaMinX = element.GetIntAttribute("areaMinX", 0);
4244
areaMinY = element.GetIntAttribute("areaMinY", 0);
4345
areaMinZ = element.GetIntAttribute("areaMinZ", 0);

Diff for: Core/GDCore/Project/EventsBasedObjectVariant.h

+15-1
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ class Project;
1919
namespace gd {
2020
/**
2121
* \brief Represents a variation of style of an events-based object.
22-
*
22+
*
2323
* \ingroup PlatformDefinition
2424
*/
2525
class GD_CORE_API EventsBasedObjectVariant {
@@ -178,6 +178,16 @@ class GD_CORE_API EventsBasedObjectVariant {
178178
void SetAreaMaxZ(int areaMaxZ_) { areaMaxZ = areaMaxZ_; }
179179
///@}
180180

181+
/** \brief Change the asset store id of the object.
182+
*/
183+
void SetAssetStoreId(const gd::String &assetStoreId_) {
184+
assetStoreId = assetStoreId_;
185+
};
186+
187+
/** \brief Return the asset store id of the object.
188+
*/
189+
const gd::String &GetAssetStoreId() const { return assetStoreId; };
190+
181191
void SerializeTo(SerializerElement &element) const;
182192

183193
void UnserializeFrom(gd::Project &project, const SerializerElement &element);
@@ -193,6 +203,10 @@ class GD_CORE_API EventsBasedObjectVariant {
193203
double areaMaxX;
194204
double areaMaxY;
195205
double areaMaxZ;
206+
/**
207+
* The ID of the asset if the object comes from the store.
208+
*/
209+
gd::String assetStoreId;
196210
};
197211

198212
} // namespace gd

Diff for: GDevelop.js/Bindings/Bindings.idl

+2
Original file line numberDiff line numberDiff line change
@@ -3185,6 +3185,8 @@ interface EventsBasedObjectVariant {
31853185
void SetAreaMaxX(double value);
31863186
void SetAreaMaxY(double value);
31873187
void SetAreaMaxZ(double value);
3188+
void SetAssetStoreId([Const] DOMString assetStoreId);
3189+
[Const, Ref] DOMString GetAssetStoreId();
31883190

31893191
void SerializeTo([Ref] SerializerElement element);
31903192
void UnserializeFrom([Ref] Project project, [Const, Ref] SerializerElement element);

Diff for: GDevelop.js/types.d.ts

+2
Original file line numberDiff line numberDiff line change
@@ -2312,6 +2312,8 @@ export class EventsBasedObjectVariant extends EmscriptenObject {
23122312
setAreaMaxX(value: number): void;
23132313
setAreaMaxY(value: number): void;
23142314
setAreaMaxZ(value: number): void;
2315+
setAssetStoreId(assetStoreId: string): void;
2316+
getAssetStoreId(): string;
23152317
serializeTo(element: SerializerElement): void;
23162318
unserializeFrom(project: Project, element: SerializerElement): void;
23172319
}

Diff for: GDevelop.js/types/gdeventsbasedobjectvariant.js

+2
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@ declare class gdEventsBasedObjectVariant {
1818
setAreaMaxX(value: number): void;
1919
setAreaMaxY(value: number): void;
2020
setAreaMaxZ(value: number): void;
21+
setAssetStoreId(assetStoreId: string): void;
22+
getAssetStoreId(): string;
2123
serializeTo(element: gdSerializerElement): void;
2224
unserializeFrom(project: gdProject, element: gdSerializerElement): void;
2325
delete(): void;

Diff for: newIDE/app/src/AssetStore/InstallAsset.js

+52
Original file line numberDiff line numberDiff line change
@@ -153,6 +153,19 @@ export type InstallAssetArgs = {|
153153
targetObjectFolderOrObject?: ?gdObjectFolderOrObject,
154154
|};
155155

156+
const findVariant = (
157+
container: gdEventsBasedObjectVariantsContainer,
158+
assetStoreId: string
159+
): gdEventsBasedObjectVariant | null => {
160+
for (let index = 0; index < container.getVariantsCount(); index++) {
161+
const variant = container.getVariantAt(index);
162+
if (variant.getAssetStoreId()) {
163+
return variant;
164+
}
165+
}
166+
return null;
167+
};
168+
156169
export const addAssetToProject = async ({
157170
asset,
158171
project,
@@ -168,6 +181,36 @@ export const addAssetToProject = async ({
168181
const type: ?string = objectAsset.object.type;
169182
if (!type) throw new Error('An object has no type specified');
170183

184+
let variantName: string | null = null;
185+
const serializedVariant = objectAsset.variant;
186+
const isCustomObjectWithVariant =
187+
serializedVariant && project.hasEventsBasedObject(type);
188+
if (isCustomObjectWithVariant && serializedVariant) {
189+
const eventsBasedObject = project.getEventsBasedObject(type);
190+
const variants = eventsBasedObject.getVariants();
191+
variantName = serializedVariant.name;
192+
let variant = findVariant(variants, serializedVariant.assetStoreId);
193+
if (!variant) {
194+
// TODO Forbid name with `::`
195+
const uniqueNewName = newNameGenerator(variantName, tentativeNewName =>
196+
variants.hasVariantNamed(tentativeNewName)
197+
);
198+
variant = variants.insertNewVariant(
199+
uniqueNewName,
200+
variants.getVariantsCount()
201+
);
202+
variantName = uniqueNewName;
203+
}
204+
unserializeFromJSObject(
205+
variant,
206+
serializedVariant,
207+
'unserializeFrom',
208+
project
209+
);
210+
variant.setName(variantName);
211+
variant.setAssetStoreId(asset.id);
212+
}
213+
171214
// Insert the object
172215
const originalName = sanitizeObjectName(objectAsset.object.name);
173216
const newName = newNameGenerator(originalName, name =>
@@ -204,6 +247,15 @@ export const addAssetToProject = async ({
204247
);
205248

206249
object.setAssetStoreId(asset.id);
250+
if (isCustomObjectWithVariant && variantName) {
251+
const customObjectConfiguration = gd.asCustomObjectConfiguration(
252+
object.getConfiguration()
253+
);
254+
customObjectConfiguration.setVariantName(variantName);
255+
customObjectConfiguration.setMarkedAsOverridingEventsBasedObjectChildrenConfiguration(
256+
false
257+
);
258+
}
207259
// The name was overwritten after unserialization.
208260
object.setName(newName);
209261

Diff for: newIDE/app/src/ObjectsRendering/Renderers/RenderedCustomObjectInstance.js

+28-14
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
// @flow
22
import RenderedInstance from './RenderedInstance';
33
import Rendered3DInstance from './Rendered3DInstance';
4+
import RenderedUnknownInstance from './RenderedUnknownInstance';
45
import PixiResourcesLoader from '../PixiResourcesLoader';
56
import ResourcesLoader from '../../ResourcesLoader';
67
import ObjectsRenderingService from '../ObjectsRenderingService';
@@ -153,21 +154,34 @@ export default class RenderedCustomObjectInstance extends Rendered3DInstance
153154
): RenderedInstance | Rendered3DInstance => {
154155
let renderedInstance = this.renderedInstances.get(instance.ptr);
155156
if (!renderedInstance) {
156-
const customObjectConfiguration = gd.asCustomObjectConfiguration(
157-
this._associatedObjectConfiguration
158-
);
159-
//No renderer associated yet, the instance must have been just created!...
160-
const childObjectConfiguration = customObjectConfiguration.getChildObjectConfiguration(
161-
instance.getObjectName()
162-
);
157+
// No renderer associated yet, the instance must have been just created!...
158+
let childObjectConfiguration = null;
159+
const variant = this.getVariant();
160+
if (variant) {
161+
const childObjects = variant.getObjects();
162+
if (childObjects.hasObjectNamed(instance.getObjectName())) {
163+
childObjectConfiguration = childObjects
164+
.getObject(instance.getObjectName())
165+
.getConfiguration();
166+
}
167+
}
163168
//...so let's create a renderer.
164-
renderedInstance = ObjectsRenderingService.createNewInstanceRenderer(
165-
this._project,
166-
instance,
167-
childObjectConfiguration,
168-
this._pixiObject,
169-
this._threeObject
170-
);
169+
renderedInstance = childObjectConfiguration
170+
? ObjectsRenderingService.createNewInstanceRenderer(
171+
this._project,
172+
instance,
173+
childObjectConfiguration,
174+
this._pixiObject,
175+
this._threeObject
176+
)
177+
: new RenderedUnknownInstance(
178+
this._project,
179+
instance,
180+
// $FlowFixMe It's not actually used.
181+
null,
182+
this._pixiObject,
183+
PixiResourcesLoader
184+
);
171185
this.renderedInstances.set(instance.ptr, renderedInstance);
172186
}
173187
return renderedInstance;

Diff for: newIDE/app/src/Utils/GDevelopServices/Asset.js

+1
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ export type ExtensionDependency = {|
4545
export type ObjectAsset = {|
4646
object: any /*(serialized gdObjectConfiguration)*/,
4747
resources: Array<any /*(serialized gdResource)*/>,
48+
variant?: any /*(serialized gdEventsBasedObjectVariant)*/,
4849
// TODO This can become mandatory after the migration of the asset repository.
4950
requiredExtensions?: Array<ExtensionDependency>,
5051
|};

0 commit comments

Comments
 (0)