Compare commits

..

3 Commits

Author SHA1 Message Date
Clément Pasteau
2a621f2b92 Send error stack 2023-10-10 16:17:20 +02:00
Clément Pasteau
fdf6a1e41e Limit trace 2023-10-10 15:24:22 +02:00
Clément Pasteau
8e731188f9 Improve error message and component when crash 2023-10-10 15:09:27 +02:00
684 changed files with 13811 additions and 52518 deletions

View File

@@ -30,7 +30,7 @@ jobs:
- run: - run:
name: Install Emscripten (for GDevelop.js) name: Install Emscripten (for GDevelop.js)
command: git clone https://github.com/juj/emsdk.git && cd emsdk && ./emsdk install 3.1.21 && ./emsdk activate 3.1.21 && cd .. command: git clone https://github.com/juj/emsdk.git && cd emsdk && ./emsdk install 1.39.6 && ./emsdk activate 1.39.6 && cd ..
# GDevelop.js dependencies # GDevelop.js dependencies
- restore_cache: - restore_cache:
@@ -107,7 +107,7 @@ jobs:
- run: - run:
name: Install Emscripten (for GDevelop.js) name: Install Emscripten (for GDevelop.js)
command: git clone https://github.com/juj/emsdk.git && cd emsdk && ./emsdk install 3.1.21 && ./emsdk activate 3.1.21 && cd .. command: git clone https://github.com/juj/emsdk.git && cd emsdk && ./emsdk install 1.39.6 && ./emsdk activate 1.39.6 && cd ..
- run: - run:
name: Install system dependencies for Electron builder name: Install system dependencies for Electron builder
@@ -127,8 +127,7 @@ jobs:
# Build GDevelop.js (and run tests to ensure it works) # Build GDevelop.js (and run tests to ensure it works)
- run: - run:
name: Build GDevelop.js name: Build GDevelop.js
# Use "--runInBand" as it's faster and avoid deadlocks on CircleCI Linux machines (probably because limited in processes number). command: cd GDevelop.js && source ../emsdk/emsdk_env.sh && npm run build && npm test && cd ..
command: cd GDevelop.js && source ../emsdk/emsdk_env.sh && npm run build && npm test -- --runInBand && cd ..
# GDevelop IDE dependencies (after building GDevelop.js to avoid downloading a pre-built version) # GDevelop IDE dependencies (after building GDevelop.js to avoid downloading a pre-built version)
- run: - run:
@@ -185,7 +184,7 @@ jobs:
- run: - run:
name: Install Emscripten (for GDevelop.js) name: Install Emscripten (for GDevelop.js)
command: git clone https://github.com/juj/emsdk.git && cd emsdk && ./emsdk install 3.1.21 && ./emsdk activate 3.1.21 && cd .. command: git clone https://github.com/juj/emsdk.git && cd emsdk && ./emsdk install 1.39.6 && ./emsdk activate 1.39.6 && cd ..
# GDevelop.js dependencies # GDevelop.js dependencies
- restore_cache: - restore_cache:
@@ -201,8 +200,7 @@ jobs:
# Build GDevelop.js (and run tests to ensure it works) # Build GDevelop.js (and run tests to ensure it works)
- run: - run:
name: Build GDevelop.js name: Build GDevelop.js
# Use "--runInBand" as it's faster and avoid deadlocks on CircleCI Linux machines (probably because limited in processes number). command: cd GDevelop.js && source ../emsdk/emsdk_env.sh && npm run build && npm test && cd ..
command: cd GDevelop.js && source ../emsdk/emsdk_env.sh && npm run build && npm test -- --runInBand && cd ..
- save_cache: - save_cache:
paths: paths:

View File

@@ -1,37 +0,0 @@
name: 💥 Automatic crash report
description: Do not use this template for bug reports. This template is only for automatic crash reports.
body:
- type: textarea
id: description
attributes:
label: Describe what you were doing when the crash happened
description: If applicable, add screenshots to help explain your problem.
placeholder: |
1. Went to '...'
2. Clicked on '...'
3. Scrolled down to '...'
4. Saw error
- type: input
id: gdevelop_version
attributes:
label: GDevelop version
description: |
The version of GDevelop used. Leave the prefilled value.
validations:
required: true
- type: textarea
id: platform_info
attributes:
label: Platform info
description: |
The platform you are using GDevelop on. Leave the prefilled value.
- type: textarea
id: error_stack
attributes:
label: Additional error context
description: Additonal context about the problem. Leave the prefilled value.
- type: textarea
id: component_stack
attributes:
label: Additional component context
description: Additonal context about the problem. Leave the prefilled value.

View File

@@ -2,21 +2,18 @@ name: 🐛Bug report
description: Create a bug report about GDevelop or the game engine description: Create a bug report about GDevelop or the game engine
body: body:
- type: checkboxes - type: checkboxes
id: searched_issues
attributes: attributes:
label: Is there an existing issue for this? label: Is there an existing issue for this?
options: options:
- label: I have searched the [existing issues](https://github.com/4ian/GDevelop/issues) - label: I have searched the [existing issues](https://github.com/4ian/GDevelop/issues)
required: true required: true
- type: textarea - type: textarea
id: description
attributes: attributes:
label: Describe the bug label: Describe the bug
description: A clear and concise description of what the bug is. description: A clear and concise description of what the bug is.
validations: validations:
required: true required: true
- type: textarea - type: textarea
id: reproduction_steps
attributes: attributes:
label: Steps to reproduce label: Steps to reproduce
description: | description: |
@@ -30,7 +27,6 @@ body:
validations: validations:
required: true required: true
- type: dropdown - type: dropdown
id: platform
attributes: attributes:
label: GDevelop platform label: GDevelop platform
description: Which platform of GDevelop are you using? description: Which platform of GDevelop are you using?
@@ -42,7 +38,6 @@ body:
validations: validations:
required: true required: true
- type: input - type: input
id: gdevelop_version
attributes: attributes:
label: GDevelop version label: GDevelop version
description: | description: |
@@ -52,7 +47,6 @@ body:
validations: validations:
required: true required: true
- type: textarea - type: textarea
id: platform_info
attributes: attributes:
label: Platform info label: Platform info
value: | value: |
@@ -72,7 +66,6 @@ body:
</details> </details>
- type: textarea - type: textarea
id: additional_context
attributes: attributes:
label: Additional context label: Additional context
description: Add any other context about the problem here. description: Add any other context about the problem here.

View File

@@ -14,7 +14,7 @@ tasks:
init: | init: |
sudo apt-get update sudo apt-get update
sudo apt install cmake python-is-python3 python3-distutils -y sudo apt install cmake python-is-python3 python3-distutils -y
git clone https://github.com/juj/emsdk.git && cd emsdk && ./emsdk install 3.1.21 && ./emsdk activate 3.1.21 && cd .. git clone https://github.com/juj/emsdk.git && cd emsdk && ./emsdk install 1.39.6 && ./emsdk activate 1.39.6 && cd ..
cd GDevelop.js cd GDevelop.js
npm install npm install
source ../emsdk/emsdk_env.sh && npm run build -- --dev source ../emsdk/emsdk_env.sh && npm run build -- --dev

View File

@@ -39,7 +39,7 @@ install:
- cd .. - cd ..
# Install Emscripten (for GDevelop.js) # Install Emscripten (for GDevelop.js)
- git clone https://github.com/juj/emsdk.git - git clone https://github.com/juj/emsdk.git
- cd emsdk && ./emsdk install 3.1.21 && ./emsdk activate 3.1.21 && cd .. - cd emsdk && ./emsdk install 1.39.6 && ./emsdk activate 1.39.6 && cd ..
# Install GDevelop.js dependencies # Install GDevelop.js dependencies
- cd GDevelop.js && npm install && cd .. - cd GDevelop.js && npm install && cd ..
# Build GDevelop.js # Build GDevelop.js

View File

@@ -113,8 +113,7 @@
"memory_resource": "cpp", "memory_resource": "cpp",
"__bits": "cpp", "__bits": "cpp",
"__verbose_abort": "cpp", "__verbose_abort": "cpp",
"variant": "cpp", "variant": "cpp"
"charconv": "cpp"
}, },
"files.exclude": { "files.exclude": {
"Binaries/*build*": true, "Binaries/*build*": true,

View File

@@ -164,7 +164,7 @@ void LinkEvent::UnserializeFrom(gd::Project& project,
} }
bool LinkEvent::AcceptVisitor(gd::EventVisitor &eventVisitor) { bool LinkEvent::AcceptVisitor(gd::EventVisitor &eventVisitor) {
return BaseEvent::AcceptVisitor(eventVisitor) || return BaseEvent::AcceptVisitor(eventVisitor) |
eventVisitor.VisitLinkEvent(*this); eventVisitor.VisitLinkEvent(*this);
} }

View File

@@ -46,6 +46,10 @@ void EffectsCodeGenerator::GenerateEffectsIncludeFiles(
// TODO Add unit tests on this function. // TODO Add unit tests on this function.
// TODO Merge with UsedExtensionsFinder. // TODO Merge with UsedExtensionsFinder.
// Default lights rely on the fact that UsedExtensionsFinder doesn't find
// extension usages for effects. This has the happy side effect of not
// including Three.js when no 3D object are in the scenes.
// We need to make something explicit to avoid future bugs.
// See also gd::Project::ExposeResources for a method that traverse the whole // See also gd::Project::ExposeResources for a method that traverse the whole
// project (this time for resources) and // project (this time for resources) and

View File

@@ -69,36 +69,8 @@ gd::String EventsCodeGenerator::GenerateRelationalOperatorCall(
} }
} }
auto lhs = callStartString + "(" + argumentsStr + ")"; return callStartString + "(" + argumentsStr + ") " + relationalOperator +
return GenerateRelationalOperation(relationalOperator, lhs, rhs); " " + rhs;
}
/**
* @brief Generate a relational operation
*
* @param relationalOperator the operator
* @param lhs the left hand operand
* @param rhs the right hand operand
* @return gd::String
*/
gd::String EventsCodeGenerator::GenerateRelationalOperation(
const gd::String& relationalOperator,
const gd::String& lhs,
const gd::String& rhs) {
return lhs + " " + GenerateRelationalOperatorCodes(relationalOperator) + " " + rhs;
}
const gd::String EventsCodeGenerator::GenerateRelationalOperatorCodes(const gd::String &operatorString) {
if (operatorString == "=") {
return "==";
}
if (operatorString != "<" && operatorString != ">" &&
operatorString != "<=" && operatorString != ">=" && operatorString != "!=" &&
operatorString != "startsWith" && operatorString != "endsWith" && operatorString != "contains") {
cout << "Warning: Bad relational operator: Set to == by default." << endl;
return "==";
}
return operatorString;
} }
/** /**
@@ -666,6 +638,18 @@ gd::String EventsCodeGenerator::GenerateActionsListCode(
return outputCode; return outputCode;
} }
const gd::String EventsCodeGenerator::GenerateRelationalOperatorCodes(const gd::String &operatorString) {
if (operatorString == "=") {
return "==";
}
if (operatorString != "<" && operatorString != ">" &&
operatorString != "<=" && operatorString != ">=" && operatorString != "!=") {
cout << "Warning: Bad relational operator: Set to == by default." << endl;
return "==";
}
return operatorString;
}
gd::String EventsCodeGenerator::GenerateParameterCodes( gd::String EventsCodeGenerator::GenerateParameterCodes(
const gd::Expression& parameter, const gd::Expression& parameter,
const gd::ParameterMetadata& metadata, const gd::ParameterMetadata& metadata,
@@ -690,7 +674,7 @@ gd::String EventsCodeGenerator::GenerateParameterCodes(
argOutput = argOutput =
GenerateObject(parameter.GetPlainString(), metadata.GetType(), context); GenerateObject(parameter.GetPlainString(), metadata.GetType(), context);
} else if (metadata.GetType() == "relationalOperator") { } else if (metadata.GetType() == "relationalOperator") {
argOutput += parameter.GetPlainString(); argOutput += GenerateRelationalOperatorCodes(parameter.GetPlainString());
argOutput = "\"" + argOutput + "\""; argOutput = "\"" + argOutput + "\"";
} else if (metadata.GetType() == "operator") { } else if (metadata.GetType() == "operator") {
argOutput += parameter.GetPlainString(); argOutput += parameter.GetPlainString();

View File

@@ -473,15 +473,10 @@ class GD_CORE_API EventsCodeGenerator {
*/ */
size_t GenerateSingleUsageUniqueIdForEventsList(); size_t GenerateSingleUsageUniqueIdForEventsList();
virtual gd::String GenerateRelationalOperation(
const gd::String& relationalOperator,
const gd::String& lhs,
const gd::String& rhs);
protected:
virtual const gd::String GenerateRelationalOperatorCodes( virtual const gd::String GenerateRelationalOperatorCodes(
const gd::String& operatorString); const gd::String& operatorString);
protected:
/** /**
* \brief Generate the code for a single parameter. * \brief Generate the code for a single parameter.
* *
@@ -737,7 +732,6 @@ class GD_CORE_API EventsCodeGenerator {
const std::vector<gd::String>& arguments, const std::vector<gd::String>& arguments,
const gd::String& callStartString, const gd::String& callStartString,
std::size_t startFromArgument = 0); std::size_t startFromArgument = 0);
gd::String GenerateOperatorCall(const gd::InstructionMetadata& instrInfos, gd::String GenerateOperatorCall(const gd::InstructionMetadata& instrInfos,
const std::vector<gd::String>& arguments, const std::vector<gd::String>& arguments,
const gd::String& callStartString, const gd::String& callStartString,

View File

@@ -491,6 +491,11 @@ class GD_CORE_API ExpressionParser2 {
std::vector<std::unique_ptr<ExpressionNode>> parameters; std::vector<std::unique_ptr<ExpressionNode>> parameters;
gd::String lastObjectName = ""; gd::String lastObjectName = "";
// By convention, object is always the first parameter, and behavior the
// second one.
size_t parameterIndex =
WrittenParametersFirstIndex(objectName, behaviorName);
bool previousCharacterIsParameterSeparator = false; bool previousCharacterIsParameterSeparator = false;
while (!IsEndReached()) { while (!IsEndReached()) {
SkipAllWhitespaces(); SkipAllWhitespaces();
@@ -509,6 +514,7 @@ class GD_CORE_API ExpressionParser2 {
SkipAllWhitespaces(); SkipAllWhitespaces();
previousCharacterIsParameterSeparator = CheckIfChar(IsParameterSeparator); previousCharacterIsParameterSeparator = CheckIfChar(IsParameterSeparator);
SkipIfChar(IsParameterSeparator); SkipIfChar(IsParameterSeparator);
parameterIndex++;
} }
ExpressionParserLocation invalidClosingParenthesisLocation; ExpressionParserLocation invalidClosingParenthesisLocation;

View File

@@ -115,23 +115,21 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsAdvancedExtension(
.AddExpression( .AddExpression(
"GetArgumentAsNumber", "GetArgumentAsNumber",
_("Get function parameter value"), _("Get function parameter value"),
_("Get function parameter (also called \"argument\") value. You don't need this most of the time as you can simply write the parameter name in an expression."), _("Get function parameter (also called \"argument\") value."),
"", "",
"res/function16.png") "res/function16.png")
.AddParameter("functionParameterName", _("Parameter name"), "number,string,boolean") .AddParameter("functionParameterName", _("Parameter name"), "number,string,boolean")
.SetRelevantForFunctionEventsOnly() .SetRelevantForFunctionEventsOnly();
.SetHidden();
extension extension
.AddStrExpression( .AddStrExpression(
"GetArgumentAsString", "GetArgumentAsString",
_("Get function parameter text"), _("Get function parameter text"),
_("Get function parameter (also called \"argument\") text. You don't need this most of the time as you can simply write the parameter name in an expression."), _("Get function parameter (also called \"argument\") text."),
"", "",
"res/function16.png") "res/function16.png")
.AddParameter("functionParameterName", _("Parameter name"), "number,string,boolean") .AddParameter("functionParameterName", _("Parameter name"), "number,string,boolean")
.SetRelevantForFunctionEventsOnly() .SetRelevantForFunctionEventsOnly();
.SetHidden();
extension extension
.AddCondition( .AddCondition(

View File

@@ -49,7 +49,6 @@ class GD_CORE_API BuiltinExtensionsImplementer {
static void ImplementsAnimatableExtension(gd::PlatformExtension& extension); static void ImplementsAnimatableExtension(gd::PlatformExtension& extension);
static void ImplementsEffectExtension(gd::PlatformExtension& extension); static void ImplementsEffectExtension(gd::PlatformExtension& extension);
static void ImplementsOpacityExtension(gd::PlatformExtension& extension); static void ImplementsOpacityExtension(gd::PlatformExtension& extension);
static void ImplementsTextContainerExtension(gd::PlatformExtension& extension);
}; };
} // namespace gd } // namespace gd

View File

@@ -396,7 +396,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
_("Z order"), _("Z order"),
_("Modify the Z-order of an object"), _("Modify the Z-order of an object"),
_("the z-order"), _("the z-order"),
_("Layers and cameras"), _("Z order"),
"res/actions/planicon24.png", "res/actions/planicon24.png",
"res/actions/planicon.png") "res/actions/planicon.png")
@@ -550,7 +550,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
_("Z-order"), _("Z-order"),
_("Compare the Z-order of the specified object."), _("Compare the Z-order of the specified object."),
_("the Z-order"), _("the Z-order"),
_("Layer"), _("Z-order"),
"res/conditions/planicon24.png", "res/conditions/planicon24.png",
"res/conditions/planicon.png") "res/conditions/planicon.png")
@@ -617,7 +617,6 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
"number", ParameterOptions::MakeNewOptions()) "number", ParameterOptions::MakeNewOptions())
.MarkAsAdvanced(); .MarkAsAdvanced();
// Deprecated
obj.AddCondition("AngleOfDisplacement", obj.AddCondition("AngleOfDisplacement",
_("Angle of movement (using forces)"), _("Angle of movement (using forces)"),
_("Compare the angle of movement of an object according to " _("Compare the angle of movement of an object according to "
@@ -627,20 +626,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
_("Movement using forces"), _("Movement using forces"),
"res/conditions/vitesse24.png", "res/conditions/vitesse24.png",
"res/conditions/vitesse.png") "res/conditions/vitesse.png")
.SetHidden()
.AddParameter("object", _("Object"))
.AddParameter("expression", _("Angle, in degrees"))
.AddParameter("expression", _("Tolerance, in degrees"))
.MarkAsAdvanced();
obj.AddCondition("IsTotalForceAngleAround",
_("Angle of movement (using forces)"),
_("Compare the angle of movement of an object according to "
"the forces applied on it."),
_("Angle of movement of _PARAM0_ is _PARAM1_ ± _PARAM2_°"),
_("Movement using forces"),
"res/conditions/vitesse24.png",
"res/conditions/vitesse.png")
.AddParameter("object", _("Object")) .AddParameter("object", _("Object"))
.AddParameter("expression", _("Angle, in degrees")) .AddParameter("expression", _("Angle, in degrees"))
.AddParameter("expression", _("Tolerance, in degrees")) .AddParameter("expression", _("Tolerance, in degrees"))
@@ -1151,7 +1137,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
obj.AddExpression("ZOrder", obj.AddExpression("ZOrder",
_("Z-order"), _("Z-order"),
_("Z-order of an object"), _("Z-order of an object"),
"", _("Visibility"),
"res/actions/planicon.png") "res/actions/planicon.png")
.AddParameter("object", _("Object")); .AddParameter("object", _("Object"));
@@ -1624,7 +1610,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
_("Cast a ray from _PARAM1_;_PARAM2_, angle: _PARAM3_ and max " _("Cast a ray from _PARAM1_;_PARAM2_, angle: _PARAM3_ and max "
"distance: _PARAM4_px, against _PARAM0_, and save the " "distance: _PARAM4_px, against _PARAM0_, and save the "
"result in _PARAM5_, _PARAM6_"), "result in _PARAM5_, _PARAM6_"),
_("Collision"), "",
"res/conditions/raycast24.png", "res/conditions/raycast24.png",
"res/conditions/raycast.png") "res/conditions/raycast.png")
.AddParameter("objectList", _("Objects to test against the ray")) .AddParameter("objectList", _("Objects to test against the ray"))
@@ -1655,7 +1641,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
_("Cast a ray from _PARAM1_;_PARAM2_ to _PARAM3_;_PARAM4_ " _("Cast a ray from _PARAM1_;_PARAM2_ to _PARAM3_;_PARAM4_ "
"against _PARAM0_, and save the " "against _PARAM0_, and save the "
"result in _PARAM5_, _PARAM6_"), "result in _PARAM5_, _PARAM6_"),
_("Collision"), "",
"res/conditions/raycast24.png", "res/conditions/raycast24.png",
"res/conditions/raycast.png") "res/conditions/raycast.png")
.AddParameter("objectList", _("Objects to test against the ray")) .AddParameter("objectList", _("Objects to test against the ray"))

View File

@@ -327,6 +327,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsCameraExtension(
.AddParameter("expression", _("Camera number (default : 0)"), "", true) .AddParameter("expression", _("Camera number (default : 0)"), "", true)
.SetDefaultValue("0"); .SetDefaultValue("0");
// TODO Deprecated: hide this action in a future release.
extension extension
.AddAction( .AddAction(
"FixCamera", "FixCamera",
@@ -338,7 +339,6 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsCameraExtension(
"", "",
"res/actions/camera24.png", "res/actions/camera24.png",
"res/actions/camera.png") "res/actions/camera.png")
.SetHidden()
.AddCodeOnlyParameter("currentScene", "") .AddCodeOnlyParameter("currentScene", "")
.AddParameter("objectPtr", _("Object")) .AddParameter("objectPtr", _("Object"))
.AddParameter("expression", .AddParameter("expression",
@@ -386,7 +386,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsCameraExtension(
_("Center the camera on an object"), _("Center the camera on an object"),
_("Center the camera on the specified object."), _("Center the camera on the specified object."),
_("Center camera on _PARAM1_ (layer: _PARAM3_)"), _("Center camera on _PARAM1_ (layer: _PARAM3_)"),
_("Layers and cameras"), "",
"res/actions/camera24.png", "res/actions/camera24.png",
"res/actions/camera.png") "res/actions/camera.png")
.AddCodeOnlyParameter("currentScene", "") .AddCodeOnlyParameter("currentScene", "")
@@ -548,7 +548,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsCameraExtension(
extension extension
.AddAction( .AddAction(
"ChangeLayerTimeScale", "ChangeLayerTimeScale",
_("Layer time scale"), _("Change layer time scale"),
_("Change the time scale applied to the objects of the layer."), _("Change the time scale applied to the objects of the layer."),
_("Set the time scale of layer _PARAM1_ to _PARAM2_"), _("Set the time scale of layer _PARAM1_ to _PARAM2_"),
"", "",
@@ -594,7 +594,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsCameraExtension(
extension extension
.AddAction( .AddAction(
"SetLayerAmbientLightColor", "SetLayerAmbientLightColor",
_("Ambient light color"), _("Set the ambient light color"),
_("Set the ambient light color of the lighting layer in format " _("Set the ambient light color of the lighting layer in format "
"\"R;G;B\" string."), "\"R;G;B\" string."),
_("Set the ambient color of the lighting layer _PARAM1_ to _PARAM2_"), _("Set the ambient color of the lighting layer _PARAM1_ to _PARAM2_"),

View File

@@ -23,8 +23,6 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsAnimatableExtension(
"Florian Rival", "Florian Rival",
"Open source (MIT License)") "Open source (MIT License)")
.SetExtensionHelpPath("/objects"); .SetExtensionHelpPath("/objects");
extension.AddInstructionOrExpressionGroupMetadata(_("Animatable capability"))
.SetIcon("res/actions/animation24.png");
extension.AddInstructionOrExpressionGroupMetadata(_("Animations and images")) extension.AddInstructionOrExpressionGroupMetadata(_("Animations and images"))
.SetIcon("res/actions/animation24.png"); .SetIcon("res/actions/animation24.png");
@@ -44,7 +42,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsAnimatableExtension(
"number", "number",
"Index", "Index",
_("Animation (by number)"), _("Animation (by number)"),
_("the animation played by the object using the animation number (from " _("the number of the animation played by the object (the number from "
"the animations list)"), "the animations list)"),
_("the number of the animation"), _("the number of the animation"),
_("Animations and images"), _("Animations and images"),
@@ -55,7 +53,6 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsAnimatableExtension(
"number", gd::ParameterOptions::MakeNewOptions().SetDescription( "number", gd::ParameterOptions::MakeNewOptions().SetDescription(
_("Animation index"))) _("Animation index")))
.MarkAsSimple(); .MarkAsSimple();
aut.GetAllExpressions()["Index"].SetGroup("");
aut.AddExpressionAndConditionAndAction( aut.AddExpressionAndConditionAndAction(
"string", "string",
@@ -72,7 +69,6 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsAnimatableExtension(
"objectAnimationName", gd::ParameterOptions::MakeNewOptions().SetDescription( "objectAnimationName", gd::ParameterOptions::MakeNewOptions().SetDescription(
_("Animation name"))) _("Animation name")))
.MarkAsSimple(); .MarkAsSimple();
aut.GetAllStrExpressions()["Name"].SetGroup("");
aut.AddScopedAction("PauseAnimation", aut.AddScopedAction("PauseAnimation",
_("Pause the animation"), _("Pause the animation"),
@@ -111,7 +107,6 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsAnimatableExtension(
"number", gd::ParameterOptions::MakeNewOptions().SetDescription( "number", gd::ParameterOptions::MakeNewOptions().SetDescription(
_("Speed scale"))) _("Speed scale")))
.MarkAsSimple(); .MarkAsSimple();
aut.GetAllExpressions()["SpeedScale"].SetGroup("");
aut.AddScopedCondition("IsAnimationPaused", aut.AddScopedCondition("IsAnimationPaused",
_("Animation paused"), _("Animation paused"),
@@ -135,31 +130,6 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsAnimatableExtension(
.AddParameter("object", _("Object")) .AddParameter("object", _("Object"))
.AddParameter("behavior", _("Behavior"), "AnimatableBehavior") .AddParameter("behavior", _("Behavior"), "AnimatableBehavior")
.MarkAsSimple(); .MarkAsSimple();
aut.AddExpressionAndConditionAndAction(
"number",
"ElapsedTime",
_("Animation elapsed time"),
_("the elapsed time from the beginning of the animation (in seconds)"),
_("the animation elapsed time"),
_("Animations and images"),
"res/actions/animation24.png")
.AddParameter("object", _("Object"))
.AddParameter("behavior", _("Behavior"), "AnimatableBehavior")
.UseStandardParameters(
"number", gd::ParameterOptions::MakeNewOptions().SetDescription(
_("Elapsed time (in seconds)")))
.MarkAsAdvanced();
aut.GetAllExpressions()["ElapsedTime"].SetGroup("");
aut.AddExpression(
"Duration",
_("Animation duration"),
_("Return the current animation duration (in seconds)."),
_("Animations and images"),
"res/actions/animation24.png")
.AddParameter("object", _("Object"))
.AddParameter("behavior", _("Behavior"), "AnimatableBehavior");
} }
} // namespace gd } // namespace gd

View File

@@ -23,8 +23,6 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsOpacityExtension(
"Florian Rival", "Florian Rival",
"Open source (MIT License)") "Open source (MIT License)")
.SetExtensionHelpPath("/objects"); .SetExtensionHelpPath("/objects");
extension.AddInstructionOrExpressionGroupMetadata(_("Opacity capability"))
.SetIcon("res/actions/opacity24.png");
extension.AddInstructionOrExpressionGroupMetadata(_("Visibility")) extension.AddInstructionOrExpressionGroupMetadata(_("Visibility"))
.SetIcon("res/actions/opacity24.png"); .SetIcon("res/actions/opacity24.png");
@@ -56,7 +54,6 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsOpacityExtension(
_("Opacity (0-255)"))) _("Opacity (0-255)")))
.SetFunctionName("setOpacity") .SetFunctionName("setOpacity")
.SetGetter("getOpacity"); .SetGetter("getOpacity");
aut.GetAllExpressions()["Value"].SetGroup("");
} }
} // namespace gd } // namespace gd

View File

@@ -23,8 +23,6 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsScalableExtension(
"Florian Rival", "Florian Rival",
"Open source (MIT License)") "Open source (MIT License)")
.SetExtensionHelpPath("/objects"); .SetExtensionHelpPath("/objects");
extension.AddInstructionOrExpressionGroupMetadata(_("Scalable capability"))
.SetIcon("res/actions/scale24_black.png");
extension.AddInstructionOrExpressionGroupMetadata(_("Size")) extension.AddInstructionOrExpressionGroupMetadata(_("Size"))
.SetIcon("res/actions/scale24_black.png"); .SetIcon("res/actions/scale24_black.png");
@@ -46,7 +44,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsScalableExtension(
_("Scale"), _("Scale"),
_("the scale of the object (default scale is 1)"), _("the scale of the object (default scale is 1)"),
_("the scale"), _("the scale"),
_("Size"), _("Scale"),
"res/actions/scale24_black.png") "res/actions/scale24_black.png")
.AddParameter("object", _("Object")) .AddParameter("object", _("Object"))
.AddParameter("behavior", _("Behavior"), "ScalableBehavior") .AddParameter("behavior", _("Behavior"), "ScalableBehavior")
@@ -55,7 +53,6 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsScalableExtension(
gd::ParameterOptions::MakeNewOptions().SetDescription( gd::ParameterOptions::MakeNewOptions().SetDescription(
_("Scale (1 by default)"))) _("Scale (1 by default)")))
.MarkAsAdvanced(); .MarkAsAdvanced();
aut.GetAllExpressions()["Value"].SetGroup("");
aut.AddExpressionAndConditionAndAction( aut.AddExpressionAndConditionAndAction(
"number", "number",
@@ -63,7 +60,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsScalableExtension(
_("Scale on X axis"), _("Scale on X axis"),
_("the scale on X axis of the object (default scale is 1)"), _("the scale on X axis of the object (default scale is 1)"),
_("the scale on X axis"), _("the scale on X axis"),
_("Size"), _("Scale"),
"res/actions/scaleWidth24_black.png") "res/actions/scaleWidth24_black.png")
.AddParameter("object", _("Object")) .AddParameter("object", _("Object"))
.AddParameter("behavior", _("Behavior"), "ScalableBehavior") .AddParameter("behavior", _("Behavior"), "ScalableBehavior")
@@ -72,7 +69,6 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsScalableExtension(
gd::ParameterOptions::MakeNewOptions().SetDescription( gd::ParameterOptions::MakeNewOptions().SetDescription(
_("Scale (1 by default)"))) _("Scale (1 by default)")))
.MarkAsAdvanced(); .MarkAsAdvanced();
aut.GetAllExpressions()["X"].SetGroup("");
aut.AddExpressionAndConditionAndAction( aut.AddExpressionAndConditionAndAction(
"number", "number",
@@ -80,7 +76,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsScalableExtension(
_("Scale on Y axis"), _("Scale on Y axis"),
_("the scale on Y axis of the object (default scale is 1)"), _("the scale on Y axis of the object (default scale is 1)"),
_("the scale on Y axis"), _("the scale on Y axis"),
_("Size"), _("Scale"),
"res/actions/scaleHeight24_black.png") "res/actions/scaleHeight24_black.png")
.AddParameter("object", _("Object")) .AddParameter("object", _("Object"))
.AddParameter("behavior", _("Behavior"), "ScalableBehavior") .AddParameter("behavior", _("Behavior"), "ScalableBehavior")
@@ -89,7 +85,6 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsScalableExtension(
gd::ParameterOptions::MakeNewOptions().SetDescription( gd::ParameterOptions::MakeNewOptions().SetDescription(
_("Scale (1 by default)"))) _("Scale (1 by default)")))
.MarkAsAdvanced(); .MarkAsAdvanced();
aut.GetAllExpressions()["Y"].SetGroup("");
} }
} // namespace gd } // namespace gd

View File

@@ -1,58 +0,0 @@
/*
* GDevelop Core
* Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights
* reserved. This project is released under the GNU Lesser General Public
* License.
*/
#include "GDCore/Extensions/Builtin/AllBuiltinExtensions.h"
#include "GDCore/Extensions/Metadata/MultipleInstructionMetadata.h"
#include "GDCore/Project/Behavior.h"
#include "GDCore/Project/BehaviorsSharedData.h"
#include "GDCore/Project/Object.h"
#include "GDCore/Tools/Localization.h"
using namespace std;
namespace gd {
void GD_CORE_API BuiltinExtensionsImplementer::ImplementsTextContainerExtension(
gd::PlatformExtension& extension) {
extension
.SetExtensionInformation("TextContainerCapability",
_("Text capability"),
_("Animate objects."),
"Florian Rival",
"Open source (MIT License)")
.SetExtensionHelpPath("/objects");
extension.AddInstructionOrExpressionGroupMetadata(_("Text capability"))
.SetIcon("res/conditions/text24_black.png");
gd::BehaviorMetadata& aut = extension.AddBehavior(
"TextContainerBehavior",
_("Text capability"),
"Text",
_("Access objects text."),
"",
"res/conditions/text24_black.png",
"TextContainerBehavior",
std::make_shared<gd::Behavior>(),
std::make_shared<gd::BehaviorsSharedData>())
.SetHidden();
aut.AddExpressionAndConditionAndAction(
"string",
"Value",
_("Text"),
_("the text"),
_("the text"),
"",
"res/conditions/text24_black.png")
.AddParameter("object", _("Object"))
.AddParameter("behavior", _("Behavior"), "TextContainerBehavior")
.UseStandardParameters(
"string", gd::ParameterOptions::MakeNewOptions().SetDescription(
_("Text")))
.MarkAsSimple();
aut.GetAllStrExpressions()["Value"].SetGroup("");
}
} // namespace gd

View File

@@ -5,7 +5,6 @@
*/ */
#include "AllBuiltinExtensions.h" #include "AllBuiltinExtensions.h"
#include "GDCore/Tools/Localization.h" #include "GDCore/Tools/Localization.h"
#include "GDCore/Extensions/Metadata/MultipleInstructionMetadata.h"
using namespace std; using namespace std;
namespace gd { namespace gd {
@@ -58,7 +57,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsSceneExtension(
extension extension
.AddCondition("DoesSceneExist", .AddCondition("DoesSceneExist",
_("Does scene exist"), _("Does scene exist"),
_("Check if a scene exists."), _("Check if scene exists."),
_("Scene _PARAM1_ exists"), _("Scene _PARAM1_ exists"),
"", "",
"res/actions/texte.png", "res/actions/texte.png",
@@ -164,45 +163,6 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsSceneExtension(
"res/actions/window.png") "res/actions/window.png")
.SetHelpPath("/interface/scene-editor/events") .SetHelpPath("/interface/scene-editor/events")
.AddCodeOnlyParameter("currentScene", ""); .AddCodeOnlyParameter("currentScene", "");
extension
.AddAction("PrioritizeLoadingOfScene",
_("Preload scene"),
_("Preload a scene resources as soon as possible in background."),
_("Preload scene _PARAM1_ in background"),
"",
"res/actions/replaceScene24.png",
"res/actions/replaceScene.png")
.SetHelpPath("/all-features/resources-loading")
.AddCodeOnlyParameter("currentScene", "")
.AddParameter("sceneName", _("Name of the new scene"))
.MarkAsAdvanced();
extension.AddExpressionAndCondition("number",
"SceneLoadingProgress",
_("Scene loading progress"),
_("The progress of resources loading in background for a scene (between 0 and 1)."),
_("_PARAM0_ loading progress"),
_(""),
"res/actions/replaceScene24.png")
.SetHelpPath("/all-features/resources-loading")
.AddCodeOnlyParameter("currentScene", "")
.AddParameter("sceneName", _("Scene name"))
.UseStandardParameters("number", ParameterOptions::MakeNewOptions())
.MarkAsAdvanced();
extension
.AddCondition("AreSceneAssetsLoaded",
_("Scene preloaded"),
_("Check if scene resources have finished to load in background."),
_("Scene _PARAM1_ was preloaded in background"),
"",
"res/actions/replaceScene24.png",
"res/actions/replaceScene.png")
.SetHelpPath("/all-features/resources-loading")
.AddCodeOnlyParameter("currentScene", "")
.AddParameter("sceneName", _("Scene name"))
.MarkAsAdvanced();
} }
} // namespace gd } // namespace gd

View File

@@ -30,7 +30,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsSpriteExtension(
.AddObject<SpriteObject>("Sprite", .AddObject<SpriteObject>("Sprite",
_("Sprite"), _("Sprite"),
_("Animated object which can be used for " _("Animated object which can be used for "
"most elements of a game."), "most elements of a game"),
"CppPlatform/Extensions/spriteicon.png") "CppPlatform/Extensions/spriteicon.png")
.SetCategoryFullName(_("General")) .SetCategoryFullName(_("General"))
.AddDefaultBehavior("EffectCapability::EffectBehavior") .AddDefaultBehavior("EffectCapability::EffectBehavior")
@@ -408,7 +408,6 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsSpriteExtension(
.SetHidden() .SetHidden()
.MarkAsSimple(); .MarkAsSimple();
// Deprecated
obj.AddCondition("ScaleWidth", obj.AddCondition("ScaleWidth",
_("Scale on X axis"), _("Scale on X axis"),
_("Compare the scale of the width of an object."), _("Compare the scale of the width of an object."),
@@ -416,7 +415,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsSpriteExtension(
_("Size"), _("Size"),
"res/conditions/scaleWidth24_black.png", "res/conditions/scaleWidth24_black.png",
"res/conditions/scaleWidth_black.png") "res/conditions/scaleWidth_black.png")
.SetHidden()
.AddParameter("object", _("Object"), "Sprite") .AddParameter("object", _("Object"), "Sprite")
.UseStandardRelationalOperatorParameters( .UseStandardRelationalOperatorParameters(
"number", "number",
@@ -424,7 +423,6 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsSpriteExtension(
_("Scale (1 by default)"))) _("Scale (1 by default)")))
.MarkAsAdvanced(); .MarkAsAdvanced();
// Deprecated
obj.AddCondition("ScaleHeight", obj.AddCondition("ScaleHeight",
_("Scale on Y axis"), _("Scale on Y axis"),
_("Compare the scale of the height of an object."), _("Compare the scale of the height of an object."),
@@ -432,7 +430,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsSpriteExtension(
_("Size"), _("Size"),
"res/conditions/scaleHeight24_black.png", "res/conditions/scaleHeight24_black.png",
"res/conditions/scaleHeight_black.png") "res/conditions/scaleHeight_black.png")
.SetHidden()
.AddParameter("object", _("Object"), "Sprite") .AddParameter("object", _("Object"), "Sprite")
.UseStandardRelationalOperatorParameters( .UseStandardRelationalOperatorParameters(
"number", "number",

View File

@@ -87,8 +87,8 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsWindowExtension(
extension extension
.AddAction( .AddAction(
"SetWindowSize", "SetWindowSize",
_("Game window size"), _("Change the size of the game window"),
_("Changes the size of the game window. Note that this " _("This action changes the size of the game window. Note that this "
"will only work on platform supporting this operation: games " "will only work on platform supporting this operation: games "
"running in browsers or on mobile phones can not update their " "running in browsers or on mobile phones can not update their "
"window size. Game resolution can still be updated."), "window size. Game resolution can still be updated."),

View File

@@ -191,16 +191,6 @@ class GD_CORE_API MultipleInstructionMetadata : public AbstractFunctionMetadata
return *this; return *this;
} }
/**
* \see gd::InstructionMetadata::SetHelpPath
*/
MultipleInstructionMetadata &SetHelpPath(const gd::String &path) {
if (expression) expression->SetHelpPath(path);
if (condition) condition->SetHelpPath(path);
if (action) action->SetHelpPath(path);
return *this;
}
/** /**
* \see gd::InstructionMetadata::MarkAsSimple * \see gd::InstructionMetadata::MarkAsSimple
*/ */

View File

@@ -303,24 +303,12 @@ class GD_CORE_API ObjectMetadata : public InstructionOrExpressionContainerMetada
return *this; return *this;
} }
/** /**
* \brief Return true if the object must be hidden in the IDE. * \brief Return true if the instruction must be hidden in the IDE.
*/ */
bool IsHidden() const { return hidden; } bool IsHidden() const { return hidden; }
/**
* \brief Declare a usage of the 3D renderer.
*/
ObjectMetadata &MarkAsRenderedIn3D() {
isRenderedIn3D = true;
return *this;
}
/**
* \brief Return true if the object uses the 3D renderer.
*/
bool IsRenderedIn3D() const { return isRenderedIn3D; }
std::map<gd::String, gd::InstructionMetadata> conditionsInfos; std::map<gd::String, gd::InstructionMetadata> conditionsInfos;
std::map<gd::String, gd::InstructionMetadata> actionsInfos; std::map<gd::String, gd::InstructionMetadata> actionsInfos;
std::map<gd::String, gd::ExpressionMetadata> expressionsInfos; std::map<gd::String, gd::ExpressionMetadata> expressionsInfos;
@@ -341,7 +329,6 @@ class GD_CORE_API ObjectMetadata : public InstructionOrExpressionContainerMetada
gd::String categoryFullName; gd::String categoryFullName;
std::set<gd::String> defaultBehaviorTypes; std::set<gd::String> defaultBehaviorTypes;
bool hidden = false; bool hidden = false;
bool isRenderedIn3D = false;
std::shared_ptr<gd::ObjectConfiguration> std::shared_ptr<gd::ObjectConfiguration>
blueprintObject; ///< The "blueprint" object to be copied when a new blueprintObject; ///< The "blueprint" object to be copied when a new

View File

@@ -4,6 +4,7 @@
* reserved. This project is released under the MIT License. * reserved. This project is released under the MIT License.
*/ */
#if defined(GD_IDE_ONLY)
#include "DependenciesAnalyzer.h" #include "DependenciesAnalyzer.h"
#include <algorithm> #include <algorithm>
#include "GDCore/Events/Builtin/LinkEvent.h" #include "GDCore/Events/Builtin/LinkEvent.h"
@@ -28,9 +29,9 @@ DependenciesAnalyzer::DependenciesAnalyzer(const gd::Project& project_,
bool DependenciesAnalyzer::Analyze() { bool DependenciesAnalyzer::Analyze() {
if (layout) if (layout)
return Analyze(layout->GetEvents()); return Analyze(layout->GetEvents(), true);
else if (externalEvents) else if (externalEvents)
return Analyze(externalEvents->GetEvents()); return Analyze(externalEvents->GetEvents(), true);
std::cout << "ERROR: DependenciesAnalyzer called without any layout or " std::cout << "ERROR: DependenciesAnalyzer called without any layout or "
"external events."; "external events.";
@@ -39,38 +40,63 @@ bool DependenciesAnalyzer::Analyze() {
DependenciesAnalyzer::~DependenciesAnalyzer() {} DependenciesAnalyzer::~DependenciesAnalyzer() {}
bool DependenciesAnalyzer::Analyze(const gd::EventsList& events) { bool DependenciesAnalyzer::Analyze(const gd::EventsList& events, bool isOnTopLevel) {
for (unsigned int i = 0; i < events.size(); ++i) { for (unsigned int i = 0; i < events.size(); ++i) {
const gd::LinkEvent* linkEvent = dynamic_cast<const gd::LinkEvent*>(&events[i]); const gd::LinkEvent* linkEvent = dynamic_cast<const gd::LinkEvent*>(&events[i]);
if (linkEvent) { if (linkEvent) {
DependenciesAnalyzer analyzer(*this);
gd::String linked = linkEvent->GetTarget(); gd::String linked = linkEvent->GetTarget();
if (project.HasExternalEventsNamed(linked)) { if (project.HasExternalEventsNamed(linked)) {
if (std::find(parentExternalEvents.begin(), if (std::find(parentExternalEvents.begin(),
parentExternalEvents.end(), parentExternalEvents.end(),
linked) != parentExternalEvents.end()) { linked) != parentExternalEvents.end())
// Circular dependency! return false; // Circular dependency!
externalEventsDependencies.insert(
linked); // There is a direct dependency
if (!isOnTopLevel) notTopLevelExternalEventsDependencies.insert(linked);
analyzer.AddParentExternalEvents(linked);
if (!analyzer.Analyze(project.GetExternalEvents(linked).GetEvents(),
isOnTopLevel))
return false; return false;
}
bool wasDependencyJustAdded = externalEventsDependencies.insert(linked).second;
if (wasDependencyJustAdded) {
parentExternalEvents.push_back(linked);
if (!Analyze(project.GetExternalEvents(linked).GetEvents()))
return false;
parentExternalEvents.pop_back();
}
} else if (project.HasLayoutNamed(linked)) { } else if (project.HasLayoutNamed(linked)) {
if (std::find(parentScenes.begin(), parentScenes.end(), linked) != if (std::find(parentScenes.begin(), parentScenes.end(), linked) !=
parentScenes.end()) { parentScenes.end())
// Circular dependency! return false; // Circular dependency!
scenesDependencies.insert(linked); // There is a direct dependency
if (!isOnTopLevel) notTopLevelScenesDependencies.insert(linked);
analyzer.AddParentScene(linked);
if (!analyzer.Analyze(project.GetLayout(linked).GetEvents(),
isOnTopLevel))
return false; return false;
} }
bool wasDependencyJustAdded = scenesDependencies.insert(linked).second;
if (wasDependencyJustAdded) { // Update with indirect dependencies.
parentScenes.push_back(linked); scenesDependencies.insert(analyzer.GetScenesDependencies().begin(),
if (!Analyze(project.GetLayout(linked).GetEvents())) analyzer.GetScenesDependencies().end());
return false; externalEventsDependencies.insert(
parentScenes.pop_back(); analyzer.GetExternalEventsDependencies().begin(),
} analyzer.GetExternalEventsDependencies().end());
sourceFilesDependencies.insert(
analyzer.GetSourceFilesDependencies().begin(),
analyzer.GetSourceFilesDependencies().end());
notTopLevelScenesDependencies.insert(
analyzer.GetNotTopLevelScenesDependencies().begin(),
analyzer.GetNotTopLevelScenesDependencies().end());
notTopLevelExternalEventsDependencies.insert(
analyzer.GetNotTopLevelExternalEventsDependencies().begin(),
analyzer.GetNotTopLevelExternalEventsDependencies().end());
if (!isOnTopLevel) {
notTopLevelScenesDependencies.insert(
analyzer.GetScenesDependencies().begin(),
analyzer.GetScenesDependencies().end());
notTopLevelExternalEventsDependencies.insert(
analyzer.GetExternalEventsDependencies().begin(),
analyzer.GetExternalEventsDependencies().end());
} }
} }
@@ -86,9 +112,45 @@ bool DependenciesAnalyzer::Analyze(const gd::EventsList& events) {
// Analyze sub events dependencies // Analyze sub events dependencies
if (events[i].CanHaveSubEvents()) { if (events[i].CanHaveSubEvents()) {
if (!Analyze(events[i].GetSubEvents())) return false; if (!Analyze(events[i].GetSubEvents(), false)) return false;
} }
} }
return true; return true;
} }
gd::String DependenciesAnalyzer::ExternalEventsCanBeCompiledForAScene() {
if (!externalEvents) {
std::cout << "ERROR: ExternalEventsCanBeCompiledForAScene called without "
"external events set!"
<< std::endl;
return "";
}
gd::String sceneName;
for (unsigned int i = 0; i < project.GetLayoutsCount(); ++i) {
// For each layout, compute the dependencies and the dependencies which are
// not coming from a top level event.
DependenciesAnalyzer analyzer(project, project.GetLayout(i));
if (!analyzer.Analyze()) continue; // Analyze failed -> Cyclic dependencies
const std::set<gd::String>& dependencies =
analyzer.GetExternalEventsDependencies();
const std::set<gd::String>& notTopLevelDependencies =
analyzer.GetNotTopLevelExternalEventsDependencies();
// Check if the external events is a dependency, and that is is only present
// as a link on the top level.
if (dependencies.find(externalEvents->GetName()) != dependencies.end() &&
notTopLevelDependencies.find(externalEvents->GetName()) ==
notTopLevelDependencies.end()) {
if (!sceneName.empty())
return ""; // External events can be compiled only if one scene is
// including them.
else
sceneName = project.GetLayout(i).GetName();
}
}
return sceneName; // External events can be compiled and used for the scene.
}
#endif

View File

@@ -39,6 +39,11 @@ class GD_CORE_API DependenciesAnalyzer {
/** /**
* \brief Constructor for analyzing the dependencies of external events. * \brief Constructor for analyzing the dependencies of external events.
*
* You can also call then
* DependenciesAnalyzer::ExternalEventsCanBeCompiledForAScene to check if the
* external events can be compiled separately and called by a scene. \see
* DependenciesAnalyzer::ExternalEventsCanBeCompiledForAScene
*/ */
DependenciesAnalyzer(const gd::Project& project_, DependenciesAnalyzer(const gd::Project& project_,
const gd::ExternalEvents& externalEvents); const gd::ExternalEvents& externalEvents);
@@ -55,6 +60,18 @@ class GD_CORE_API DependenciesAnalyzer {
*/ */
bool Analyze(); bool Analyze();
/**
* Check if the external events (passed in the constructor) can be compiled
* and called by a single scene:<br> This is possible when the link calling
* the external events does not have any parent event and when this situation
* occurs only in a single scene and not in another.
*
* \return The name of the scene which is able to call the compiled external
* events. If empty, no scene is able to call them. (So external events have
* to be included directly by links).
*/
gd::String ExternalEventsCanBeCompiledForAScene();
/** /**
* \brief Return the scenes being dependencies of the scene or external events * \brief Return the scenes being dependencies of the scene or external events
* passed in the constructor. * passed in the constructor.
@@ -79,6 +96,25 @@ class GD_CORE_API DependenciesAnalyzer {
return sourceFilesDependencies; return sourceFilesDependencies;
}; };
/**
* \brief Return the scenes being dependencies of the scene or external events
* passed in the constructor, but being not top level dependencies: The links
* including them are not a top level events (i.e: They have a parent event).
*/
const std::set<gd::String>& GetNotTopLevelScenesDependencies() const {
return notTopLevelScenesDependencies;
};
/**
* \brief Return the external events being dependencies of the scene or
* external events passed in the constructor, but being not top level
* dependencies: The links including them are not a top level events (i.e:
* They have a parent event).
*/
const std::set<gd::String>& GetNotTopLevelExternalEventsDependencies() const {
return notTopLevelExternalEventsDependencies;
};
private: private:
/** /**
* \brief Analyze the dependencies of the events. * \brief Analyze the dependencies of the events.
@@ -88,11 +124,32 @@ class GD_CORE_API DependenciesAnalyzer {
* (they have no parents). \return false if a circular dependency exists, true * (they have no parents). \return false if a circular dependency exists, true
* otherwise. * otherwise.
*/ */
bool Analyze(const gd::EventsList& events); bool Analyze(const gd::EventsList& events, bool isOnTopLevel);
void AddParentScene(gd::String parentScene) {
parentScenes.push_back(parentScene);
};
void AddParentExternalEvents(gd::String parentExternalEvents_) {
parentExternalEvents.push_back(parentExternalEvents_);
};
/**
* Return true if all links pointing to external events called \a
* externalEventsName are only at the top level of \a events. The function
* return false as soon as it discover a link to external events which is not
* at the top level ( i.e: It has a parent event ).
*
* \warning The function assumes that there are not cyclic dependencies.
*/
bool CheckIfExternalEventsIsLinkedOnlyAtTopLevel(
const gd::String& externalEventsName,
std::vector<std::shared_ptr<gd::BaseEvent> >& events);
std::set<gd::String> scenesDependencies; std::set<gd::String> scenesDependencies;
std::set<gd::String> externalEventsDependencies; std::set<gd::String> externalEventsDependencies;
std::set<gd::String> sourceFilesDependencies; std::set<gd::String> sourceFilesDependencies;
std::set<gd::String> notTopLevelScenesDependencies;
std::set<gd::String> notTopLevelExternalEventsDependencies;
std::vector<gd::String> std::vector<gd::String>
parentScenes; ///< Used to check for circular dependencies. parentScenes; ///< Used to check for circular dependencies.
std::vector<gd::String> std::vector<gd::String>

View File

@@ -226,7 +226,7 @@ void EventsIdentifiersFinder::FindArgumentsInEventsAndDependencies(
eventWorker.Launch(layout.GetEvents(), eventWorker.Launch(layout.GetEvents(),
gd::ProjectScopedContainers::MakeNewProjectScopedContainersForProjectAndLayout(project, layout)); gd::ProjectScopedContainers::MakeNewProjectScopedContainersForProjectAndLayout(project, layout));
DependenciesAnalyzer dependenciesAnalyzer(project, layout); DependenciesAnalyzer dependenciesAnalyzer = DependenciesAnalyzer(project, layout);
dependenciesAnalyzer.Analyze(); dependenciesAnalyzer.Analyze();
for (const gd::String& externalEventName : dependenciesAnalyzer.GetExternalEventsDependencies()) { for (const gd::String& externalEventName : dependenciesAnalyzer.GetExternalEventsDependencies()) {
const gd::ExternalEvents& externalEvents = project.GetExternalEvents(externalEventName); const gd::ExternalEvents& externalEvents = project.GetExternalEvents(externalEventName);

View File

@@ -258,7 +258,7 @@ void EventsVariablesFinder::FindArgumentsInEventsAndDependencies(
eventWorker.Launch(layout.GetEvents(), eventWorker.Launch(layout.GetEvents(),
gd::ProjectScopedContainers::MakeNewProjectScopedContainersForProjectAndLayout(project, layout)); gd::ProjectScopedContainers::MakeNewProjectScopedContainersForProjectAndLayout(project, layout));
DependenciesAnalyzer dependenciesAnalyzer(project, layout); DependenciesAnalyzer dependenciesAnalyzer = DependenciesAnalyzer(project, layout);
dependenciesAnalyzer.Analyze(); dependenciesAnalyzer.Analyze();
for (const gd::String& externalEventName : dependenciesAnalyzer.GetExternalEventsDependencies()) { for (const gd::String& externalEventName : dependenciesAnalyzer.GetExternalEventsDependencies()) {
const gd::ExternalEvents& externalEvents = project.GetExternalEvents(externalEventName); const gd::ExternalEvents& externalEvents = project.GetExternalEvents(externalEventName);

View File

@@ -25,9 +25,6 @@ const UsedExtensionsResult UsedExtensionsFinder::ScanProject(gd::Project& projec
void UsedExtensionsFinder::DoVisitObject(gd::Object &object) { void UsedExtensionsFinder::DoVisitObject(gd::Object &object) {
auto metadata = gd::MetadataProvider::GetExtensionAndObjectMetadata( auto metadata = gd::MetadataProvider::GetExtensionAndObjectMetadata(
project.GetCurrentPlatform(), object.GetType()); project.GetCurrentPlatform(), object.GetType());
if (metadata.GetMetadata().IsRenderedIn3D()) {
result.MarkAsHaving3DObjects();
}
result.GetUsedExtensions().insert(metadata.GetExtension().GetName()); result.GetUsedExtensions().insert(metadata.GetExtension().GetName());
for (auto &&includeFile : metadata.GetMetadata().includeFiles) { for (auto &&includeFile : metadata.GetMetadata().includeFiles) {
result.GetUsedIncludeFiles().insert(includeFile); result.GetUsedIncludeFiles().insert(includeFile);

View File

@@ -44,13 +44,6 @@ public:
return usedRequiredFiles; return usedRequiredFiles;
} }
/**
* \brief Return true when at least 1 object uses the 3D renderer.
*/
bool Has3DObjects() const {
return has3DObjects;
}
/** /**
* The extensions used by the project (or part of it). * The extensions used by the project (or part of it).
*/ */
@@ -66,15 +59,10 @@ public:
*/ */
std::set<gd::String> &GetUsedRequiredFiles() { return usedRequiredFiles; } std::set<gd::String> &GetUsedRequiredFiles() { return usedRequiredFiles; }
void MarkAsHaving3DObjects() {
has3DObjects = true;
}
private: private:
std::set<gd::String> usedExtensions; std::set<gd::String> usedExtensions;
std::set<gd::String> usedIncludeFiles; std::set<gd::String> usedIncludeFiles;
std::set<gd::String> usedRequiredFiles; std::set<gd::String> usedRequiredFiles;
bool has3DObjects = false;
}; };
class GD_CORE_API UsedExtensionsFinder class GD_CORE_API UsedExtensionsFinder

View File

@@ -43,6 +43,7 @@ void ExtensionsLoader::LoadAllExtensions(const gd::String &directory,
struct dirent *lecture; struct dirent *lecture;
DIR *rep; DIR *rep;
rep = opendir(directory.c_str()); rep = opendir(directory.c_str());
int l = 0;
if (rep == NULL) { if (rep == NULL) {
cout << "Unable to open Extensions (" << directory << ") directory." cout << "Unable to open Extensions (" << directory << ") directory."
@@ -62,6 +63,8 @@ void ExtensionsLoader::LoadAllExtensions(const gd::String &directory,
LoadExtension(directory + "/" + lec, platform, forgiving); LoadExtension(directory + "/" + lec, platform, forgiving);
librariesLoaded.push_back(directory + "/" + lec); librariesLoaded.push_back(directory + "/" + lec);
l++;
} }
} }
@@ -100,6 +103,7 @@ void ExtensionsLoader::ExtensionsLoadingDone(const gd::String &directory) {
struct dirent *lecture; struct dirent *lecture;
DIR *rep; DIR *rep;
rep = opendir(directory.c_str()); rep = opendir(directory.c_str());
int l = 0;
if (rep == NULL) { if (rep == NULL) {
cout << "Unable to open Extensions (" << directory << ") directory." cout << "Unable to open Extensions (" << directory << ") directory."
@@ -114,6 +118,7 @@ void ExtensionsLoader::ExtensionsLoadingDone(const gd::String &directory) {
lec.find(".xgd" + suffix, lec.length() - 4 - suffix.length()) != lec.find(".xgd" + suffix, lec.length() - 4 - suffix.length()) !=
string::npos) { string::npos) {
librariesLoaded.push_back(directory + "/" + lec); librariesLoaded.push_back(directory + "/" + lec);
l++;
} }
} }

View File

@@ -262,6 +262,13 @@ bool ResourceWorkerInEventsWorker::DoVisitInstruction(gd::Instruction& instructi
return false; return false;
}; };
void LaunchResourceWorkerOnEvents(const gd::Project& project,
gd::EventsList& events,
gd::ArbitraryResourceWorker& worker) {
gd::ResourceWorkerInEventsWorker eventsWorker(project, worker);
eventsWorker.Launch(events);
}
gd::ResourceWorkerInEventsWorker gd::ResourceWorkerInEventsWorker
GetResourceWorkerOnEvents(const gd::Project &project, GetResourceWorkerOnEvents(const gd::Project &project,
gd::ArbitraryResourceWorker &worker) { gd::ArbitraryResourceWorker &worker) {
@@ -286,8 +293,8 @@ void ResourceWorkerInObjectsWorker::DoVisitBehavior(gd::Behavior &behavior){
gd::ResourceWorkerInObjectsWorker gd::ResourceWorkerInObjectsWorker
GetResourceWorkerOnObjects(const gd::Project &project, GetResourceWorkerOnObjects(const gd::Project &project,
gd::ArbitraryResourceWorker &worker) { gd::ArbitraryResourceWorker &worker) {
gd::ResourceWorkerInObjectsWorker resourcesWorker(project, worker); gd::ResourceWorkerInObjectsWorker eventsWorker(project, worker);
return resourcesWorker; return eventsWorker;
} }
} // namespace gd } // namespace gd

View File

@@ -37,7 +37,7 @@ namespace gd {
* \see ResourcesMergingHelper * \see ResourcesMergingHelper
* \see gd::ResourcesInUseHelper * \see gd::ResourcesInUseHelper
* *
* \see gd::GetResourceWorkerOnEvents * \see gd::LaunchResourceWorkerOnEvents
* *
* \ingroup IDE * \ingroup IDE
*/ */

View File

@@ -1,19 +0,0 @@
#include "ObjectsUsingResourceCollector.h"
#include "GDCore/Project/Object.h"
#include "GDCore/Project/Project.h"
namespace gd {
void ObjectsUsingResourceCollector::DoVisitObject(gd::Object& object) {
gd::ResourceNameMatcher resourceNameMatcher(resourceName);
object.GetConfiguration().ExposeResources(resourceNameMatcher);
if (resourceNameMatcher.AnyResourceMatches()) {
objectNames.push_back(object.GetName());
}
};
ObjectsUsingResourceCollector::~ObjectsUsingResourceCollector() {}
} // namespace gd

View File

@@ -1,89 +0,0 @@
/*
* GDevelop Core
* Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights
* reserved. This project is released under the MIT License.
*/
#ifndef ProjectObjectsUsingResourceCollector_H
#define ProjectObjectsUsingResourceCollector_H
#include <vector>
#include "GDCore/IDE/Project/ArbitraryObjectsWorker.h"
#include "GDCore/IDE/Project/ArbitraryResourceWorker.h"
#include "GDCore/String.h"
namespace gd {
class Object;
} // namespace gd
namespace gd {
class GD_CORE_API ObjectsUsingResourceCollector
: public ArbitraryObjectsWorker {
public:
ObjectsUsingResourceCollector(const gd::String& resourceName_)
: resourceName(resourceName_){};
virtual ~ObjectsUsingResourceCollector();
std::vector<gd::String>& GetObjectNames() { return objectNames; }
private:
void DoVisitObject(gd::Object& object) override;
std::vector<gd::String> objectNames;
gd::String resourceName;
};
class GD_CORE_API ResourceNameMatcher : public ArbitraryResourceWorker {
public:
ResourceNameMatcher(const gd::String& resourceName_)
: resourceName(resourceName_), matchesResourceName(false){};
virtual ~ResourceNameMatcher(){};
bool AnyResourceMatches() { return matchesResourceName; }
void Reset() { matchesResourceName = false; }
private:
virtual void ExposeFile(gd::String& resource) override{
/*Don't care, we just read resource names*/
};
virtual void ExposeImage(gd::String& otherResourceName) override {
MatchResourceName(otherResourceName);
};
virtual void ExposeAudio(gd::String& otherResourceName) override {
MatchResourceName(otherResourceName);
};
virtual void ExposeFont(gd::String& otherResourceName) override {
MatchResourceName(otherResourceName);
};
virtual void ExposeJson(gd::String& otherResourceName) override {
MatchResourceName(otherResourceName);
};
virtual void ExposeTilemap(gd::String& otherResourceName) override {
MatchResourceName(otherResourceName);
};
virtual void ExposeTileset(gd::String& otherResourceName) override {
MatchResourceName(otherResourceName);
};
virtual void ExposeVideo(gd::String& otherResourceName) override {
MatchResourceName(otherResourceName);
};
virtual void ExposeBitmapFont(gd::String& otherResourceName) override {
MatchResourceName(otherResourceName);
};
virtual void ExposeModel3D(gd::String& otherResourceName) override {
MatchResourceName(otherResourceName);
};
void MatchResourceName(gd::String& otherResourceName) {
if (otherResourceName == resourceName) matchesResourceName = true;
}
gd::String resourceName;
bool matchesResourceName;
};
}; // namespace gd
#endif // ProjectObjectsUsingResourceCollector_H

View File

@@ -51,6 +51,7 @@ bool ProjectResourcesCopier::CopyAllResourcesTo(
// Copy resources // Copy resources
map<gd::String, gd::String>& resourcesNewFilename = map<gd::String, gd::String>& resourcesNewFilename =
resourcesMergingHelper.GetAllResourcesOldAndNewFilename(); resourcesMergingHelper.GetAllResourcesOldAndNewFilename();
unsigned int i = 0;
for (map<gd::String, gd::String>::const_iterator it = for (map<gd::String, gd::String>::const_iterator it =
resourcesNewFilename.begin(); resourcesNewFilename.begin();
it != resourcesNewFilename.end(); it != resourcesNewFilename.end();
@@ -70,6 +71,8 @@ bool ProjectResourcesCopier::CopyAllResourcesTo(
destinationFile + _("\".")); destinationFile + _("\"."));
} }
} }
++i;
} }
return true; return true;

View File

@@ -1,35 +0,0 @@
/*
* GDevelop JS Platform
* Copyright 2008-2023 Florian Rival (Florian.Rival@gmail.com). All rights
* reserved. This project is released under the MIT License.
*/
#include "SceneResourcesFinder.h"
#include "GDCore/IDE/ResourceExposer.h"
#include "GDCore/Project/Layout.h"
#include "GDCore/Project/Project.h"
#include "GDCore/Serialization/SerializerElement.h"
namespace gd {
std::set<gd::String> SceneResourcesFinder::FindProjectResources(gd::Project &project) {
gd::SceneResourcesFinder resourceWorker;
gd::ResourceExposer::ExposeProjectResources(project, resourceWorker);
return resourceWorker.resourceNames;
}
std::set<gd::String> SceneResourcesFinder::FindSceneResources(gd::Project &project,
gd::Layout &layout) {
gd::SceneResourcesFinder resourceWorker;
gd::ResourceExposer::ExposeLayoutResources(project, layout, resourceWorker);
return resourceWorker.resourceNames;
}
void SceneResourcesFinder::AddUsedResource(gd::String &resourceName) {
if (resourceName.empty()) {
return;
}
resourceNames.insert(resourceName);
}
} // namespace gd

View File

@@ -1,86 +0,0 @@
/*
* GDevelop JS Platform
* Copyright 2008-2023 Florian Rival (Florian.Rival@gmail.com). All rights
* reserved. This project is released under the MIT License.
*/
#pragma once
#include "GDCore/IDE/Project/ArbitraryResourceWorker.h"
#include "GDCore/String.h"
#include <set>
namespace gd {
class Project;
class Layout;
class SerializerElement;
} // namespace gd
namespace gd {
/**
* \brief Find resource usages in several parts of the project.
*
* \ingroup IDE
*/
class SceneResourcesFinder : private gd::ArbitraryResourceWorker {
public:
/**
* @brief Find resource usages in a given scenes.
*
* It doesn't include resources used globally.
*/
static std::set<gd::String> FindSceneResources(gd::Project &project,
gd::Layout &layout);
/**
* @brief Find resource that are used globally in the project.
*
* It doesn't include resources used in scenes.
*/
static std::set<gd::String> FindProjectResources(gd::Project &project);
virtual ~SceneResourcesFinder(){};
private:
SceneResourcesFinder() : gd::ArbitraryResourceWorker(){};
void AddUsedResource(gd::String &resourceName);
void ExposeFile(gd::String &resourceFileName) override{
// Don't do anything: we're renaming resources, not the files they are
// pointing to.
};
void ExposeImage(gd::String &imageResourceName) override {
AddUsedResource(imageResourceName);
};
void ExposeAudio(gd::String &audioResourceName) override {
AddUsedResource(audioResourceName);
};
void ExposeFont(gd::String &fontResourceName) override {
AddUsedResource(fontResourceName);
};
void ExposeJson(gd::String &jsonResourceName) override {
AddUsedResource(jsonResourceName);
};
void ExposeTilemap(gd::String &tilemapResourceName) override {
AddUsedResource(tilemapResourceName);
};
void ExposeTileset(gd::String &tilesetResourceName) override {
AddUsedResource(tilesetResourceName);
};
void ExposeVideo(gd::String &videoResourceName) override {
AddUsedResource(videoResourceName);
};
void ExposeBitmapFont(gd::String &bitmapFontName) override {
AddUsedResource(bitmapFontName);
};
void ExposeModel3D(gd::String &resourceName) override {
AddUsedResource(resourceName);
};
std::set<gd::String> resourceNames;
};
} // namespace gd

View File

@@ -20,7 +20,6 @@
#include "GDCore/Project/Project.h" #include "GDCore/Project/Project.h"
#include "GDCore/Project/ProjectScopedContainers.h" #include "GDCore/Project/ProjectScopedContainers.h"
#include "GDCore/String.h" #include "GDCore/String.h"
#include "GDCore/IDE/DependenciesAnalyzer.h"
namespace gd { namespace gd {
@@ -34,8 +33,27 @@ void ProjectBrowserHelper::ExposeProjectEvents(
// Add events based extensions // Add events based extensions
for (std::size_t e = 0; e < project.GetEventsFunctionsExtensionsCount(); for (std::size_t e = 0; e < project.GetEventsFunctionsExtensionsCount();
e++) { e++) {
// Add (free) events functions
auto &eventsFunctionsExtension = project.GetEventsFunctionsExtension(e); auto &eventsFunctionsExtension = project.GetEventsFunctionsExtension(e);
ProjectBrowserHelper::ExposeEventsFunctionsExtensionEvents(project, eventsFunctionsExtension, worker); for (auto &&eventsFunction : eventsFunctionsExtension.GetInternalVector()) {
worker.Launch(eventsFunction->GetEvents());
}
// Add (behavior) events functions
for (auto &&eventsBasedBehavior :
eventsFunctionsExtension.GetEventsBasedBehaviors()
.GetInternalVector()) {
ExposeEventsBasedBehaviorEvents(project, *eventsBasedBehavior, worker);
}
// Add (object) events functions
for (auto &&eventsBasedObject :
eventsFunctionsExtension.GetEventsBasedObjects().GetInternalVector()) {
auto &objectEventsFunctions = eventsBasedObject->GetEventsFunctions();
for (auto &&eventsFunction : objectEventsFunctions.GetInternalVector()) {
worker.Launch(eventsFunction->GetEvents());
}
}
} }
} }
@@ -51,7 +69,7 @@ void ProjectBrowserHelper::ExposeProjectEventsWithoutExtensions(
} }
} }
void ProjectBrowserHelper::ExposeLayoutEventsAndExternalEvents( void ProjectBrowserHelper::ExposeLayoutEvents(
gd::Project &project, gd::Layout &layout, gd::Project &project, gd::Layout &layout,
gd::ArbitraryEventsWorker &worker) { gd::ArbitraryEventsWorker &worker) {
@@ -67,7 +85,7 @@ void ProjectBrowserHelper::ExposeLayoutEventsAndExternalEvents(
} }
} }
void ProjectBrowserHelper::ExposeLayoutEventsAndExternalEvents( void ProjectBrowserHelper::ExposeLayoutEvents(
gd::Project &project, gd::Layout &layout, gd::Project &project, gd::Layout &layout,
gd::ArbitraryEventsWorkerWithContext &worker) { gd::ArbitraryEventsWorkerWithContext &worker) {
auto projectScopedContainers = auto projectScopedContainers =
@@ -85,32 +103,6 @@ void ProjectBrowserHelper::ExposeLayoutEventsAndExternalEvents(
} }
} }
void ProjectBrowserHelper::ExposeLayoutEventsAndDependencies(
gd::Project &project, gd::Layout &layout,
gd::ArbitraryEventsWorker &worker) {
// Add layouts events
worker.Launch(layout.GetEvents());
DependenciesAnalyzer dependenciesAnalyzer(project, layout);
bool hasCircularDependencies = !dependenciesAnalyzer.Analyze();
if (hasCircularDependencies) {
// The analyzer stops when it finds circular dependencies so the dependencies are not complete.
// TODO Should the analyzer still continue to avoid side effect on thing that would not be code generation related?
// Maybe a boolean parameter should be added?
return;
}
for (const gd::String& externalEventName : dependenciesAnalyzer.GetExternalEventsDependencies()) {
gd::ExternalEvents& externalEvents = project.GetExternalEvents(externalEventName);
worker.Launch(externalEvents.GetEvents());
}
for (const gd::String& sceneName : dependenciesAnalyzer.GetScenesDependencies()) {
gd::Layout& dependencyLayout = project.GetLayout(sceneName);
worker.Launch(dependencyLayout.GetEvents());
}
}
void ProjectBrowserHelper::ExposeProjectEvents( void ProjectBrowserHelper::ExposeProjectEvents(
gd::Project &project, gd::ArbitraryEventsWorkerWithContext &worker) { gd::Project &project, gd::ArbitraryEventsWorkerWithContext &worker) {
// See also gd::Project::ExposeResources for a method that traverse the whole // See also gd::Project::ExposeResources for a method that traverse the whole
@@ -138,43 +130,8 @@ void ProjectBrowserHelper::ExposeProjectEvents(
// Add events based extensions // Add events based extensions
for (std::size_t e = 0; e < project.GetEventsFunctionsExtensionsCount(); for (std::size_t e = 0; e < project.GetEventsFunctionsExtensionsCount();
e++) { e++) {
// Add (free) events functions
auto &eventsFunctionsExtension = project.GetEventsFunctionsExtension(e); auto &eventsFunctionsExtension = project.GetEventsFunctionsExtension(e);
ProjectBrowserHelper::ExposeEventsFunctionsExtensionEvents(project, eventsFunctionsExtension, worker);
}
}
void ProjectBrowserHelper::ExposeEventsFunctionsExtensionEvents(
gd::Project &project, const gd::EventsFunctionsExtension &eventsFunctionsExtension,
gd::ArbitraryEventsWorker &worker) {
// Add (free) events functions
for (auto &&eventsFunction : eventsFunctionsExtension.GetInternalVector()) {
gd::ObjectsContainer globalObjectsAndGroups;
gd::ObjectsContainer objectsAndGroups;
gd::EventsFunctionTools::FreeEventsFunctionToObjectsContainer(
project, eventsFunctionsExtension, *eventsFunction,
globalObjectsAndGroups, objectsAndGroups);
worker.Launch(eventsFunction->GetEvents());
}
// Add (behavior) events functions
for (auto &&eventsBasedBehavior :
eventsFunctionsExtension.GetEventsBasedBehaviors()
.GetInternalVector()) {
ExposeEventsBasedBehaviorEvents(project, *eventsBasedBehavior, worker);
}
// Add (object) events functions
for (auto &&eventsBasedObject :
eventsFunctionsExtension.GetEventsBasedObjects().GetInternalVector()) {
ExposeEventsBasedObjectEvents(project, *eventsBasedObject, worker);
}
}
void ProjectBrowserHelper::ExposeEventsFunctionsExtensionEvents(
gd::Project &project, const gd::EventsFunctionsExtension &eventsFunctionsExtension,
gd::ArbitraryEventsWorkerWithContext &worker) {
// Add (free) events functions
for (auto &&eventsFunction : eventsFunctionsExtension.GetInternalVector()) { for (auto &&eventsFunction : eventsFunctionsExtension.GetInternalVector()) {
gd::ObjectsContainer globalObjectsAndGroups; gd::ObjectsContainer globalObjectsAndGroups;
gd::ObjectsContainer objectsAndGroups; gd::ObjectsContainer objectsAndGroups;
@@ -183,7 +140,7 @@ void ProjectBrowserHelper::ExposeEventsFunctionsExtensionEvents(
globalObjectsAndGroups, objectsAndGroups); globalObjectsAndGroups, objectsAndGroups);
auto projectScopedContainers = auto projectScopedContainers =
gd::ProjectScopedContainers::MakeNewProjectScopedContainersFor(globalObjectsAndGroups, objectsAndGroups); gd::ProjectScopedContainers::MakeNewProjectScopedContainersFor(globalObjectsAndGroups, objectsAndGroups);
projectScopedContainers.AddParameters(eventsFunction->GetParametersForEvents(eventsFunctionsExtension)); projectScopedContainers.AddParameters(eventsFunction->GetParameters());
worker.Launch(eventsFunction->GetEvents(), projectScopedContainers); worker.Launch(eventsFunction->GetEvents(), projectScopedContainers);
} }
@@ -200,6 +157,7 @@ void ProjectBrowserHelper::ExposeEventsFunctionsExtensionEvents(
eventsFunctionsExtension.GetEventsBasedObjects().GetInternalVector()) { eventsFunctionsExtension.GetEventsBasedObjects().GetInternalVector()) {
ExposeEventsBasedObjectEvents(project, *eventsBasedObject, worker); ExposeEventsBasedObjectEvents(project, *eventsBasedObject, worker);
} }
}
} }
void ProjectBrowserHelper::ExposeEventsBasedBehaviorEvents( void ProjectBrowserHelper::ExposeEventsBasedBehaviorEvents(
@@ -225,27 +183,12 @@ void ProjectBrowserHelper::ExposeEventsBasedBehaviorEvents(
gd::ProjectScopedContainers::MakeNewProjectScopedContainersFor(globalObjectsAndGroups, objectsAndGroups); gd::ProjectScopedContainers::MakeNewProjectScopedContainersFor(globalObjectsAndGroups, objectsAndGroups);
projectScopedContainers.AddPropertiesContainer(eventsBasedBehavior.GetSharedPropertyDescriptors()); projectScopedContainers.AddPropertiesContainer(eventsBasedBehavior.GetSharedPropertyDescriptors());
projectScopedContainers.AddPropertiesContainer(eventsBasedBehavior.GetPropertyDescriptors()); projectScopedContainers.AddPropertiesContainer(eventsBasedBehavior.GetPropertyDescriptors());
projectScopedContainers.AddParameters(eventsFunction->GetParametersForEvents(eventsBasedBehavior.GetEventsFunctions())); projectScopedContainers.AddParameters(eventsFunction->GetParameters());
worker.Launch(eventsFunction->GetEvents(), projectScopedContainers); worker.Launch(eventsFunction->GetEvents(), projectScopedContainers);
} }
} }
void ProjectBrowserHelper::ExposeEventsBasedObjectEvents(
gd::Project &project, const gd::EventsBasedObject &eventsBasedObject,
gd::ArbitraryEventsWorker &worker) {
auto &objectEventsFunctions = eventsBasedObject.GetEventsFunctions();
for (auto &&eventsFunction : objectEventsFunctions.GetInternalVector()) {
gd::ObjectsContainer globalObjectsAndGroups;
gd::ObjectsContainer objectsAndGroups;
gd::EventsFunctionTools::ObjectEventsFunctionToObjectsContainer(
project, eventsBasedObject, *eventsFunction, globalObjectsAndGroups,
objectsAndGroups);
worker.Launch(eventsFunction->GetEvents());
}
}
void ProjectBrowserHelper::ExposeEventsBasedObjectEvents( void ProjectBrowserHelper::ExposeEventsBasedObjectEvents(
gd::Project &project, const gd::EventsBasedObject &eventsBasedObject, gd::Project &project, const gd::EventsBasedObject &eventsBasedObject,
gd::ArbitraryEventsWorkerWithContext &worker) { gd::ArbitraryEventsWorkerWithContext &worker) {
@@ -259,7 +202,7 @@ void ProjectBrowserHelper::ExposeEventsBasedObjectEvents(
auto projectScopedContainers = auto projectScopedContainers =
gd::ProjectScopedContainers::MakeNewProjectScopedContainersFor(globalObjectsAndGroups, objectsAndGroups); gd::ProjectScopedContainers::MakeNewProjectScopedContainersFor(globalObjectsAndGroups, objectsAndGroups);
projectScopedContainers.AddPropertiesContainer(eventsBasedObject.GetPropertyDescriptors()); projectScopedContainers.AddPropertiesContainer(eventsBasedObject.GetPropertyDescriptors());
projectScopedContainers.AddParameters(eventsFunction->GetParametersForEvents(eventsBasedObject.GetEventsFunctions())); projectScopedContainers.AddParameters(eventsFunction->GetParameters());
worker.Launch(eventsFunction->GetEvents(), projectScopedContainers); worker.Launch(eventsFunction->GetEvents(), projectScopedContainers);
} }
@@ -273,7 +216,7 @@ void ProjectBrowserHelper::ExposeProjectObjects(
// Layout objects // Layout objects
for (size_t i = 0; i < project.GetLayoutsCount(); i++) { for (size_t i = 0; i < project.GetLayoutsCount(); i++) {
gd::ProjectBrowserHelper::ExposeLayoutObjects(project.GetLayout(i), worker); worker.Launch(project.GetLayout(i));
} }
// Event based objects children // Event based objects children
@@ -289,14 +232,6 @@ void ProjectBrowserHelper::ExposeProjectObjects(
} }
}; };
void ProjectBrowserHelper::ExposeLayoutObjects(gd::Layout &layout,
gd::ArbitraryObjectsWorker &worker) {
// In the future, layouts may have children object containers.
// Layout objects
worker.Launch(layout);
}
void ProjectBrowserHelper::ExposeProjectFunctions( void ProjectBrowserHelper::ExposeProjectFunctions(
gd::Project &project, gd::ArbitraryEventsFunctionsWorker &worker) { gd::Project &project, gd::ArbitraryEventsFunctionsWorker &worker) {

View File

@@ -60,52 +60,18 @@ public:
* \brief Call the specified worker on all events of a layout and * \brief Call the specified worker on all events of a layout and
* its external events. * its external events.
*/ */
static void ExposeLayoutEventsAndExternalEvents(gd::Project &project, gd::Layout &layout, static void ExposeLayoutEvents(gd::Project &project, gd::Layout &layout,
gd::ArbitraryEventsWorker &worker); gd::ArbitraryEventsWorker &worker);
/** /**
* \brief Call the specified worker on all events of a layout and * \brief Call the specified worker on all events of a layout and
* its external events. * its external events.
*/ */
static void ExposeLayoutEventsAndExternalEvents(gd::Project &project, gd::Layout &layout, static void ExposeLayoutEvents(gd::Project &project, gd::Layout &layout,
gd::ArbitraryEventsWorkerWithContext &worker); gd::ArbitraryEventsWorkerWithContext &worker);
/**
* \brief Call the specified worker on all events of a layout and
* its dependencies according to EventLink (external events or other layout
* events).
*/
static void
ExposeLayoutEventsAndDependencies(gd::Project &project, gd::Layout &layout,
gd::ArbitraryEventsWorker &worker);
/** /**
* \brief Call the specified worker on all events of the event-based * \brief Call the specified worker on all events of the event-based
* extension. * behavior
*
* This should be the preferred way to traverse all the events of an events
* based extension.
*/
static void ExposeEventsFunctionsExtensionEvents(
gd::Project &project,
const gd::EventsFunctionsExtension &eventsFunctionsExtension,
gd::ArbitraryEventsWorker &worker);
/**
* \brief Call the specified worker on all events of the event-based
* extension.
*
* This should be the preferred way to traverse all the events of an events
* based extension.
*/
static void ExposeEventsFunctionsExtensionEvents(
gd::Project &project,
const gd::EventsFunctionsExtension &eventsFunctionsExtension,
gd::ArbitraryEventsWorkerWithContext &worker);
/**
* \brief Call the specified worker on all events of the event-based
* behavior.
* *
* This should be the preferred way to traverse all the events of an events * This should be the preferred way to traverse all the events of an events
* based behavior. * based behavior.
@@ -127,22 +93,10 @@ public:
/** /**
* \brief Call the specified worker on all events of the event-based * \brief Call the specified worker on all events of the event-based
* object. * behavior.
* *
* This should be the preferred way to traverse all the events of an * This should be the preferred way to traverse all the events of an
* event-based object. * event-based behavior.
*/
static void
ExposeEventsBasedObjectEvents(gd::Project &project,
const gd::EventsBasedObject &eventsBasedObject,
gd::ArbitraryEventsWorker &worker);
/**
* \brief Call the specified worker on all events of the event-based
* object.
*
* This should be the preferred way to traverse all the events of an
* event-based object.
*/ */
static void static void
ExposeEventsBasedObjectEvents(gd::Project &project, ExposeEventsBasedObjectEvents(gd::Project &project,
@@ -158,14 +112,6 @@ public:
static void ExposeProjectObjects(gd::Project &project, static void ExposeProjectObjects(gd::Project &project,
gd::ArbitraryObjectsWorker &worker); gd::ArbitraryObjectsWorker &worker);
/**
* \brief Call the specified worker on all ObjectContainers of the layout.
*
* This should be the preferred way to traverse all the objects of a layout.
*/
static void ExposeLayoutObjects(gd::Layout &layout,
gd::ArbitraryObjectsWorker &worker);
/** /**
* \brief Call the specified worker on all FunctionsContainers of the project * \brief Call the specified worker on all FunctionsContainers of the project
* (global, layouts...) * (global, layouts...)

View File

@@ -24,7 +24,6 @@
#include "GDCore/Extensions/Platform.h" #include "GDCore/Extensions/Platform.h"
#include "GDCore/Extensions/Metadata/MetadataProvider.h" #include "GDCore/Extensions/Metadata/MetadataProvider.h"
#include "GDCore/Extensions/Metadata/EffectMetadata.h" #include "GDCore/Extensions/Metadata/EffectMetadata.h"
#include "GDCore/IDE/Events/UsedExtensionsFinder.h"
namespace gd { namespace gd {
@@ -37,7 +36,6 @@ void ResourceExposer::ExposeWholeProjectResources(gd::Project& project, gd::Arbi
// Expose any project resources as files. // Expose any project resources as files.
worker.ExposeResources(resourcesManager); worker.ExposeResources(resourcesManager);
project.GetPlatformSpecificAssets().ExposeResources(worker); project.GetPlatformSpecificAssets().ExposeResources(worker);
// Expose event resources // Expose event resources
@@ -75,49 +73,6 @@ void ResourceExposer::ExposeWholeProjectResources(gd::Project& project, gd::Arbi
worker.ExposeImage(loadingScreen.GetBackgroundImageResourceName()); worker.ExposeImage(loadingScreen.GetBackgroundImageResourceName());
} }
void ResourceExposer::ExposeProjectResources(gd::Project& project, gd::ArbitraryResourceWorker& worker) {
// Expose global objects configuration resources
auto objectWorker = gd::GetResourceWorkerOnObjects(project, worker);
objectWorker.Launch(project);
}
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( void ResourceExposer::ExposeEffectResources(
gd::Platform &platform, gd::Effect &effect, gd::Platform &platform, gd::Effect &effect,
gd::ArbitraryResourceWorker &worker) { gd::ArbitraryResourceWorker &worker) {
@@ -133,13 +88,11 @@ void ResourceExposer::ExposeEffectResources(
auto &resourceType = propertyDescriptor.GetExtraInfo()[0]; auto &resourceType = propertyDescriptor.GetExtraInfo()[0];
const gd::String &resourceName = effect.GetStringParameter(propertyName); const gd::String &resourceName = effect.GetStringParameter(propertyName);
if (!resourceName.empty()) { gd::String potentiallyUpdatedResourceName = resourceName;
gd::String potentiallyUpdatedResourceName = resourceName; worker.ExposeResourceWithType(resourceType,
worker.ExposeResourceWithType(resourceType, potentiallyUpdatedResourceName);
potentiallyUpdatedResourceName); if (potentiallyUpdatedResourceName != resourceName) {
if (potentiallyUpdatedResourceName != resourceName) { effect.SetStringParameter(propertyName, potentiallyUpdatedResourceName);
effect.SetStringParameter(propertyName, potentiallyUpdatedResourceName);
}
} }
} }
} }

View File

@@ -10,7 +10,6 @@ class Platform;
class Project; class Project;
class ArbitraryResourceWorker; class ArbitraryResourceWorker;
class Effect; class Effect;
class Layout;
} // namespace gd } // namespace gd
namespace gd { namespace gd {
@@ -32,25 +31,6 @@ public:
static void ExposeWholeProjectResources(gd::Project &project, static void ExposeWholeProjectResources(gd::Project &project,
gd::ArbitraryResourceWorker &worker); gd::ArbitraryResourceWorker &worker);
/**
* @brief Expose only the resources used globally on a project.
*
* It doesn't include resources used in layouts.
*/
static void ExposeProjectResources(gd::Project &project,
gd::ArbitraryResourceWorker &worker);
/**
* @brief Expose the resources used in a given layout.
*
* It doesn't include resources used globally.
*/
static void ExposeLayoutResources(gd::Project &project, gd::Layout &layout,
gd::ArbitraryResourceWorker &worker);
/**
* @brief Expose the resources used in a given effect.
*/
static void ExposeEffectResources(gd::Platform &platform, gd::Effect &effect, static void ExposeEffectResources(gd::Platform &platform, gd::Effect &effect,
gd::ArbitraryResourceWorker &worker); gd::ArbitraryResourceWorker &worker);
}; };

View File

@@ -1538,7 +1538,7 @@ void WholeProjectRefactorer::RenameLayer(gd::Project &project,
return; return;
gd::ProjectElementRenamer projectElementRenamer(project.GetCurrentPlatform(), gd::ProjectElementRenamer projectElementRenamer(project.GetCurrentPlatform(),
"layer", oldName, newName); "layer", oldName, newName);
gd::ProjectBrowserHelper::ExposeLayoutEventsAndExternalEvents(project, layout, gd::ProjectBrowserHelper::ExposeLayoutEvents(project, layout,
projectElementRenamer); projectElementRenamer);
} }
@@ -1552,7 +1552,7 @@ void WholeProjectRefactorer::RenameLayerEffect(gd::Project &project,
gd::ProjectElementRenamer projectElementRenamer( gd::ProjectElementRenamer projectElementRenamer(
project.GetCurrentPlatform(), "layerEffectName", oldName, newName); project.GetCurrentPlatform(), "layerEffectName", oldName, newName);
projectElementRenamer.SetLayerConstraint(layer.GetName()); projectElementRenamer.SetLayerConstraint(layer.GetName());
gd::ProjectBrowserHelper::ExposeLayoutEventsAndExternalEvents(project, layout, gd::ProjectBrowserHelper::ExposeLayoutEvents(project, layout,
projectElementRenamer); projectElementRenamer);
} }
@@ -1566,7 +1566,7 @@ void WholeProjectRefactorer::RenameObjectAnimation(gd::Project &project,
gd::ProjectElementRenamer projectElementRenamer( gd::ProjectElementRenamer projectElementRenamer(
project.GetCurrentPlatform(), "objectAnimationName", oldName, newName); project.GetCurrentPlatform(), "objectAnimationName", oldName, newName);
projectElementRenamer.SetObjectConstraint(object.GetName()); projectElementRenamer.SetObjectConstraint(object.GetName());
gd::ProjectBrowserHelper::ExposeLayoutEventsAndExternalEvents(project, layout, gd::ProjectBrowserHelper::ExposeLayoutEvents(project, layout,
projectElementRenamer); projectElementRenamer);
} }
@@ -1580,7 +1580,7 @@ void WholeProjectRefactorer::RenameObjectPoint(gd::Project &project,
gd::ProjectElementRenamer projectElementRenamer( gd::ProjectElementRenamer projectElementRenamer(
project.GetCurrentPlatform(), "objectPointName", oldName, newName); project.GetCurrentPlatform(), "objectPointName", oldName, newName);
projectElementRenamer.SetObjectConstraint(object.GetName()); projectElementRenamer.SetObjectConstraint(object.GetName());
gd::ProjectBrowserHelper::ExposeLayoutEventsAndExternalEvents(project, layout, gd::ProjectBrowserHelper::ExposeLayoutEvents(project, layout,
projectElementRenamer); projectElementRenamer);
} }
@@ -1594,7 +1594,7 @@ void WholeProjectRefactorer::RenameObjectEffect(gd::Project &project,
gd::ProjectElementRenamer projectElementRenamer( gd::ProjectElementRenamer projectElementRenamer(
project.GetCurrentPlatform(), "objectEffectName", oldName, newName); project.GetCurrentPlatform(), "objectEffectName", oldName, newName);
projectElementRenamer.SetObjectConstraint(object.GetName()); projectElementRenamer.SetObjectConstraint(object.GetName());
gd::ProjectBrowserHelper::ExposeLayoutEventsAndExternalEvents(project, layout, gd::ProjectBrowserHelper::ExposeLayoutEvents(project, layout,
projectElementRenamer); projectElementRenamer);
} }

View File

@@ -5,8 +5,6 @@
*/ */
#include "CustomConfigurationHelper.h" #include "CustomConfigurationHelper.h"
#include <map>
#include "GDCore/IDE/Project/ArbitraryResourceWorker.h" #include "GDCore/IDE/Project/ArbitraryResourceWorker.h"
#include "GDCore/Project/Behavior.h" #include "GDCore/Project/Behavior.h"
#include "GDCore/Project/Project.h" #include "GDCore/Project/Project.h"
@@ -15,6 +13,8 @@
#include "GDCore/Serialization/Serializer.h" #include "GDCore/Serialization/Serializer.h"
#include "GDCore/Serialization/SerializerElement.h" #include "GDCore/Serialization/SerializerElement.h"
#include <map>
using namespace gd; using namespace gd;
void CustomConfigurationHelper::InitializeContent( void CustomConfigurationHelper::InitializeContent(
@@ -25,8 +25,7 @@ void CustomConfigurationHelper::InitializeContent(
auto propertyType = property->GetType(); auto propertyType = property->GetType();
if (propertyType == "String" || propertyType == "Choice" || if (propertyType == "String" || propertyType == "Choice" ||
propertyType == "Color" || propertyType == "Behavior" || propertyType == "Color" || propertyType == "Behavior") {
propertyType == "resource") {
element.SetStringValue(property->GetValue()); element.SetStringValue(property->GetValue());
} else if (propertyType == "Number") { } else if (propertyType == "Number") {
element.SetDoubleValue(property->GetValue().To<double>()); element.SetDoubleValue(property->GetValue().To<double>());
@@ -52,8 +51,7 @@ std::map<gd::String, gd::PropertyDescriptor> CustomConfigurationHelper::GetPrope
if (configurationContent.HasChild(propertyName)) { if (configurationContent.HasChild(propertyName)) {
if (propertyType == "String" || propertyType == "Choice" || if (propertyType == "String" || propertyType == "Choice" ||
propertyType == "Color" || propertyType == "Behavior" || propertyType == "Color" || propertyType == "Behavior") {
propertyType == "resource") {
newProperty.SetValue( newProperty.SetValue(
configurationContent.GetChild(propertyName).GetStringValue()); configurationContent.GetChild(propertyName).GetStringValue());
} else if (propertyType == "Number") { } else if (propertyType == "Number") {
@@ -61,9 +59,8 @@ std::map<gd::String, gd::PropertyDescriptor> CustomConfigurationHelper::GetPrope
configurationContent.GetChild(propertyName).GetDoubleValue())); configurationContent.GetChild(propertyName).GetDoubleValue()));
} else if (propertyType == "Boolean") { } else if (propertyType == "Boolean") {
newProperty.SetValue( newProperty.SetValue(
configurationContent.GetChild(propertyName).GetBoolValue() configurationContent.GetChild(propertyName).GetBoolValue() ? "true"
? "true" : "false");
: "false");
} }
} else { } else {
// No value was serialized for this property. `newProperty` // No value was serialized for this property. `newProperty`
@@ -88,8 +85,7 @@ bool CustomConfigurationHelper::UpdateProperty(
const gd::String &propertyType = property.GetType(); const gd::String &propertyType = property.GetType();
if (propertyType == "String" || propertyType == "Choice" || if (propertyType == "String" || propertyType == "Choice" ||
propertyType == "Color" || propertyType == "Behavior" || propertyType == "Color" || propertyType == "Behavior") {
propertyType == "resource") {
element.SetStringValue(newValue); element.SetStringValue(newValue);
} else if (propertyType == "Number") { } else if (propertyType == "Number") {
element.SetDoubleValue(newValue.To<double>()); element.SetDoubleValue(newValue.To<double>());

View File

@@ -17,7 +17,7 @@ EventsBasedObject::EventsBasedObject()
} }
EventsBasedObject::~EventsBasedObject() {} EventsBasedObject::~EventsBasedObject() {}
EventsBasedObject::EventsBasedObject(const gd::EventsBasedObject &_eventBasedObject) EventsBasedObject::EventsBasedObject(const gd::EventsBasedObject &_eventBasedObject)
: AbstractEventsBasedEntity(_eventBasedObject) { : AbstractEventsBasedEntity(_eventBasedObject) {
// TODO Add a copy constructor in ObjectsContainer. // TODO Add a copy constructor in ObjectsContainer.
@@ -27,26 +27,17 @@ EventsBasedObject::EventsBasedObject(const gd::EventsBasedObject &_eventBasedObj
void EventsBasedObject::SerializeTo(SerializerElement& element) const { void EventsBasedObject::SerializeTo(SerializerElement& element) const {
element.SetAttribute("defaultName", defaultName); element.SetAttribute("defaultName", defaultName);
if (isRenderedIn3D) {
element.SetBoolAttribute("is3D", true);
}
AbstractEventsBasedEntity::SerializeTo(element); AbstractEventsBasedEntity::SerializeTo(element);
SerializeObjectsTo(element.AddChild("objects")); SerializeObjectsTo(element.AddChild("objects"));
SerializeFoldersTo(element.AddChild("objectsFolderStructure"));
} }
void EventsBasedObject::UnserializeFrom(gd::Project& project, void EventsBasedObject::UnserializeFrom(gd::Project& project,
const SerializerElement& element) { const SerializerElement& element) {
defaultName = element.GetStringAttribute("defaultName"); defaultName = element.GetStringAttribute("defaultName");
isRenderedIn3D = element.GetBoolAttribute("is3D", false);
AbstractEventsBasedEntity::UnserializeFrom(project, element); AbstractEventsBasedEntity::UnserializeFrom(project, element);
UnserializeObjectsFrom(project, element.GetChild("objects")); UnserializeObjectsFrom(project, element.GetChild("objects"));
if (element.HasChild("objectsFolderStructure")) {
UnserializeFoldersFrom(project, element.GetChild("objectsFolderStructure", 0));
}
AddMissingObjectsInRootFolder();
} }
} // namespace gd } // namespace gd

View File

@@ -72,19 +72,6 @@ class GD_CORE_API EventsBasedObject: public AbstractEventsBasedEntity, public Ob
return *this; return *this;
} }
/**
* \brief Declare a usage of the 3D renderer.
*/
EventsBasedObject& MarkAsRenderedIn3D(bool isRenderedIn3D_) {
isRenderedIn3D = isRenderedIn3D_;
return *this;
}
/**
* \brief Return true if the object uses the 3D renderer.
*/
bool IsRenderedIn3D() const { return isRenderedIn3D; }
void SerializeTo(SerializerElement& element) const override; void SerializeTo(SerializerElement& element) const override;
void UnserializeFrom(gd::Project& project, void UnserializeFrom(gd::Project& project,
@@ -92,7 +79,6 @@ class GD_CORE_API EventsBasedObject: public AbstractEventsBasedEntity, public Ob
private: private:
gd::String defaultName; gd::String defaultName;
bool isRenderedIn3D;
}; };
} // namespace gd } // namespace gd

View File

@@ -19,7 +19,7 @@ Layer::Layer()
isLocked(false), isLocked(false),
isLightingLayer(false), isLightingLayer(false),
followBaseLayerCamera(false), followBaseLayerCamera(false),
camera3DNearPlaneDistance(3), camera3DNearPlaneDistance(0.1),
camera3DFarPlaneDistance(10000), camera3DFarPlaneDistance(10000),
camera3DFieldOfView(45), camera3DFieldOfView(45),
ambientLightColorR(200), ambientLightColorR(200),

View File

@@ -294,7 +294,6 @@ void Layout::SerializeTo(SerializerElement& element) const {
GetVariables().SerializeTo(element.AddChild("variables")); GetVariables().SerializeTo(element.AddChild("variables"));
GetInitialInstances().SerializeTo(element.AddChild("instances")); GetInitialInstances().SerializeTo(element.AddChild("instances"));
SerializeObjectsTo(element.AddChild("objects")); SerializeObjectsTo(element.AddChild("objects"));
SerializeFoldersTo(element.AddChild("objectsFolderStructure"));
gd::EventsListSerialization::SerializeEventsTo(events, gd::EventsListSerialization::SerializeEventsTo(events,
element.AddChild("events")); element.AddChild("events"));
@@ -354,11 +353,6 @@ void Layout::UnserializeFrom(gd::Project& project,
project, GetEvents(), element.GetChild("events", 0, "Events")); project, GetEvents(), element.GetChild("events", 0, "Events"));
UnserializeObjectsFrom(project, element.GetChild("objects", 0, "Objets")); UnserializeObjectsFrom(project, element.GetChild("objects", 0, "Objets"));
if (element.HasChild("objectsFolderStructure")) {
UnserializeFoldersFrom(project, element.GetChild("objectsFolderStructure", 0));
}
AddMissingObjectsInRootFolder();
initialInstances.UnserializeFrom( initialInstances.UnserializeFrom(
element.GetChild("instances", 0, "Positions")); element.GetChild("instances", 0, "Positions"));
variables.UnserializeFrom(element.GetChild("variables", 0, "Variables")); variables.UnserializeFrom(element.GetChild("variables", 0, "Variables"));

View File

@@ -40,6 +40,7 @@ void Object::Init(const gd::Object& object) {
name = object.name; name = object.name;
assetStoreId = object.assetStoreId; assetStoreId = object.assetStoreId;
objectVariables = object.objectVariables; objectVariables = object.objectVariables;
tags = object.tags;
effectsContainer = object.effectsContainer; effectsContainer = object.effectsContainer;
behaviors.clear(); behaviors.clear();
@@ -133,6 +134,7 @@ void Object::UnserializeFrom(gd::Project& project,
SetType(element.GetStringAttribute("type")); SetType(element.GetStringAttribute("type"));
assetStoreId = element.GetStringAttribute("assetStoreId"); assetStoreId = element.GetStringAttribute("assetStoreId");
name = element.GetStringAttribute("name", name, "nom"); name = element.GetStringAttribute("name", name, "nom");
tags = element.GetStringAttribute("tags");
objectVariables.UnserializeFrom( objectVariables.UnserializeFrom(
element.GetChild("variables", 0, "Variables")); element.GetChild("variables", 0, "Variables"));
@@ -205,6 +207,7 @@ void Object::SerializeTo(SerializerElement& element) const {
element.SetAttribute("name", GetName()); element.SetAttribute("name", GetName());
element.SetAttribute("assetStoreId", GetAssetStoreId()); element.SetAttribute("assetStoreId", GetAssetStoreId());
element.SetAttribute("type", GetType()); element.SetAttribute("type", GetType());
element.SetAttribute("tags", GetTags());
objectVariables.SerializeTo(element.AddChild("variables")); objectVariables.SerializeTo(element.AddChild("variables"));
effectsContainer.SerializeTo(element.AddChild("effects")); effectsContainer.SerializeTo(element.AddChild("effects"));

View File

@@ -120,6 +120,14 @@ class GD_CORE_API Object {
*/ */
const gd::String& GetType() const { return configuration->GetType(); } const gd::String& GetType() const { return configuration->GetType(); }
/** \brief Change the tags of the object.
*/
void SetTags(const gd::String& tags_) { tags = tags_; }
/** \brief Return the tags of the object.
*/
const gd::String& GetTags() const { return tags; }
/** \brief Shortcut to check if the object is a 3D object. /** \brief Shortcut to check if the object is a 3D object.
*/ */
bool Is3DObject() const { return configuration->Is3DObject(); } bool Is3DObject() const { return configuration->Is3DObject(); }
@@ -260,6 +268,7 @@ class GD_CORE_API Object {
///< object. ///< object.
gd::VariablesContainer gd::VariablesContainer
objectVariables; ///< List of the variables of the object objectVariables; ///< List of the variables of the object
gd::String tags; ///< Comma-separated list of tags
gd::EffectsContainer gd::EffectsContainer
effectsContainer; ///< The effects container for the object. effectsContainer; ///< The effects container for the object.
mutable gd::String persistentUuid; ///< A persistent random version 4 UUID, mutable gd::String persistentUuid; ///< A persistent random version 4 UUID,

View File

@@ -1,248 +0,0 @@
/*
* GDevelop Core
* Copyright 2008-2023 Florian Rival (Florian.Rival@gmail.com). All rights
* reserved. This project is released under the MIT License.
*/
#include "GDCore/Project/ObjectFolderOrObject.h"
#include <memory>
#include "GDCore/Project/Object.h"
#include "GDCore/Project/ObjectsContainer.h"
#include "GDCore/Serialization/SerializerElement.h"
#include "GDCore/Tools/Log.h"
using namespace std;
namespace gd {
ObjectFolderOrObject ObjectFolderOrObject::badObjectFolderOrObject;
ObjectFolderOrObject::ObjectFolderOrObject()
: folderName("__NULL"), object(nullptr) {}
ObjectFolderOrObject::ObjectFolderOrObject(gd::String folderName_,
ObjectFolderOrObject* parent_)
: folderName(folderName_), parent(parent_), object(nullptr) {}
ObjectFolderOrObject::ObjectFolderOrObject(gd::Object* object_,
ObjectFolderOrObject* parent_)
: object(object_), parent(parent_) {}
ObjectFolderOrObject::~ObjectFolderOrObject() {}
bool ObjectFolderOrObject::HasObjectNamed(const gd::String& name) {
if (IsFolder()) {
return std::any_of(
children.begin(),
children.end(),
[&name](
std::unique_ptr<gd::ObjectFolderOrObject>& objectFolderOrObject) {
return objectFolderOrObject->HasObjectNamed(name);
});
}
if (!object) return false;
return object->GetName() == name;
}
ObjectFolderOrObject& ObjectFolderOrObject::GetObjectNamed(
const gd::String& name) {
if (object && object->GetName() == name) {
return *this;
}
if (IsFolder()) {
for (std::size_t j = 0; j < children.size(); j++) {
ObjectFolderOrObject& foundInChild = children[j]->GetObjectNamed(name);
if (&(foundInChild) != &badObjectFolderOrObject) {
return foundInChild;
}
}
}
return badObjectFolderOrObject;
}
void ObjectFolderOrObject::SetFolderName(const gd::String& name) {
if (!IsFolder()) return;
folderName = name;
}
ObjectFolderOrObject& ObjectFolderOrObject::GetChildAt(std::size_t index) {
if (index >= children.size()) return badObjectFolderOrObject;
return *children[index];
}
const ObjectFolderOrObject& ObjectFolderOrObject::GetChildAt(std::size_t index) const {
if (index >= children.size()) return badObjectFolderOrObject;
return *children[index];
}
ObjectFolderOrObject& ObjectFolderOrObject::GetObjectChild(
const gd::String& name) {
for (std::size_t j = 0; j < children.size(); j++) {
if (!children[j]->IsFolder()) {
if (children[j]->GetObject().GetName() == name) return *children[j];
};
}
return badObjectFolderOrObject;
}
void ObjectFolderOrObject::InsertObject(gd::Object* insertedObject,
std::size_t position) {
auto objectFolderOrObject =
gd::make_unique<ObjectFolderOrObject>(insertedObject, this);
if (position < children.size()) {
children.insert(children.begin() + position,
std::move(objectFolderOrObject));
} else {
children.push_back(std::move(objectFolderOrObject));
}
}
std::size_t ObjectFolderOrObject::GetChildPosition(
const ObjectFolderOrObject& child) const {
for (std::size_t j = 0; j < children.size(); j++) {
if (children[j].get() == &child) return j;
}
return gd::String::npos;
}
ObjectFolderOrObject& ObjectFolderOrObject::InsertNewFolder(
const gd::String& newFolderName, std::size_t position) {
auto newFolderPtr =
gd::make_unique<ObjectFolderOrObject>(newFolderName, this);
gd::ObjectFolderOrObject& newFolder = *(*(children.insert(
position < children.size() ? children.begin() + position : children.end(),
std::move(newFolderPtr))));
return newFolder;
};
void ObjectFolderOrObject::RemoveRecursivelyObjectNamed(
const gd::String& name) {
if (IsFolder()) {
children.erase(
std::remove_if(children.begin(),
children.end(),
[&name](std::unique_ptr<gd::ObjectFolderOrObject>&
objectFolderOrObject) {
return !objectFolderOrObject->IsFolder() &&
objectFolderOrObject->GetObject().GetName() ==
name;
}),
children.end());
for (auto& it : children) {
it->RemoveRecursivelyObjectNamed(name);
}
}
};
bool ObjectFolderOrObject::IsADescendantOf(
const ObjectFolderOrObject& otherObjectFolderOrObject) {
if (parent == nullptr) return false;
if (&(*parent) == &otherObjectFolderOrObject) return true;
return parent->IsADescendantOf(otherObjectFolderOrObject);
}
void ObjectFolderOrObject::MoveChild(std::size_t oldIndex,
std::size_t newIndex) {
if (!IsFolder()) return;
if (oldIndex >= children.size() || newIndex >= children.size()) return;
std::unique_ptr<gd::ObjectFolderOrObject> objectFolderOrObject =
std::move(children[oldIndex]);
children.erase(children.begin() + oldIndex);
children.insert(children.begin() + newIndex, std::move(objectFolderOrObject));
}
void ObjectFolderOrObject::RemoveFolderChild(
const ObjectFolderOrObject& childToRemove) {
if (!IsFolder() || !childToRemove.IsFolder() ||
childToRemove.GetChildrenCount() > 0) {
return;
}
std::vector<std::unique_ptr<gd::ObjectFolderOrObject>>::iterator it = find_if(
children.begin(),
children.end(),
[&childToRemove](std::unique_ptr<gd::ObjectFolderOrObject>& child) {
return child.get() == &childToRemove;
});
if (it == children.end()) return;
children.erase(it);
}
void ObjectFolderOrObject::MoveObjectFolderOrObjectToAnotherFolder(
gd::ObjectFolderOrObject& objectFolderOrObject,
gd::ObjectFolderOrObject& newParentFolder,
std::size_t newPosition) {
if (!newParentFolder.IsFolder()) return;
if (newParentFolder.IsADescendantOf(objectFolderOrObject)) return;
std::vector<std::unique_ptr<gd::ObjectFolderOrObject>>::iterator it =
find_if(children.begin(),
children.end(),
[&objectFolderOrObject](std::unique_ptr<gd::ObjectFolderOrObject>&
childObjectFolderOrObject) {
return childObjectFolderOrObject.get() == &objectFolderOrObject;
});
if (it == children.end()) return;
std::unique_ptr<gd::ObjectFolderOrObject> objectFolderOrObjectPtr =
std::move(*it);
children.erase(it);
objectFolderOrObjectPtr->parent = &newParentFolder;
newParentFolder.children.insert(
newPosition < newParentFolder.children.size()
? newParentFolder.children.begin() + newPosition
: newParentFolder.children.end(),
std::move(objectFolderOrObjectPtr));
}
void ObjectFolderOrObject::SerializeTo(SerializerElement& element) const {
if (IsFolder()) {
element.SetAttribute("folderName", GetFolderName());
if (children.size() > 0) {
SerializerElement& childrenElement = element.AddChild("children");
childrenElement.ConsiderAsArrayOf("objectFolderOrObject");
for (std::size_t j = 0; j < children.size(); j++) {
children[j]->SerializeTo(
childrenElement.AddChild("objectFolderOrObject"));
}
}
} else {
element.SetAttribute("objectName", GetObject().GetName());
}
}
void ObjectFolderOrObject::UnserializeFrom(
gd::Project& project,
const SerializerElement& element,
gd::ObjectsContainer& objectsContainer) {
children.clear();
gd::String potentialFolderName = element.GetStringAttribute("folderName", "");
if (!potentialFolderName.empty()) {
object = nullptr;
folderName = potentialFolderName;
if (element.HasChild("children")) {
const SerializerElement& childrenElements =
element.GetChild("children", 0);
childrenElements.ConsiderAsArrayOf("objectFolderOrObject");
for (std::size_t i = 0; i < childrenElements.GetChildrenCount(); ++i) {
std::unique_ptr<ObjectFolderOrObject> childObjectFolderOrObject =
make_unique<ObjectFolderOrObject>();
childObjectFolderOrObject->UnserializeFrom(
project, childrenElements.GetChild(i), objectsContainer);
childObjectFolderOrObject->parent = this;
children.push_back(std::move(childObjectFolderOrObject));
}
}
} else {
folderName = "";
gd::String objectName = element.GetStringAttribute("objectName");
if (objectsContainer.HasObjectNamed(objectName)) {
object = &objectsContainer.GetObject(objectName);
} else {
gd::LogError("Object with name " + objectName +
" not found in objects container.");
object = nullptr;
}
}
};
} // namespace gd

View File

@@ -1,203 +0,0 @@
/*
* GDevelop Core
* Copyright 2008-2023 Florian Rival (Florian.Rival@gmail.com). All rights
* reserved. This project is released under the MIT License.
*/
#ifndef GDCORE_OBJECTFOLDEROROBJECT_H
#define GDCORE_OBJECTFOLDEROROBJECT_H
#include <memory>
#include <vector>
#include "GDCore/Serialization/SerializerElement.h"
#include "GDCore/String.h"
namespace gd {
class Project;
class Object;
class SerializerElement;
class ObjectsContainer;
} // namespace gd
namespace gd {
/**
* \brief Class representing a folder structure in order to organize objects
* in folders (to be used with an ObjectsContainer.)
*
* \see gd::ObjectsContainer
*/
class GD_CORE_API ObjectFolderOrObject {
public:
/**
* \brief Default constructor creating an empty instance. Useful for the null
* object pattern.
*/
ObjectFolderOrObject();
virtual ~ObjectFolderOrObject();
/**
* \brief Constructor for creating an instance representing a folder.
*/
ObjectFolderOrObject(gd::String folderName_,
ObjectFolderOrObject* parent_ = nullptr);
/**
* \brief Constructor for creating an instance representing an object.
*/
ObjectFolderOrObject(gd::Object* object_,
ObjectFolderOrObject* parent_ = nullptr);
/**
* \brief Returns the object behind the instance.
*/
gd::Object& GetObject() const { return *object; }
/**
* \brief Returns true if the instance represents a folder.
*/
bool IsFolder() const { return !folderName.empty(); }
/**
* \brief Returns the name of the folder.
*/
const gd::String& GetFolderName() const { return folderName; }
/**
* \brief Set the folder name. Does nothing if called on an instance not
* representing a folder.
*/
void SetFolderName(const gd::String& name);
/**
* \brief Returns true if the instance represents the object with the given
* name or if any of the children does (recursive search).
*/
bool HasObjectNamed(const gd::String& name);
/**
* \brief Returns the child instance holding the object with the given name
* (recursive search).
*/
ObjectFolderOrObject& GetObjectNamed(const gd::String& name);
/**
* \brief Returns the number of children. Returns 0 if the instance represents
* an object.
*/
std::size_t GetChildrenCount() const {
if (IsFolder()) return children.size();
return 0;
}
/**
* \brief Returns the child ObjectFolderOrObject at the given index.
*/
ObjectFolderOrObject& GetChildAt(std::size_t index);
/**
* \brief Returns the child ObjectFolderOrObject at the given index.
*/
const ObjectFolderOrObject& GetChildAt(std::size_t index) const;
/**
* \brief Returns the child ObjectFolderOrObject that represents the object
* with the given name. To use only if sure that the instance holds the object
* in its direct children (no recursive search).
*
* \note The equivalent method to get a folder by its name cannot be
* implemented because there is no unicity enforced on the folder name.
*/
ObjectFolderOrObject& GetObjectChild(const gd::String& name);
/**
* \brief Returns the parent of the instance. If the instance has no parent
* (root folder), the null object is returned.
*/
ObjectFolderOrObject& GetParent() {
if (parent == nullptr) {
return badObjectFolderOrObject;
}
return *parent;
};
/**
* \brief Returns true if the instance is a root folder (that's to say it
* has no parent).
*/
bool IsRootFolder() { return !object && !parent; }
/**
* \brief Moves a child from a position to a new one.
*/
void MoveChild(std::size_t oldIndex, std::size_t newIndex);
/**
* \brief Removes the given child from the instance's children. If the given
* child contains children of its own, does nothing.
*/
void RemoveFolderChild(const ObjectFolderOrObject& childToRemove);
/**
* \brief Removes the child representing the object with the given name from
* the instance children and recursively does it for every folder children.
*/
void RemoveRecursivelyObjectNamed(const gd::String& name);
/**
* \brief Inserts an instance representing the given object at the given
* position.
*/
void InsertObject(gd::Object* insertedObject,
std::size_t position = (size_t)-1);
/**
* \brief Inserts an instance representing a folder with the given name at the
* given position.
*/
ObjectFolderOrObject& InsertNewFolder(const gd::String& newFolderName,
std::size_t position);
/**
* \brief Returns true if the instance is a descendant of the given instance
* of ObjectFolderOrObject.
*/
bool IsADescendantOf(const ObjectFolderOrObject& otherObjectFolderOrObject);
/**
* \brief Returns the position of the given instance of ObjectFolderOrObject
* in the instance's children.
*/
std::size_t GetChildPosition(const ObjectFolderOrObject& child) const;
/**
* \brief Moves the given child ObjectFolderOrObject to the given folder at
* the given position.
*/
void MoveObjectFolderOrObjectToAnotherFolder(
gd::ObjectFolderOrObject& objectFolderOrObject,
gd::ObjectFolderOrObject& newParentFolder,
std::size_t newPosition);
/** \name Saving and loading
* Members functions related to saving and loading the objects of the class.
*/
///@{
/**
* \brief Serialize the ObjectFolderOrObject instance.
*/
void SerializeTo(SerializerElement& element) const;
/**
* \brief Unserialize the ObjectFolderOrObject instance.
*/
void UnserializeFrom(gd::Project& project,
const SerializerElement& element,
ObjectsContainer& objectsContainer);
///@}
private:
static gd::ObjectFolderOrObject badObjectFolderOrObject;
gd::ObjectFolderOrObject*
parent; // nullptr if root folder, points to the parent folder otherwise.
// Representing an object:
gd::Object* object; // nullptr if folderName is set.
// or representing a folder:
gd::String folderName; // Empty if object is set.
std::vector<std::unique_ptr<ObjectFolderOrObject>>
children; // Folder children.
};
} // namespace gd
#endif // GDCORE_OBJECTFOLDEROROBJECT_H

View File

@@ -9,15 +9,12 @@
#include "GDCore/Extensions/Platform.h" #include "GDCore/Extensions/Platform.h"
#include "GDCore/Project/Object.h" #include "GDCore/Project/Object.h"
#include "GDCore/Project/ObjectFolderOrObject.h"
#include "GDCore/Project/Project.h" #include "GDCore/Project/Project.h"
#include "GDCore/Serialization/SerializerElement.h" #include "GDCore/Serialization/SerializerElement.h"
namespace gd { namespace gd {
ObjectsContainer::ObjectsContainer() { ObjectsContainer::ObjectsContainer() {}
rootFolder = gd::make_unique<gd::ObjectFolderOrObject>("__ROOT");
}
ObjectsContainer::~ObjectsContainer() {} ObjectsContainer::~ObjectsContainer() {}
@@ -27,22 +24,6 @@ void ObjectsContainer::SerializeObjectsTo(SerializerElement& element) const {
initialObjects[j]->SerializeTo(element.AddChild("object")); initialObjects[j]->SerializeTo(element.AddChild("object"));
} }
} }
void ObjectsContainer::SerializeFoldersTo(SerializerElement& element) const {
rootFolder->SerializeTo(element);
}
void ObjectsContainer::UnserializeFoldersFrom(
gd::Project& project, const SerializerElement& element) {
rootFolder->UnserializeFrom(project, element, *this);
}
void ObjectsContainer::AddMissingObjectsInRootFolder() {
for (std::size_t i = 0; i < initialObjects.size(); ++i) {
if (!rootFolder->HasObjectNamed(initialObjects[i]->GetName())) {
rootFolder->InsertObject(&(*initialObjects[i]));
}
}
}
void ObjectsContainer::UnserializeObjectsFrom( void ObjectsContainer::UnserializeObjectsFrom(
gd::Project& project, const SerializerElement& element) { gd::Project& project, const SerializerElement& element) {
@@ -67,23 +48,17 @@ void ObjectsContainer::UnserializeObjectsFrom(
bool ObjectsContainer::HasObjectNamed(const gd::String& name) const { bool ObjectsContainer::HasObjectNamed(const gd::String& name) const {
return (find_if(initialObjects.begin(), return (find_if(initialObjects.begin(),
initialObjects.end(), initialObjects.end(),
[&](const std::unique_ptr<gd::Object>& object) { [&](const std::unique_ptr<gd::Object>& object) { return object->GetName() == name; }) != initialObjects.end());
return object->GetName() == name;
}) != initialObjects.end());
} }
gd::Object& ObjectsContainer::GetObject(const gd::String& name) { gd::Object& ObjectsContainer::GetObject(const gd::String& name) {
return *(*find_if(initialObjects.begin(), return *(*find_if(initialObjects.begin(),
initialObjects.end(), initialObjects.end(),
[&](const std::unique_ptr<gd::Object>& object) { [&](const std::unique_ptr<gd::Object>& object) { return object->GetName() == name; }));
return object->GetName() == name;
}));
} }
const gd::Object& ObjectsContainer::GetObject(const gd::String& name) const { const gd::Object& ObjectsContainer::GetObject(const gd::String& name) const {
return *(*find_if(initialObjects.begin(), return *(*find_if(initialObjects.begin(),
initialObjects.end(), initialObjects.end(),
[&](const std::unique_ptr<gd::Object>& object) { [&](const std::unique_ptr<gd::Object>& object) { return object->GetName() == name; }));
return object->GetName() == name;
}));
} }
gd::Object& ObjectsContainer::GetObject(std::size_t index) { gd::Object& ObjectsContainer::GetObject(std::size_t index) {
return *initialObjects[index]; return *initialObjects[index];
@@ -109,22 +84,6 @@ gd::Object& ObjectsContainer::InsertNewObject(const gd::Project& project,
: initialObjects.end(), : initialObjects.end(),
project.CreateObject(objectType, name)))); project.CreateObject(objectType, name))));
rootFolder->InsertObject(&newlyCreatedObject);
return newlyCreatedObject;
}
gd::Object& ObjectsContainer::InsertNewObjectInFolder(
const gd::Project& project,
const gd::String& objectType,
const gd::String& name,
gd::ObjectFolderOrObject& objectFolderOrObject,
std::size_t position) {
gd::Object& newlyCreatedObject = *(*(initialObjects.insert(
initialObjects.end(), project.CreateObject(objectType, name))));
objectFolderOrObject.InsertObject(&newlyCreatedObject, position);
return newlyCreatedObject; return newlyCreatedObject;
} }
@@ -138,6 +97,16 @@ gd::Object& ObjectsContainer::InsertObject(const gd::Object& object,
return newlyCreatedObject; return newlyCreatedObject;
} }
void ObjectsContainer::SwapObjects(std::size_t firstObjectIndex,
std::size_t secondObjectIndex) {
if (firstObjectIndex >= initialObjects.size() ||
secondObjectIndex >= initialObjects.size())
return;
std::iter_swap(initialObjects.begin() + firstObjectIndex,
initialObjects.begin() + secondObjectIndex);
}
void ObjectsContainer::MoveObject(std::size_t oldIndex, std::size_t newIndex) { void ObjectsContainer::MoveObject(std::size_t oldIndex, std::size_t newIndex) {
if (oldIndex >= initialObjects.size() || newIndex >= initialObjects.size()) if (oldIndex >= initialObjects.size() || newIndex >= initialObjects.size())
return; return;
@@ -151,59 +120,30 @@ void ObjectsContainer::RemoveObject(const gd::String& name) {
std::vector<std::unique_ptr<gd::Object>>::iterator objectIt = std::vector<std::unique_ptr<gd::Object>>::iterator objectIt =
find_if(initialObjects.begin(), find_if(initialObjects.begin(),
initialObjects.end(), initialObjects.end(),
[&](const std::unique_ptr<gd::Object>& object) { [&](const std::unique_ptr<gd::Object>& object) { return object->GetName() == name; });
return object->GetName() == name;
});
if (objectIt == initialObjects.end()) return; if (objectIt == initialObjects.end()) return;
rootFolder->RemoveRecursivelyObjectNamed(name);
initialObjects.erase(objectIt); initialObjects.erase(objectIt);
} }
void ObjectsContainer::MoveObjectFolderOrObjectToAnotherContainerInFolder( void ObjectsContainer::MoveObjectToAnotherContainer(
gd::ObjectFolderOrObject& objectFolderOrObject, const gd::String& name,
gd::ObjectsContainer& newContainer, gd::ObjectsContainer& newContainer,
gd::ObjectFolderOrObject& newParentFolder,
std::size_t newPosition) { std::size_t newPosition) {
if (objectFolderOrObject.IsFolder() || !newParentFolder.IsFolder()) return; std::vector<std::unique_ptr<gd::Object>>::iterator objectIt =
find_if(initialObjects.begin(),
std::vector<std::unique_ptr<gd::Object>>::iterator objectIt = find_if( initialObjects.end(),
initialObjects.begin(), [&](const std::unique_ptr<gd::Object>& object) { return object->GetName() == name; });
initialObjects.end(),
[&objectFolderOrObject](std::unique_ptr<gd::Object>& object) {
return object->GetName() == objectFolderOrObject.GetObject().GetName();
});
if (objectIt == initialObjects.end()) return; if (objectIt == initialObjects.end()) return;
std::unique_ptr<gd::Object> object = std::move(*objectIt); std::unique_ptr<gd::Object> object = std::move(*objectIt);
initialObjects.erase(objectIt); initialObjects.erase(objectIt);
newContainer.initialObjects.push_back(std::move(object)); newContainer.initialObjects.insert(
newPosition < newContainer.initialObjects.size()
objectFolderOrObject.GetParent().MoveObjectFolderOrObjectToAnotherFolder( ? newContainer.initialObjects.begin() + newPosition
objectFolderOrObject, newParentFolder, newPosition); : newContainer.initialObjects.end(),
} std::move(object));
std::vector<const ObjectFolderOrObject*>
ObjectsContainer::GetAllObjectFolderOrObjects() const {
std::vector<const ObjectFolderOrObject*> results;
std::function<void(const ObjectFolderOrObject& folder)> addChildrenOfFolder =
[&](const ObjectFolderOrObject& folder) {
for (size_t i = 0; i < folder.GetChildrenCount(); ++i) {
const auto& child = folder.GetChildAt(i);
results.push_back(&child);
if (child.IsFolder()) {
addChildrenOfFolder(child);
}
}
};
addChildrenOfFolder(*rootFolder);
return results;
} }
} // namespace gd } // namespace gd

View File

@@ -9,12 +9,11 @@
#include <vector> #include <vector>
#include "GDCore/String.h" #include "GDCore/String.h"
#include "GDCore/Project/ObjectGroupsContainer.h" #include "GDCore/Project/ObjectGroupsContainer.h"
#include "GDCore/Project/ObjectFolderOrObject.h"
namespace gd { namespace gd {
class Object; class Object;
class Project; class Project;
class SerializerElement; class SerializerElement;
} // namespace gd }
#undef GetObject // Disable an annoying macro #undef GetObject // Disable an annoying macro
namespace gd { namespace gd {
@@ -99,19 +98,6 @@ class GD_CORE_API ObjectsContainer {
const gd::String& objectType, const gd::String& objectType,
const gd::String& name, const gd::String& name,
std::size_t position); std::size_t position);
/**
* \brief Add a new empty object of type \a objectType called \a name in the
* given folder at the specified position.<br>
*
* \note The object is created using the project's current platform.
* \return A reference to the object in the list.
*/
gd::Object& InsertNewObjectInFolder(
const gd::Project& project,
const gd::String& objectType,
const gd::String& name,
gd::ObjectFolderOrObject& objectFolderOrObject,
std::size_t position);
/** /**
* \brief Add a new object to the list * \brief Add a new object to the list
@@ -139,18 +125,18 @@ class GD_CORE_API ObjectsContainer {
void MoveObject(std::size_t oldIndex, std::size_t newIndex); void MoveObject(std::size_t oldIndex, std::size_t newIndex);
/** /**
* Move the specified object to another container, removing it from the * \brief Swap the position of the specified objects.
* current one and adding it to the new one at the specified position in the
* given folder.
*
* \note This does not invalidate the references to the object (object is not
* moved in memory, as referenced by smart pointers internally).
*/ */
void MoveObjectFolderOrObjectToAnotherContainerInFolder( void SwapObjects(std::size_t firstObjectIndex, std::size_t secondObjectIndex);
gd::ObjectFolderOrObject& objectFolderOrObject,
gd::ObjectsContainer& newContainer, /**
gd::ObjectFolderOrObject& newParentFolder, * Move the specified object to another container, removing it from the current one
std::size_t newPosition); * and adding it to the new one at the specified position.
*
* \note This does not invalidate the references to the object (object is not moved in memory,
* as referenced by smart pointers internally).
*/
void MoveObjectToAnotherContainer(const gd::String& name, gd::ObjectsContainer & newContainer, std::size_t newPosition);
/** /**
* Provide a raw access to the vector containing the objects * Provide a raw access to the vector containing the objects
@@ -167,43 +153,20 @@ class GD_CORE_API ObjectsContainer {
} }
///@} ///@}
/**
* Returns a vector containing all object and folders in this container.
* Only use this for checking if you hold a valid `ObjectFolderOrObject` -
* don't use this for rendering or anything else.
*/
std::vector<const ObjectFolderOrObject*> GetAllObjectFolderOrObjects() const;
gd::ObjectFolderOrObject& GetRootFolder() {
return *rootFolder;
}
void AddMissingObjectsInRootFolder();
/** \name Saving and loading /** \name Saving and loading
* Members functions related to saving and loading the objects of the class. * Members functions related to saving and loading the objects of the class.
*/ */
///@{ ///@{
/** /**
* \brief Serialize the objects container. * \brief Serialize instances container.
*/ */
void SerializeObjectsTo(SerializerElement& element) const; void SerializeObjectsTo(SerializerElement& element) const;
/** /**
* \brief Unserialize the objects container. * \brief Unserialize the instances container.
*/ */
void UnserializeObjectsFrom(gd::Project& project, void UnserializeObjectsFrom(gd::Project& project,
const SerializerElement& element); const SerializerElement& element);
/**
* \brief Serialize folder structure.
*/
void SerializeFoldersTo(SerializerElement& element) const;
/**
* \brief Unserialize folder structure.
*/
void UnserializeFoldersFrom(gd::Project& project,
const SerializerElement& element);
///@} ///@}
/** \name Objects groups management /** \name Objects groups management
@@ -227,9 +190,6 @@ class GD_CORE_API ObjectsContainer {
std::vector<std::unique_ptr<gd::Object> > std::vector<std::unique_ptr<gd::Object> >
initialObjects; ///< Objects contained. initialObjects; ///< Objects contained.
gd::ObjectGroupsContainer objectGroups; gd::ObjectGroupsContainer objectGroups;
private:
std::unique_ptr<gd::ObjectFolderOrObject> rootFolder;
}; };
} // namespace gd } // namespace gd

View File

@@ -48,6 +48,11 @@ using namespace std;
namespace gd { namespace gd {
// By default, disallow unicode in identifiers, but this can be set to true
// by the IDE. In the future, this will be set to true by default, keeping backward compatibility.
// We keep it disabled by default to progressively ask users to test it in real projects.
bool Project::allowUsageOfUnicodeIdentifierNames = false;
Project::Project() Project::Project()
: name(_("Project")), : name(_("Project")),
version("1.0.0"), version("1.0.0"),
@@ -81,24 +86,26 @@ Project::~Project() {}
void Project::ResetProjectUuid() { projectUuid = UUID::MakeUuid4(); } void Project::ResetProjectUuid() { projectUuid = UUID::MakeUuid4(); }
std::unique_ptr<gd::Object> Project::CreateObject( std::unique_ptr<gd::Object>
const gd::String& objectType, const gd::String& name) const { Project::CreateObject(const gd::String &objectType, const gd::String &name) const {
std::unique_ptr<gd::Object> object = gd::make_unique<Object>( std::unique_ptr<gd::Object> object =
name, objectType, CreateObjectConfiguration(objectType)); gd::make_unique<Object>(name, objectType, CreateObjectConfiguration(objectType));
auto& platform = GetCurrentPlatform(); auto &platform = GetCurrentPlatform();
auto& project = *this; auto &project = *this;
auto addDefaultBehavior = [&platform, &project, &object, &objectType]( auto addDefaultBehavior =
const gd::String& behaviorType) { [&platform,
auto& behaviorMetadata = &project,
&object,
&objectType](const gd::String& behaviorType) {
auto &behaviorMetadata =
gd::MetadataProvider::GetBehaviorMetadata(platform, behaviorType); gd::MetadataProvider::GetBehaviorMetadata(platform, behaviorType);
if (MetadataProvider::IsBadBehaviorMetadata(behaviorMetadata)) { if (MetadataProvider::IsBadBehaviorMetadata(behaviorMetadata)) {
gd::LogWarning("Object: " + objectType + gd::LogWarning("Object: " + objectType + " has an unknown default behavior: " + behaviorType);
" has an unknown default behavior: " + behaviorType);
return; return;
} }
auto* behavior = object->AddNewBehavior( auto* behavior = object->AddNewBehavior(project, behaviorType,
project, behaviorType, behaviorMetadata.GetDefaultName()); behaviorMetadata.GetDefaultName());
behavior->SetDefaultBehavior(true); behavior->SetDefaultBehavior(true);
}; };
@@ -107,17 +114,18 @@ std::unique_ptr<gd::Object> Project::CreateObject(
addDefaultBehavior("ResizableCapability::ResizableBehavior"); addDefaultBehavior("ResizableCapability::ResizableBehavior");
addDefaultBehavior("ScalableCapability::ScalableBehavior"); addDefaultBehavior("ScalableCapability::ScalableBehavior");
addDefaultBehavior("FlippableCapability::FlippableBehavior"); addDefaultBehavior("FlippableCapability::FlippableBehavior");
} else { }
auto& objectMetadata = else {
gd::MetadataProvider::GetObjectMetadata(platform, objectType); auto &objectMetadata = gd::MetadataProvider::GetObjectMetadata(platform, objectType);
if (MetadataProvider::IsBadObjectMetadata(objectMetadata)) { if (MetadataProvider::IsBadObjectMetadata(objectMetadata)) {
gd::LogWarning("Object: " + name + " has an unknown type: " + objectType); gd::LogWarning("Object: " + name + " has an unknown type: " + objectType);
} }
for (auto& behaviorType : objectMetadata.GetDefaultBehaviors()) { for (auto &behaviorType : objectMetadata.GetDefaultBehaviors()) {
addDefaultBehavior(behaviorType); addDefaultBehavior(behaviorType);
} }
} }
return std::move(object); return std::move(object);
} }
@@ -841,11 +849,6 @@ void Project::UnserializeFrom(const SerializerElement& element) {
resourcesManager.UnserializeFrom( resourcesManager.UnserializeFrom(
element.GetChild("resources", 0, "Resources")); element.GetChild("resources", 0, "Resources"));
UnserializeObjectsFrom(*this, element.GetChild("objects", 0, "Objects")); UnserializeObjectsFrom(*this, element.GetChild("objects", 0, "Objects"));
if (element.HasChild("objectsFolderStructure")) {
UnserializeFoldersFrom(*this, element.GetChild("objectsFolderStructure", 0));
}
AddMissingObjectsInRootFolder();
GetVariables().UnserializeFrom(element.GetChild("variables", 0, "Variables")); GetVariables().UnserializeFrom(element.GetChild("variables", 0, "Variables"));
scenes.clear(); scenes.clear();
@@ -997,7 +1000,6 @@ void Project::SerializeTo(SerializerElement& element) const {
resourcesManager.SerializeTo(element.AddChild("resources")); resourcesManager.SerializeTo(element.AddChild("resources"));
SerializeObjectsTo(element.AddChild("objects")); SerializeObjectsTo(element.AddChild("objects"));
SerializeFoldersTo(element.AddChild("objectsFolderStructure"));
GetObjectGroups().SerializeTo(element.AddChild("objectsGroups")); GetObjectGroups().SerializeTo(element.AddChild("objectsGroups"));
GetVariables().SerializeTo(element.AddChild("variables")); GetVariables().SerializeTo(element.AddChild("variables"));
@@ -1036,18 +1038,28 @@ void Project::SerializeTo(SerializerElement& element) const {
externalSourceFilesElement.AddChild("sourceFile")); externalSourceFilesElement.AddChild("sourceFile"));
} }
void Project::AllowUsageOfUnicodeIdentifierNames(bool enable) {
allowUsageOfUnicodeIdentifierNames = enable;
}
bool Project::IsNameSafe(const gd::String& name) { bool Project::IsNameSafe(const gd::String& name) {
if (name.empty()) return false; if (name.empty()) return false;
if (isdigit(name[0])) return false; if (isdigit(name[0])) return false;
for (auto character : name) { if (!allowUsageOfUnicodeIdentifierNames) {
if (!GrammarTerminals::IsAllowedInIdentifier(character)) { gd::String legacyAllowedCharacters =
return false; "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_";
return !(name.find_first_not_of(legacyAllowedCharacters) != gd::String::npos);
} else {
for (auto character : name) {
if (!GrammarTerminals::IsAllowedInIdentifier(character)) {
return false;
}
} }
}
return true; return true;
}
} }
gd::String Project::GetSafeName(const gd::String& name) { gd::String Project::GetSafeName(const gd::String& name) {
@@ -1057,13 +1069,18 @@ gd::String Project::GetSafeName(const gd::String& name) {
if (isdigit(name[0])) newName = "_" + newName; if (isdigit(name[0])) newName = "_" + newName;
for (size_t i = 0; i < newName.size(); ++i) { gd::String legacyAllowedCharacters =
// Note that iterating on the characters is not super efficient (O(n^2), "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_";
// which could be avoided with an iterator), but this function is not
// critical for performance (only used to generate a name when a user for (size_t i = 0;i < newName.size();++i) {
// creates a new entity or rename one). // Note that iterating on the characters is not super efficient (O(n^2), which
// could be avoided with an iterator), but this function is not critical for performance
// (only used to generate a name when a user creates a new entity or rename one).
auto character = newName[i]; auto character = newName[i];
bool isAllowed = GrammarTerminals::IsAllowedInIdentifier(character); bool isAllowed =
allowUsageOfUnicodeIdentifierNames
? GrammarTerminals::IsAllowedInIdentifier(character)
: legacyAllowedCharacters.find(character) != gd::String::npos;
// Replace all unallowed letters by an underscore. // Replace all unallowed letters by an underscore.
if (!isAllowed) { if (!isAllowed) {

View File

@@ -11,12 +11,12 @@
#include "GDCore/Project/ExtensionProperties.h" #include "GDCore/Project/ExtensionProperties.h"
#include "GDCore/Project/LoadingScreen.h" #include "GDCore/Project/LoadingScreen.h"
#include "GDCore/Project/Watermark.h"
#include "GDCore/Project/ObjectGroupsContainer.h" #include "GDCore/Project/ObjectGroupsContainer.h"
#include "GDCore/Project/ObjectsContainer.h" #include "GDCore/Project/ObjectsContainer.h"
#include "GDCore/Project/PlatformSpecificAssets.h" #include "GDCore/Project/PlatformSpecificAssets.h"
#include "GDCore/Project/ResourcesManager.h" #include "GDCore/Project/ResourcesManager.h"
#include "GDCore/Project/VariablesContainer.h" #include "GDCore/Project/VariablesContainer.h"
#include "GDCore/Project/Watermark.h"
#include "GDCore/String.h" #include "GDCore/String.h"
namespace gd { namespace gd {
class Platform; class Platform;
@@ -82,9 +82,7 @@ class GD_CORE_API Project : public ObjectsContainer {
/** /**
* \brief Change the project description * \brief Change the project description
*/ */
void SetDescription(const gd::String& description_) { void SetDescription(const gd::String& description_) { description = description_; };
description = description_;
};
/** /**
* \brief Get the project description * \brief Get the project description
@@ -126,9 +124,7 @@ class GD_CORE_API Project : public ObjectsContainer {
/** /**
* \brief Get the author usernames of the project. * \brief Get the author usernames of the project.
*/ */
const std::vector<gd::String>& GetAuthorUsernames() const { const std::vector<gd::String>& GetAuthorUsernames() const { return authorUsernames; };
return authorUsernames;
};
/** /**
* \brief Get the author usernames of the project, to modify them (non-const). * \brief Get the author usernames of the project, to modify them (non-const).
@@ -139,9 +135,7 @@ class GD_CORE_API Project : public ObjectsContainer {
* Define the project as playable with a keyboard. * Define the project as playable with a keyboard.
* \param enable True to define the project as playable with a keyboard. * \param enable True to define the project as playable with a keyboard.
*/ */
void SetPlayableWithKeyboard(bool playable = true) { void SetPlayableWithKeyboard(bool playable = true) { isPlayableWithKeyboard = playable; }
isPlayableWithKeyboard = playable;
}
/** /**
* Check if the project is defined as playable with a keyboard. * Check if the project is defined as playable with a keyboard.
@@ -152,9 +146,7 @@ class GD_CORE_API Project : public ObjectsContainer {
* Define the project as playable with a gamepad. * Define the project as playable with a gamepad.
* \param enable True to define the project as playable with a gamepad. * \param enable True to define the project as playable with a gamepad.
*/ */
void SetPlayableWithGamepad(bool playable = true) { void SetPlayableWithGamepad(bool playable = true) { isPlayableWithGamepad = playable; }
isPlayableWithGamepad = playable;
}
/** /**
* Check if the project is defined as playable with a gamepad. * Check if the project is defined as playable with a gamepad.
@@ -165,9 +157,7 @@ class GD_CORE_API Project : public ObjectsContainer {
* Define the project as playable on a mobile. * Define the project as playable on a mobile.
* \param enable True to define the project as playable on a mobile. * \param enable True to define the project as playable on a mobile.
*/ */
void SetPlayableWithMobile(bool playable = true) { void SetPlayableWithMobile(bool playable = true) { isPlayableWithMobile = playable; }
isPlayableWithMobile = playable;
}
/** /**
* Check if the project is defined as playable on a mobile. * Check if the project is defined as playable on a mobile.
@@ -401,23 +391,17 @@ class GD_CORE_API Project : public ObjectsContainer {
/** /**
* Set the antialiasing mode used by the game ("none" or "MSAA"). * Set the antialiasing mode used by the game ("none" or "MSAA").
*/ */
void SetAntialiasingMode(const gd::String& antialiasingMode_) { void SetAntialiasingMode(const gd::String& antialiasingMode_) { antialiasingMode = antialiasingMode_; }
antialiasingMode = antialiasingMode_;
}
/** /**
* Return true if antialising is enabled on mobiles. * Return true if antialising is enabled on mobiles.
*/ */
bool IsAntialisingEnabledOnMobile() const { bool IsAntialisingEnabledOnMobile() const { return isAntialisingEnabledOnMobile; }
return isAntialisingEnabledOnMobile;
}
/** /**
* Set whether antialising is enabled on mobiles or not. * Set whether antialising is enabled on mobiles or not.
*/ */
void SetAntialisingEnabledOnMobile(bool enable) { void SetAntialisingEnabledOnMobile(bool enable) { isAntialisingEnabledOnMobile = enable; }
isAntialisingEnabledOnMobile = enable;
}
/** /**
* \brief Return if the project should set 0 as Z-order for objects created * \brief Return if the project should set 0 as Z-order for objects created
@@ -921,8 +905,7 @@ class GD_CORE_API Project : public ObjectsContainer {
/** /**
* \brief Return the events based object with a given type. * \brief Return the events based object with a given type.
*/ */
const gd::EventsBasedObject& GetEventsBasedObject( const gd::EventsBasedObject& GetEventsBasedObject(const gd::String& type) const;
const gd::String& type) const;
/** /**
* \brief Check if events based behavior with a given type exists. * \brief Check if events based behavior with a given type exists.
@@ -937,8 +920,7 @@ class GD_CORE_API Project : public ObjectsContainer {
/** /**
* \brief Return the events based behavior with a given type. * \brief Return the events based behavior with a given type.
*/ */
const gd::EventsBasedBehavior& GetEventsBasedBehavior( const gd::EventsBasedBehavior& GetEventsBasedBehavior(const gd::String& type) const;
const gd::String& type) const;
///@} ///@}
@@ -987,6 +969,20 @@ class GD_CORE_API Project : public ObjectsContainer {
*/ */
///@{ ///@{
/**
* Check if unicode names are allowed in identifier names.
* \see IsNameSafe
* \see GetSafeName
*/
static bool IsUsageOfUnicodeIdentifierNamesAllowed() { return allowUsageOfUnicodeIdentifierNames; };
/**
* Set if unicode names are allowed in identifier names.
* \see IsNameSafe
* \see GetSafeName
*/
static void AllowUsageOfUnicodeIdentifierNames(bool enable);
/** /**
* Return true if \a name is valid (can be used safely for an object, * Return true if \a name is valid (can be used safely for an object,
* behavior, events function name, etc...). * behavior, events function name, etc...).
@@ -994,8 +990,8 @@ class GD_CORE_API Project : public ObjectsContainer {
static bool IsNameSafe(const gd::String& name); static bool IsNameSafe(const gd::String& name);
/** /**
* Return a name, based on the one passed in parameter, that can be safely * Return a name, based on the one passed in parameter, that can be safely used
* used for an object, behavior, events function name, etc... * for an object, behavior, events function name, etc...
*/ */
static gd::String GetSafeName(const gd::String& name); static gd::String GetSafeName(const gd::String& name);
///@} ///@}
@@ -1072,8 +1068,8 @@ class GD_CORE_API Project : public ObjectsContainer {
bool adaptGameResolutionAtRuntime; ///< Should the game resolution be adapted bool adaptGameResolutionAtRuntime; ///< Should the game resolution be adapted
///< to the window size at runtime ///< to the window size at runtime
gd::String gd::String
sizeOnStartupMode; ///< How to adapt the game size to the screen. Can be sizeOnStartupMode; ///< How to adapt the game size to the screen. Can be
///< "adaptWidth", "adaptHeight" or empty ///< "adaptWidth", "adaptHeight" or empty
gd::String antialiasingMode; gd::String antialiasingMode;
bool isAntialisingEnabledOnMobile; bool isAntialisingEnabledOnMobile;
gd::String projectUuid; ///< UUID useful to identify the game in online gd::String projectUuid; ///< UUID useful to identify the game in online
@@ -1099,18 +1095,19 @@ class GD_CORE_API Project : public ObjectsContainer {
externalSourceFiles; ///< List of external source files used. externalSourceFiles; ///< List of external source files used.
gd::String author; ///< Game author name, for publishing purpose. gd::String author; ///< Game author name, for publishing purpose.
std::vector<gd::String> std::vector<gd::String>
authorIds; ///< Game author ids, from GDevelop users DB. authorIds; ///< Game author ids, from GDevelop users DB.
std::vector<gd::String> std::vector<gd::String>
authorUsernames; ///< Game author usernames, from GDevelop users DB. authorUsernames; ///< Game author usernames, from GDevelop users DB.
std::vector<gd::String> categories; ///< Game categories std::vector<gd::String>
bool isPlayableWithKeyboard; ///< The project is playable with a keyboard. categories; ///< Game categories
bool isPlayableWithGamepad; ///< The project is playable with a gamepad. bool isPlayableWithKeyboard; ///< The project is playable with a keyboard.
bool isPlayableWithMobile; ///< The project is playable on a mobile. bool isPlayableWithGamepad; ///< The project is playable with a gamepad.
gd::String packageName; ///< Game package name bool isPlayableWithMobile; ///< The project is playable on a mobile.
gd::String templateSlug; ///< The slug of the template from which the game is gd::String packageName; ///< Game package name
///< created. gd::String templateSlug; ///< The slug of the template from which the game is
gd::String orientation; ///< Lock game orientation (on mobile devices). ///< created.
///< "default", "landscape" or "portrait". gd::String orientation; ///< Lock game orientation (on mobile devices).
///< "default", "landscape" or "portrait".
bool bool
folderProject; ///< True if folder project, false if single file project. folderProject; ///< True if folder project, false if single file project.
gd::String gd::String
@@ -1131,6 +1128,8 @@ class GD_CORE_API Project : public ObjectsContainer {
///< time the project was saved. ///< time the project was saved.
mutable unsigned int gdBuildVersion; ///< The GD build version used the last mutable unsigned int gdBuildVersion; ///< The GD build version used the last
///< time the project was saved. ///< time the project was saved.
static bool allowUsageOfUnicodeIdentifierNames;
}; };
} // namespace gd } // namespace gd

View File

@@ -534,7 +534,19 @@ void ResourcesManager::SerializeTo(SerializerElement& element) const {
if (resources[i] == std::shared_ptr<Resource>()) break; if (resources[i] == std::shared_ptr<Resource>()) break;
SerializerElement& resourceElement = resourcesElement.AddChild("resource"); SerializerElement& resourceElement = resourcesElement.AddChild("resource");
gd::ResourcesManager::SerializeResourceTo(*resources[i], resourceElement); resourceElement.SetAttribute("kind", resources[i]->GetKind());
resourceElement.SetAttribute("name", resources[i]->GetName());
resourceElement.SetAttribute("metadata", resources[i]->GetMetadata());
const gd::String& originName = resources[i]->GetOriginName();
const gd::String& originIdentifier = resources[i]->GetOriginIdentifier();
if (!originName.empty() || !originIdentifier.empty()) {
resourceElement.AddChild("origin")
.SetAttribute("name", originName)
.SetAttribute("identifier", originIdentifier);
}
resources[i]->SerializeTo(resourceElement);
} }
SerializerElement& resourcesFoldersElement = SerializerElement& resourcesFoldersElement =
@@ -544,22 +556,6 @@ void ResourcesManager::SerializeTo(SerializerElement& element) const {
folders[i].SerializeTo(resourcesFoldersElement.AddChild("folder")); folders[i].SerializeTo(resourcesFoldersElement.AddChild("folder"));
} }
void ResourcesManager::SerializeResourceTo(gd::Resource &resource,
SerializerElement &resourceElement) {
resourceElement.SetAttribute("kind", resource.GetKind());
resourceElement.SetAttribute("name", resource.GetName());
resourceElement.SetAttribute("metadata", resource.GetMetadata());
const gd::String &originName = resource.GetOriginName();
const gd::String &originIdentifier = resource.GetOriginIdentifier();
if (!originName.empty() || !originIdentifier.empty()) {
resourceElement.AddChild("origin")
.SetAttribute("name", originName)
.SetAttribute("identifier", originIdentifier);
}
resource.SerializeTo(resourceElement);
}
void ImageResource::SetFile(const gd::String& newFile) { void ImageResource::SetFile(const gd::String& newFile) {
file = NormalizePathSeparator(newFile); file = NormalizePathSeparator(newFile);
} }

View File

@@ -662,11 +662,6 @@ class GD_CORE_API ResourcesManager {
*/ */
void SerializeTo(SerializerElement& element) const; void SerializeTo(SerializerElement& element) const;
/**
* \brief Serialize one resource.
*/
static void SerializeResourceTo(gd::Resource& resource, SerializerElement& resourceElement);
/** /**
* \brief Unserialize the object. * \brief Unserialize the object.
*/ */

File diff suppressed because it is too large Load Diff

View File

@@ -5398,10 +5398,12 @@ class Runner {
getRegistryHub().getTestCaseRegistry().getFilteredTests( getRegistryHub().getTestCaseRegistry().getFilteredTests(
testSpec, *m_config, testCases); testSpec, *m_config, testCases);
int testsRunForGroup = 0;
for (std::vector<TestCase>::const_iterator it = testCases.begin(), for (std::vector<TestCase>::const_iterator it = testCases.begin(),
itEnd = testCases.end(); itEnd = testCases.end();
it != itEnd; it != itEnd;
++it) { ++it) {
testsRunForGroup++;
if (m_testsAlreadyRun.find(*it) == m_testsAlreadyRun.end()) { if (m_testsAlreadyRun.find(*it) == m_testsAlreadyRun.end()) {
if (context.aborting()) break; if (context.aborting()) break;

View File

@@ -39,18 +39,16 @@ module.exports = {
.setIcon('res/conditions/3d_box.svg'); .setIcon('res/conditions/3d_box.svg');
{ {
const base3D = extension const base3D = extension.addBehavior(
.addBehavior( "Base3DBehavior",
'Base3DBehavior', _("3D capability"),
_('3D capability'), "Object3D",
'Object3D', _("Move the object in 3D space."),
_('Move the object in 3D space.'), "",
'', "res/conditions/3d_box.svg",
'res/conditions/3d_box.svg', "Base3DBehavior",
'Base3DBehavior',
new gd.Behavior(), new gd.Behavior(),
new gd.BehaviorsSharedData() new gd.BehaviorsSharedData())
)
.setHidden() .setHidden()
.setIncludeFile('Extensions/3D/Base3DBehavior.js'); .setIncludeFile('Extensions/3D/Base3DBehavior.js');
@@ -65,11 +63,11 @@ module.exports = {
'res/conditions/3d_box.svg' 'res/conditions/3d_box.svg'
) )
.addParameter('object', _('3D object')) .addParameter('object', _('3D object'))
.addParameter('behavior', _('Behavior'), 'Base3DBehavior') .addParameter("behavior", _("Behavior"), "Base3DBehavior")
.useStandardParameters('number', gd.ParameterOptions.makeNewOptions()) .useStandardParameters('number', gd.ParameterOptions.makeNewOptions())
.setFunctionName('setZ') .setFunctionName('setZ')
.setGetter('getZ'); .setGetter('getZ');
base3D base3D
.addExpressionAndConditionAndAction( .addExpressionAndConditionAndAction(
'number', 'number',
@@ -97,23 +95,23 @@ module.exports = {
'res/conditions/3d_box.svg' 'res/conditions/3d_box.svg'
) )
.addParameter('object', _('3D object')) .addParameter('object', _('3D object'))
.addParameter('behavior', _('Behavior'), 'Base3DBehavior') .addParameter("behavior", _("Behavior"), "Base3DBehavior")
.useStandardParameters('number', gd.ParameterOptions.makeNewOptions()) .useStandardParameters('number', gd.ParameterOptions.makeNewOptions())
.setFunctionName('setDepth') .setFunctionName('setDepth')
.setGetter('getDepth'); .setGetter('getDepth');
base3D base3D
.addExpressionAndConditionAndAction( .addExpressionAndConditionAndAction(
'number', 'number',
'ScaleZ', 'ScaleZ',
_('Scale on Z axis'), _('Scale on Z axis'),
_('the scale on Z axis of an object (default scale is 1)'), _("the scale on Z axis of an object (default scale is 1)"),
_('the scale on Z axis scale'), _("the scale on Z axis scale"),
_('Size'), _('Scale'),
'res/conditions/3d_box.svg' 'res/conditions/3d_box.svg'
) )
.addParameter('object', _('3D object')) .addParameter('object', _('3D object'))
.addParameter('behavior', _('Behavior'), 'Base3DBehavior') .addParameter("behavior", _("Behavior"), "Base3DBehavior")
.useStandardParameters( .useStandardParameters(
'number', 'number',
gd.ParameterOptions.makeNewOptions().setDescription( gd.ParameterOptions.makeNewOptions().setDescription(
@@ -124,7 +122,7 @@ module.exports = {
.setFunctionName('setScaleZ') .setFunctionName('setScaleZ')
.setGetter('getScaleZ'); .setGetter('getScaleZ');
base3D base3D
.addScopedAction( .addScopedAction(
'FlipZ', 'FlipZ',
_('Flip the object on Z'), _('Flip the object on Z'),
@@ -135,12 +133,12 @@ module.exports = {
'res/conditions/3d_box.svg' 'res/conditions/3d_box.svg'
) )
.addParameter('object', _('3D object')) .addParameter('object', _('3D object'))
.addParameter('behavior', _('Behavior'), 'Base3DBehavior') .addParameter("behavior", _("Behavior"), "Base3DBehavior")
.addParameter('yesorno', _('Activate flipping')) .addParameter('yesorno', _('Activate flipping'))
.markAsSimple() .markAsSimple()
.setFunctionName('flipZ'); .setFunctionName('flipZ');
base3D base3D
.addScopedCondition( .addScopedCondition(
'FlippedZ', 'FlippedZ',
_('Flipped on Z'), _('Flipped on Z'),
@@ -151,10 +149,10 @@ module.exports = {
'res/conditions/3d_box.svg' 'res/conditions/3d_box.svg'
) )
.addParameter('object', _('3D object')) .addParameter('object', _('3D object'))
.addParameter('behavior', _('Behavior'), 'Base3DBehavior') .addParameter("behavior", _("Behavior"), "Base3DBehavior")
.setFunctionName('isFlippedZ'); .setFunctionName('isFlippedZ');
base3D base3D
.addExpressionAndConditionAndAction( .addExpressionAndConditionAndAction(
'number', 'number',
'RotationX', 'RotationX',
@@ -165,12 +163,12 @@ module.exports = {
'res/conditions/3d_box.svg' 'res/conditions/3d_box.svg'
) )
.addParameter('object', _('3D object')) .addParameter('object', _('3D object'))
.addParameter('behavior', _('Behavior'), 'Base3DBehavior') .addParameter("behavior", _("Behavior"), "Base3DBehavior")
.useStandardParameters('number', gd.ParameterOptions.makeNewOptions()) .useStandardParameters('number', gd.ParameterOptions.makeNewOptions())
.setFunctionName('setRotationX') .setFunctionName('setRotationX')
.setGetter('getRotationX'); .setGetter('getRotationX');
base3D base3D
.addExpressionAndConditionAndAction( .addExpressionAndConditionAndAction(
'number', 'number',
'RotationY', 'RotationY',
@@ -181,12 +179,12 @@ module.exports = {
'res/conditions/3d_box.svg' 'res/conditions/3d_box.svg'
) )
.addParameter('object', _('3D object')) .addParameter('object', _('3D object'))
.addParameter('behavior', _('Behavior'), 'Base3DBehavior') .addParameter("behavior", _("Behavior"), "Base3DBehavior")
.useStandardParameters('number', gd.ParameterOptions.makeNewOptions()) .useStandardParameters('number', gd.ParameterOptions.makeNewOptions())
.setFunctionName('setRotationY') .setFunctionName('setRotationY')
.setGetter('getRotationY'); .setGetter('getRotationY');
base3D base3D
.addScopedAction( .addScopedAction(
'TurnAroundX', 'TurnAroundX',
_('Turn around X axis'), _('Turn around X axis'),
@@ -199,12 +197,12 @@ module.exports = {
'res/conditions/3d_box.svg' 'res/conditions/3d_box.svg'
) )
.addParameter('object', _('3D object')) .addParameter('object', _('3D object'))
.addParameter('behavior', _('Behavior'), 'Base3DBehavior') .addParameter("behavior", _("Behavior"), "Base3DBehavior")
.addParameter('number', _('Rotation angle'), '', false) .addParameter('number', _('Rotation angle'), '', false)
.markAsAdvanced() .markAsAdvanced()
.setFunctionName('turnAroundX'); .setFunctionName('turnAroundX');
base3D base3D
.addScopedAction( .addScopedAction(
'TurnAroundY', 'TurnAroundY',
_('Turn around Y axis'), _('Turn around Y axis'),
@@ -217,12 +215,12 @@ module.exports = {
'res/conditions/3d_box.svg' 'res/conditions/3d_box.svg'
) )
.addParameter('object', _('3D object')) .addParameter('object', _('3D object'))
.addParameter('behavior', _('Behavior'), 'Base3DBehavior') .addParameter("behavior", _("Behavior"), "Base3DBehavior")
.addParameter('number', _('Rotation angle'), '', false) .addParameter('number', _('Rotation angle'), '', false)
.markAsAdvanced() .markAsAdvanced()
.setFunctionName('turnAroundY'); .setFunctionName('turnAroundY');
base3D base3D
.addScopedAction( .addScopedAction(
'TurnAroundZ', 'TurnAroundZ',
_('Turn around Z axis'), _('Turn around Z axis'),
@@ -235,7 +233,7 @@ module.exports = {
'res/conditions/3d_box.svg' 'res/conditions/3d_box.svg'
) )
.addParameter('object', _('3D object')) .addParameter('object', _('3D object'))
.addParameter('behavior', _('Behavior'), 'Base3DBehavior') .addParameter("behavior", _("Behavior"), "Base3DBehavior")
.addParameter('number', _('Rotation angle'), '', false) .addParameter('number', _('Rotation angle'), '', false)
.markAsAdvanced() .markAsAdvanced()
.setFunctionName('turnAroundZ'); .setFunctionName('turnAroundZ');
@@ -246,18 +244,17 @@ module.exports = {
.addObject( .addObject(
'Model3DObject', 'Model3DObject',
_('3D Model'), _('3D Model'),
_('An animated 3D model.'), _('A 3D model.'),
'JsPlatform/Extensions/3d_box.svg', 'JsPlatform/Extensions/3d_box.svg',
new gd.Model3DObjectConfiguration() new gd.Model3DObjectConfiguration()
) )
.setCategoryFullName(_('General')) .setCategoryFullName(_('3D'))
// Effects are unsupported because the object is not rendered with PIXI. // Effects are unsupported because the object is not rendered with PIXI.
.addDefaultBehavior('ResizableCapability::ResizableBehavior') .addDefaultBehavior('ResizableCapability::ResizableBehavior')
.addDefaultBehavior('ScalableCapability::ScalableBehavior') .addDefaultBehavior('ScalableCapability::ScalableBehavior')
.addDefaultBehavior('FlippableCapability::FlippableBehavior') .addDefaultBehavior('FlippableCapability::FlippableBehavior')
.addDefaultBehavior('AnimatableCapability::AnimatableBehavior') .addDefaultBehavior('AnimatableCapability::AnimatableBehavior')
.addDefaultBehavior('Scene3D::Base3DBehavior') .addDefaultBehavior('Scene3D::Base3DBehavior')
.markAsRenderedIn3D()
.setIncludeFile('Extensions/3D/A_RuntimeObject3D.js') .setIncludeFile('Extensions/3D/A_RuntimeObject3D.js')
.addIncludeFile('Extensions/3D/A_RuntimeObject3DRenderer.js') .addIncludeFile('Extensions/3D/A_RuntimeObject3DRenderer.js')
.addIncludeFile('Extensions/3D/Model3DRuntimeObject.js') .addIncludeFile('Extensions/3D/Model3DRuntimeObject.js')
@@ -282,6 +279,7 @@ module.exports = {
.setFunctionName('setZ') .setFunctionName('setZ')
.setGetter('getZ'); .setGetter('getZ');
// Deprecated // Deprecated
object object
.addExpressionAndConditionAndAction( .addExpressionAndConditionAndAction(
@@ -1127,17 +1125,16 @@ module.exports = {
.addObject( .addObject(
'Cube3DObject', 'Cube3DObject',
_('3D Box'), _('3D Box'),
_('A box with images for each face'), _('A 3D box.'),
'JsPlatform/Extensions/3d_box.svg', 'JsPlatform/Extensions/3d_box.svg',
Cube3DObject Cube3DObject
) )
.setCategoryFullName(_('General')) .setCategoryFullName(_('3D'))
// Effects are unsupported because the object is not rendered with PIXI. // Effects are unsupported because the object is not rendered with PIXI.
.addDefaultBehavior('ResizableCapability::ResizableBehavior') .addDefaultBehavior('ResizableCapability::ResizableBehavior')
.addDefaultBehavior('ScalableCapability::ScalableBehavior') .addDefaultBehavior('ScalableCapability::ScalableBehavior')
.addDefaultBehavior('FlippableCapability::FlippableBehavior') .addDefaultBehavior('FlippableCapability::FlippableBehavior')
.addDefaultBehavior('Scene3D::Base3DBehavior') .addDefaultBehavior('Scene3D::Base3DBehavior')
.markAsRenderedIn3D()
.setIncludeFile('Extensions/3D/A_RuntimeObject3D.js') .setIncludeFile('Extensions/3D/A_RuntimeObject3D.js')
.addIncludeFile('Extensions/3D/A_RuntimeObject3DRenderer.js') .addIncludeFile('Extensions/3D/A_RuntimeObject3DRenderer.js')
.addIncludeFile('Extensions/3D/Cube3DRuntimeObject.js') .addIncludeFile('Extensions/3D/Cube3DRuntimeObject.js')
@@ -1162,7 +1159,7 @@ module.exports = {
.setFunctionName('setZ') .setFunctionName('setZ')
.setGetter('getZ'); .setGetter('getZ');
// Deprecated // Deprecated
object object
.addExpressionAndConditionAndAction( .addExpressionAndConditionAndAction(
'number', 'number',
@@ -1307,7 +1304,7 @@ module.exports = {
.setFunctionName('setScaleX') .setFunctionName('setScaleX')
.setGetter('getScaleX'); .setGetter('getScaleX');
// Deprecated // Deprecated
object object
.addExpressionAndConditionAndAction( .addExpressionAndConditionAndAction(
'number', 'number',
@@ -1665,7 +1662,7 @@ module.exports = {
'Change the camera rotation to look at an object. The camera top always face the screen.' 'Change the camera rotation to look at an object. The camera top always face the screen.'
), ),
_('Change the camera rotation of _PARAM2_ to look at _PARAM1_'), _('Change the camera rotation of _PARAM2_ to look at _PARAM1_'),
_("Layers and cameras"), '',
'res/conditions/3d_box.svg', 'res/conditions/3d_box.svg',
'res/conditions/3d_box.svg' 'res/conditions/3d_box.svg'
) )
@@ -2099,12 +2096,6 @@ module.exports = {
this.updateTexture(); this.updateTexture();
} }
onRemovedFromScene() {
super.onRemovedFromScene();
// Keep textures because they are shared by all sprites.
this._pixiObject.destroy({ children: true });
}
static _getResourceNameToDisplay(objectConfiguration) { static _getResourceNameToDisplay(objectConfiguration) {
return getFirstVisibleFaceResourceName(objectConfiguration); return getFirstVisibleFaceResourceName(objectConfiguration);
} }
@@ -2169,18 +2160,17 @@ module.exports = {
updatePIXISprite() { updatePIXISprite() {
const width = this.getWidth(); const width = this.getWidth();
const height = this.getHeight(); const height = this.getHeight();
const objectTextureFrame = this._pixiTexturedObject.texture.frame;
// In case the texture is not loaded yet, we don't want to crash.
if (!objectTextureFrame) return;
this._pixiTexturedObject.anchor.x = this._pixiTexturedObject.anchor.x =
this._centerX / objectTextureFrame.width; this._centerX / this._pixiTexturedObject.texture.frame.width;
this._pixiTexturedObject.anchor.y = this._pixiTexturedObject.anchor.y =
this._centerY / objectTextureFrame.height; this._centerY / this._pixiTexturedObject.texture.frame.height;
this._pixiTexturedObject.angle = this._instance.getAngle(); this._pixiTexturedObject.angle = this._instance.getAngle();
this._pixiTexturedObject.scale.x = width / objectTextureFrame.width; this._pixiTexturedObject.scale.x =
this._pixiTexturedObject.scale.y = height / objectTextureFrame.height; width / this._pixiTexturedObject.texture.frame.width;
this._pixiTexturedObject.scale.y =
height / this._pixiTexturedObject.texture.frame.height;
this._pixiTexturedObject.position.x = this._pixiTexturedObject.position.x =
this._instance.getX() + this._instance.getX() +
@@ -2689,11 +2679,6 @@ module.exports = {
}); });
} }
onRemovedFromScene() {
super.onRemovedFromScene();
this._pixiObject.destroy({ children: true });
}
static getThumbnail(project, resourcesLoader, objectConfiguration) { static getThumbnail(project, resourcesLoader, objectConfiguration) {
return 'JsPlatform/Extensions/3d_box.svg'; return 'JsPlatform/Extensions/3d_box.svg';
} }

View File

@@ -113,10 +113,6 @@ namespace gdjs {
); );
} }
if (this.isNeedingLifecycleFunctions()) {
this.getLifecycleSleepState().wakeUp();
}
// *ALWAYS* call `this.onCreated()` at the very end of your object constructor. // *ALWAYS* call `this.onCreated()` at the very end of your object constructor.
this.onCreated(); this.onCreated();
} }
@@ -198,10 +194,6 @@ namespace gdjs {
} }
} }
isNeedingLifecycleFunctions(): boolean {
return super.isNeedingLifecycleFunctions() || this._animations.length > 0;
}
update(instanceContainer: gdjs.RuntimeInstanceContainer): void { update(instanceContainer: gdjs.RuntimeInstanceContainer): void {
const elapsedTime = this.getElapsedTime() / 1000; const elapsedTime = this.getElapsedTime() / 1000;
this._renderer.updateAnimation(elapsedTime * this._animationSpeedScale); this._renderer.updateAnimation(elapsedTime * this._animationSpeedScale);
@@ -229,9 +221,6 @@ namespace gdjs {
const animation = this._animations[animationIndex]; const animation = this._animations[animationIndex];
this._currentAnimationIndex = animationIndex; this._currentAnimationIndex = animationIndex;
this._renderer.playAnimation(animation.source, animation.loop); this._renderer.playAnimation(animation.source, animation.loop);
if (this._animationPaused) {
this._renderer.pauseAnimation();
}
} }
} }
@@ -283,12 +272,12 @@ namespace gdjs {
pauseAnimation() { pauseAnimation() {
this._animationPaused = true; this._animationPaused = true;
this._renderer.pauseAnimation(); return this._renderer.pauseAnimation();
} }
resumeAnimation() { resumeAnimation() {
this._animationPaused = false; this._animationPaused = false;
this._renderer.resumeAnimation(); return this._renderer.resumeAnimation();
} }
getAnimationSpeedScale() { getAnimationSpeedScale() {
@@ -299,20 +288,6 @@ namespace gdjs {
this._animationSpeedScale = ratio; this._animationSpeedScale = ratio;
} }
getAnimationElapsedTime(): float {
return this._renderer.getAnimationElapsedTime();
}
setAnimationElapsedTime(time: float): void {
this._renderer.setAnimationElapsedTime(time);
}
getAnimationDuration(): float {
return this._renderer.getAnimationDuration(
this._animations[this._currentAnimationIndex].source
);
}
getCenterX(): float { getCenterX(): float {
const centerPoint = this._renderer.getCenterPoint(); const centerPoint = this._renderer.getCenterPoint();
return this.getWidth() * centerPoint[0]; return this.getWidth() * centerPoint[0];

View File

@@ -348,24 +348,6 @@ namespace gdjs {
// Make sure the first frame is displayed. // Make sure the first frame is displayed.
this._animationMixer.update(0); this._animationMixer.update(0);
} }
getAnimationElapsedTime(): float {
return this._action ? this._action.time : 0;
}
setAnimationElapsedTime(time: float): void {
if (this._action) {
this._action.time = time;
}
}
getAnimationDuration(animationName: string): float {
const clip = THREE.AnimationClip.findByName(
this._originalModel.animations,
animationName
);
return clip ? clip.duration : 0;
}
} }
export const Model3DRuntimeObjectRenderer = Model3DRuntimeObject3DRenderer; export const Model3DRuntimeObjectRenderer = Model3DRuntimeObject3DRenderer;

View File

@@ -86,13 +86,11 @@ namespace gdjs {
export const turnCameraTowardObject = ( export const turnCameraTowardObject = (
runtimeScene: RuntimeScene, runtimeScene: RuntimeScene,
object: gdjs.RuntimeObject | null, object: gdjs.RuntimeObject,
layerName: string, layerName: string,
cameraIndex: integer, cameraIndex: integer,
isStandingOnY: boolean isStandingOnY: boolean
) => { ) => {
if (!object) return;
const layer = runtimeScene.getLayer(layerName); const layer = runtimeScene.getLayer(layerName);
const layerRenderer = layer.getRenderer(); const layerRenderer = layer.getRenderer();

View File

@@ -36,7 +36,7 @@ module.exports = {
extension extension
.addAction( .addAction(
'Focus', 'Focus',
_('Window focus'), _('Change focus of the window'),
_('Make the window gain or lose focus.'), _('Make the window gain or lose focus.'),
_('Focus the window: _PARAM0_'), _('Focus the window: _PARAM0_'),
_('Windows, Linux, macOS'), _('Windows, Linux, macOS'),
@@ -72,7 +72,7 @@ module.exports = {
extension extension
.addAction( .addAction(
'Show', 'Show',
_('Window visibility'), _('Change visibility of the window'),
_('Make the window visible or invisible.'), _('Make the window visible or invisible.'),
_('Window visible: _PARAM0_'), _('Window visible: _PARAM0_'),
_('Windows, Linux, macOS'), _('Windows, Linux, macOS'),
@@ -624,7 +624,7 @@ module.exports = {
extension extension
.addAction( .addAction(
'SetOpacity', 'SetOpacity',
_('Window opacity'), _('Set window opacity'),
_('Changes the window opacity.'), _('Changes the window opacity.'),
_('Set the window opacity to _PARAM0_'), _('Set the window opacity to _PARAM0_'),
_('Windows, Linux, macOS'), _('Windows, Linux, macOS'),
@@ -645,7 +645,7 @@ module.exports = {
extension extension
.addAction( .addAction(
'SetWindowPosition', 'SetWindowPosition',
_('Window position'), _('Set window position'),
_('Changes the window position.'), _('Changes the window position.'),
_('Set the window position to _PARAM0_;_PARAM1_'), _('Set the window position to _PARAM0_;_PARAM1_'),
_('Windows, Linux, macOS'), _('Windows, Linux, macOS'),

View File

@@ -30,7 +30,6 @@ describe('gdjs.AnchorRuntimeBehavior', function () {
behaviorsSharedData: [], behaviorsSharedData: [],
objects: [], objects: [],
instances: [], instances: [],
usedResources: [],
}); });
function createObject(behaviorProperties) { function createObject(behaviorProperties) {

View File

@@ -126,10 +126,6 @@ namespace gdjs {
getHeight(): float { getHeight(): float {
return this._pixiObject.height; return this._pixiObject.height;
} }
destroy(): void {
this._pixiObject.destroy(true);
}
} }
export const BBTextRuntimeObjectRenderer = BBTextRuntimeObjectPixiRenderer; export const BBTextRuntimeObjectRenderer = BBTextRuntimeObjectPixiRenderer;

View File

@@ -130,9 +130,8 @@ namespace gdjs {
} }
} }
onDestroyed(): void { onDestroyFromScene(instanceContainer: gdjs.RuntimeInstanceContainer): void {
super.onDestroyed(); super.onDestroyFromScene(instanceContainer);
this._renderer.destroy();
} }
/** /**

View File

@@ -176,12 +176,10 @@ module.exports = {
'Extensions/BitmapText/bitmaptextruntimeobject-pixi-renderer.js' 'Extensions/BitmapText/bitmaptextruntimeobject-pixi-renderer.js'
) )
.setCategoryFullName(_('Text')) .setCategoryFullName(_('Text'))
.addDefaultBehavior("TextContainerCapability::TextContainerBehavior")
.addDefaultBehavior('EffectCapability::EffectBehavior') .addDefaultBehavior('EffectCapability::EffectBehavior')
.addDefaultBehavior('OpacityCapability::OpacityBehavior') .addDefaultBehavior('OpacityCapability::OpacityBehavior')
.addDefaultBehavior('ScalableCapability::ScalableBehavior'); .addDefaultBehavior('ScalableCapability::ScalableBehavior');
// Deprecated
object object
.addExpressionAndConditionAndAction( .addExpressionAndConditionAndAction(
'string', 'string',
@@ -192,23 +190,11 @@ module.exports = {
'', '',
'res/conditions/text24_black.png' 'res/conditions/text24_black.png'
) )
.setHidden()
.addParameter('object', _('Bitmap text'), 'BitmapTextObject', false) .addParameter('object', _('Bitmap text'), 'BitmapTextObject', false)
.useStandardParameters('string', gd.ParameterOptions.makeNewOptions()) .useStandardParameters('string', gd.ParameterOptions.makeNewOptions())
.setFunctionName('setText') .setFunctionName('setText')
.setGetter('getText'); .setGetter('getText');
object
.addStrExpression(
'Text',
_('Text'),
_('Return the text.'),
'',
'res/conditions/text24_black.png'
)
.addParameter('object', _('Bitmap text'), 'BitmapTextObject', false)
.setFunctionName('getText');
// Deprecated // Deprecated
object object
.addExpressionAndConditionAndAction( .addExpressionAndConditionAndAction(
@@ -296,7 +282,6 @@ module.exports = {
.getCodeExtraInformation() .getCodeExtraInformation()
.setFunctionName('setTint'); .setFunctionName('setTint');
// Deprecated
object object
.addAction( .addAction(
'SetBitmapFontAndTextureAtlasResourceName', 'SetBitmapFontAndTextureAtlasResourceName',
@@ -309,7 +294,6 @@ module.exports = {
'res/actions/font24.png', 'res/actions/font24.png',
'res/actions/font.png' 'res/actions/font.png'
) )
.setHidden()
.addParameter('object', _('Bitmap text'), 'BitmapTextObject', false) .addParameter('object', _('Bitmap text'), 'BitmapTextObject', false)
.addParameter( .addParameter(
'bitmapFontResource', 'bitmapFontResource',
@@ -327,34 +311,6 @@ module.exports = {
.getCodeExtraInformation() .getCodeExtraInformation()
.setFunctionName('setBitmapFontAndTextureAtlasResourceName'); .setFunctionName('setBitmapFontAndTextureAtlasResourceName');
object
.addAction(
'SetBitmapFontAndTextureAtlasResourceName2',
_('Bitmap files resources'),
_('Change the Bitmap Font and/or the atlas image used by the object.'),
_(
'Set the bitmap font of _PARAM0_ to _PARAM1_ and the atlas to _PARAM2_'
),
'',
'res/actions/font24.png',
'res/actions/font.png'
)
.addParameter('object', _('Bitmap text'), 'BitmapTextObject', false)
.addParameter(
'bitmapFontResource',
_('Bitmap font resource name'),
'',
false
)
.addParameter(
'imageResource',
_('Texture atlas resource name'),
'',
false
)
.getCodeExtraInformation()
.setFunctionName('setBitmapFontAndTextureAtlasResourceName');
object object
.addExpressionAndCondition( .addExpressionAndCondition(
'string', 'string',

View File

@@ -37,7 +37,7 @@ namespace gdjs {
*/ */
export class BitmapTextRuntimeObject export class BitmapTextRuntimeObject
extends gdjs.RuntimeObject extends gdjs.RuntimeObject
implements gdjs.TextContainer, gdjs.OpacityHandler, gdjs.Scalable { implements gdjs.OpacityHandler, gdjs.Scalable {
_opacity: float; _opacity: float;
_text: string; _text: string;
/** color in format [r, g, b], where each component is in the range [0, 255] */ /** color in format [r, g, b], where each component is in the range [0, 255] */
@@ -141,8 +141,8 @@ namespace gdjs {
} }
} }
onDestroyed(): void { onDestroyFromScene(instanceContainer: gdjs.RuntimeInstanceContainer): void {
super.onDestroyed(); super.onDestroyFromScene(instanceContainer);
this._renderer.onDestroy(); this._renderer.onDestroy();
} }

View File

@@ -41,7 +41,7 @@ void DeclareDestroyOutsideBehaviorExtension(gd::PlatformExtension& extension) {
_("Compare the additional border that the object must cross " _("Compare the additional border that the object must cross "
"before being deleted."), "before being deleted."),
_("the additional border"), _("the additional border"),
_("Destroy outside configuration"), "",
"CppPlatform/Extensions/destroyoutsideicon24.png", "CppPlatform/Extensions/destroyoutsideicon24.png",
"CppPlatform/Extensions/destroyoutsideicon16.png") "CppPlatform/Extensions/destroyoutsideicon16.png")
.AddParameter("object", _("Object")) .AddParameter("object", _("Object"))
@@ -56,7 +56,7 @@ void DeclareDestroyOutsideBehaviorExtension(gd::PlatformExtension& extension) {
_("Change the additional border that the object must cross " _("Change the additional border that the object must cross "
"before being deleted."), "before being deleted."),
_("the additional border"), _("the additional border"),
_("Destroy outside configuration"), "",
"CppPlatform/Extensions/destroyoutsideicon24.png", "CppPlatform/Extensions/destroyoutsideicon24.png",
"CppPlatform/Extensions/destroyoutsideicon16.png") "CppPlatform/Extensions/destroyoutsideicon16.png")
.AddParameter("object", _("Object")) .AddParameter("object", _("Object"))

View File

@@ -39,7 +39,7 @@ void DeclareDraggableBehaviorExtension(gd::PlatformExtension& extension) {
_("Being dragged"), _("Being dragged"),
_("Check if the object is being dragged."), _("Check if the object is being dragged."),
_("_PARAM0_ is being dragged"), _("_PARAM0_ is being dragged"),
_("Draggable"), "",
"CppPlatform/Extensions/draggableicon24.png", "CppPlatform/Extensions/draggableicon24.png",
"CppPlatform/Extensions/draggableicon16.png") "CppPlatform/Extensions/draggableicon16.png")
@@ -51,7 +51,7 @@ void DeclareDraggableBehaviorExtension(gd::PlatformExtension& extension) {
_("Was just dropped"), _("Was just dropped"),
_("Check if the object was just dropped after being dragged."), _("Check if the object was just dropped after being dragged."),
_("_PARAM0_ was just dropped"), _("_PARAM0_ was just dropped"),
_("Draggable"), "",
"CppPlatform/Extensions/draggableicon24.png", "CppPlatform/Extensions/draggableicon24.png",
"CppPlatform/Extensions/draggableicon16.png") "CppPlatform/Extensions/draggableicon16.png")

View File

@@ -27,7 +27,6 @@ describe('gdjs.DraggableRuntimeBehavior', function () {
behaviorsSharedData: [], behaviorsSharedData: [],
objects: [], objects: [],
instances: [], instances: [],
usedResources: [],
}); });
var object = new gdjs.TestRuntimeObject(runtimeScene, { var object = new gdjs.TestRuntimeObject(runtimeScene, {

View File

@@ -725,44 +725,6 @@ module.exports = {
.setType('number') .setType('number')
.setDescription(_('Padding for the visual effect area')); .setDescription(_('Padding for the visual effect area'));
const hslAdjustmentEffect = extension
.addEffect('HslAdjustment')
.setFullName(_('HSL Adjustment'))
.setDescription(
_(
'Adjust hue, saturation and lightness.'
)
)
.markAsOnlyWorkingFor2D()
.addIncludeFile('Extensions/Effects/pixi-filters/filter-hsl-adjustment.js')
.addIncludeFile('Extensions/Effects/hsl-adjustment-pixi-filter.js');
const hslAdjustmentProperties = hslAdjustmentEffect.getProperties();
hslAdjustmentProperties
.getOrCreate('hue')
.setValue('0')
.setLabel(_('Hue in degrees (between -180 and 180)'))
.setType('number');
hslAdjustmentProperties
.getOrCreate('saturation')
.setValue('0')
.setLabel(_('Saturation (between -1 and 1)'))
.setType('number');
hslAdjustmentProperties
.getOrCreate('lightness')
.setValue('0')
.setLabel(_('Lightness (between -1 and 1)'))
.setType('number');
hslAdjustmentProperties
.getOrCreate('colorize')
.setValue('false')
.setLabel(_('Colorize from the grayscale image'))
.setType('boolean');
hslAdjustmentProperties
.getOrCreate('alpha')
.setValue('1')
.setLabel(_('Alpha (between 0 and 1, 0 is transparent)'))
.setType('number');
const kawaseBlurEffect = extension const kawaseBlurEffect = extension
.addEffect('KawaseBlur') .addEffect('KawaseBlur')
.setFullName(_('Blur (Kawase, fast)')) .setFullName(_('Blur (Kawase, fast)'))
@@ -813,38 +775,6 @@ module.exports = {
.setLabel(_('Opacity (between 0 and 1)')) .setLabel(_('Opacity (between 0 and 1)'))
.setType('number'); .setType('number');
const motionBlurEffect = extension
.addEffect('MotionBlur')
.setFullName(_('Motion Blur'))
.setDescription(
_('Blur the rendered image to give a feeling of speed.')
)
.markAsOnlyWorkingFor2D()
.addIncludeFile('Extensions/Effects/pixi-filters/filter-motion-blur.js')
.addIncludeFile('Extensions/Effects/motion-blur-pixi-filter.js');
const motionBlurProperties = motionBlurEffect.getProperties();
motionBlurProperties
.getOrCreate('velocityX')
.setValue('0')
.setLabel(_('Velocity on X axis'))
.setType('number');
motionBlurProperties
.getOrCreate('velocityY')
.setValue('0')
.setLabel(_('Velocity on Y axis'))
.setType('number');
motionBlurProperties
.getOrCreate('kernelSize')
.setValue('5')
.setLabel(_('Kernel size (odd number between 3 and 25)'))
.setType('number')
.setDescription(_('Quality of the blur.'));
motionBlurProperties
.getOrCreate('offset')
.setValue('0')
.setLabel(_('Offset'))
.setType('number');
const nightEffect = extension const nightEffect = extension
.addEffect('Night') .addEffect('Night')
.setFullName(_('Dark Night')) .setFullName(_('Dark Night'))
@@ -1159,59 +1089,6 @@ module.exports = {
.setLabel(_('Opacity (between 0 and 1)')) .setLabel(_('Opacity (between 0 and 1)'))
.setType('number'); .setType('number');
const shockwaveEffect = extension
.addEffect('Shockwave')
.setFullName(_('Shockwave'))
.setDescription(
_('Deform the image the way a drop deforms a water surface.')
)
.markAsOnlyWorkingFor2D()
.addIncludeFile('Extensions/Effects/pixi-filters/filter-shockwave.js')
.addIncludeFile('Extensions/Effects/shockwave-pixi-filter.js');
const shockwaveEffectProperties = shockwaveEffect.getProperties();
shockwaveEffectProperties
.getOrCreate('time')
.setValue('0')
.setLabel(_('Elapsed time'))
.setType('number')
.setDescription('It can be set back to 0 to play the shockwave animation again.');
shockwaveEffectProperties
.getOrCreate('speed')
.setValue('500')
.setLabel(_('Spreading speed (in pixels per second)'))
.setType('number');
shockwaveEffectProperties
.getOrCreate('amplitude')
.setValue('50')
.setLabel(_('Amplitude'))
.setType('number');
shockwaveEffectProperties
.getOrCreate('wavelength')
.setValue('200')
.setLabel(_('Wavelength'))
.setType('number');
shockwaveEffectProperties
.getOrCreate('brightness')
.setValue('1')
.setLabel(_('Brightness'))
.setType('number');
shockwaveEffectProperties
.getOrCreate('radius')
.setValue('0')
.setLabel(_('Maximum radius (0 for infinity)'))
.setType('number');
shockwaveEffectProperties
.getOrCreate('centerX')
.setValue('0.5')
.setLabel(_('Center on X axis'))
.setType('number');
shockwaveEffectProperties
.getOrCreate('centerY')
.setValue('0.5')
.setLabel(_('Center on Y axis'))
.setType('number')
.setDescription('(0,0) is the top-left and (1,1) is the bottom right.');
const tiltShiftEffect = extension const tiltShiftEffect = extension
.addEffect('TiltShift') .addEffect('TiltShift')
.setFullName(_('Tilt shift')) .setFullName(_('Tilt shift'))

View File

@@ -2,16 +2,12 @@ namespace gdjs {
gdjs.PixiFiltersTools.registerFilterCreator( gdjs.PixiFiltersTools.registerFilterCreator(
'Adjustment', 'Adjustment',
new (class extends gdjs.PixiFiltersTools.PixiFilterCreator { new (class extends gdjs.PixiFiltersTools.PixiFilterCreator {
makePIXIFilter(target: EffectsTarget, effectData) { makePIXIFilter(target, effectData) {
const adjustmentFilter = new PIXI.filters.AdjustmentFilter(); const adjustmentFilter = new PIXI.filters.AdjustmentFilter();
return adjustmentFilter; return adjustmentFilter;
} }
updatePreRender(filter: PIXI.Filter, target: EffectsTarget) {} updatePreRender(filter, target) {}
updateDoubleParameter( updateDoubleParameter(filter, parameterName, value) {
filter: PIXI.Filter,
parameterName: string,
value: number
) {
const adjustmentFilter = (filter as unknown) as PIXI.filters.AdjustmentFilter; const adjustmentFilter = (filter as unknown) as PIXI.filters.AdjustmentFilter;
if (parameterName === 'gamma') { if (parameterName === 'gamma') {
adjustmentFilter.gamma = value; adjustmentFilter.gamma = value;
@@ -31,16 +27,8 @@ namespace gdjs {
adjustmentFilter.alpha = value; adjustmentFilter.alpha = value;
} }
} }
updateStringParameter( updateStringParameter(filter, parameterName, value) {}
filter: PIXI.Filter, updateBooleanParameter(filter, parameterName, value) {}
parameterName: string,
value: string
) {}
updateBooleanParameter(
filter: PIXI.Filter,
parameterName: string,
value: boolean
) {}
})() })()
); );
} }

View File

@@ -2,16 +2,12 @@ namespace gdjs {
gdjs.PixiFiltersTools.registerFilterCreator( gdjs.PixiFiltersTools.registerFilterCreator(
'AdvancedBloom', 'AdvancedBloom',
new (class extends gdjs.PixiFiltersTools.PixiFilterCreator { new (class extends gdjs.PixiFiltersTools.PixiFilterCreator {
makePIXIFilter(target: EffectsTarget, effectData) { makePIXIFilter(target, effectData) {
const advancedBloomFilter = new PIXI.filters.AdvancedBloomFilter(); const advancedBloomFilter = new PIXI.filters.AdvancedBloomFilter();
return advancedBloomFilter; return advancedBloomFilter;
} }
updatePreRender(filter: PIXI.Filter, target: EffectsTarget) {} updatePreRender(filter, target) {}
updateDoubleParameter( updateDoubleParameter(filter, parameterName, value) {
filter: PIXI.Filter,
parameterName: string,
value: number
) {
const advancedBloomFilter = (filter as unknown) as PIXI.filters.AdvancedBloomFilter; const advancedBloomFilter = (filter as unknown) as PIXI.filters.AdvancedBloomFilter;
if (parameterName === 'threshold') { if (parameterName === 'threshold') {
advancedBloomFilter.threshold = value; advancedBloomFilter.threshold = value;
@@ -27,16 +23,8 @@ namespace gdjs {
advancedBloomFilter.padding = value; advancedBloomFilter.padding = value;
} }
} }
updateStringParameter( updateStringParameter(filter, parameterName, value) {}
filter: PIXI.Filter, updateBooleanParameter(filter, parameterName, value) {}
parameterName: string,
value: string
) {}
updateBooleanParameter(
filter: PIXI.Filter,
parameterName: string,
value: boolean
) {}
})() })()
); );
} }

View File

@@ -2,31 +2,19 @@ namespace gdjs {
gdjs.PixiFiltersTools.registerFilterCreator( gdjs.PixiFiltersTools.registerFilterCreator(
'Ascii', 'Ascii',
new (class extends gdjs.PixiFiltersTools.PixiFilterCreator { new (class extends gdjs.PixiFiltersTools.PixiFilterCreator {
makePIXIFilter(target: EffectsTarget, effectData) { makePIXIFilter(target, effectData) {
const asciiFilter = new PIXI.filters.AsciiFilter(); const asciiFilter = new PIXI.filters.AsciiFilter();
return asciiFilter; return asciiFilter;
} }
updatePreRender(filter: PIXI.Filter, target: EffectsTarget) {} updatePreRender(filter, target) {}
updateDoubleParameter( updateDoubleParameter(filter, parameterName, value) {
filter: PIXI.Filter,
parameterName: string,
value: number
) {
const asciiFilter = (filter as unknown) as PIXI.filters.AsciiFilter; const asciiFilter = (filter as unknown) as PIXI.filters.AsciiFilter;
if (parameterName === 'size') { if (parameterName === 'size') {
asciiFilter.size = value; asciiFilter.size = value;
} }
} }
updateStringParameter( updateStringParameter(filter, parameterName, value) {}
filter: PIXI.Filter, updateBooleanParameter(filter, parameterName, value) {}
parameterName: string,
value: string
) {}
updateBooleanParameter(
filter: PIXI.Filter,
parameterName: string,
value: boolean
) {}
})() })()
); );
} }

View File

@@ -2,16 +2,12 @@ namespace gdjs {
gdjs.PixiFiltersTools.registerFilterCreator( gdjs.PixiFiltersTools.registerFilterCreator(
'Bevel', 'Bevel',
new (class extends gdjs.PixiFiltersTools.PixiFilterCreator { new (class extends gdjs.PixiFiltersTools.PixiFilterCreator {
makePIXIFilter(target: EffectsTarget, effectData) { makePIXIFilter(target, effectData) {
const bevelFilter = new PIXI.filters.BevelFilter(); const bevelFilter = new PIXI.filters.BevelFilter();
return bevelFilter; return bevelFilter;
} }
updatePreRender(filter: PIXI.Filter, target: EffectsTarget) {} updatePreRender(filter, target) {}
updateDoubleParameter( updateDoubleParameter(filter, parameterName, value) {
filter: PIXI.Filter,
parameterName: string,
value: number
) {
const bevelFilter = (filter as unknown) as PIXI.filters.BevelFilter; const bevelFilter = (filter as unknown) as PIXI.filters.BevelFilter;
if (parameterName === 'rotation') { if (parameterName === 'rotation') {
bevelFilter.rotation = value; bevelFilter.rotation = value;
@@ -26,11 +22,7 @@ namespace gdjs {
bevelFilter.shadowAlpha = value; bevelFilter.shadowAlpha = value;
} }
} }
updateStringParameter( updateStringParameter(filter, parameterName, value) {
filter: PIXI.Filter,
parameterName: string,
value: string
) {
const bevelFilter = (filter as unknown) as PIXI.filters.BevelFilter; const bevelFilter = (filter as unknown) as PIXI.filters.BevelFilter;
if (parameterName === 'lightColor') { if (parameterName === 'lightColor') {
bevelFilter.lightColor = gdjs.PixiFiltersTools.rgbOrHexToHexNumber( bevelFilter.lightColor = gdjs.PixiFiltersTools.rgbOrHexToHexNumber(
@@ -43,11 +35,7 @@ namespace gdjs {
); );
} }
} }
updateBooleanParameter( updateBooleanParameter(filter, parameterName, value) {}
filter: PIXI.Filter,
parameterName: string,
value: boolean
) {}
})() })()
); );
} }

View File

@@ -2,33 +2,21 @@ namespace gdjs {
gdjs.PixiFiltersTools.registerFilterCreator( gdjs.PixiFiltersTools.registerFilterCreator(
'BlackAndWhite', 'BlackAndWhite',
new (class extends gdjs.PixiFiltersTools.PixiFilterCreator { new (class extends gdjs.PixiFiltersTools.PixiFilterCreator {
makePIXIFilter(target: EffectsTarget, effectData) { makePIXIFilter(target, effectData) {
const colorMatrix = new PIXI.ColorMatrixFilter(); const colorMatrix = new PIXI.ColorMatrixFilter();
colorMatrix.blackAndWhite(false); colorMatrix.blackAndWhite(false);
return colorMatrix; return colorMatrix;
} }
updatePreRender(filter: PIXI.Filter, target: EffectsTarget) {} updatePreRender(filter, target) {}
updateDoubleParameter( updateDoubleParameter(filter, parameterName, value) {
filter: PIXI.Filter,
parameterName: string,
value: number
) {
const colorMatrix = (filter as unknown) as PIXI.ColorMatrixFilter; const colorMatrix = (filter as unknown) as PIXI.ColorMatrixFilter;
if (parameterName !== 'opacity') { if (parameterName !== 'opacity') {
return; return;
} }
colorMatrix.alpha = gdjs.PixiFiltersTools.clampValue(value, 0, 1); colorMatrix.alpha = gdjs.PixiFiltersTools.clampValue(value, 0, 1);
} }
updateStringParameter( updateStringParameter(filter, parameterName, value) {}
filter: PIXI.Filter, updateBooleanParameter(filter, parameterName, value) {}
parameterName: string,
value: string
) {}
updateBooleanParameter(
filter: PIXI.Filter,
parameterName: string,
value: boolean
) {}
})() })()
); );
} }

View File

@@ -2,16 +2,12 @@ namespace gdjs {
gdjs.PixiFiltersTools.registerFilterCreator( gdjs.PixiFiltersTools.registerFilterCreator(
'BlendingMode', 'BlendingMode',
new (class extends gdjs.PixiFiltersTools.PixiFilterCreator { new (class extends gdjs.PixiFiltersTools.PixiFilterCreator {
makePIXIFilter(target: EffectsTarget, effectData) { makePIXIFilter(target, effectData) {
const blendingModeFilter = new PIXI.AlphaFilter(); const blendingModeFilter = new PIXI.AlphaFilter();
return blendingModeFilter; return blendingModeFilter;
} }
updatePreRender(filter: PIXI.Filter, target: EffectsTarget) {} updatePreRender(filter, target) {}
updateDoubleParameter( updateDoubleParameter(filter, parameterName, value) {
filter: PIXI.Filter,
parameterName: string,
value: number
) {
const blendingModeFilter = (filter as unknown) as PIXI.AlphaFilter; const blendingModeFilter = (filter as unknown) as PIXI.AlphaFilter;
if (parameterName === 'alpha') { if (parameterName === 'alpha') {
blendingModeFilter.alpha = value; blendingModeFilter.alpha = value;
@@ -19,16 +15,8 @@ namespace gdjs {
blendingModeFilter.blendMode = value; blendingModeFilter.blendMode = value;
} }
} }
updateStringParameter( updateStringParameter(filter, parameterName, value) {}
filter: PIXI.Filter, updateBooleanParameter(filter, parameterName, value) {}
parameterName: string,
value: string
) {}
updateBooleanParameter(
filter: PIXI.Filter,
parameterName: string,
value: boolean
) {}
})() })()
); );
} }

View File

@@ -2,16 +2,12 @@ namespace gdjs {
gdjs.PixiFiltersTools.registerFilterCreator( gdjs.PixiFiltersTools.registerFilterCreator(
'Blur', 'Blur',
new (class extends gdjs.PixiFiltersTools.PixiFilterCreator { new (class extends gdjs.PixiFiltersTools.PixiFilterCreator {
makePIXIFilter(target: EffectsTarget, effectData) { makePIXIFilter(target, effectData) {
const blur = new PIXI.BlurFilter(); const blur = new PIXI.BlurFilter();
return blur; return blur;
} }
updatePreRender(filter: PIXI.Filter, target: EffectsTarget) {} updatePreRender(filter, target) {}
updateDoubleParameter( updateDoubleParameter(filter, parameterName, value) {
filter: PIXI.Filter,
parameterName: string,
value: number
) {
if ( if (
parameterName !== 'blur' && parameterName !== 'blur' &&
parameterName !== 'quality' && parameterName !== 'quality' &&
@@ -25,16 +21,8 @@ namespace gdjs {
} }
filter[parameterName] = value; filter[parameterName] = value;
} }
updateStringParameter( updateStringParameter(filter, parameterName, value) {}
filter: PIXI.Filter, updateBooleanParameter(filter, parameterName, value) {}
parameterName: string,
value: string
) {}
updateBooleanParameter(
filter: PIXI.Filter,
parameterName: string,
value: boolean
) {}
})() })()
); );
} }

View File

@@ -2,17 +2,13 @@ namespace gdjs {
gdjs.PixiFiltersTools.registerFilterCreator( gdjs.PixiFiltersTools.registerFilterCreator(
'Brightness', 'Brightness',
new (class extends gdjs.PixiFiltersTools.PixiFilterCreator { new (class extends gdjs.PixiFiltersTools.PixiFilterCreator {
makePIXIFilter(target: EffectsTarget, effectData) { makePIXIFilter(target, effectData) {
const brightness = new PIXI.ColorMatrixFilter(); const brightness = new PIXI.ColorMatrixFilter();
brightness.brightness(1, false); brightness.brightness(1, false);
return brightness; return brightness;
} }
updatePreRender(filter: PIXI.Filter, target: EffectsTarget) {} updatePreRender(filter, target) {}
updateDoubleParameter( updateDoubleParameter(filter, parameterName, value) {
filter: PIXI.Filter,
parameterName: string,
value: number
) {
const brightnessFilter = (filter as unknown) as PIXI.ColorMatrixFilter; const brightnessFilter = (filter as unknown) as PIXI.ColorMatrixFilter;
if (parameterName !== 'brightness') { if (parameterName !== 'brightness') {
return; return;
@@ -22,16 +18,8 @@ namespace gdjs {
false false
); );
} }
updateStringParameter( updateStringParameter(filter, parameterName, value) {}
filter: PIXI.Filter, updateBooleanParameter(filter, parameterName, value) {}
parameterName: string,
value: string
) {}
updateBooleanParameter(
filter: PIXI.Filter,
parameterName: string,
value: boolean
) {}
})() })()
); );
} }

View File

@@ -2,16 +2,12 @@ namespace gdjs {
gdjs.PixiFiltersTools.registerFilterCreator( gdjs.PixiFiltersTools.registerFilterCreator(
'BulgePinch', 'BulgePinch',
new (class extends gdjs.PixiFiltersTools.PixiFilterCreator { new (class extends gdjs.PixiFiltersTools.PixiFilterCreator {
makePIXIFilter(target: EffectsTarget, effectData) { makePIXIFilter(target, effectData) {
const bulgePinchFilter = new PIXI.filters.BulgePinchFilter(); const bulgePinchFilter = new PIXI.filters.BulgePinchFilter();
return bulgePinchFilter; return bulgePinchFilter;
} }
updatePreRender(filter: PIXI.Filter, target: EffectsTarget) {} updatePreRender(filter, target) {}
updateDoubleParameter( updateDoubleParameter(filter, parameterName, value) {
filter: PIXI.Filter,
parameterName: string,
value: number
) {
const bulgePinchFilter = (filter as unknown) as PIXI.filters.BulgePinchFilter; const bulgePinchFilter = (filter as unknown) as PIXI.filters.BulgePinchFilter;
if (parameterName === 'centerX') { if (parameterName === 'centerX') {
bulgePinchFilter.center[0] = value; bulgePinchFilter.center[0] = value;
@@ -27,16 +23,8 @@ namespace gdjs {
); );
} }
} }
updateStringParameter( updateStringParameter(filter, parameterName, value) {}
filter: PIXI.Filter, updateBooleanParameter(filter, parameterName, value) {}
parameterName: string,
value: string
) {}
updateBooleanParameter(
filter: PIXI.Filter,
parameterName: string,
value: boolean
) {}
})() })()
); );
} }

View File

@@ -2,7 +2,7 @@ namespace gdjs {
gdjs.PixiFiltersTools.registerFilterCreator( gdjs.PixiFiltersTools.registerFilterCreator(
'ColorMap', 'ColorMap',
new (class extends gdjs.PixiFiltersTools.PixiFilterCreator { new (class extends gdjs.PixiFiltersTools.PixiFilterCreator {
makePIXIFilter(target: EffectsTarget, effectData) { makePIXIFilter(target, effectData) {
const colorMapTexture = target const colorMapTexture = target
.getRuntimeScene() .getRuntimeScene()
.getGame() .getGame()
@@ -19,12 +19,8 @@ namespace gdjs {
); );
return colorMapFilter; return colorMapFilter;
} }
updatePreRender(filter: PIXI.Filter, target: EffectsTarget) {} updatePreRender(filter, target) {}
updateDoubleParameter( updateDoubleParameter(filter, parameterName, value) {
filter: PIXI.Filter,
parameterName: string,
value: number
) {
const colorMapFilter = (filter as unknown) as PIXI.filters.ColorMapFilter; const colorMapFilter = (filter as unknown) as PIXI.filters.ColorMapFilter;
if (parameterName === 'mix') { if (parameterName === 'mix') {
colorMapFilter.mix = gdjs.PixiFiltersTools.clampValue( colorMapFilter.mix = gdjs.PixiFiltersTools.clampValue(
@@ -34,16 +30,8 @@ namespace gdjs {
); );
} }
} }
updateStringParameter( updateStringParameter(filter, parameterName, value) {}
filter: PIXI.Filter, updateBooleanParameter(filter, parameterName, value) {
parameterName: string,
value: string
) {}
updateBooleanParameter(
filter: PIXI.Filter,
parameterName: string,
value: boolean
) {
const colorMapFilter = (filter as unknown) as PIXI.filters.ColorMapFilter; const colorMapFilter = (filter as unknown) as PIXI.filters.ColorMapFilter;
if (parameterName === 'nearest') { if (parameterName === 'nearest') {
colorMapFilter.nearest = value; colorMapFilter.nearest = value;

View File

@@ -2,26 +2,18 @@ namespace gdjs {
gdjs.PixiFiltersTools.registerFilterCreator( gdjs.PixiFiltersTools.registerFilterCreator(
'ColorReplace', 'ColorReplace',
new (class extends gdjs.PixiFiltersTools.PixiFilterCreator { new (class extends gdjs.PixiFiltersTools.PixiFilterCreator {
makePIXIFilter(target: EffectsTarget, effectData) { makePIXIFilter(target, effectData) {
const colorReplaceFilter = new PIXI.filters.ColorReplaceFilter(); const colorReplaceFilter = new PIXI.filters.ColorReplaceFilter();
return colorReplaceFilter; return colorReplaceFilter;
} }
updatePreRender(filter: PIXI.Filter, target: EffectsTarget) {} updatePreRender(filter, target) {}
updateDoubleParameter( updateDoubleParameter(filter, parameterName, value) {
filter: PIXI.Filter,
parameterName: string,
value: number
) {
const colorReplaceFilter = (filter as unknown) as PIXI.filters.ColorReplaceFilter; const colorReplaceFilter = (filter as unknown) as PIXI.filters.ColorReplaceFilter;
if (parameterName === 'epsilon') { if (parameterName === 'epsilon') {
colorReplaceFilter.epsilon = value; colorReplaceFilter.epsilon = value;
} }
} }
updateStringParameter( updateStringParameter(filter, parameterName, value) {
filter: PIXI.Filter,
parameterName: string,
value: string
) {
const colorReplaceFilter = (filter as unknown) as PIXI.filters.ColorReplaceFilter; const colorReplaceFilter = (filter as unknown) as PIXI.filters.ColorReplaceFilter;
if (parameterName === 'originalColor') { if (parameterName === 'originalColor') {
colorReplaceFilter.originalColor = gdjs.PixiFiltersTools.rgbOrHexToHexNumber( colorReplaceFilter.originalColor = gdjs.PixiFiltersTools.rgbOrHexToHexNumber(
@@ -33,11 +25,7 @@ namespace gdjs {
); );
} }
} }
updateBooleanParameter( updateBooleanParameter(filter, parameterName, value) {}
filter: PIXI.Filter,
parameterName: string,
value: boolean
) {}
})() })()
); );
} }

View File

@@ -9,7 +9,7 @@ namespace gdjs {
crtFilter._animationTimer = 0; crtFilter._animationTimer = 0;
return crtFilter; return crtFilter;
} }
updatePreRender(filter: PIXI.Filter, target: EffectsTarget) { updatePreRender(filter, target) {
if (filter.animationSpeed !== 0) { if (filter.animationSpeed !== 0) {
// Multiply by 10 so that the default value is a sensible speed // Multiply by 10 so that the default value is a sensible speed
filter.time += filter.time +=
@@ -23,11 +23,7 @@ namespace gdjs {
} }
} }
} }
updateDoubleParameter( updateDoubleParameter(filter, parameterName, value) {
filter: PIXI.Filter,
parameterName: string,
value: number
) {
if (parameterName === 'lineWidth') { if (parameterName === 'lineWidth') {
filter.lineWidth = value; filter.lineWidth = value;
} else if (parameterName === 'lineContrast') { } else if (parameterName === 'lineContrast') {
@@ -52,16 +48,8 @@ namespace gdjs {
filter.padding = value; filter.padding = value;
} }
} }
updateStringParameter( updateStringParameter(filter, parameterName, value) {}
filter: PIXI.Filter, updateBooleanParameter(filter, parameterName, value) {
parameterName: string,
value: string
) {}
updateBooleanParameter(
filter: PIXI.Filter,
parameterName: string,
value: boolean
) {
if (parameterName === 'verticalLine') { if (parameterName === 'verticalLine') {
filter.verticalLine = value; filter.verticalLine = value;
} }

View File

@@ -2,7 +2,7 @@ namespace gdjs {
gdjs.PixiFiltersTools.registerFilterCreator( gdjs.PixiFiltersTools.registerFilterCreator(
'Displacement', 'Displacement',
new (class extends gdjs.PixiFiltersTools.PixiFilterCreator { new (class extends gdjs.PixiFiltersTools.PixiFilterCreator {
makePIXIFilter(target: EffectsTarget, effectData) { makePIXIFilter(target, effectData) {
const displacementMapTexture = target const displacementMapTexture = target
.getRuntimeScene() .getRuntimeScene()
.getGame() .getGame()
@@ -15,12 +15,8 @@ namespace gdjs {
); );
return displacementFilter; return displacementFilter;
} }
updatePreRender(filter: PIXI.Filter, target: EffectsTarget) {} updatePreRender(filter, target) {}
updateDoubleParameter( updateDoubleParameter(filter, parameterName, value) {
filter: PIXI.Filter,
parameterName: string,
value: number
) {
const displacementFilter = (filter as unknown) as PIXI.DisplacementFilter; const displacementFilter = (filter as unknown) as PIXI.DisplacementFilter;
if (parameterName === 'scaleX') { if (parameterName === 'scaleX') {
displacementFilter.scale.x = value; displacementFilter.scale.x = value;
@@ -29,16 +25,8 @@ namespace gdjs {
displacementFilter.scale.y = value; displacementFilter.scale.y = value;
} }
} }
updateStringParameter( updateStringParameter(filter, parameterName, value) {}
filter: PIXI.Filter, updateBooleanParameter(filter, parameterName, value) {}
parameterName: string,
value: string
) {}
updateBooleanParameter(
filter: PIXI.Filter,
parameterName: string,
value: boolean
) {}
})() })()
); );
} }

View File

@@ -2,16 +2,12 @@ namespace gdjs {
gdjs.PixiFiltersTools.registerFilterCreator( gdjs.PixiFiltersTools.registerFilterCreator(
'Dot', 'Dot',
new (class extends gdjs.PixiFiltersTools.PixiFilterCreator { new (class extends gdjs.PixiFiltersTools.PixiFilterCreator {
makePIXIFilter(target: EffectsTarget, effectData) { makePIXIFilter(target, effectData) {
const dotFilter = new PIXI.filters.DotFilter(); const dotFilter = new PIXI.filters.DotFilter();
return dotFilter; return dotFilter;
} }
updatePreRender(filter: PIXI.Filter, target: EffectsTarget) {} updatePreRender(filter, target) {}
updateDoubleParameter( updateDoubleParameter(filter, parameterName, value) {
filter: PIXI.Filter,
parameterName: string,
value: number
) {
const dotFilter = (filter as unknown) as PIXI.filters.DotFilter; const dotFilter = (filter as unknown) as PIXI.filters.DotFilter;
if (parameterName === 'scale') { if (parameterName === 'scale') {
dotFilter.scale = value; dotFilter.scale = value;
@@ -19,16 +15,8 @@ namespace gdjs {
dotFilter.angle = value; dotFilter.angle = value;
} }
} }
updateStringParameter( updateStringParameter(filter, parameterName, value) {}
filter: PIXI.Filter, updateBooleanParameter(filter, parameterName, value) {}
parameterName: string,
value: string
) {}
updateBooleanParameter(
filter: PIXI.Filter,
parameterName: string,
value: boolean
) {}
})() })()
); );
} }

View File

@@ -2,16 +2,12 @@ namespace gdjs {
gdjs.PixiFiltersTools.registerFilterCreator( gdjs.PixiFiltersTools.registerFilterCreator(
'DropShadow', 'DropShadow',
new (class extends gdjs.PixiFiltersTools.PixiFilterCreator { new (class extends gdjs.PixiFiltersTools.PixiFilterCreator {
makePIXIFilter(target: EffectsTarget, effectData) { makePIXIFilter(target, effectData) {
const dropShadowFilter = new PIXI.filters.DropShadowFilter(); const dropShadowFilter = new PIXI.filters.DropShadowFilter();
return dropShadowFilter; return dropShadowFilter;
} }
updatePreRender(filter: PIXI.Filter, target: EffectsTarget) {} updatePreRender(filter, target) {}
updateDoubleParameter( updateDoubleParameter(filter, parameterName, value) {
filter: PIXI.Filter,
parameterName: string,
value: number
) {
const dropShadowFilter = (filter as unknown) as PIXI.filters.DropShadowFilter; const dropShadowFilter = (filter as unknown) as PIXI.filters.DropShadowFilter;
if (parameterName === 'blur') { if (parameterName === 'blur') {
dropShadowFilter.blur = value; dropShadowFilter.blur = value;
@@ -27,11 +23,7 @@ namespace gdjs {
dropShadowFilter.padding = value; dropShadowFilter.padding = value;
} }
} }
updateStringParameter( updateStringParameter(filter, parameterName, value) {
filter: PIXI.Filter,
parameterName: string,
value: string
) {
const dropShadowFilter = (filter as unknown) as PIXI.filters.DropShadowFilter; const dropShadowFilter = (filter as unknown) as PIXI.filters.DropShadowFilter;
if (parameterName === 'color') { if (parameterName === 'color') {
dropShadowFilter.color = gdjs.PixiFiltersTools.rgbOrHexToHexNumber( dropShadowFilter.color = gdjs.PixiFiltersTools.rgbOrHexToHexNumber(
@@ -39,11 +31,7 @@ namespace gdjs {
); );
} }
} }
updateBooleanParameter( updateBooleanParameter(filter, parameterName, value) {
filter: PIXI.Filter,
parameterName: string,
value: boolean
) {
const dropShadowFilter = (filter as unknown) as PIXI.filters.DropShadowFilter; const dropShadowFilter = (filter as unknown) as PIXI.filters.DropShadowFilter;
if (parameterName === 'shadowOnly') { if (parameterName === 'shadowOnly') {
dropShadowFilter.shadowOnly = value; dropShadowFilter.shadowOnly = value;

View File

@@ -9,7 +9,7 @@ namespace gdjs {
glitchFilter._animationTimer = 0; glitchFilter._animationTimer = 0;
return glitchFilter; return glitchFilter;
} }
updatePreRender(filter: PIXI.Filter, target: EffectsTarget) { updatePreRender(filter, target) {
if (filter.animationFrequency !== 0) { if (filter.animationFrequency !== 0) {
filter._animationTimer += target.getElapsedTime() / 1000; filter._animationTimer += target.getElapsedTime() / 1000;
if (filter._animationTimer >= 1 / filter.animationFrequency) { if (filter._animationTimer >= 1 / filter.animationFrequency) {
@@ -18,11 +18,7 @@ namespace gdjs {
} }
} }
} }
updateDoubleParameter( updateDoubleParameter(filter, parameterName, value) {
filter: PIXI.Filter,
parameterName: string,
value: number
) {
if (parameterName === 'slices') { if (parameterName === 'slices') {
filter.slices = value; filter.slices = value;
} else if (parameterName === 'offset') { } else if (parameterName === 'offset') {
@@ -51,16 +47,8 @@ namespace gdjs {
filter.animationFrequency = value; filter.animationFrequency = value;
} }
} }
updateStringParameter( updateStringParameter(filter, parameterName, value) {}
filter: PIXI.Filter, updateBooleanParameter(filter, parameterName, value) {
parameterName: string,
value: string
) {}
updateBooleanParameter(
filter: PIXI.Filter,
parameterName: string,
value: boolean
) {
if (parameterName === 'average') { if (parameterName === 'average') {
filter.average = value; filter.average = value;
} }

View File

@@ -2,16 +2,12 @@ namespace gdjs {
gdjs.PixiFiltersTools.registerFilterCreator( gdjs.PixiFiltersTools.registerFilterCreator(
'Glow', 'Glow',
new (class extends gdjs.PixiFiltersTools.PixiFilterCreator { new (class extends gdjs.PixiFiltersTools.PixiFilterCreator {
makePIXIFilter(target: EffectsTarget, effectData) { makePIXIFilter(target, effectData) {
const glowFilter = new PIXI.filters.GlowFilter(); const glowFilter = new PIXI.filters.GlowFilter();
return glowFilter; return glowFilter;
} }
updatePreRender(filter: PIXI.Filter, target: EffectsTarget) {} updatePreRender(filter, target) {}
updateDoubleParameter( updateDoubleParameter(filter, parameterName, value) {
filter: PIXI.Filter,
parameterName: string,
value: number
) {
const glowFilter = (filter as unknown) as PIXI.filters.GlowFilter; const glowFilter = (filter as unknown) as PIXI.filters.GlowFilter;
if (parameterName === 'innerStrength') { if (parameterName === 'innerStrength') {
glowFilter.innerStrength = value; glowFilter.innerStrength = value;
@@ -22,21 +18,13 @@ namespace gdjs {
glowFilter.distance = value; glowFilter.distance = value;
} }
} }
updateStringParameter( updateStringParameter(filter, parameterName, value) {
filter: PIXI.Filter,
parameterName: string,
value: string
) {
const glowFilter = (filter as unknown) as PIXI.filters.GlowFilter; const glowFilter = (filter as unknown) as PIXI.filters.GlowFilter;
if (parameterName === 'color') { if (parameterName === 'color') {
glowFilter.color = gdjs.PixiFiltersTools.rgbOrHexToHexNumber(value); glowFilter.color = gdjs.PixiFiltersTools.rgbOrHexToHexNumber(value);
} }
} }
updateBooleanParameter( updateBooleanParameter(filter, parameterName, value) {}
filter: PIXI.Filter,
parameterName: string,
value: boolean
) {}
})() })()
); );
} }

View File

@@ -8,17 +8,13 @@ namespace gdjs {
const godrayFilter = new PIXI.filters.GodrayFilter(); const godrayFilter = new PIXI.filters.GodrayFilter();
return godrayFilter; return godrayFilter;
} }
updatePreRender(filter: PIXI.Filter, target: EffectsTarget) { updatePreRender(filter, target) {
if (filter.animationSpeed !== 0) { if (filter.animationSpeed !== 0) {
filter.time += filter.time +=
(target.getElapsedTime() / 1000) * filter.animationSpeed; (target.getElapsedTime() / 1000) * filter.animationSpeed;
} }
} }
updateDoubleParameter( updateDoubleParameter(filter, parameterName, value) {
filter: PIXI.Filter,
parameterName: string,
value: number
) {
if (parameterName === 'lacunarity') { if (parameterName === 'lacunarity') {
filter.lacunarity = value; filter.lacunarity = value;
} else if (parameterName === 'angle') { } else if (parameterName === 'angle') {
@@ -37,16 +33,8 @@ namespace gdjs {
filter.padding = value; filter.padding = value;
} }
} }
updateStringParameter( updateStringParameter(filter, parameterName, value) {}
filter: PIXI.Filter, updateBooleanParameter(filter, parameterName, value) {
parameterName: string,
value: string
) {}
updateBooleanParameter(
filter: PIXI.Filter,
parameterName: string,
value: boolean
) {
if (parameterName === 'parallel') { if (parameterName === 'parallel') {
filter.parallel = value; filter.parallel = value;
} }

View File

@@ -1,43 +0,0 @@
namespace gdjs {
gdjs.PixiFiltersTools.registerFilterCreator(
'HslAdjustment',
new (class extends gdjs.PixiFiltersTools.PixiFilterCreator {
makePIXIFilter(target: EffectsTarget, effectData) {
const hslAdjustmentFilter = new PIXI.filters.HslAdjustmentFilter();
return hslAdjustmentFilter;
}
updatePreRender(filter: PIXI.Filter, target: EffectsTarget) {}
updateDoubleParameter(
filter: PIXI.Filter,
parameterName: string,
value: number
) {
const hslAdjustmentFilter = filter as PIXI.filters.HslAdjustmentFilter;
if (parameterName === 'hue') {
hslAdjustmentFilter.hue = value;
} else if (parameterName === 'saturation') {
hslAdjustmentFilter.saturation = value;
} else if (parameterName === 'lightness') {
hslAdjustmentFilter.lightness = value;
} else if (parameterName === 'alpha') {
hslAdjustmentFilter.alpha = value;
}
}
updateStringParameter(
filter: PIXI.Filter,
parameterName: string,
value: string
) {}
updateBooleanParameter(
filter: PIXI.Filter,
parameterName: string,
value: boolean
) {
const hslAdjustmentFilter = filter as PIXI.filters.HslAdjustmentFilter;
if (parameterName === 'colorize') {
hslAdjustmentFilter.colorize = value;
}
}
})()
);
}

View File

@@ -2,37 +2,27 @@ namespace gdjs {
gdjs.PixiFiltersTools.registerFilterCreator( gdjs.PixiFiltersTools.registerFilterCreator(
'KawaseBlur', 'KawaseBlur',
new (class extends gdjs.PixiFiltersTools.PixiFilterCreator { new (class extends gdjs.PixiFiltersTools.PixiFilterCreator {
makePIXIFilter(target: EffectsTarget, effectData) { makePIXIFilter(target, effectData) {
const kawaseBlurFilter = new PIXI.filters.KawaseBlurFilter(); const kawaseBlurFilter = new PIXI.filters.KawaseBlurFilter();
return kawaseBlurFilter; return kawaseBlurFilter;
} }
updatePreRender(filter: PIXI.Filter, target: EffectsTarget) {} updatePreRender(filter, target) {}
updateDoubleParameter( updateDoubleParameter(filter, parameterName, value) {
filter: PIXI.Filter,
parameterName: string,
value: number
) {
const kawaseBlurFilter = (filter as unknown) as PIXI.filters.KawaseBlurFilter; const kawaseBlurFilter = (filter as unknown) as PIXI.filters.KawaseBlurFilter;
if (parameterName === 'pixelizeX') { if (parameterName === 'pixelizeX') {
kawaseBlurFilter.pixelSize[0] = value; // @ts-ignore: fix these wrong parameters
kawaseBlurFilter.pixelizeX = value;
} else if (parameterName === 'pixelizeY') { } else if (parameterName === 'pixelizeY') {
kawaseBlurFilter.pixelSize[1] = value; // @ts-ignore: fix these wrong parameters
kawaseBlurFilter.pixelizeY = value;
} else if (parameterName === 'blur') { } else if (parameterName === 'blur') {
kawaseBlurFilter.blur = value; kawaseBlurFilter.blur = value;
} else if (parameterName === 'quality') { } else if (parameterName === 'quality') {
kawaseBlurFilter.quality = value; kawaseBlurFilter.quality = value;
} }
} }
updateStringParameter( updateStringParameter(filter, parameterName, value) {}
filter: PIXI.Filter, updateBooleanParameter(filter, parameterName, value) {}
parameterName: string,
value: string
) {}
updateBooleanParameter(
filter: PIXI.Filter,
parameterName: string,
value: boolean
) {}
})() })()
); );
} }

View File

@@ -24,31 +24,19 @@ namespace gdjs {
gdjs.PixiFiltersTools.registerFilterCreator( gdjs.PixiFiltersTools.registerFilterCreator(
'LightNight', 'LightNight',
new (class extends gdjs.PixiFiltersTools.PixiFilterCreator { new (class extends gdjs.PixiFiltersTools.PixiFilterCreator {
makePIXIFilter(target: EffectsTarget, effectData) { makePIXIFilter(target, effectData) {
const filter = new gdjs.LightNightPixiFilter(); const filter = new gdjs.LightNightPixiFilter();
return filter; return filter;
} }
updatePreRender(filter: PIXI.Filter, target: EffectsTarget) {} updatePreRender(filter, target) {}
updateDoubleParameter( updateDoubleParameter(filter, parameterName, value) {
filter: PIXI.Filter,
parameterName: string,
value: number
) {
if (parameterName !== 'opacity') { if (parameterName !== 'opacity') {
return; return;
} }
filter.uniforms.opacity = gdjs.PixiFiltersTools.clampValue(value, 0, 1); filter.uniforms.opacity = gdjs.PixiFiltersTools.clampValue(value, 0, 1);
} }
updateStringParameter( updateStringParameter(filter, parameterName, value) {}
filter: PIXI.Filter, updateBooleanParameter(filter, parameterName, value) {}
parameterName: string,
value: string
) {}
updateBooleanParameter(
filter: PIXI.Filter,
parameterName: string,
value: boolean
) {}
})() })()
); );
} }

View File

@@ -1,40 +0,0 @@
namespace gdjs {
gdjs.PixiFiltersTools.registerFilterCreator(
'MotionBlur',
new (class extends gdjs.PixiFiltersTools.PixiFilterCreator {
makePIXIFilter(target: EffectsTarget, effectData) {
const motionBlurFilter = new PIXI.filters.MotionBlurFilter([0, 0]);
return motionBlurFilter;
}
updatePreRender(filter: PIXI.Filter, target: EffectsTarget) {}
updateDoubleParameter(
filter: PIXI.Filter,
parameterName: string,
value: number
) {
const motionBlurFilter = filter as PIXI.filters.MotionBlurFilter;
if (parameterName === 'velocityX') {
// @ts-ignore Using the private member avoids to instantiate Arrays.
motionBlurFilter._velocity.x = value;
} else if (parameterName === 'velocityY') {
// @ts-ignore Using the private member avoids to instantiate Arrays.
motionBlurFilter._velocity.y = value;
} else if (parameterName === 'kernelSize') {
motionBlurFilter.kernelSize = value;
} else if (parameterName === 'offset') {
motionBlurFilter.offset = value;
}
}
updateStringParameter(
filter: PIXI.Filter,
parameterName: string,
value: string
) {}
updateBooleanParameter(
filter: PIXI.Filter,
parameterName: string,
value: boolean
) {}
})()
);
}

View File

@@ -28,16 +28,12 @@ namespace gdjs {
gdjs.PixiFiltersTools.registerFilterCreator( gdjs.PixiFiltersTools.registerFilterCreator(
'Night', 'Night',
new (class extends gdjs.PixiFiltersTools.PixiFilterCreator { new (class extends gdjs.PixiFiltersTools.PixiFilterCreator {
makePIXIFilter(target: EffectsTarget, effectData) { makePIXIFilter(target, effectData) {
const filter = new gdjs.NightPixiFilter(); const filter = new gdjs.NightPixiFilter();
return filter; return filter;
} }
updatePreRender(filter: PIXI.Filter, target: EffectsTarget) {} updatePreRender(filter, target) {}
updateDoubleParameter( updateDoubleParameter(filter, parameterName, value) {
filter: PIXI.Filter,
parameterName: string,
value: number
) {
if (parameterName !== 'intensity' && parameterName !== 'opacity') { if (parameterName !== 'intensity' && parameterName !== 'opacity') {
return; return;
} }
@@ -47,16 +43,8 @@ namespace gdjs {
1 1
); );
} }
updateStringParameter( updateStringParameter(filter, parameterName, value) {}
filter: PIXI.Filter, updateBooleanParameter(filter, parameterName, value) {}
parameterName: string,
value: string
) {}
updateBooleanParameter(
filter: PIXI.Filter,
parameterName: string,
value: boolean
) {}
})() })()
); );
} }

View File

@@ -2,32 +2,20 @@ namespace gdjs {
gdjs.PixiFiltersTools.registerFilterCreator( gdjs.PixiFiltersTools.registerFilterCreator(
'Noise', 'Noise',
new (class extends gdjs.PixiFiltersTools.PixiFilterCreator { new (class extends gdjs.PixiFiltersTools.PixiFilterCreator {
makePIXIFilter(target: EffectsTarget, effectData) { makePIXIFilter(target, effectData) {
const noiseFilter = new PIXI.NoiseFilter(); const noiseFilter = new PIXI.NoiseFilter();
return noiseFilter; return noiseFilter;
} }
updatePreRender(filter: PIXI.Filter, target: EffectsTarget) {} updatePreRender(filter, target) {}
updateDoubleParameter( updateDoubleParameter(filter, parameterName, value) {
filter: PIXI.Filter,
parameterName: string,
value: number
) {
const noiseFilter = (filter as unknown) as PIXI.NoiseFilter; const noiseFilter = (filter as unknown) as PIXI.NoiseFilter;
if (parameterName !== 'noise') { if (parameterName !== 'noise') {
return; return;
} }
noiseFilter.noise = gdjs.PixiFiltersTools.clampValue(value, 0, 1); noiseFilter.noise = gdjs.PixiFiltersTools.clampValue(value, 0, 1);
} }
updateStringParameter( updateStringParameter(filter, parameterName, value) {}
filter: PIXI.Filter, updateBooleanParameter(filter, parameterName, value) {}
parameterName: string,
value: string
) {}
updateBooleanParameter(
filter: PIXI.Filter,
parameterName: string,
value: boolean
) {}
})() })()
); );
} }

View File

@@ -9,7 +9,7 @@ namespace gdjs {
oldFilmFilter._animationTimer = 0; oldFilmFilter._animationTimer = 0;
return oldFilmFilter; return oldFilmFilter;
} }
updatePreRender(filter: PIXI.Filter, target: EffectsTarget) { updatePreRender(filter, target) {
if (filter.animationFrequency !== 0) { if (filter.animationFrequency !== 0) {
filter._animationTimer += target.getElapsedTime() / 1000; filter._animationTimer += target.getElapsedTime() / 1000;
if (filter._animationTimer >= 1 / filter.animationFrequency) { if (filter._animationTimer >= 1 / filter.animationFrequency) {
@@ -18,11 +18,7 @@ namespace gdjs {
} }
} }
} }
updateDoubleParameter( updateDoubleParameter(filter, parameterName, value) {
filter: PIXI.Filter,
parameterName: string,
value: number
) {
if (parameterName === 'sepia') { if (parameterName === 'sepia') {
filter.sepia = value; filter.sepia = value;
} else if (parameterName === 'noise') { } else if (parameterName === 'noise') {
@@ -45,16 +41,8 @@ namespace gdjs {
filter.animationFrequency = value; filter.animationFrequency = value;
} }
} }
updateStringParameter( updateStringParameter(filter, parameterName, value) {}
filter: PIXI.Filter, updateBooleanParameter(filter, parameterName, value) {}
parameterName: string,
value: string
) {}
updateBooleanParameter(
filter: PIXI.Filter,
parameterName: string,
value: boolean
) {}
})() })()
); );
} }

View File

@@ -2,16 +2,12 @@ namespace gdjs {
gdjs.PixiFiltersTools.registerFilterCreator( gdjs.PixiFiltersTools.registerFilterCreator(
'Outline', 'Outline',
new (class extends gdjs.PixiFiltersTools.PixiFilterCreator { new (class extends gdjs.PixiFiltersTools.PixiFilterCreator {
makePIXIFilter(target: EffectsTarget, effectData) { makePIXIFilter(target, effectData) {
const outlineFilter = new PIXI.filters.OutlineFilter(); const outlineFilter = new PIXI.filters.OutlineFilter();
return outlineFilter; return outlineFilter;
} }
updatePreRender(filter: PIXI.Filter, target: EffectsTarget) {} updatePreRender(filter, target) {}
updateDoubleParameter( updateDoubleParameter(filter, parameterName, value) {
filter: PIXI.Filter,
parameterName: string,
value: number
) {
const outlineFilter = (filter as unknown) as PIXI.filters.OutlineFilter; const outlineFilter = (filter as unknown) as PIXI.filters.OutlineFilter;
if (parameterName === 'thickness') { if (parameterName === 'thickness') {
outlineFilter.thickness = value; outlineFilter.thickness = value;
@@ -19,11 +15,7 @@ namespace gdjs {
outlineFilter.padding = value; outlineFilter.padding = value;
} }
} }
updateStringParameter( updateStringParameter(filter, parameterName, value) {
filter: PIXI.Filter,
parameterName: string,
value: string
) {
const outlineFilter = (filter as unknown) as PIXI.filters.OutlineFilter; const outlineFilter = (filter as unknown) as PIXI.filters.OutlineFilter;
if (parameterName === 'color') { if (parameterName === 'color') {
outlineFilter.color = gdjs.PixiFiltersTools.rgbOrHexToHexNumber( outlineFilter.color = gdjs.PixiFiltersTools.rgbOrHexToHexNumber(
@@ -31,11 +23,7 @@ namespace gdjs {
); );
} }
} }
updateBooleanParameter( updateBooleanParameter(filter, parameterName, value) {}
filter: PIXI.Filter,
parameterName: string,
value: boolean
) {}
})() })()
); );
} }

Some files were not shown because too many files have changed in this diff Show More