Skip to content

Commit 8a4a019

Browse files
committed
Use the variant at runtime.
1 parent 5e7a8e0 commit 8a4a019

6 files changed

+79
-28
lines changed

Core/GDCore/IDE/ProjectBrowserHelper.cpp

+6
Original file line numberDiff line numberDiff line change
@@ -314,6 +314,12 @@ void ProjectBrowserHelper::ExposeProjectObjects(
314314
eventsFunctionsExtension.GetEventsBasedObjects().GetInternalVector()) {
315315
auto eventsBasedObject = eventsBasedObjectUniquePtr.get();
316316
worker.Launch(eventsBasedObject->GetObjects());
317+
318+
for (auto &&variantUniquePtr :
319+
eventsBasedObject->GetVariants().GetInternalVector()) {
320+
auto variant = variantUniquePtr.get();
321+
worker.Launch(variant->GetObjects());
322+
}
317323
}
318324
}
319325
};

Core/GDCore/Project/CustomObjectConfiguration.cpp

+21-3
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ using namespace gd;
1919

2020
void CustomObjectConfiguration::Init(const gd::CustomObjectConfiguration& objectConfiguration) {
2121
project = objectConfiguration.project;
22+
variantName = objectConfiguration.variantName;
2223
objectContent = objectConfiguration.objectContent;
2324
animations = objectConfiguration.animations;
2425
isMarkedAsOverridingEventsBasedObjectChildrenConfiguration =
@@ -249,9 +250,26 @@ void CustomObjectConfiguration::ExposeResources(gd::ArbitraryResourceWorker& wor
249250
}
250251
const auto &eventsBasedObject = project->GetEventsBasedObject(GetType());
251252

252-
for (auto& childObject : eventsBasedObject.GetObjects().GetObjects()) {
253-
auto &configuration = GetChildObjectConfiguration(childObject->GetName());
254-
configuration.ExposeResources(worker);
253+
if (isMarkedAsOverridingEventsBasedObjectChildrenConfiguration) {
254+
for (auto &childObject : eventsBasedObject.GetObjects().GetObjects()) {
255+
auto &configuration = GetChildObjectConfiguration(childObject->GetName());
256+
configuration.ExposeResources(worker);
257+
}
258+
} else {
259+
if (variantName.empty() ||
260+
!eventsBasedObject.GetVariants().HasVariantNamed(variantName)) {
261+
for (auto &childObject :
262+
eventsBasedObject.GetDefaultVariant().GetObjects().GetObjects()) {
263+
childObject->GetConfiguration().ExposeResources(worker);
264+
}
265+
} else {
266+
for (auto &childObject : eventsBasedObject.GetVariants()
267+
.GetVariant(variantName)
268+
.GetObjects()
269+
.GetObjects()) {
270+
childObject->GetConfiguration().ExposeResources(worker);
271+
}
272+
}
255273
}
256274
}
257275

Core/GDCore/Project/CustomObjectConfiguration.h

+3-3
Original file line numberDiff line numberDiff line change
@@ -29,9 +29,9 @@ namespace gd {
2929
* "resource".
3030
*/
3131
class CustomObjectConfiguration : public gd::ObjectConfiguration {
32-
public:
33-
CustomObjectConfiguration(const Project& project_, const String& type_)
34-
: project(&project_), isMarkedAsOverridingEventsBasedObjectChildrenConfiguration(false) {
32+
public:
33+
CustomObjectConfiguration(const Project &project_, const String &type_)
34+
: project(&project_) {
3535
SetType(type_);
3636
}
3737
std::unique_ptr<gd::ObjectConfiguration> Clone() const override;

GDJS/Runtime/CustomRuntimeObject.ts

+29-12
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ namespace gdjs {
1212

1313
export type CustomObjectConfiguration = ObjectConfiguration & {
1414
animatable?: SpriteAnimationData[];
15+
variant: string;
1516
childrenContent: { [objectName: string]: ObjectConfiguration & any };
1617
};
1718

@@ -92,34 +93,50 @@ namespace gdjs {
9293
}
9394

9495
private _initializeFromObjectData(
95-
objectData: ObjectData & CustomObjectConfiguration
96+
customObjectData: ObjectData & CustomObjectConfiguration
9697
) {
9798
const eventsBasedObjectData = this._runtimeScene
9899
.getGame()
99-
.getEventsBasedObjectData(objectData.type);
100+
.getEventsBasedObjectData(customObjectData.type);
100101
if (!eventsBasedObjectData) {
101102
logger.error(
102-
`A CustomRuntimeObject was initialized (or re-initialized) from object data referring to an non existing events based object data with type "${objectData.type}".`
103+
`A CustomRuntimeObject was initialized (or re-initialized) from object data referring to an non existing events based object data with type "${customObjectData.type}".`
103104
);
104105
return;
105106
}
107+
108+
let usedVariantData: EventsBasedObjectVariantData = eventsBasedObjectData;
109+
if (customObjectData.variant) {
110+
for (
111+
let variantIndex = 0;
112+
variantIndex < eventsBasedObjectData.variants.length;
113+
variantIndex++
114+
) {
115+
const variantData = eventsBasedObjectData.variants[variantIndex];
116+
if (variantData.name === customObjectData.variant) {
117+
usedVariantData = variantData;
118+
break;
119+
}
120+
}
121+
}
122+
106123
this._isInnerAreaFollowingParentSize =
107124
eventsBasedObjectData.isInnerAreaFollowingParentSize;
108-
if (eventsBasedObjectData.instances.length > 0) {
125+
if (usedVariantData.instances.length > 0) {
109126
if (!this._innerArea) {
110127
this._innerArea = {
111128
min: [0, 0, 0],
112129
max: [0, 0, 0],
113130
};
114131
}
115-
this._innerArea.min[0] = eventsBasedObjectData.areaMinX;
116-
this._innerArea.min[1] = eventsBasedObjectData.areaMinY;
117-
this._innerArea.min[2] = eventsBasedObjectData.areaMinZ;
118-
this._innerArea.max[0] = eventsBasedObjectData.areaMaxX;
119-
this._innerArea.max[1] = eventsBasedObjectData.areaMaxY;
120-
this._innerArea.max[2] = eventsBasedObjectData.areaMaxZ;
121-
}
122-
this._instanceContainer.loadFrom(objectData, eventsBasedObjectData);
132+
this._innerArea.min[0] = usedVariantData.areaMinX;
133+
this._innerArea.min[1] = usedVariantData.areaMinY;
134+
this._innerArea.min[2] = usedVariantData.areaMinZ;
135+
this._innerArea.max[0] = usedVariantData.areaMaxX;
136+
this._innerArea.max[1] = usedVariantData.areaMaxY;
137+
this._innerArea.max[2] = usedVariantData.areaMaxZ;
138+
}
139+
this._instanceContainer.loadFrom(customObjectData, usedVariantData);
123140
}
124141

125142
protected abstract _createRender():

GDJS/Runtime/CustomRuntimeObjectInstanceContainer.ts

+9-9
Original file line numberDiff line numberDiff line change
@@ -65,21 +65,21 @@ namespace gdjs {
6565
*/
6666
loadFrom(
6767
customObjectData: ObjectData & CustomObjectConfiguration,
68-
eventsBasedObjectData: EventsBasedObjectData
68+
eventsBasedObjectVariantData: EventsBasedObjectVariantData
6969
) {
7070
if (this._isLoaded) {
7171
this.onDestroyFromScene(this._parent);
7272
}
7373

74-
this._setOriginalInnerArea(eventsBasedObjectData);
74+
this._setOriginalInnerArea(eventsBasedObjectVariantData);
7575

7676
// Registering objects
7777
for (
78-
let i = 0, len = eventsBasedObjectData.objects.length;
78+
let i = 0, len = eventsBasedObjectVariantData.objects.length;
7979
i < len;
8080
++i
8181
) {
82-
const childObjectData = eventsBasedObjectData.objects[i];
82+
const childObjectData = eventsBasedObjectVariantData.objects[i];
8383
if (customObjectData.childrenContent) {
8484
this.registerObject({
8585
...childObjectData,
@@ -92,14 +92,14 @@ namespace gdjs {
9292
}
9393
}
9494

95-
if (eventsBasedObjectData.layers.length > 0) {
95+
if (eventsBasedObjectVariantData.layers.length > 0) {
9696
// Load layers
9797
for (
98-
let i = 0, len = eventsBasedObjectData.layers.length;
98+
let i = 0, len = eventsBasedObjectVariantData.layers.length;
9999
i < len;
100100
++i
101101
) {
102-
this.addLayer(eventsBasedObjectData.layers[i]);
102+
this.addLayer(eventsBasedObjectVariantData.layers[i]);
103103
}
104104
} else {
105105
// Add a default layer
@@ -128,7 +128,7 @@ namespace gdjs {
128128
}
129129

130130
this.createObjectsFrom(
131-
eventsBasedObjectData.instances,
131+
eventsBasedObjectVariantData.instances,
132132
0,
133133
0,
134134
0,
@@ -147,7 +147,7 @@ namespace gdjs {
147147
* `_initialInnerArea` is shared by every instance to save memory.
148148
*/
149149
private _setOriginalInnerArea(
150-
eventsBasedObjectData: EventsBasedObjectData
150+
eventsBasedObjectData: EventsBasedObjectVariantData
151151
) {
152152
if (eventsBasedObjectData.instances.length > 0) {
153153
if (!eventsBasedObjectData._initialInnerArea) {

GDJS/Runtime/types/project-data.d.ts

+11-1
Original file line numberDiff line numberDiff line change
@@ -206,9 +206,16 @@ declare interface SceneAndExtensionsData {
206206
usedExtensionsWithVariablesData: EventsFunctionsExtensionData[];
207207
}
208208

209-
declare interface EventsBasedObjectData extends InstanceContainerData {
209+
declare interface EventsBasedObjectData
210+
extends EventsBasedObjectVariantData,
211+
InstanceContainerData {
210212
name: string;
211213
isInnerAreaFollowingParentSize: boolean;
214+
variants: Array<EventsBasedObjectVariantData>;
215+
}
216+
217+
declare interface EventsBasedObjectVariantData extends InstanceContainerData {
218+
name: string;
212219
// The flat representation of defaultSize.
213220
areaMinX: float;
214221
areaMinY: float;
@@ -225,6 +232,9 @@ declare interface EventsBasedObjectData extends InstanceContainerData {
225232
min: [float, float, float];
226233
max: [float, float, float];
227234
} | null;
235+
instances: InstanceData[];
236+
objects: ObjectData[];
237+
layers: LayerData[];
228238
}
229239

230240
declare interface BehaviorSharedData {

0 commit comments

Comments
 (0)