mirror of
https://github.com/4ian/GDevelop.git
synced 2025-10-15 10:19:04 +00:00
Compare commits
3 Commits
lifecycle-
...
improve-er
Author | SHA1 | Date | |
---|---|---|---|
![]() |
2a621f2b92 | ||
![]() |
fdf6a1e41e | ||
![]() |
8e731188f9 |
@@ -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:
|
||||||
|
37
.github/ISSUE_TEMPLATE/--automatic-crash.yml
vendored
37
.github/ISSUE_TEMPLATE/--automatic-crash.yml
vendored
@@ -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.
|
|
11
.github/ISSUE_TEMPLATE/--bug-report.yml
vendored
11
.github/ISSUE_TEMPLATE/--bug-report.yml
vendored
@@ -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.
|
||||||
|
@@ -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
|
||||||
|
@@ -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
|
||||||
|
3
.vscode/settings.json
vendored
3
.vscode/settings.json
vendored
@@ -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,
|
||||||
|
@@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -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
|
||||||
|
@@ -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();
|
||||||
|
@@ -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,
|
||||||
|
@@ -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;
|
||||||
|
@@ -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(
|
||||||
|
@@ -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
|
||||||
|
@@ -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"))
|
||||||
|
@@ -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_"),
|
||||||
|
@@ -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
|
||||||
|
@@ -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
|
||||||
|
@@ -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
|
||||||
|
@@ -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
|
|
@@ -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
|
||||||
|
@@ -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",
|
||||||
|
@@ -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."),
|
||||||
|
@@ -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
|
||||||
*/
|
*/
|
||||||
|
@@ -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
|
||||||
|
@@ -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
|
||||||
|
@@ -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>
|
||||||
|
@@ -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);
|
||||||
|
@@ -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);
|
||||||
|
@@ -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);
|
||||||
|
@@ -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
|
||||||
|
@@ -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++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -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
|
||||||
|
@@ -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
|
||||||
*/
|
*/
|
||||||
|
@@ -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
|
|
@@ -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
|
|
@@ -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;
|
||||||
|
@@ -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
|
|
@@ -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
|
|
@@ -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) {
|
||||||
|
|
||||||
|
@@ -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...)
|
||||||
|
@@ -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);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -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);
|
||||||
};
|
};
|
||||||
|
@@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -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>());
|
||||||
|
@@ -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
|
||||||
|
@@ -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
|
||||||
|
@@ -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),
|
||||||
|
@@ -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"));
|
||||||
|
@@ -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"));
|
||||||
|
|
||||||
|
@@ -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,
|
||||||
|
@@ -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
|
|
@@ -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
|
|
@@ -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
|
||||||
|
@@ -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
|
||||||
|
@@ -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) {
|
||||||
|
@@ -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
|
||||||
|
@@ -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);
|
||||||
}
|
}
|
||||||
|
@@ -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
@@ -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;
|
||||||
|
|
||||||
|
@@ -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';
|
||||||
}
|
}
|
||||||
|
@@ -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];
|
||||||
|
@@ -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;
|
||||||
|
@@ -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();
|
||||||
|
|
||||||
|
@@ -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'),
|
||||||
|
@@ -30,7 +30,6 @@ describe('gdjs.AnchorRuntimeBehavior', function () {
|
|||||||
behaviorsSharedData: [],
|
behaviorsSharedData: [],
|
||||||
objects: [],
|
objects: [],
|
||||||
instances: [],
|
instances: [],
|
||||||
usedResources: [],
|
|
||||||
});
|
});
|
||||||
|
|
||||||
function createObject(behaviorProperties) {
|
function createObject(behaviorProperties) {
|
||||||
|
@@ -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;
|
||||||
|
@@ -130,9 +130,8 @@ namespace gdjs {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
onDestroyed(): void {
|
onDestroyFromScene(instanceContainer: gdjs.RuntimeInstanceContainer): void {
|
||||||
super.onDestroyed();
|
super.onDestroyFromScene(instanceContainer);
|
||||||
this._renderer.destroy();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@@ -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',
|
||||||
|
@@ -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();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -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"))
|
||||||
|
@@ -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")
|
||||||
|
|
||||||
|
@@ -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, {
|
||||||
|
@@ -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'))
|
||||||
|
@@ -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
|
|
||||||
) {}
|
|
||||||
})()
|
})()
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@@ -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
|
|
||||||
) {}
|
|
||||||
})()
|
})()
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@@ -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
|
|
||||||
) {}
|
|
||||||
})()
|
})()
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@@ -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
|
|
||||||
) {}
|
|
||||||
})()
|
})()
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@@ -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
|
|
||||||
) {}
|
|
||||||
})()
|
})()
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@@ -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
|
|
||||||
) {}
|
|
||||||
})()
|
})()
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@@ -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
|
|
||||||
) {}
|
|
||||||
})()
|
})()
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@@ -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
|
|
||||||
) {}
|
|
||||||
})()
|
})()
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@@ -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
|
|
||||||
) {}
|
|
||||||
})()
|
})()
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@@ -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;
|
||||||
|
@@ -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
|
|
||||||
) {}
|
|
||||||
})()
|
})()
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@@ -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;
|
||||||
}
|
}
|
||||||
|
@@ -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
|
|
||||||
) {}
|
|
||||||
})()
|
})()
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@@ -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
|
|
||||||
) {}
|
|
||||||
})()
|
})()
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@@ -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;
|
||||||
|
@@ -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;
|
||||||
}
|
}
|
||||||
|
@@ -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
|
|
||||||
) {}
|
|
||||||
})()
|
})()
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@@ -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;
|
||||||
}
|
}
|
||||||
|
@@ -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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
})()
|
|
||||||
);
|
|
||||||
}
|
|
@@ -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
|
|
||||||
) {}
|
|
||||||
})()
|
})()
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@@ -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
|
|
||||||
) {}
|
|
||||||
})()
|
})()
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@@ -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
|
|
||||||
) {}
|
|
||||||
})()
|
|
||||||
);
|
|
||||||
}
|
|
@@ -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
|
|
||||||
) {}
|
|
||||||
})()
|
})()
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@@ -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
|
|
||||||
) {}
|
|
||||||
})()
|
})()
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@@ -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
|
|
||||||
) {}
|
|
||||||
})()
|
})()
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@@ -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
Reference in New Issue
Block a user