mirror of
https://github.com/4ian/GDevelop.git
synced 2025-10-15 10:19:04 +00:00

* See more about using [JavaScript on this page](https://wiki.gdevelop.io/gdevelop5/events/js-code/javascript-in-extensions/#experimental-new-option-javascript-files-in-your-project). Only show in developer changelog
156 lines
5.7 KiB
C++
156 lines
5.7 KiB
C++
/*
|
|
* GDevelop Core
|
|
* Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights
|
|
* reserved. This project is released under the MIT License.
|
|
*/
|
|
#include "ResourceExposer.h"
|
|
|
|
#include "GDCore/Extensions/Metadata/EffectMetadata.h"
|
|
#include "GDCore/Extensions/Metadata/MetadataProvider.h"
|
|
#include "GDCore/Extensions/Platform.h"
|
|
#include "GDCore/IDE/Events/ArbitraryEventsWorker.h"
|
|
#include "GDCore/IDE/Project/ArbitraryResourceWorker.h"
|
|
#include "GDCore/IDE/ProjectBrowserHelper.h"
|
|
#include "GDCore/Project/Effect.h"
|
|
#include "GDCore/Project/EventsFunctionsExtension.h"
|
|
#include "GDCore/Project/Layout.h"
|
|
#include "GDCore/Project/Project.h"
|
|
#include "GDCore/String.h"
|
|
|
|
namespace gd {
|
|
|
|
void ResourceExposer::ExposeWholeProjectResources(
|
|
gd::Project &project, gd::ArbitraryResourceWorker &worker) {
|
|
// See also gd::ProjectBrowserHelper::ExposeProjectEvents for a method that
|
|
// traverse the whole project (this time for events) and ExposeProjectEffects
|
|
// (this time for effects).
|
|
|
|
// Expose any project resources as files.
|
|
worker.ExposeResources();
|
|
|
|
project.GetPlatformSpecificAssets().ExposeResources(worker);
|
|
|
|
// Expose event resources
|
|
auto eventWorker = gd::GetResourceWorkerOnEvents(project, worker);
|
|
gd::ProjectBrowserHelper::ExposeProjectEvents(project, eventWorker);
|
|
|
|
// Expose object configuration resources
|
|
auto objectWorker = gd::GetResourceWorkerOnObjects(project, worker);
|
|
gd::ProjectBrowserHelper::ExposeProjectObjects(project, objectWorker);
|
|
|
|
// Expose layer effect resources
|
|
for (std::size_t layoutIndex = 0; layoutIndex < project.GetLayoutsCount();
|
|
layoutIndex++) {
|
|
auto &layout = project.GetLayout(layoutIndex);
|
|
|
|
for (std::size_t layerIndex = 0; layerIndex < layout.GetLayersCount();
|
|
layerIndex++) {
|
|
auto &layer = layout.GetLayer(layerIndex);
|
|
|
|
auto &effects = layer.GetEffects();
|
|
for (size_t effectIndex = 0; effectIndex < effects.GetEffectsCount();
|
|
effectIndex++) {
|
|
auto &effect = effects.GetEffect(effectIndex);
|
|
gd::ResourceExposer::ExposeEffectResources(
|
|
project.GetCurrentPlatform(), effect, worker);
|
|
}
|
|
}
|
|
}
|
|
|
|
// Expose loading screen background image if present
|
|
auto &loadingScreen = project.GetLoadingScreen();
|
|
if (loadingScreen.GetBackgroundImageResourceName() != "")
|
|
worker.ExposeImage(loadingScreen.GetBackgroundImageResourceName());
|
|
|
|
// Expose extension source files
|
|
for (std::size_t e = 0; e < project.GetEventsFunctionsExtensionsCount();
|
|
e++) {
|
|
auto &eventsFunctionsExtension = project.GetEventsFunctionsExtension(e);
|
|
ExposeExtensionResources(eventsFunctionsExtension, worker);
|
|
}
|
|
}
|
|
|
|
void ResourceExposer::ExposeProjectResources(
|
|
gd::Project &project, gd::ArbitraryResourceWorker &worker) {
|
|
// Expose global objects configuration resources
|
|
auto objectWorker = gd::GetResourceWorkerOnObjects(project, worker);
|
|
objectWorker.Launch(project.GetObjects());
|
|
}
|
|
|
|
void ResourceExposer::ExposeLayoutResources(
|
|
gd::Project &project,
|
|
gd::Layout &layout,
|
|
gd::ArbitraryResourceWorker &worker) {
|
|
// Expose object configuration resources
|
|
auto objectWorker = gd::GetResourceWorkerOnObjects(project, worker);
|
|
gd::ProjectBrowserHelper::ExposeLayoutObjects(layout, objectWorker);
|
|
|
|
// Expose layer effect resources
|
|
for (std::size_t layerIndex = 0; layerIndex < layout.GetLayersCount();
|
|
layerIndex++) {
|
|
auto &layer = layout.GetLayer(layerIndex);
|
|
|
|
auto &effects = layer.GetEffects();
|
|
for (size_t effectIndex = 0; effectIndex < effects.GetEffectsCount();
|
|
effectIndex++) {
|
|
auto &effect = effects.GetEffect(effectIndex);
|
|
gd::ResourceExposer::ExposeEffectResources(
|
|
project.GetCurrentPlatform(), effect, worker);
|
|
}
|
|
}
|
|
|
|
// Expose event resources
|
|
auto eventWorker = gd::GetResourceWorkerOnEvents(project, worker);
|
|
gd::ProjectBrowserHelper::ExposeLayoutEventsAndDependencies(
|
|
project, layout, eventWorker);
|
|
|
|
// Exposed extension event resources
|
|
// Note that using resources in extensions is very unlikely and probably not
|
|
// worth the effort of something smart.
|
|
for (std::size_t e = 0; e < project.GetEventsFunctionsExtensionsCount();
|
|
e++) {
|
|
auto &eventsFunctionsExtension = project.GetEventsFunctionsExtension(e);
|
|
gd::ProjectBrowserHelper::ExposeEventsFunctionsExtensionEvents(
|
|
project, eventsFunctionsExtension, eventWorker);
|
|
}
|
|
}
|
|
|
|
void ResourceExposer::ExposeEffectResources(
|
|
gd::Platform &platform,
|
|
gd::Effect &effect,
|
|
gd::ArbitraryResourceWorker &worker) {
|
|
auto &effectMetadata =
|
|
MetadataProvider::GetEffectMetadata(platform, effect.GetEffectType());
|
|
|
|
for (auto &propertyPair : effectMetadata.GetProperties()) {
|
|
auto &propertyName = propertyPair.first;
|
|
auto &propertyDescriptor = propertyPair.second;
|
|
|
|
if (propertyDescriptor.GetType() == "resource" &&
|
|
propertyDescriptor.GetExtraInfo().size() > 0) {
|
|
auto &resourceType = propertyDescriptor.GetExtraInfo()[0];
|
|
|
|
const gd::String &resourceName = effect.GetStringParameter(propertyName);
|
|
if (!resourceName.empty()) {
|
|
gd::String potentiallyUpdatedResourceName = resourceName;
|
|
worker.ExposeResourceWithType(resourceType,
|
|
potentiallyUpdatedResourceName);
|
|
if (potentiallyUpdatedResourceName != resourceName) {
|
|
effect.SetStringParameter(propertyName,
|
|
potentiallyUpdatedResourceName);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
void ResourceExposer::ExposeExtensionResources(
|
|
gd::EventsFunctionsExtension &extension,
|
|
gd::ArbitraryResourceWorker &worker) {
|
|
for (auto &sourceFile : extension.GetAllSourceFiles()) {
|
|
worker.ExposeJavaScript(sourceFile.GetResourceName());
|
|
}
|
|
}
|
|
|
|
} // namespace gd
|