mirror of
https://github.com/4ian/GDevelop.git
synced 2025-10-15 10:19:04 +00:00
Compare commits
29 Commits
hot-reload
...
object-sle
Author | SHA1 | Date | |
---|---|---|---|
![]() |
327165482a | ||
![]() |
92d7ddf5f7 | ||
![]() |
d153378351 | ||
![]() |
5274f68432 | ||
![]() |
329d899b47 | ||
![]() |
72603a4c0e | ||
![]() |
38e187b110 | ||
![]() |
633071560d | ||
![]() |
66f12b848c | ||
![]() |
9d1233bb09 | ||
![]() |
daa1f305ee | ||
![]() |
0755493f94 | ||
![]() |
8c7331fc44 | ||
![]() |
0f8fcacf98 | ||
![]() |
23a39f1e2c | ||
![]() |
b7787d29f1 | ||
![]() |
ad0f1f163f | ||
![]() |
e34aedb15c | ||
![]() |
27f16a3db0 | ||
![]() |
6e6ddb9edd | ||
![]() |
fbf4baebe9 | ||
![]() |
2cdfc889a8 | ||
![]() |
7f7a13dee8 | ||
![]() |
e45ba9465d | ||
![]() |
cbae925680 | ||
![]() |
852fdd77dd | ||
![]() |
8afea382d4 | ||
![]() |
c3c0c1961b | ||
![]() |
40c5012a0e |
@@ -103,6 +103,11 @@ void EventsCodeGenerationContext::EmptyObjectsListNeeded(
|
||||
depthOfLastUse[objectName] = GetContextDepth();
|
||||
}
|
||||
|
||||
void EventsCodeGenerationContext::AddUsedObjectsMapNames(
|
||||
const gd::String& objectMapName) {
|
||||
usedObjectsMapNames.insert(objectMapName);
|
||||
}
|
||||
|
||||
std::set<gd::String> EventsCodeGenerationContext::GetAllObjectsToBeDeclared()
|
||||
const {
|
||||
std::set<gd::String> allObjectListsToBeDeclared(
|
||||
|
@@ -175,6 +175,12 @@ class GD_CORE_API EventsCodeGenerationContext {
|
||||
return emptyObjectsListsToBeDeclared;
|
||||
};
|
||||
|
||||
const std::set<gd::String>& GetUsedObjectsMapNames() const {
|
||||
return usedObjectsMapNames;
|
||||
};
|
||||
|
||||
void AddUsedObjectsMapNames(const gd::String& objectMapName);
|
||||
|
||||
/**
|
||||
* Return the objects lists which are already declared and can be used in the
|
||||
* current context without declaration.
|
||||
@@ -297,6 +303,8 @@ class GD_CORE_API EventsCodeGenerationContext {
|
||||
///< necessary objects can be
|
||||
///< backed up.
|
||||
|
||||
std::set<gd::String> usedObjectsMapNames;
|
||||
|
||||
std::map<gd::String, unsigned int>
|
||||
depthOfLastUse; ///< The context depth when an object was last used.
|
||||
gd::String
|
||||
|
@@ -408,6 +408,25 @@ gd::String EventsCodeGenerator::GenerateConditionCode(
|
||||
arguments, instrInfos, returnBoolean, condition.IsInverted(), context);
|
||||
}
|
||||
|
||||
// Flag the ObjectsLists as modified.
|
||||
gd::ParameterMetadataTools::IterateOverParameters(
|
||||
condition.GetParameters(), instrInfos.parameters,
|
||||
[this, &context,
|
||||
&conditionCode](const gd::ParameterMetadata ¶meterMetadata,
|
||||
const gd::Expression ¶meterValue,
|
||||
const gd::String &lastObjectName) {
|
||||
// objectListOrEmptyWithoutPicking are only used by SceneInstancesCount
|
||||
// and PickedInstancesCount conditions. They are not pass for one
|
||||
// condition to another.
|
||||
if (parameterMetadata.GetType() == "objectList" ||
|
||||
parameterMetadata.GetType() == "objectListOrEmptyIfJustDeclared") {
|
||||
// TODO FIXME What about groups using the object?
|
||||
conditionCode +=
|
||||
GetObjectMapName(parameterValue.GetPlainString(), context) +
|
||||
".isPicked = true;\n";
|
||||
}
|
||||
});
|
||||
|
||||
return conditionCode;
|
||||
}
|
||||
|
||||
|
@@ -585,6 +585,12 @@ class GD_CORE_API EventsCodeGenerator {
|
||||
return "fakeObjectListOf_" + objectName;
|
||||
}
|
||||
|
||||
// TODO Documentation
|
||||
virtual gd::String GetObjectMapName(const gd::String &objectName,
|
||||
gd::EventsCodeGenerationContext &context) {
|
||||
return "fakeObjectListOf_" + objectName;
|
||||
}
|
||||
|
||||
virtual gd::String GeneratePropertyGetter(
|
||||
const gd::PropertiesContainer& propertiesContainer,
|
||||
const gd::NamedPropertyDescriptor& property,
|
||||
|
@@ -277,11 +277,8 @@ class GD_CORE_API ExpressionParser2 {
|
||||
|
||||
std::unique_ptr<VariableNode> Variable(const gd::String &name, gd::ExpressionParserLocation nameLocation) {
|
||||
auto variable = gd::make_unique<VariableNode>(name);
|
||||
|
||||
if (CheckIfChar(IsOpeningSquareBracket) || CheckIfChar(IsDot)) {
|
||||
variable->child = VariableAccessorOrVariableBracketAccessor();
|
||||
variable->child->parent = variable.get();
|
||||
}
|
||||
variable->child = VariableAccessorOrVariableBracketAccessor();
|
||||
variable->child->parent = variable.get();
|
||||
|
||||
variable->location = ExpressionParserLocation(
|
||||
nameLocation.GetStartPosition(), GetCurrentPosition());
|
||||
@@ -305,12 +302,8 @@ class GD_CORE_API ExpressionParser2 {
|
||||
"bracket for each opening bracket."));
|
||||
}
|
||||
SkipIfChar(IsClosingSquareBracket);
|
||||
|
||||
SkipAllWhitespaces();
|
||||
if (CheckIfChar(IsOpeningSquareBracket) || CheckIfChar(IsDot)) {
|
||||
child->child = VariableAccessorOrVariableBracketAccessor();
|
||||
child->child->parent = child.get();
|
||||
}
|
||||
child->child = VariableAccessorOrVariableBracketAccessor();
|
||||
child->child->parent = child.get();
|
||||
child->location =
|
||||
ExpressionParserLocation(childStartPosition, GetCurrentPosition());
|
||||
|
||||
@@ -322,15 +315,8 @@ class GD_CORE_API ExpressionParser2 {
|
||||
auto identifierAndLocation = ReadIdentifierName(/*allowDeprecatedSpacesInName=*/ false);
|
||||
auto child =
|
||||
gd::make_unique<VariableAccessorNode>(identifierAndLocation.name);
|
||||
if (identifierAndLocation.name.empty()) {
|
||||
child->diagnostic = RaiseSyntaxError(_("A name should be entered after the dot."));
|
||||
}
|
||||
|
||||
SkipAllWhitespaces();
|
||||
if (CheckIfChar(IsOpeningSquareBracket) || CheckIfChar(IsDot)) {
|
||||
child->child = VariableAccessorOrVariableBracketAccessor();
|
||||
child->child->parent = child.get();
|
||||
}
|
||||
child->child = VariableAccessorOrVariableBracketAccessor();
|
||||
child->child->parent = child.get();
|
||||
child->nameLocation = identifierAndLocation.location;
|
||||
child->dotLocation = dotLocation;
|
||||
child->location =
|
||||
@@ -339,11 +325,7 @@ class GD_CORE_API ExpressionParser2 {
|
||||
return std::move(child);
|
||||
}
|
||||
|
||||
// Should never happen, unless a node called this function without checking if the current character
|
||||
// was a dot or an opening bracket - this means there is an error in the grammar.
|
||||
auto unrecognisedNode = gd::make_unique<VariableAccessorOrVariableBracketAccessorNode>();
|
||||
unrecognisedNode->diagnostic = RaiseSyntaxError(_("A dot or bracket was expected here."));
|
||||
return std::move(unrecognisedNode);
|
||||
return std::move(gd::make_unique<VariableAccessorOrVariableBracketAccessorNode>());
|
||||
}
|
||||
|
||||
std::unique_ptr<FunctionCallNode> FreeFunction(
|
||||
@@ -379,24 +361,18 @@ class GD_CORE_API ExpressionParser2 {
|
||||
const auto &childIdentifierNameLocation =
|
||||
childIdentifierAndLocation.location;
|
||||
|
||||
std::unique_ptr<gd::ExpressionParserError> emptyNameError = childIdentifierName.empty() ?
|
||||
RaiseSyntaxError(_("A name should be entered after the dot.")) : nullptr;
|
||||
|
||||
SkipAllWhitespaces();
|
||||
|
||||
if (IsNamespaceSeparator()) {
|
||||
ExpressionParserLocation namespaceSeparatorLocation =
|
||||
SkipNamespaceSeparator();
|
||||
SkipAllWhitespaces();
|
||||
auto behaviorFunction = BehaviorFunction(parentIdentifier,
|
||||
return BehaviorFunction(parentIdentifier,
|
||||
childIdentifierName,
|
||||
parentIdentifierLocation,
|
||||
parentIdentifierDotLocation,
|
||||
childIdentifierNameLocation,
|
||||
namespaceSeparatorLocation);
|
||||
|
||||
if (emptyNameError) behaviorFunction->diagnostic = std::move(emptyNameError);
|
||||
return std::move(behaviorFunction);
|
||||
} else if (CheckIfChar(IsOpeningParenthesis)) {
|
||||
ExpressionParserLocation openingParenthesisLocation = SkipChar();
|
||||
|
||||
@@ -405,7 +381,7 @@ class GD_CORE_API ExpressionParser2 {
|
||||
childIdentifierName);
|
||||
auto parametersNode = Parameters(function.get(), parentIdentifier);
|
||||
function->parameters = std::move(parametersNode.parameters),
|
||||
function->diagnostic = emptyNameError ? std::move(emptyNameError) : std::move(parametersNode.diagnostic);
|
||||
function->diagnostic = std::move(parametersNode.diagnostic);
|
||||
|
||||
function->location = ExpressionParserLocation(
|
||||
parentIdentifierLocation.GetStartPosition(), GetCurrentPosition());
|
||||
@@ -418,8 +394,6 @@ class GD_CORE_API ExpressionParser2 {
|
||||
return std::move(function);
|
||||
} else if (CheckIfChar(IsDot) || CheckIfChar(IsOpeningSquareBracket)) {
|
||||
auto variable = gd::make_unique<VariableNode>(parentIdentifier);
|
||||
variable->diagnostic = std::move(emptyNameError);
|
||||
|
||||
auto child =
|
||||
gd::make_unique<VariableAccessorNode>(childIdentifierName);
|
||||
child->child = VariableAccessorOrVariableBracketAccessor();
|
||||
@@ -445,7 +419,6 @@ class GD_CORE_API ExpressionParser2 {
|
||||
node->identifierNameLocation = parentIdentifierLocation;
|
||||
node->identifierNameDotLocation = parentIdentifierDotLocation;
|
||||
node->childIdentifierNameLocation = childIdentifierNameLocation;
|
||||
node->diagnostic = std::move(emptyNameError);
|
||||
return std::move(node);
|
||||
}
|
||||
|
||||
|
@@ -8,7 +8,6 @@
|
||||
|
||||
#include <memory>
|
||||
#include <vector>
|
||||
|
||||
#include "GDCore/Events/Parsers/ExpressionParser2Node.h"
|
||||
#include "GDCore/Events/Parsers/ExpressionParser2NodeWorker.h"
|
||||
namespace gd {
|
||||
@@ -44,11 +43,6 @@ class GD_CORE_API ExpressionParser2NodePrinter
|
||||
*/
|
||||
const gd::String& GetOutput() { return output; };
|
||||
|
||||
static gd::String PrintStringLiteral(const gd::String& str) {
|
||||
return "\"" +
|
||||
str.FindAndReplace("\\", "\\\\").FindAndReplace("\"", "\\\"") + "\"";
|
||||
}
|
||||
|
||||
protected:
|
||||
void OnVisitSubExpressionNode(SubExpressionNode& node) override {
|
||||
output += "(";
|
||||
@@ -75,7 +69,10 @@ class GD_CORE_API ExpressionParser2NodePrinter
|
||||
}
|
||||
void OnVisitNumberNode(NumberNode& node) override { output += node.number; }
|
||||
void OnVisitTextNode(TextNode& node) override {
|
||||
output += PrintStringLiteral(node.text);
|
||||
output +=
|
||||
"\"" +
|
||||
node.text.FindAndReplace("\\", "\\\\").FindAndReplace("\"", "\\\"") +
|
||||
"\"";
|
||||
}
|
||||
void OnVisitVariableNode(VariableNode& node) override {
|
||||
output += node.name;
|
||||
@@ -100,8 +97,8 @@ class GD_CORE_API ExpressionParser2NodePrinter
|
||||
}
|
||||
void OnVisitObjectFunctionNameNode(ObjectFunctionNameNode& node) override {
|
||||
if (!node.behaviorFunctionName.empty()) {
|
||||
output += node.objectName + "." + node.objectFunctionOrBehaviorName +
|
||||
"::" + node.behaviorFunctionName;
|
||||
output +=
|
||||
node.objectName + "." + node.objectFunctionOrBehaviorName + "::" + node.behaviorFunctionName;
|
||||
} else {
|
||||
output += node.objectName + "." + node.objectFunctionOrBehaviorName;
|
||||
}
|
||||
|
@@ -1475,10 +1475,11 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
|
||||
_("Position"),
|
||||
"res/conditions/distance24.png",
|
||||
"res/conditions/distance.png")
|
||||
.AddParameter("objectList", _("Object"))
|
||||
.AddParameter("objectList", _("Object 2"))
|
||||
.AddParameter("objectListOrEmptyIfJustDeclared", _("Object"))
|
||||
.AddParameter("objectListOrEmptyIfJustDeclared", _("Object 2"))
|
||||
.AddParameter("expression", _("Distance"))
|
||||
.AddCodeOnlyParameter("conditionInverted", "")
|
||||
.AddCodeOnlyParameter("objectsContext", "")
|
||||
.MarkAsSimple();
|
||||
|
||||
extension
|
||||
@@ -1585,10 +1586,10 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
|
||||
_("Collision"),
|
||||
"res/conditions/collision24.png",
|
||||
"res/conditions/collision.png")
|
||||
.AddParameter("objectList", _("Object"))
|
||||
.AddParameter("objectList", _("Object"))
|
||||
.AddParameter("objectListOrEmptyIfJustDeclared", _("Object"))
|
||||
.AddParameter("objectListOrEmptyIfJustDeclared", _("Object"))
|
||||
.AddCodeOnlyParameter("conditionInverted", "")
|
||||
.AddCodeOnlyParameter("currentScene", "")
|
||||
.AddCodeOnlyParameter("objectsContext", "")
|
||||
.AddParameter("yesorno",
|
||||
_("Ignore objects that are touching each other on their "
|
||||
"edges, but are not overlapping (default: no)"),
|
||||
|
@@ -171,8 +171,8 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsSceneExtension(
|
||||
_("Preload a scene resources as soon as possible in background."),
|
||||
_("Preload scene _PARAM1_ in background"),
|
||||
"",
|
||||
"res/actions/hourglass_black.svg",
|
||||
"res/actions/hourglass_black.svg")
|
||||
"res/actions/replaceScene24.png",
|
||||
"res/actions/replaceScene.png")
|
||||
.SetHelpPath("/all-features/resources-loading")
|
||||
.AddCodeOnlyParameter("currentScene", "")
|
||||
.AddParameter("sceneName", _("Name of the new scene"))
|
||||
@@ -184,7 +184,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsSceneExtension(
|
||||
_("The progress of resources loading in background for a scene (between 0 and 1)."),
|
||||
_("_PARAM0_ loading progress"),
|
||||
_(""),
|
||||
"res/actions/hourglass_black.svg")
|
||||
"res/actions/replaceScene24.png")
|
||||
.SetHelpPath("/all-features/resources-loading")
|
||||
.AddCodeOnlyParameter("currentScene", "")
|
||||
.AddParameter("sceneName", _("Scene name"))
|
||||
@@ -197,8 +197,8 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsSceneExtension(
|
||||
_("Check if scene resources have finished to load in background."),
|
||||
_("Scene _PARAM1_ was preloaded in background"),
|
||||
"",
|
||||
"res/actions/hourglass_black.svg",
|
||||
"res/actions/hourglass_black.svg")
|
||||
"res/actions/replaceScene24.png",
|
||||
"res/actions/replaceScene.png")
|
||||
.SetHelpPath("/all-features/resources-loading")
|
||||
.AddCodeOnlyParameter("currentScene", "")
|
||||
.AddParameter("sceneName", _("Scene name"))
|
||||
|
@@ -5,7 +5,6 @@
|
||||
*/
|
||||
#include "ExpressionMetadata.h"
|
||||
#include "GDCore/CommonTools.h"
|
||||
#include "GDCore/Extensions/PlatformExtension.h"
|
||||
#include "GDCore/String.h"
|
||||
|
||||
namespace gd {
|
||||
@@ -47,14 +46,16 @@ gd::ExpressionMetadata& ExpressionMetadata::AddParameter(
|
||||
// For objects/behavior, the supplementary information
|
||||
// parameter is an object/behavior type...
|
||||
((gd::ParameterMetadata::IsObject(type) ||
|
||||
gd::ParameterMetadata::IsBehavior(type))
|
||||
// Prefix with the namespace if it's not already there.
|
||||
&& (supplementaryInformation.find(
|
||||
PlatformExtension::GetNamespaceSeparator()) != gd::String::npos)
|
||||
? supplementaryInformation
|
||||
: (supplementaryInformation.empty()
|
||||
? ""
|
||||
: extensionNamespace + supplementaryInformation)));
|
||||
gd::ParameterMetadata::IsBehavior(type))
|
||||
// Prefix with the namespace if it's not already there.
|
||||
&& !(supplementaryInformation.rfind(extensionNamespace, 0) == 0))
|
||||
? (supplementaryInformation.empty()
|
||||
? ""
|
||||
: extensionNamespace +
|
||||
supplementaryInformation //... so prefix it with the extension
|
||||
// namespace.
|
||||
)
|
||||
: supplementaryInformation); // Otherwise don't change anything
|
||||
|
||||
// TODO: Assert against supplementaryInformation === "emsc" (when running with
|
||||
// Emscripten), and warn about a missing argument when calling addParameter.
|
||||
|
@@ -8,7 +8,6 @@
|
||||
#include <algorithm>
|
||||
|
||||
#include "GDCore/CommonTools.h"
|
||||
#include "GDCore/Extensions/PlatformExtension.h"
|
||||
#include "GDCore/Serialization/SerializerElement.h"
|
||||
#include "GDCore/Tools/Localization.h"
|
||||
#include "GDCore/Tools/Log.h"
|
||||
@@ -65,14 +64,17 @@ InstructionMetadata& InstructionMetadata::AddParameter(
|
||||
// For objects/behavior, the supplementary information
|
||||
// parameter is an object/behavior type...
|
||||
((gd::ParameterMetadata::IsObject(type) ||
|
||||
gd::ParameterMetadata::IsBehavior(type))
|
||||
// Prefix with the namespace if it's not already there.
|
||||
&& (supplementaryInformation.find(
|
||||
PlatformExtension::GetNamespaceSeparator()) != gd::String::npos)
|
||||
? supplementaryInformation
|
||||
: (supplementaryInformation.empty()
|
||||
? ""
|
||||
: extensionNamespace + supplementaryInformation)));
|
||||
gd::ParameterMetadata::IsBehavior(type))
|
||||
// Prefix with the namespace if it's not already there.
|
||||
&& !(supplementaryInformation.rfind(extensionNamespace, 0) == 0))
|
||||
? (supplementaryInformation.empty()
|
||||
? ""
|
||||
: extensionNamespace +
|
||||
supplementaryInformation //... so prefix it with the
|
||||
// extension
|
||||
// namespace.
|
||||
)
|
||||
: supplementaryInformation); // Otherwise don't change anything
|
||||
|
||||
// TODO: Assert against supplementaryInformation === "emsc" (when running with
|
||||
// Emscripten), and warn about a missing argument when calling addParameter.
|
||||
@@ -188,7 +190,7 @@ InstructionMetadata::UseStandardRelationalOperatorParameters(
|
||||
gd::String templateSentence = _("<subject> of _PARAM0_ <operator> <value>");
|
||||
|
||||
sentence =
|
||||
templateSentence.FindAndReplace("<subject>", sentence.CapitalizeFirstLetter())
|
||||
templateSentence.FindAndReplace("<subject>", sentence)
|
||||
.FindAndReplace(
|
||||
"<operator>",
|
||||
"_PARAM" + gd::String::From(operatorParamIndex) + "_")
|
||||
@@ -198,7 +200,7 @@ InstructionMetadata::UseStandardRelationalOperatorParameters(
|
||||
gd::String templateSentence = _("<subject> <operator> <value>");
|
||||
|
||||
sentence =
|
||||
templateSentence.FindAndReplace("<subject>", sentence.CapitalizeFirstLetter())
|
||||
templateSentence.FindAndReplace("<subject>", sentence)
|
||||
.FindAndReplace(
|
||||
"<operator>",
|
||||
"_PARAM" + gd::String::From(operatorParamIndex) + "_")
|
||||
|
@@ -264,11 +264,8 @@ class GD_CORE_API PlatformExtension {
|
||||
*
|
||||
* \param name The name of the behavior
|
||||
* \param fullname The user friendly name of the behavior
|
||||
* \param defaultName The default name of behavior instances
|
||||
* \param description The user friendly description of the behavior
|
||||
* \param group The behavior category label
|
||||
* \param icon The icon of the behavior.
|
||||
* \param className The name of the class implementing the behavior
|
||||
* \param instance An instance of the behavior that
|
||||
* will be used to create the behavior
|
||||
* \param sharedDatasInstance Optional
|
||||
@@ -291,7 +288,6 @@ class GD_CORE_API PlatformExtension {
|
||||
* \param name The name of the behavior
|
||||
* \param fullname The user friendly name of the behavior
|
||||
* \param description The user friendly description of the behavior
|
||||
* \param group The behavior category label
|
||||
* \param icon The icon of the behavior.
|
||||
*/
|
||||
gd::BehaviorMetadata& AddEventsBasedBehavior(
|
||||
|
@@ -136,7 +136,7 @@ class GD_CORE_API ExpressionVariableReplacer
|
||||
auto& objectsContainersList =
|
||||
projectScopedContainers.GetObjectsContainersList();
|
||||
if (!objectNameToUseForVariableAccessor.empty()) {
|
||||
if (objectsContainersList.HasObjectOrGroupVariablesContainer(
|
||||
if (objectsContainersList.HasVariablesContainer(
|
||||
objectNameToUseForVariableAccessor, targetVariablesContainer)) {
|
||||
// The node represents an object variable, and this object variables are
|
||||
// the target. Do the replacement or removals:
|
||||
@@ -177,7 +177,7 @@ class GD_CORE_API ExpressionVariableReplacer
|
||||
GetPotentialNewName(node.identifierName),
|
||||
[&]() {
|
||||
// This represents an object.
|
||||
if (objectsContainersList.HasObjectOrGroupVariablesContainer(
|
||||
if (objectsContainersList.HasVariablesContainer(
|
||||
node.identifierName, targetVariablesContainer)) {
|
||||
// The node represents an object variable, and this object variables
|
||||
// are the target. Do the replacement or removals:
|
||||
|
@@ -11,16 +11,13 @@
|
||||
|
||||
#include "GDCore/Events/Parsers/ExpressionParser2.h"
|
||||
#include "GDCore/Events/Parsers/ExpressionParser2Node.h"
|
||||
#include "GDCore/Events/Parsers/ExpressionParser2NodePrinter.h"
|
||||
#include "GDCore/Events/Parsers/ExpressionParser2NodeWorker.h"
|
||||
#include "GDCore/Events/Parsers/GrammarTerminals.h"
|
||||
#include "GDCore/Extensions/Metadata/ExpressionMetadata.h"
|
||||
#include "GDCore/Extensions/Metadata/InstructionMetadata.h"
|
||||
#include "GDCore/Extensions/Metadata/ValueTypeMetadata.h"
|
||||
#include "GDCore/IDE/Events/ExpressionNodeLocationFinder.h"
|
||||
#include "GDCore/IDE/Events/ExpressionTypeFinder.h"
|
||||
#include "GDCore/IDE/Events/ExpressionVariableOwnerFinder.h"
|
||||
#include "GDCore/IDE/Events/ExpressionVariableParentFinder.h"
|
||||
#include "GDCore/Project/ProjectScopedContainers.h"
|
||||
#include "GDCore/Project/Variable.h"
|
||||
|
||||
@@ -489,56 +486,47 @@ class GD_CORE_API ExpressionCompletionFinder
|
||||
auto type = gd::ExpressionTypeFinder::GetType(
|
||||
platform, projectScopedContainers, rootType, node);
|
||||
|
||||
// Only attempt to complete with the children of the variable
|
||||
// if it's the last child (no more `.AnotherVariable` written after).
|
||||
bool eagerlyCompleteIfExactMatch = node.child == nullptr;
|
||||
|
||||
if (gd::ValueTypeMetadata::IsTypeLegacyPreScopedVariable(type)) {
|
||||
if (type == "globalvar" || type == "scenevar") {
|
||||
if (type == "globalvar") {
|
||||
const auto* variablesContainer =
|
||||
type == "globalvar"
|
||||
? projectScopedContainers.GetVariablesContainersList()
|
||||
.GetTopMostVariablesContainer()
|
||||
: projectScopedContainers.GetVariablesContainersList()
|
||||
.GetBottomMostVariablesContainer();
|
||||
projectScopedContainers.GetVariablesContainersList()
|
||||
.GetTopMostVariablesContainer();
|
||||
if (variablesContainer) {
|
||||
AddCompletionsForVariablesMatchingSearch(*variablesContainer,
|
||||
node.name,
|
||||
node.nameLocation,
|
||||
eagerlyCompleteIfExactMatch);
|
||||
AddCompletionsForVariablesMatchingSearch(
|
||||
*variablesContainer, node.name, node.nameLocation);
|
||||
}
|
||||
} else if (type == "scenevar") {
|
||||
const auto* variablesContainer =
|
||||
projectScopedContainers.GetVariablesContainersList()
|
||||
.GetBottomMostVariablesContainer();
|
||||
if (variablesContainer) {
|
||||
AddCompletionsForVariablesMatchingSearch(
|
||||
*variablesContainer, node.name, node.nameLocation);
|
||||
}
|
||||
} else if (type == "objectvar") {
|
||||
auto objectName = gd::ExpressionVariableOwnerFinder::GetObjectName(
|
||||
platform, objectsContainersList, rootObjectName, node);
|
||||
platform,
|
||||
objectsContainersList,
|
||||
// Variable fields doesn't use expression completion,
|
||||
// so the object will be found inside the expression itself.
|
||||
"",
|
||||
node);
|
||||
|
||||
AddCompletionsForObjectOrGroupVariablesMatchingSearch(
|
||||
objectsContainersList,
|
||||
objectName,
|
||||
node.name,
|
||||
node.nameLocation,
|
||||
eagerlyCompleteIfExactMatch);
|
||||
objectsContainersList, objectName, node.name, node.nameLocation);
|
||||
}
|
||||
} else {
|
||||
AddCompletionsForObjectsAndVariablesMatchingSearch(
|
||||
node.name, type, node.nameLocation, eagerlyCompleteIfExactMatch);
|
||||
node.name, type, node.nameLocation);
|
||||
}
|
||||
}
|
||||
void OnVisitVariableAccessorNode(VariableAccessorNode& node) override {
|
||||
VariableAndItsParent variableAndItsParent =
|
||||
gd::ExpressionVariableParentFinder::GetLastParentOfNode(
|
||||
platform, projectScopedContainers, node);
|
||||
|
||||
// If no child, we're at the end of a variable (like `GrandChild` in
|
||||
// `Something.Child.GrandChild`) so we can complete eagerly children if we
|
||||
// can.
|
||||
gd::String eagerlyCompleteForVariableName =
|
||||
node.child == nullptr ? node.name : "";
|
||||
AddCompletionsForChildrenVariablesOf(variableAndItsParent,
|
||||
node.nameLocation,
|
||||
eagerlyCompleteForVariableName);
|
||||
// No completions
|
||||
}
|
||||
void OnVisitVariableBracketAccessorNode(
|
||||
VariableBracketAccessorNode& node) override {}
|
||||
VariableBracketAccessorNode& node) override {
|
||||
// No completions
|
||||
}
|
||||
void OnVisitIdentifierNode(IdentifierNode& node) override {
|
||||
const auto& objectsContainersList =
|
||||
projectScopedContainers.GetObjectsContainersList();
|
||||
@@ -549,81 +537,45 @@ class GD_CORE_API ExpressionCompletionFinder
|
||||
AddCompletionsForObjectMatchingSearch(
|
||||
node.identifierName, type, node.location);
|
||||
} else if (gd::ValueTypeMetadata::IsTypeLegacyPreScopedVariable(type)) {
|
||||
if (type == "globalvar" || type == "scenevar") {
|
||||
if (type == "globalvar") {
|
||||
const auto* variablesContainer =
|
||||
type == "globalvar"
|
||||
? projectScopedContainers.GetVariablesContainersList()
|
||||
.GetTopMostVariablesContainer()
|
||||
: projectScopedContainers.GetVariablesContainersList()
|
||||
.GetBottomMostVariablesContainer();
|
||||
projectScopedContainers.GetVariablesContainersList()
|
||||
.GetTopMostVariablesContainer();
|
||||
if (variablesContainer) {
|
||||
if (IsCaretOn(node.identifierNameDotLocation) ||
|
||||
IsCaretOn(node.childIdentifierNameLocation)) {
|
||||
// Complete a potential child variable:
|
||||
if (variablesContainer->Has(node.identifierName)) {
|
||||
AddCompletionsForChildrenVariablesOf(
|
||||
&variablesContainer->Get(node.identifierName),
|
||||
node.childIdentifierNameLocation,
|
||||
node.childIdentifierName);
|
||||
}
|
||||
} else {
|
||||
// Complete a root variable of the scene or project.
|
||||
|
||||
// Don't attempt to complete children variables if there is
|
||||
// already a dot written (`MyVariable.`).
|
||||
bool eagerlyCompleteIfPossible =
|
||||
!node.identifierNameDotLocation.IsValid();
|
||||
AddCompletionsForVariablesMatchingSearch(
|
||||
*variablesContainer,
|
||||
node.identifierName,
|
||||
node.identifierNameLocation,
|
||||
eagerlyCompleteIfPossible);
|
||||
}
|
||||
AddCompletionsForVariablesMatchingSearch(*variablesContainer,
|
||||
node.identifierName,
|
||||
node.identifierNameLocation);
|
||||
}
|
||||
} else if (type == "scenevar") {
|
||||
const auto* variablesContainer =
|
||||
projectScopedContainers.GetVariablesContainersList()
|
||||
.GetBottomMostVariablesContainer();
|
||||
if (variablesContainer) {
|
||||
AddCompletionsForVariablesMatchingSearch(*variablesContainer,
|
||||
node.identifierName,
|
||||
node.identifierNameLocation);
|
||||
}
|
||||
} else if (type == "objectvar") {
|
||||
auto objectName = gd::ExpressionVariableOwnerFinder::GetObjectName(
|
||||
platform, objectsContainersList, rootObjectName, node);
|
||||
platform,
|
||||
objectsContainersList,
|
||||
// Variable fields doesn't use expression completion,
|
||||
// so the object will be found inside the expression itself.
|
||||
"",
|
||||
node);
|
||||
|
||||
if (IsCaretOn(node.identifierNameDotLocation) ||
|
||||
IsCaretOn(node.childIdentifierNameLocation)) {
|
||||
// Complete a potential child variable:
|
||||
const auto* variablesContainer =
|
||||
objectsContainersList.GetObjectOrGroupVariablesContainer(
|
||||
objectName);
|
||||
if (variablesContainer &&
|
||||
variablesContainer->Has(node.identifierName)) {
|
||||
AddCompletionsForChildrenVariablesOf(
|
||||
&variablesContainer->Get(node.identifierName),
|
||||
node.childIdentifierNameLocation,
|
||||
node.childIdentifierName);
|
||||
}
|
||||
} else {
|
||||
// Complete a root variable of the object.
|
||||
|
||||
// Don't attempt to complete children variables if there is
|
||||
// already a dot written (`MyVariable.`).
|
||||
bool eagerlyCompleteIfPossible =
|
||||
!node.identifierNameDotLocation.IsValid();
|
||||
AddCompletionsForObjectOrGroupVariablesMatchingSearch(
|
||||
objectsContainersList,
|
||||
objectName,
|
||||
node.identifierName,
|
||||
node.identifierNameLocation,
|
||||
eagerlyCompleteIfPossible);
|
||||
}
|
||||
AddCompletionsForObjectOrGroupVariablesMatchingSearch(
|
||||
objectsContainersList,
|
||||
objectName,
|
||||
node.identifierName,
|
||||
node.identifierNameLocation);
|
||||
}
|
||||
} else {
|
||||
// Object function, behavior name, variable, object variable.
|
||||
if (IsCaretOn(node.identifierNameLocation)) {
|
||||
// Don't attempt to complete children variables if there is
|
||||
// already a dot written (`MyVariable.`).
|
||||
bool eagerlyCompleteIfPossible =
|
||||
!node.identifierNameDotLocation.IsValid();
|
||||
// Is this the proper position?
|
||||
AddCompletionsForAllIdentifiersMatchingSearch(
|
||||
node.identifierName,
|
||||
type,
|
||||
node.identifierNameLocation,
|
||||
eagerlyCompleteIfPossible);
|
||||
node.identifierName, type, node.identifierNameLocation);
|
||||
if (!node.identifierNameDotLocation.IsValid()) {
|
||||
completions.push_back(
|
||||
ExpressionCompletionDescription::ForExpressionWithPrefix(
|
||||
@@ -634,57 +586,27 @@ class GD_CORE_API ExpressionCompletionFinder
|
||||
}
|
||||
} else if (IsCaretOn(node.identifierNameDotLocation) ||
|
||||
IsCaretOn(node.childIdentifierNameLocation)) {
|
||||
// Might be:
|
||||
// - An object variable, object behavior or object expression.
|
||||
// - Or a variable with a child.
|
||||
projectScopedContainers.MatchIdentifierWithName<void>(
|
||||
node.identifierName,
|
||||
[&]() {
|
||||
// This is an object.
|
||||
const gd::String& objectName = node.identifierName;
|
||||
AddCompletionsForObjectOrGroupVariablesMatchingSearch(
|
||||
objectsContainersList,
|
||||
objectName,
|
||||
node.childIdentifierName,
|
||||
node.childIdentifierNameLocation,
|
||||
true);
|
||||
const gd::String& objectName = node.identifierName;
|
||||
|
||||
completions.push_back(
|
||||
ExpressionCompletionDescription::ForBehaviorWithPrefix(
|
||||
node.childIdentifierName,
|
||||
node.childIdentifierNameLocation.GetStartPosition(),
|
||||
node.childIdentifierNameLocation.GetEndPosition(),
|
||||
objectName));
|
||||
completions.push_back(
|
||||
ExpressionCompletionDescription::ForExpressionWithPrefix(
|
||||
type,
|
||||
node.childIdentifierName,
|
||||
node.childIdentifierNameLocation.GetStartPosition(),
|
||||
node.childIdentifierNameLocation.GetEndPosition(),
|
||||
objectName));
|
||||
},
|
||||
[&]() {
|
||||
// This is a variable.
|
||||
VariableAndItsParent variableAndItsParent =
|
||||
gd::ExpressionVariableParentFinder::GetLastParentOfNode(
|
||||
platform, projectScopedContainers, node);
|
||||
|
||||
AddCompletionsForChildrenVariablesOf(
|
||||
variableAndItsParent,
|
||||
node.childIdentifierNameLocation,
|
||||
node.childIdentifierName);
|
||||
},
|
||||
[&]() {
|
||||
// Ignore properties here.
|
||||
// There is no support for "children" of properties.
|
||||
},
|
||||
[&]() {
|
||||
// Ignore parameters here.
|
||||
// There is no support for "children" of parameters.
|
||||
},
|
||||
[&]() {
|
||||
// Ignore unrecognised identifiers here.
|
||||
});
|
||||
// Might be an object variable, object behavior or object expression:
|
||||
AddCompletionsForObjectOrGroupVariablesMatchingSearch(
|
||||
objectsContainersList,
|
||||
objectName,
|
||||
node.childIdentifierName,
|
||||
node.childIdentifierNameLocation);
|
||||
completions.push_back(
|
||||
ExpressionCompletionDescription::ForBehaviorWithPrefix(
|
||||
node.childIdentifierName,
|
||||
node.childIdentifierNameLocation.GetStartPosition(),
|
||||
node.childIdentifierNameLocation.GetEndPosition(),
|
||||
objectName));
|
||||
completions.push_back(
|
||||
ExpressionCompletionDescription::ForExpressionWithPrefix(
|
||||
type,
|
||||
node.childIdentifierName,
|
||||
node.childIdentifierNameLocation.GetStartPosition(),
|
||||
node.childIdentifierNameLocation.GetEndPosition(),
|
||||
objectName));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -814,8 +736,7 @@ class GD_CORE_API ExpressionCompletionFinder
|
||||
auto type = gd::ExpressionTypeFinder::GetType(
|
||||
platform, projectScopedContainers, rootType, node);
|
||||
|
||||
AddCompletionsForAllIdentifiersMatchingSearch(
|
||||
node.text, type, node.location);
|
||||
AddCompletionsForAllIdentifiersMatchingSearch(node.text, type, node.location);
|
||||
completions.push_back(
|
||||
ExpressionCompletionDescription::ForExpressionWithPrefix(
|
||||
type,
|
||||
@@ -834,96 +755,10 @@ class GD_CORE_API ExpressionCompletionFinder
|
||||
(inclusive && searchedPosition <= location.GetEndPosition())));
|
||||
}
|
||||
|
||||
/**
|
||||
* A slightly less strict check than `gd::Project::IsNameSafe` as child
|
||||
* variables can be completed even if they start with a number.
|
||||
*/
|
||||
bool IsIdentifierSafe(const gd::String& name) {
|
||||
if (name.empty()) return false;
|
||||
|
||||
for (auto character : name) {
|
||||
if (!GrammarTerminals::IsAllowedInIdentifier(character)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void AddCompletionsForChildrenVariablesOf(
|
||||
VariableAndItsParent variableAndItsParent,
|
||||
const ExpressionParserLocation& location,
|
||||
gd::String eagerlyCompleteForVariableName = "") {
|
||||
if (variableAndItsParent.parentVariable) {
|
||||
AddCompletionsForChildrenVariablesOf(variableAndItsParent.parentVariable,
|
||||
location,
|
||||
eagerlyCompleteForVariableName);
|
||||
} else if (variableAndItsParent.parentVariablesContainer) {
|
||||
AddCompletionsForVariablesMatchingSearch(
|
||||
*variableAndItsParent.parentVariablesContainer, "", location);
|
||||
}
|
||||
}
|
||||
|
||||
void AddCompletionsForChildrenVariablesOf(
|
||||
const gd::Variable* variable,
|
||||
const ExpressionParserLocation& location,
|
||||
gd::String eagerlyCompleteForVariableName = "") {
|
||||
if (!variable) return;
|
||||
|
||||
if (variable->GetType() == gd::Variable::Structure) {
|
||||
for (const auto& name : variable->GetAllChildrenNames()) {
|
||||
if (!IsIdentifierSafe(name)) continue;
|
||||
|
||||
const auto& childVariable = variable->GetChild(name);
|
||||
ExpressionCompletionDescription description(
|
||||
ExpressionCompletionDescription::Variable,
|
||||
location.GetStartPosition(),
|
||||
location.GetEndPosition());
|
||||
description.SetCompletion(name);
|
||||
description.SetVariableType(childVariable.GetType());
|
||||
completions.push_back(description);
|
||||
|
||||
if (name == eagerlyCompleteForVariableName) {
|
||||
AddEagerCompletionForVariableChildren(childVariable, name, location);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
// TODO: we could do a "comment only completion" to indicate that nothing
|
||||
// can/should be completed?
|
||||
}
|
||||
}
|
||||
|
||||
void AddEagerCompletionForVariableChildren(
|
||||
const gd::Variable& variable,
|
||||
const gd::String& variableName,
|
||||
const ExpressionParserLocation& location) {
|
||||
if (variable.GetType() == gd::Variable::Structure) {
|
||||
gd::String prefix = variableName + ".";
|
||||
for (const auto& name : variable.GetAllChildrenNames()) {
|
||||
gd::String completion =
|
||||
IsIdentifierSafe(name)
|
||||
? (prefix + name)
|
||||
: (variableName + "[" +
|
||||
gd::ExpressionParser2NodePrinter::PrintStringLiteral(name) +
|
||||
"]");
|
||||
|
||||
const auto& childVariable = variable.GetChild(name);
|
||||
ExpressionCompletionDescription description(
|
||||
ExpressionCompletionDescription::Variable,
|
||||
location.GetStartPosition(),
|
||||
location.GetEndPosition());
|
||||
description.SetCompletion(completion);
|
||||
description.SetVariableType(childVariable.GetType());
|
||||
completions.push_back(description);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void AddCompletionsForVariablesMatchingSearch(
|
||||
const gd::VariablesContainer& variablesContainer,
|
||||
const gd::String& search,
|
||||
const ExpressionParserLocation& location,
|
||||
bool eagerlyCompleteIfExactMatch = false) {
|
||||
const ExpressionParserLocation& location) {
|
||||
variablesContainer.ForEachVariableMatchingSearch(
|
||||
search,
|
||||
[&](const gd::String& variableName, const gd::Variable& variable) {
|
||||
@@ -934,11 +769,6 @@ class GD_CORE_API ExpressionCompletionFinder
|
||||
description.SetCompletion(variableName);
|
||||
description.SetVariableType(variable.GetType());
|
||||
completions.push_back(description);
|
||||
|
||||
if (eagerlyCompleteIfExactMatch && variableName == search) {
|
||||
AddEagerCompletionForVariableChildren(
|
||||
variable, variableName, location);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@@ -946,8 +776,7 @@ class GD_CORE_API ExpressionCompletionFinder
|
||||
const gd::ObjectsContainersList& objectsContainersList,
|
||||
const gd::String& objectOrGroupName,
|
||||
const gd::String& search,
|
||||
const ExpressionParserLocation& location,
|
||||
bool eagerlyCompleteIfExactMatch) {
|
||||
const ExpressionParserLocation& location) {
|
||||
objectsContainersList.ForEachObjectOrGroupVariableMatchingSearch(
|
||||
objectOrGroupName,
|
||||
search,
|
||||
@@ -959,11 +788,6 @@ class GD_CORE_API ExpressionCompletionFinder
|
||||
description.SetCompletion(variableName);
|
||||
description.SetVariableType(variable.GetType());
|
||||
completions.push_back(description);
|
||||
|
||||
if (eagerlyCompleteIfExactMatch && variableName == search) {
|
||||
AddEagerCompletionForVariableChildren(
|
||||
variable, variableName, location);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@@ -971,27 +795,25 @@ class GD_CORE_API ExpressionCompletionFinder
|
||||
const gd::String& search,
|
||||
const gd::String& type,
|
||||
const ExpressionParserLocation& location) {
|
||||
projectScopedContainers.GetObjectsContainersList()
|
||||
.ForEachNameMatchingSearch(
|
||||
search,
|
||||
[&](const gd::String& name,
|
||||
const gd::ObjectConfiguration* objectConfiguration) {
|
||||
ExpressionCompletionDescription description(
|
||||
ExpressionCompletionDescription::Object,
|
||||
location.GetStartPosition(),
|
||||
location.GetEndPosition());
|
||||
description.SetObjectConfiguration(objectConfiguration);
|
||||
description.SetCompletion(name);
|
||||
description.SetType(type);
|
||||
completions.push_back(description);
|
||||
});
|
||||
projectScopedContainers.GetObjectsContainersList().ForEachNameMatchingSearch(
|
||||
search,
|
||||
[&](const gd::String& name,
|
||||
const gd::ObjectConfiguration* objectConfiguration) {
|
||||
ExpressionCompletionDescription description(
|
||||
ExpressionCompletionDescription::Object,
|
||||
location.GetStartPosition(),
|
||||
location.GetEndPosition());
|
||||
description.SetObjectConfiguration(objectConfiguration);
|
||||
description.SetCompletion(name);
|
||||
description.SetType(type);
|
||||
completions.push_back(description);
|
||||
});
|
||||
}
|
||||
|
||||
void AddCompletionsForObjectsAndVariablesMatchingSearch(
|
||||
const gd::String& search,
|
||||
const gd::String& type,
|
||||
const ExpressionParserLocation& location,
|
||||
bool eagerlyCompleteIfExactMatch) {
|
||||
const ExpressionParserLocation& location) {
|
||||
projectScopedContainers.ForEachIdentifierMatchingSearch(
|
||||
search,
|
||||
[&](const gd::String& objectName,
|
||||
@@ -1013,11 +835,6 @@ class GD_CORE_API ExpressionCompletionFinder
|
||||
description.SetCompletion(variableName);
|
||||
description.SetVariableType(variable.GetType());
|
||||
completions.push_back(description);
|
||||
|
||||
if (eagerlyCompleteIfExactMatch && variableName == search) {
|
||||
AddEagerCompletionForVariableChildren(
|
||||
variable, variableName, location);
|
||||
}
|
||||
},
|
||||
[&](const gd::NamedPropertyDescriptor& property) {
|
||||
// Ignore properties here.
|
||||
@@ -1028,7 +845,7 @@ class GD_CORE_API ExpressionCompletionFinder
|
||||
}
|
||||
|
||||
void AddCompletionsForAllIdentifiersMatchingSearch(const gd::String& search,
|
||||
const gd::String& type) {
|
||||
const gd::String& type) {
|
||||
AddCompletionsForAllIdentifiersMatchingSearch(
|
||||
search,
|
||||
type,
|
||||
@@ -1038,8 +855,7 @@ class GD_CORE_API ExpressionCompletionFinder
|
||||
void AddCompletionsForAllIdentifiersMatchingSearch(
|
||||
const gd::String& search,
|
||||
const gd::String& type,
|
||||
const ExpressionParserLocation& location,
|
||||
bool eagerlyCompleteIfExactMatch = false) {
|
||||
const ExpressionParserLocation& location) {
|
||||
projectScopedContainers.ForEachIdentifierMatchingSearch(
|
||||
search,
|
||||
[&](const gd::String& objectName,
|
||||
@@ -1061,11 +877,6 @@ class GD_CORE_API ExpressionCompletionFinder
|
||||
description.SetCompletion(variableName);
|
||||
description.SetVariableType(variable.GetType());
|
||||
completions.push_back(description);
|
||||
|
||||
if (eagerlyCompleteIfExactMatch && variableName == search) {
|
||||
AddEagerCompletionForVariableChildren(
|
||||
variable, variableName, location);
|
||||
}
|
||||
},
|
||||
[&](const gd::NamedPropertyDescriptor& property) {
|
||||
ExpressionCompletionDescription description(
|
||||
@@ -1093,14 +904,11 @@ class GD_CORE_API ExpressionCompletionFinder
|
||||
const gd::String& rootType_,
|
||||
size_t searchedPosition_,
|
||||
gd::ExpressionNode* maybeParentNodeAtLocation_)
|
||||
: searchedPosition(searchedPosition_),
|
||||
maybeParentNodeAtLocation(maybeParentNodeAtLocation_),
|
||||
platform(platform_),
|
||||
: platform(platform_),
|
||||
projectScopedContainers(projectScopedContainers_),
|
||||
rootType(rootType_),
|
||||
rootObjectName("") // Always empty, might be changed if variable fields
|
||||
// in the editor are changed to use completion.
|
||||
{};
|
||||
searchedPosition(searchedPosition_),
|
||||
maybeParentNodeAtLocation(maybeParentNodeAtLocation_){};
|
||||
|
||||
std::vector<ExpressionCompletionDescription> completions;
|
||||
size_t searchedPosition;
|
||||
@@ -1109,7 +917,6 @@ class GD_CORE_API ExpressionCompletionFinder
|
||||
const gd::Platform& platform;
|
||||
const gd::ProjectScopedContainers& projectScopedContainers;
|
||||
const gd::String rootType;
|
||||
const gd::String rootObjectName;
|
||||
};
|
||||
|
||||
} // namespace gd
|
||||
|
@@ -263,17 +263,11 @@ ExpressionValidator::Type ExpressionValidator::ValidateFunction(
|
||||
}
|
||||
|
||||
if (gd::MetadataProvider::IsBadExpressionMetadata(metadata)) {
|
||||
if (function.functionName.empty()) {
|
||||
RaiseError("invalid_function_name",
|
||||
_("Enter the name of the function to call."),
|
||||
function.location);
|
||||
} else {
|
||||
RaiseError("invalid_function_name",
|
||||
RaiseError("invalid_function_name",
|
||||
_("Cannot find an expression with this name: ") +
|
||||
function.functionName + "\n" +
|
||||
_("Double check that you've not made any typo in the name."),
|
||||
function.location);
|
||||
}
|
||||
return returnType;
|
||||
}
|
||||
|
||||
|
@@ -1,370 +0,0 @@
|
||||
/*
|
||||
* GDevelop Core
|
||||
* Copyright 2008-present Florian Rival (Florian.Rival@gmail.com). All rights
|
||||
* reserved. This project is released under the MIT License.
|
||||
*/
|
||||
#pragma once
|
||||
|
||||
#include <memory>
|
||||
#include <vector>
|
||||
|
||||
#include "GDCore/Events/Parsers/ExpressionParser2Node.h"
|
||||
#include "GDCore/Events/Parsers/ExpressionParser2NodeWorker.h"
|
||||
#include "GDCore/Extensions/Metadata/ExpressionMetadata.h"
|
||||
#include "GDCore/Extensions/Metadata/MetadataProvider.h"
|
||||
#include "GDCore/Extensions/Metadata/ObjectMetadata.h"
|
||||
#include "GDCore/Extensions/Metadata/ParameterMetadata.h"
|
||||
#include "GDCore/Project/ProjectScopedContainers.h"
|
||||
#include "GDCore/Project/Variable.h"
|
||||
#include "GDCore/Tools/Localization.h"
|
||||
|
||||
namespace gd {
|
||||
class Expression;
|
||||
class ObjectsContainer;
|
||||
class Platform;
|
||||
class ParameterMetadata;
|
||||
class ExpressionMetadata;
|
||||
} // namespace gd
|
||||
|
||||
namespace gd {
|
||||
|
||||
/**
|
||||
* \brief Contains a variables container or a variable. Useful
|
||||
* to refer to the parent of a variable (which can be a VariablesContainer
|
||||
* or another Variable).
|
||||
*/
|
||||
struct VariableAndItsParent {
|
||||
const gd::VariablesContainer* parentVariablesContainer;
|
||||
const gd::Variable* parentVariable;
|
||||
};
|
||||
|
||||
/**
|
||||
* \brief Find the last parent (i.e: the variables container) of a node representing a variable.
|
||||
*
|
||||
* Useful for completions, to know which variables can be entered in a node.
|
||||
*
|
||||
* \see gd::ExpressionParser2
|
||||
*/
|
||||
class GD_CORE_API ExpressionVariableParentFinder
|
||||
: public ExpressionParser2NodeWorker {
|
||||
public:
|
||||
|
||||
static VariableAndItsParent GetLastParentOfNode(
|
||||
const gd::Platform& platform,
|
||||
const gd::ProjectScopedContainers& projectScopedContainers,
|
||||
gd::ExpressionNode& node) {
|
||||
gd::ExpressionVariableParentFinder typeFinder(
|
||||
platform, projectScopedContainers);
|
||||
node.Visit(typeFinder);
|
||||
return typeFinder.variableAndItsParent;
|
||||
}
|
||||
|
||||
virtual ~ExpressionVariableParentFinder(){};
|
||||
|
||||
protected:
|
||||
ExpressionVariableParentFinder(
|
||||
const gd::Platform& platform_,
|
||||
const gd::ProjectScopedContainers& projectScopedContainers_)
|
||||
: platform(platform_),
|
||||
projectScopedContainers(projectScopedContainers_),
|
||||
variableNode(nullptr),
|
||||
thisIsALegacyPrescopedVariable(false),
|
||||
bailOutBecauseEmptyVariableName(false),
|
||||
legacyPrescopedVariablesContainer(nullptr){};
|
||||
|
||||
void OnVisitSubExpressionNode(SubExpressionNode& node) override {}
|
||||
void OnVisitOperatorNode(OperatorNode& node) override {}
|
||||
void OnVisitUnaryOperatorNode(UnaryOperatorNode& node) override {}
|
||||
void OnVisitNumberNode(NumberNode& node) override {}
|
||||
void OnVisitTextNode(TextNode& node) override {}
|
||||
void OnVisitVariableNode(VariableNode& node) override {
|
||||
if (variableNode != nullptr) {
|
||||
// This is not possible
|
||||
return;
|
||||
}
|
||||
variableNode = &node;
|
||||
|
||||
// Check if the parent is a function call, in which we might be dealing
|
||||
// with a legacy pre-scoped variable parameter:
|
||||
if (node.parent) node.parent->Visit(*this);
|
||||
|
||||
if (thisIsALegacyPrescopedVariable) {
|
||||
// The node represents a variable name, and the variables container
|
||||
// containing it was identified in the FunctionCallNode.
|
||||
childVariableNames.insert(childVariableNames.begin(), node.name);
|
||||
if (legacyPrescopedVariablesContainer)
|
||||
variableAndItsParent = WalkUntilLastParent(
|
||||
*legacyPrescopedVariablesContainer, childVariableNames);
|
||||
} else {
|
||||
// Otherwise, the identifier is to be interpreted as usual:
|
||||
// it can be an object (on which a variable is accessed),
|
||||
// or a variable.
|
||||
projectScopedContainers.MatchIdentifierWithName<void>(
|
||||
node.name,
|
||||
[&]() {
|
||||
// This is an object.
|
||||
const auto* variablesContainer =
|
||||
projectScopedContainers.GetObjectsContainersList()
|
||||
.GetObjectOrGroupVariablesContainer(node.name);
|
||||
if (variablesContainer)
|
||||
variableAndItsParent =
|
||||
WalkUntilLastParent(*variablesContainer, childVariableNames);
|
||||
},
|
||||
[&]() {
|
||||
// This is a variable.
|
||||
if (projectScopedContainers.GetVariablesContainersList().Has(
|
||||
node.name)) {
|
||||
variableAndItsParent = WalkUntilLastParent(
|
||||
projectScopedContainers.GetVariablesContainersList().Get(
|
||||
node.name),
|
||||
childVariableNames);
|
||||
}
|
||||
},
|
||||
[&]() {
|
||||
// Ignore properties here.
|
||||
// There is no support for "children" of properties.
|
||||
},
|
||||
[&]() {
|
||||
// Ignore parameters here.
|
||||
// There is no support for "children" of parameters.
|
||||
},
|
||||
[&]() {
|
||||
// Ignore unrecognised identifiers here.
|
||||
});
|
||||
}
|
||||
}
|
||||
void OnVisitVariableAccessorNode(VariableAccessorNode& node) override {
|
||||
if (node.name.empty() && node.child) {
|
||||
// A variable accessor should always have a name if it has a child (i.e: another accessor).
|
||||
// While the parser may have generated an empty name,
|
||||
// flag this so we avoid finding a wrong parent (and so, run the risk of giving
|
||||
// wrong autocompletions).
|
||||
bailOutBecauseEmptyVariableName = true;
|
||||
}
|
||||
childVariableNames.insert(childVariableNames.begin(), node.name);
|
||||
if (node.parent) node.parent->Visit(*this);
|
||||
}
|
||||
void OnVisitIdentifierNode(IdentifierNode& node) override {
|
||||
if (variableNode != nullptr) {
|
||||
// This is not possible
|
||||
return;
|
||||
}
|
||||
// This node is not necessarily a variable node.
|
||||
// It will be checked when visiting the FunctionCallNode, just after.
|
||||
variableNode = &node;
|
||||
|
||||
// Check if the parent is a function call, in which we might be dealing
|
||||
// with a legacy pre-scoped variable parameter:
|
||||
if (node.parent) node.parent->Visit(*this);
|
||||
|
||||
if (thisIsALegacyPrescopedVariable) {
|
||||
// The identifier represents a variable name, and the variables container
|
||||
// containing it was identified in the FunctionCallNode.
|
||||
if (!node.childIdentifierName.empty())
|
||||
childVariableNames.insert(childVariableNames.begin(),
|
||||
node.childIdentifierName);
|
||||
childVariableNames.insert(childVariableNames.begin(),
|
||||
node.identifierName);
|
||||
|
||||
if (legacyPrescopedVariablesContainer)
|
||||
variableAndItsParent = WalkUntilLastParent(
|
||||
*legacyPrescopedVariablesContainer, childVariableNames);
|
||||
|
||||
} else {
|
||||
// Otherwise, the identifier is to be interpreted as usual:
|
||||
// it can be an object (on which a variable is accessed),
|
||||
// or a variable.
|
||||
projectScopedContainers.MatchIdentifierWithName<void>(
|
||||
node.identifierName,
|
||||
[&]() {
|
||||
// This is an object.
|
||||
if (!node.childIdentifierName.empty())
|
||||
childVariableNames.insert(childVariableNames.begin(),
|
||||
node.childIdentifierName);
|
||||
|
||||
const auto* variablesContainer =
|
||||
projectScopedContainers.GetObjectsContainersList()
|
||||
.GetObjectOrGroupVariablesContainer(node.identifierName);
|
||||
if (variablesContainer)
|
||||
variableAndItsParent =
|
||||
WalkUntilLastParent(*variablesContainer, childVariableNames);
|
||||
},
|
||||
[&]() {
|
||||
// This is a variable.
|
||||
if (!node.childIdentifierName.empty())
|
||||
childVariableNames.insert(childVariableNames.begin(),
|
||||
node.childIdentifierName);
|
||||
|
||||
if (projectScopedContainers.GetVariablesContainersList().Has(
|
||||
node.identifierName)) {
|
||||
variableAndItsParent = WalkUntilLastParent(
|
||||
projectScopedContainers.GetVariablesContainersList().Get(
|
||||
node.identifierName),
|
||||
childVariableNames);
|
||||
}
|
||||
},
|
||||
[&]() {
|
||||
// Ignore properties here.
|
||||
// There is no support for "children" of properties.
|
||||
},
|
||||
[&]() {
|
||||
// Ignore parameters here.
|
||||
// There is no support for "children" of properties.
|
||||
},
|
||||
[&]() {
|
||||
// Ignore unrecognised identifiers here.
|
||||
});
|
||||
}
|
||||
}
|
||||
void OnVisitEmptyNode(EmptyNode& node) override {}
|
||||
void OnVisitObjectFunctionNameNode(ObjectFunctionNameNode& node) override {}
|
||||
void OnVisitVariableBracketAccessorNode(
|
||||
VariableBracketAccessorNode& node) override {
|
||||
// Add a child with an empty name, which will be interpreted as
|
||||
// "take the first child/item of the structure/array".
|
||||
childVariableNames.insert(childVariableNames.begin(), "");
|
||||
if (node.parent) node.parent->Visit(*this);
|
||||
}
|
||||
void OnVisitFunctionCallNode(FunctionCallNode& functionCall) override {
|
||||
if (variableNode == nullptr) {
|
||||
return;
|
||||
}
|
||||
int parameterIndex = -1;
|
||||
for (int i = 0; i < functionCall.parameters.size(); i++) {
|
||||
if (functionCall.parameters.at(i).get() == variableNode) {
|
||||
parameterIndex = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (parameterIndex < 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
const auto& objectsContainersList =
|
||||
projectScopedContainers.GetObjectsContainersList();
|
||||
|
||||
const gd::ParameterMetadata* parameterMetadata =
|
||||
MetadataProvider::GetFunctionCallParameterMetadata(
|
||||
platform, objectsContainersList, functionCall, parameterIndex);
|
||||
if (parameterMetadata == nullptr) return; // Unexpected
|
||||
|
||||
// Support for legacy pre-scoped variables:
|
||||
if (parameterMetadata->GetValueTypeMetadata().IsLegacyPreScopedVariable()) {
|
||||
if (parameterMetadata->GetType() == "objectvar") {
|
||||
// Legacy convention where a "objectvar"
|
||||
// parameter represents a variable of the object represented by the
|
||||
// previous "object" parameter. The object on which the function is
|
||||
// called is returned if no previous parameters are objects.
|
||||
gd::String objectName = functionCall.objectName;
|
||||
for (int previousIndex = parameterIndex - 1; previousIndex >= 0;
|
||||
previousIndex--) {
|
||||
const gd::ParameterMetadata* previousParameterMetadata =
|
||||
MetadataProvider::GetFunctionCallParameterMetadata(
|
||||
platform, objectsContainersList, functionCall, previousIndex);
|
||||
if (previousParameterMetadata != nullptr &&
|
||||
gd::ParameterMetadata::IsObject(
|
||||
previousParameterMetadata->GetType())) {
|
||||
auto previousParameterNode =
|
||||
functionCall.parameters[previousIndex].get();
|
||||
IdentifierNode* objectNode =
|
||||
dynamic_cast<IdentifierNode*>(previousParameterNode);
|
||||
objectName = objectNode->identifierName;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
legacyPrescopedVariablesContainer =
|
||||
projectScopedContainers.GetObjectsContainersList()
|
||||
.GetObjectOrGroupVariablesContainer(objectName);
|
||||
thisIsALegacyPrescopedVariable = true;
|
||||
} else if (parameterMetadata->GetType() == "scenevar") {
|
||||
legacyPrescopedVariablesContainer =
|
||||
projectScopedContainers.GetVariablesContainersList()
|
||||
.GetBottomMostVariablesContainer();
|
||||
thisIsALegacyPrescopedVariable = true;
|
||||
} else if (parameterMetadata->GetType() == "globalvar") {
|
||||
legacyPrescopedVariablesContainer =
|
||||
projectScopedContainers.GetVariablesContainersList()
|
||||
.GetTopMostVariablesContainer();
|
||||
thisIsALegacyPrescopedVariable = true;
|
||||
}
|
||||
} else {
|
||||
thisIsALegacyPrescopedVariable = false;
|
||||
legacyPrescopedVariablesContainer = nullptr;
|
||||
}
|
||||
}
|
||||
|
||||
private:
|
||||
VariableAndItsParent WalkUntilLastParent(
|
||||
const gd::Variable& variable,
|
||||
const std::vector<gd::String>& childVariableNames,
|
||||
size_t startIndex = 0) {
|
||||
if (bailOutBecauseEmptyVariableName)
|
||||
return {}; // Do not even attempt to find the parent if we had an issue when visiting nodes.
|
||||
|
||||
const gd::Variable* currentVariable = &variable;
|
||||
|
||||
// Walk until size - 1 as we want the last parent.
|
||||
for (size_t index = startIndex; index + 1 < childVariableNames.size();
|
||||
++index) {
|
||||
const gd::String& childName = childVariableNames[index];
|
||||
|
||||
if (childName.empty()) {
|
||||
if (currentVariable->GetChildrenCount() == 0) {
|
||||
// The array or structure is empty, we can't walk through it - there
|
||||
// is no "parent".
|
||||
return {};
|
||||
}
|
||||
|
||||
if (currentVariable->GetType() == gd::Variable::Array) {
|
||||
currentVariable = ¤tVariable->GetAtIndex(0);
|
||||
} else {
|
||||
currentVariable =
|
||||
currentVariable->GetAllChildren().begin()->second.get();
|
||||
}
|
||||
} else {
|
||||
if (!currentVariable->HasChild(childName)) {
|
||||
// Non existing child - there is no "parent".
|
||||
return {};
|
||||
}
|
||||
|
||||
currentVariable = ¤tVariable->GetChild(childName);
|
||||
}
|
||||
}
|
||||
|
||||
// Return the last parent of the chain of variables (so not the last variable
|
||||
// but the one before it).
|
||||
return {.parentVariable = currentVariable};
|
||||
}
|
||||
|
||||
VariableAndItsParent WalkUntilLastParent(
|
||||
const gd::VariablesContainer& variablesContainer,
|
||||
const std::vector<gd::String>& childVariableNames) {
|
||||
if (bailOutBecauseEmptyVariableName)
|
||||
return {}; // Do not even attempt to find the parent if we had an issue when visiting nodes.
|
||||
if (childVariableNames.empty())
|
||||
return {}; // There is no "parent" to the variables container itself.
|
||||
|
||||
const gd::String& firstChildName = *childVariableNames.begin();
|
||||
|
||||
const gd::Variable* variable = variablesContainer.Has(firstChildName) ?
|
||||
&variablesContainer.Get(firstChildName) : nullptr;
|
||||
if (childVariableNames.size() == 1 || !variable)
|
||||
return {// Only one child: the parent is the variables container itself.
|
||||
.parentVariablesContainer = &variablesContainer};
|
||||
|
||||
return WalkUntilLastParent(*variable, childVariableNames, 1);
|
||||
}
|
||||
|
||||
gd::ExpressionNode* variableNode;
|
||||
std::vector<gd::String> childVariableNames;
|
||||
bool thisIsALegacyPrescopedVariable;
|
||||
bool bailOutBecauseEmptyVariableName;
|
||||
const gd::VariablesContainer* legacyPrescopedVariablesContainer;
|
||||
VariableAndItsParent variableAndItsParent;
|
||||
|
||||
const gd::Platform& platform;
|
||||
const gd::ProjectScopedContainers& projectScopedContainers;
|
||||
};
|
||||
|
||||
} // namespace gd
|
@@ -63,10 +63,14 @@ void ArbitraryResourceWorker::ExposeBitmapFont(gd::String& bitmapFontName){
|
||||
};
|
||||
|
||||
void ArbitraryResourceWorker::ExposeAudio(gd::String& audioName) {
|
||||
if (resourcesManager->HasResource(audioName) &&
|
||||
resourcesManager->GetResource(audioName).GetKind() == "audio") {
|
||||
// Nothing to do, the audio is a reference to a proper resource.
|
||||
return;
|
||||
for (auto resources : GetResources()) {
|
||||
if (!resources) continue;
|
||||
|
||||
if (resources->HasResource(audioName) &&
|
||||
resources->GetResource(audioName).GetKind() == "audio") {
|
||||
// Nothing to do, the audio is a reference to a proper resource.
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
// For compatibility with older projects (where events were referring to files
|
||||
@@ -76,10 +80,14 @@ void ArbitraryResourceWorker::ExposeAudio(gd::String& audioName) {
|
||||
};
|
||||
|
||||
void ArbitraryResourceWorker::ExposeFont(gd::String& fontName) {
|
||||
if (resourcesManager->HasResource(fontName) &&
|
||||
resourcesManager->GetResource(fontName).GetKind() == "font") {
|
||||
// Nothing to do, the font is a reference to a proper resource.
|
||||
return;
|
||||
for (auto resources : GetResources()) {
|
||||
if (!resources) continue;
|
||||
|
||||
if (resources->HasResource(fontName) &&
|
||||
resources->GetResource(fontName).GetKind() == "font") {
|
||||
// Nothing to do, the font is a reference to a proper resource.
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
// For compatibility with older projects (where events were referring to files
|
||||
@@ -88,7 +96,12 @@ void ArbitraryResourceWorker::ExposeFont(gd::String& fontName) {
|
||||
ExposeFile(fontName);
|
||||
};
|
||||
|
||||
void ArbitraryResourceWorker::ExposeResources() {
|
||||
void ArbitraryResourceWorker::ExposeResources(
|
||||
gd::ResourcesManager* resourcesManager) {
|
||||
if (!resourcesManager) return;
|
||||
|
||||
resourcesManagers.push_back(resourcesManager);
|
||||
|
||||
std::vector<gd::String> resources = resourcesManager->GetAllResourceNames();
|
||||
for (std::size_t i = 0; i < resources.size(); i++) {
|
||||
if (resourcesManager->GetResource(resources[i]).UseFile())
|
||||
@@ -97,6 +110,9 @@ void ArbitraryResourceWorker::ExposeResources() {
|
||||
}
|
||||
|
||||
void ArbitraryResourceWorker::ExposeEmbeddeds(gd::String& resourceName) {
|
||||
if (resourcesManagers.empty()) return;
|
||||
gd::ResourcesManager* resourcesManager = resourcesManagers[0];
|
||||
|
||||
gd::Resource& resource = resourcesManager->GetResource(resourceName);
|
||||
|
||||
if (!resource.GetMetadata().empty()) {
|
||||
@@ -160,7 +176,6 @@ void ArbitraryResourceWorker::ExposeResourceWithType(
|
||||
}
|
||||
if (resourceType == "tilemap") {
|
||||
ExposeTilemap(resourceName);
|
||||
ExposeEmbeddeds(resourceName);
|
||||
return;
|
||||
}
|
||||
if (resourceType == "tileset") {
|
||||
@@ -169,7 +184,6 @@ void ArbitraryResourceWorker::ExposeResourceWithType(
|
||||
}
|
||||
if (resourceType == "json") {
|
||||
ExposeJson(resourceName);
|
||||
ExposeEmbeddeds(resourceName);
|
||||
return;
|
||||
}
|
||||
if (resourceType == "video") {
|
||||
@@ -229,12 +243,10 @@ bool ResourceWorkerInEventsWorker::DoVisitInstruction(gd::Instruction& instructi
|
||||
} else if (parameterMetadata.GetType() == "jsonResource") {
|
||||
gd::String updatedParameterValue = parameterValue;
|
||||
worker.ExposeJson(updatedParameterValue);
|
||||
worker.ExposeEmbeddeds(updatedParameterValue);
|
||||
instruction.SetParameter(parameterIndex, updatedParameterValue);
|
||||
} else if (parameterMetadata.GetType() == "tilemapResource") {
|
||||
gd::String updatedParameterValue = parameterValue;
|
||||
worker.ExposeTilemap(updatedParameterValue);
|
||||
worker.ExposeEmbeddeds(updatedParameterValue);
|
||||
instruction.SetParameter(parameterIndex, updatedParameterValue);
|
||||
} else if (parameterMetadata.GetType() == "tilesetResource") {
|
||||
gd::String updatedParameterValue = parameterValue;
|
||||
|
@@ -42,9 +42,8 @@ namespace gd {
|
||||
* \ingroup IDE
|
||||
*/
|
||||
class GD_CORE_API ArbitraryResourceWorker {
|
||||
public:
|
||||
ArbitraryResourceWorker(gd::ResourcesManager &resourcesManager_)
|
||||
: resourcesManager(&resourcesManager_){};
|
||||
public:
|
||||
ArbitraryResourceWorker(){};
|
||||
virtual ~ArbitraryResourceWorker();
|
||||
|
||||
/**
|
||||
@@ -53,7 +52,7 @@ public:
|
||||
* first to ensure that resources are known so that images, shaders & audio
|
||||
* can make reference to them.
|
||||
*/
|
||||
void ExposeResources();
|
||||
void ExposeResources(gd::ResourcesManager *resourcesManager);
|
||||
|
||||
/**
|
||||
* \brief Expose a resource from a given type.
|
||||
@@ -123,6 +122,11 @@ public:
|
||||
*/
|
||||
virtual void ExposeEmbeddeds(gd::String &resourceName);
|
||||
|
||||
protected:
|
||||
const std::vector<gd::ResourcesManager *> &GetResources() {
|
||||
return resourcesManagers;
|
||||
};
|
||||
|
||||
private:
|
||||
/**
|
||||
* \brief Expose a resource: resources that have a file are
|
||||
@@ -130,7 +134,7 @@ public:
|
||||
*/
|
||||
void ExposeResource(gd::Resource &resource);
|
||||
|
||||
gd::ResourcesManager * resourcesManager;
|
||||
std::vector<gd::ResourcesManager *> resourcesManagers;
|
||||
};
|
||||
|
||||
/**
|
||||
|
@@ -6,7 +6,7 @@
|
||||
namespace gd {
|
||||
|
||||
void ObjectsUsingResourceCollector::DoVisitObject(gd::Object& object) {
|
||||
gd::ResourceNameMatcher resourceNameMatcher(*resourcesManager, resourceName);
|
||||
gd::ResourceNameMatcher resourceNameMatcher(resourceName);
|
||||
|
||||
object.GetConfiguration().ExposeResources(resourceNameMatcher);
|
||||
if (resourceNameMatcher.AnyResourceMatches()) {
|
||||
|
@@ -4,7 +4,8 @@
|
||||
* reserved. This project is released under the MIT License.
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
#ifndef ProjectObjectsUsingResourceCollector_H
|
||||
#define ProjectObjectsUsingResourceCollector_H
|
||||
|
||||
#include <vector>
|
||||
|
||||
@@ -20,10 +21,9 @@ namespace gd {
|
||||
|
||||
class GD_CORE_API ObjectsUsingResourceCollector
|
||||
: public ArbitraryObjectsWorker {
|
||||
public:
|
||||
ObjectsUsingResourceCollector(gd::ResourcesManager &resourcesManager_,
|
||||
const gd::String &resourceName_)
|
||||
: resourcesManager(&resourcesManager_), resourceName(resourceName_){};
|
||||
public:
|
||||
ObjectsUsingResourceCollector(const gd::String& resourceName_)
|
||||
: resourceName(resourceName_){};
|
||||
virtual ~ObjectsUsingResourceCollector();
|
||||
|
||||
std::vector<gd::String>& GetObjectNames() { return objectNames; }
|
||||
@@ -33,16 +33,12 @@ public:
|
||||
|
||||
std::vector<gd::String> objectNames;
|
||||
gd::String resourceName;
|
||||
gd::ResourcesManager *resourcesManager;
|
||||
};
|
||||
|
||||
class GD_CORE_API ResourceNameMatcher : public ArbitraryResourceWorker {
|
||||
public:
|
||||
ResourceNameMatcher(gd::ResourcesManager &resourcesManager,
|
||||
const gd::String &resourceName_)
|
||||
: resourceName(resourceName_),
|
||||
matchesResourceName(false), gd::ArbitraryResourceWorker(
|
||||
resourcesManager){};
|
||||
public:
|
||||
ResourceNameMatcher(const gd::String& resourceName_)
|
||||
: resourceName(resourceName_), matchesResourceName(false){};
|
||||
virtual ~ResourceNameMatcher(){};
|
||||
|
||||
bool AnyResourceMatches() { return matchesResourceName; }
|
||||
@@ -89,3 +85,5 @@ public:
|
||||
};
|
||||
|
||||
}; // namespace gd
|
||||
|
||||
#endif // ProjectObjectsUsingResourceCollector_H
|
||||
|
@@ -18,9 +18,8 @@ namespace gd {
|
||||
std::vector<gd::String> ProjectResourcesAdder::GetAllUseless(
|
||||
gd::Project& project, const gd::String& resourceType) {
|
||||
std::vector<gd::String> unusedResources;
|
||||
|
||||
// Search for resources used in the project
|
||||
gd::ResourcesInUseHelper resourcesInUse(project.GetResourcesManager());
|
||||
gd::ResourcesInUseHelper resourcesInUse;
|
||||
gd::ResourceExposer::ExposeWholeProjectResources(project, resourcesInUse);
|
||||
std::set<gd::String>& usedResources = resourcesInUse.GetAll(resourceType);
|
||||
|
||||
|
@@ -25,29 +25,8 @@ bool ProjectResourcesCopier::CopyAllResourcesTo(
|
||||
bool updateOriginalProject,
|
||||
bool preserveAbsoluteFilenames,
|
||||
bool preserveDirectoryStructure) {
|
||||
if (updateOriginalProject) {
|
||||
gd::ProjectResourcesCopier::CopyAllResourcesTo(
|
||||
originalProject, originalProject, fs, destinationDirectory,
|
||||
preserveAbsoluteFilenames, preserveDirectoryStructure);
|
||||
} else {
|
||||
gd::Project clonedProject = originalProject;
|
||||
gd::ProjectResourcesCopier::CopyAllResourcesTo(
|
||||
originalProject, clonedProject, fs, destinationDirectory,
|
||||
preserveAbsoluteFilenames, preserveDirectoryStructure);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
bool ProjectResourcesCopier::CopyAllResourcesTo(
|
||||
gd::Project& originalProject,
|
||||
gd::Project& clonedProject,
|
||||
AbstractFileSystem& fs,
|
||||
gd::String destinationDirectory,
|
||||
bool preserveAbsoluteFilenames,
|
||||
bool preserveDirectoryStructure) {
|
||||
|
||||
// Check if there are some resources with absolute filenames
|
||||
gd::ResourcesAbsolutePathChecker absolutePathChecker(originalProject.GetResourcesManager(), fs);
|
||||
gd::ResourcesAbsolutePathChecker absolutePathChecker(fs);
|
||||
gd::ResourceExposer::ExposeWholeProjectResources(originalProject, absolutePathChecker);
|
||||
|
||||
auto projectDirectory = fs.DirNameFrom(originalProject.GetProjectFile());
|
||||
@@ -55,14 +34,19 @@ bool ProjectResourcesCopier::CopyAllResourcesTo(
|
||||
<< destinationDirectory << "..." << std::endl;
|
||||
|
||||
// Get the resources to be copied
|
||||
gd::ResourcesMergingHelper resourcesMergingHelper(
|
||||
clonedProject.GetResourcesManager(), fs);
|
||||
gd::ResourcesMergingHelper resourcesMergingHelper(fs);
|
||||
resourcesMergingHelper.SetBaseDirectory(projectDirectory);
|
||||
resourcesMergingHelper.PreserveDirectoriesStructure(
|
||||
preserveDirectoryStructure);
|
||||
resourcesMergingHelper.PreserveAbsoluteFilenames(preserveAbsoluteFilenames);
|
||||
gd::ResourceExposer::ExposeWholeProjectResources(clonedProject,
|
||||
resourcesMergingHelper);
|
||||
resourcesMergingHelper.PreserveAbsoluteFilenames(
|
||||
preserveAbsoluteFilenames);
|
||||
|
||||
if (updateOriginalProject) {
|
||||
gd::ResourceExposer::ExposeWholeProjectResources(originalProject, resourcesMergingHelper);
|
||||
} else {
|
||||
std::shared_ptr<gd::Project> project(new gd::Project(originalProject));
|
||||
gd::ResourceExposer::ExposeWholeProjectResources(*project, resourcesMergingHelper);
|
||||
}
|
||||
|
||||
// Copy resources
|
||||
map<gd::String, gd::String>& resourcesNewFilename =
|
||||
|
@@ -47,13 +47,6 @@ class GD_CORE_API ProjectResourcesCopier {
|
||||
bool updateOriginalProject,
|
||||
bool preserveAbsoluteFilenames = true,
|
||||
bool preserveDirectoryStructure = true);
|
||||
private:
|
||||
static bool CopyAllResourcesTo(gd::Project& originalProject,
|
||||
gd::Project& clonedProject,
|
||||
gd::AbstractFileSystem& fs,
|
||||
gd::String destinationDirectory,
|
||||
bool preserveAbsoluteFilenames = true,
|
||||
bool preserveDirectoryStructure = true);
|
||||
};
|
||||
|
||||
} // namespace gd
|
||||
|
@@ -3,7 +3,8 @@
|
||||
* Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights
|
||||
* reserved. This project is released under the MIT License.
|
||||
*/
|
||||
#pragma once
|
||||
#ifndef RESOURCESABSOLUTEPATHCHECKER_H
|
||||
#define RESOURCESABSOLUTEPATHCHECKER_H
|
||||
|
||||
#include "GDCore/IDE/AbstractFileSystem.h"
|
||||
#include "GDCore/IDE/Project/ArbitraryResourceWorker.h"
|
||||
@@ -21,10 +22,10 @@ namespace gd {
|
||||
*/
|
||||
class GD_CORE_API ResourcesAbsolutePathChecker
|
||||
: public ArbitraryResourceWorker {
|
||||
public:
|
||||
ResourcesAbsolutePathChecker(gd::ResourcesManager &resourcesManager,
|
||||
AbstractFileSystem &fileSystem)
|
||||
: ArbitraryResourceWorker(resourcesManager), hasAbsoluteFilenames(false),
|
||||
public:
|
||||
ResourcesAbsolutePathChecker(AbstractFileSystem& fileSystem)
|
||||
: ArbitraryResourceWorker(),
|
||||
hasAbsoluteFilenames(false),
|
||||
fs(fileSystem){};
|
||||
virtual ~ResourcesAbsolutePathChecker(){};
|
||||
|
||||
@@ -46,3 +47,5 @@ public:
|
||||
};
|
||||
|
||||
} // namespace gd
|
||||
|
||||
#endif // RESOURCESABSOLUTEPATHCHECKER_H
|
||||
|
@@ -33,9 +33,8 @@ std::set<gd::String> & usedImages = resourcesInUse.GetAllImages();
|
||||
* \ingroup IDE
|
||||
*/
|
||||
class ResourcesInUseHelper : public gd::ArbitraryResourceWorker {
|
||||
public:
|
||||
ResourcesInUseHelper(gd::ResourcesManager &resourcesManager)
|
||||
: gd::ArbitraryResourceWorker(resourcesManager){};
|
||||
public:
|
||||
ResourcesInUseHelper() : gd::ArbitraryResourceWorker(){};
|
||||
virtual ~ResourcesInUseHelper(){};
|
||||
|
||||
std::set<gd::String>& GetAllImages() { return GetAll("image"); };
|
||||
|
@@ -28,11 +28,11 @@ namespace gd {
|
||||
* \ingroup IDE
|
||||
*/
|
||||
class GD_CORE_API ResourcesMergingHelper : public ArbitraryResourceWorker {
|
||||
public:
|
||||
ResourcesMergingHelper(gd::ResourcesManager &resourcesManager,
|
||||
gd::AbstractFileSystem &fileSystem)
|
||||
: ArbitraryResourceWorker(resourcesManager),
|
||||
preserveDirectoriesStructure(false), preserveAbsoluteFilenames(false),
|
||||
public:
|
||||
ResourcesMergingHelper(gd::AbstractFileSystem& fileSystem)
|
||||
: ArbitraryResourceWorker(),
|
||||
preserveDirectoriesStructure(false),
|
||||
preserveAbsoluteFilenames(false),
|
||||
fs(fileSystem){};
|
||||
virtual ~ResourcesMergingHelper(){};
|
||||
|
||||
|
@@ -22,16 +22,13 @@ namespace gd {
|
||||
*/
|
||||
class ResourcesRenamer : public gd::ArbitraryResourceWorker {
|
||||
public:
|
||||
/**
|
||||
* @brief Constructor taking the map from old name to new name.
|
||||
* @param oldToNewNames_ A map associating to a resource name the new name to
|
||||
* use.
|
||||
*/
|
||||
ResourcesRenamer(gd::ResourcesManager &resourcesManager,
|
||||
const std::map<gd::String, gd::String> &oldToNewNames_)
|
||||
: gd::ArbitraryResourceWorker(resourcesManager),
|
||||
oldToNewNames(oldToNewNames_){};
|
||||
|
||||
/**
|
||||
* @brief Constructor taking the map from old name to new name.
|
||||
* @param oldToNewNames_ A map associating to a resource name the new name to
|
||||
* use.
|
||||
*/
|
||||
ResourcesRenamer(const std::map<gd::String, gd::String>& oldToNewNames_)
|
||||
: gd::ArbitraryResourceWorker(), oldToNewNames(oldToNewNames_){};
|
||||
virtual ~ResourcesRenamer(){};
|
||||
|
||||
virtual void ExposeFile(gd::String& resourceFileName) override{
|
||||
|
@@ -13,16 +13,14 @@
|
||||
namespace gd {
|
||||
|
||||
std::set<gd::String> SceneResourcesFinder::FindProjectResources(gd::Project &project) {
|
||||
gd::SceneResourcesFinder resourceWorker(project.GetResourcesManager());
|
||||
|
||||
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(project.GetResourcesManager());
|
||||
|
||||
gd::SceneResourcesFinder resourceWorker;
|
||||
gd::ResourceExposer::ExposeLayoutResources(project, layout, resourceWorker);
|
||||
return resourceWorker.resourceNames;
|
||||
}
|
||||
|
@@ -44,8 +44,7 @@ public:
|
||||
virtual ~SceneResourcesFinder(){};
|
||||
|
||||
private:
|
||||
SceneResourcesFinder(gd::ResourcesManager &resourcesManager)
|
||||
: gd::ArbitraryResourceWorker(resourcesManager){};
|
||||
SceneResourcesFinder() : gd::ArbitraryResourceWorker(){};
|
||||
|
||||
void AddUsedResource(gd::String &resourceName);
|
||||
|
||||
|
@@ -128,7 +128,11 @@ void PropertyFunctionGenerator::GenerateGetterAndSetter(
|
||||
} else {
|
||||
gd::Instruction action;
|
||||
action.SetType("SetReturn" + numberOrString);
|
||||
action.AddParameter(property.GetName());
|
||||
gd::String receiver = isBehavior ? "Object.Behavior::" : "Object.";
|
||||
gd::String propertyPrefix =
|
||||
(isSharedProperties ? "SharedProperty" : "Property");
|
||||
action.AddParameter(receiver + propertyPrefix + property.GetName() +
|
||||
"()");
|
||||
event.GetActions().Insert(action, 0);
|
||||
}
|
||||
}
|
||||
@@ -229,13 +233,15 @@ void PropertyFunctionGenerator::GenerateGetterAndSetter(
|
||||
gd::Instruction action;
|
||||
action.SetType(setterType);
|
||||
action.AddParameter("Object");
|
||||
gd::String parameterGetterCall =
|
||||
"GetArgumentAs" + numberOrString + "(\"Value\")";
|
||||
if (isBehavior) {
|
||||
action.AddParameter("Behavior");
|
||||
action.AddParameter("=");
|
||||
action.AddParameter("Value");
|
||||
action.AddParameter(parameterGetterCall);
|
||||
} else {
|
||||
action.AddParameter("=");
|
||||
action.AddParameter("Value");
|
||||
action.AddParameter(parameterGetterCall);
|
||||
}
|
||||
event.GetActions().Insert(action, 0);
|
||||
}
|
||||
|
@@ -33,8 +33,10 @@ void ResourceExposer::ExposeWholeProjectResources(gd::Project& project, gd::Arbi
|
||||
// traverse the whole project (this time for events) and ExposeProjectEffects
|
||||
// (this time for effects).
|
||||
|
||||
gd::ResourcesManager* resourcesManager = &(project.GetResourcesManager());
|
||||
|
||||
// Expose any project resources as files.
|
||||
worker.ExposeResources();
|
||||
worker.ExposeResources(resourcesManager);
|
||||
|
||||
project.GetPlatformSpecificAssets().ExposeResources(worker);
|
||||
|
||||
|
@@ -17,7 +17,7 @@ LoadingScreen::LoadingScreen()
|
||||
backgroundFadeInDuration(0.2),
|
||||
minDuration(1.5),
|
||||
logoAndProgressFadeInDuration(0.2),
|
||||
logoAndProgressLogoFadeInDelay(0),
|
||||
logoAndProgressLogoFadeInDelay(0.2),
|
||||
showProgressBar(true),
|
||||
progressBarMinWidth(40),
|
||||
progressBarMaxWidth(200),
|
||||
|
@@ -113,7 +113,7 @@ bool ObjectsContainersList::HasObjectWithVariableNamed(
|
||||
return false;
|
||||
}
|
||||
|
||||
bool ObjectsContainersList::HasObjectOrGroupVariablesContainer(
|
||||
bool ObjectsContainersList::HasVariablesContainer(
|
||||
const gd::String& objectOrGroupName,
|
||||
const gd::VariablesContainer& variablesContainer) const {
|
||||
for (auto it = objectsContainers.rbegin(); it != objectsContainers.rend();
|
||||
@@ -123,31 +123,8 @@ bool ObjectsContainersList::HasObjectOrGroupVariablesContainer(
|
||||
&(*it)->GetObject(objectOrGroupName).GetVariables();
|
||||
}
|
||||
if ((*it)->GetObjectGroups().Has(objectOrGroupName)) {
|
||||
// For groups, we consider that the first object of the group defines the
|
||||
// variables available for this group. Note that this is slightly
|
||||
// different than other methods where a group is considered as the
|
||||
// "intersection" of all of its objects.
|
||||
const auto& objectNames =
|
||||
(*it)->GetObjectGroups().Get(objectOrGroupName).GetAllObjectsNames();
|
||||
|
||||
if (!objectNames.empty()) {
|
||||
return HasObjectVariablesContainer(objectNames[0], variablesContainer);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool ObjectsContainersList::HasObjectVariablesContainer(
|
||||
const gd::String& objectName,
|
||||
const gd::VariablesContainer& variablesContainer) const {
|
||||
for (auto it = objectsContainers.rbegin(); it != objectsContainers.rend();
|
||||
++it) {
|
||||
if ((*it)->HasObjectNamed(objectName)) {
|
||||
return &variablesContainer ==
|
||||
&(*it)->GetObject(objectName).GetVariables();
|
||||
// Could be adapted if objects groups have variables in the future.
|
||||
// This would allow handling the renaming of variables of an object group.
|
||||
}
|
||||
}
|
||||
|
||||
@@ -163,30 +140,8 @@ ObjectsContainersList::GetObjectOrGroupVariablesContainer(
|
||||
return &(*it)->GetObject(objectOrGroupName).GetVariables();
|
||||
}
|
||||
if ((*it)->GetObjectGroups().Has(objectOrGroupName)) {
|
||||
// For groups, we consider that the first object of the group defines the
|
||||
// variables available for this group. Note that this is slightly
|
||||
// different than other methods where a group is considered as the
|
||||
// "intersection" of all of its objects.
|
||||
const auto& objectNames =
|
||||
(*it)->GetObjectGroups().Get(objectOrGroupName).GetAllObjectsNames();
|
||||
|
||||
if (!objectNames.empty()) {
|
||||
return GetObjectVariablesContainer(objectNames[0]);
|
||||
}
|
||||
return nullptr;
|
||||
}
|
||||
}
|
||||
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
const gd::VariablesContainer*
|
||||
ObjectsContainersList::GetObjectVariablesContainer(
|
||||
const gd::String& objectName) const {
|
||||
for (auto it = objectsContainers.rbegin(); it != objectsContainers.rend();
|
||||
++it) {
|
||||
if ((*it)->HasObjectNamed(objectName)) {
|
||||
return &(*it)->GetObject(objectName).GetVariables();
|
||||
// Could be adapted if objects groups have variables in the future.
|
||||
// This would allow handling the renaming of variables of an object group.
|
||||
}
|
||||
}
|
||||
|
||||
@@ -195,6 +150,7 @@ ObjectsContainersList::GetObjectVariablesContainer(
|
||||
|
||||
gd::Variable::Type ObjectsContainersList::GetTypeOfObjectOrGroupVariable(
|
||||
const gd::String& objectOrGroupName, const gd::String& variableName) const {
|
||||
|
||||
for (auto it = objectsContainers.rbegin(); it != objectsContainers.rend();
|
||||
++it) {
|
||||
if ((*it)->HasObjectNamed(objectOrGroupName)) {
|
||||
@@ -226,12 +182,13 @@ gd::Variable::Type ObjectsContainersList::GetTypeOfObjectOrGroupVariable(
|
||||
return Variable::Type::Number;
|
||||
}
|
||||
|
||||
gd::Variable::Type ObjectsContainersList::GetTypeOfObjectVariable(
|
||||
const gd::String& objectName, const gd::String& variableName) const {
|
||||
gd::Variable::Type ObjectsContainersList::GetTypeOfObjectVariable(const gd::String& objectName, const gd::String& variableName) const {
|
||||
|
||||
for (auto it = objectsContainers.rbegin(); it != objectsContainers.rend();
|
||||
++it) {
|
||||
if ((*it)->HasObjectNamed(objectName)) {
|
||||
const auto& variables = (*it)->GetObject(objectName).GetVariables();
|
||||
const auto& variables =
|
||||
(*it)->GetObject(objectName).GetVariables();
|
||||
|
||||
return variables.Get(variableName).GetType();
|
||||
}
|
||||
|
@@ -61,7 +61,7 @@ class GD_CORE_API ObjectsContainersList {
|
||||
* \brief Check if the specified object or group has the specified variables
|
||||
* container.
|
||||
*/
|
||||
bool HasObjectOrGroupVariablesContainer(
|
||||
bool HasVariablesContainer(
|
||||
const gd::String& objectOrGroupName,
|
||||
const gd::VariablesContainer& variablesContainer) const;
|
||||
|
||||
@@ -165,13 +165,6 @@ class GD_CORE_API ObjectsContainersList {
|
||||
bool HasObjectWithVariableNamed(const gd::String& objectName,
|
||||
const gd::String& variableName) const;
|
||||
|
||||
bool HasObjectVariablesContainer(
|
||||
const gd::String& objectName,
|
||||
const gd::VariablesContainer& variablesContainer) const;
|
||||
|
||||
const gd::VariablesContainer* GetObjectVariablesContainer(
|
||||
const gd::String& objectName) const;
|
||||
|
||||
gd::Variable::Type GetTypeOfObjectVariable(const gd::String& objectName, const gd::String& variableName) const;
|
||||
|
||||
void ForEachObjectVariableMatchingSearch(
|
||||
|
@@ -403,11 +403,6 @@ String String::LowerCase() const
|
||||
return lowerCasedStr;
|
||||
}
|
||||
|
||||
String String::CapitalizeFirstLetter() const
|
||||
{
|
||||
return size() < 1 ? *this : substr(0, 1).UpperCase() + substr(1);
|
||||
}
|
||||
|
||||
String String::FindAndReplace(String search, String replacement, bool all) const
|
||||
{
|
||||
gd::String result(*this);
|
||||
|
@@ -522,11 +522,6 @@ public:
|
||||
*/
|
||||
String LowerCase() const;
|
||||
|
||||
/**
|
||||
* \brief Returns the string with the first letter in upper case.
|
||||
*/
|
||||
String CapitalizeFirstLetter() const;
|
||||
|
||||
/**
|
||||
* \brief Searches a string for a specified substring and returns a new string where all occurrences of this substring is replaced.
|
||||
* \param search The string that will be replaced by the new string.
|
||||
|
@@ -29,9 +29,7 @@
|
||||
#include "GDCore/Project/ExternalEvents.h"
|
||||
|
||||
class ArbitraryResourceWorkerTest : public gd::ArbitraryResourceWorker {
|
||||
public:
|
||||
ArbitraryResourceWorkerTest(gd::ResourcesManager &resourcesManager)
|
||||
: ArbitraryResourceWorker(resourcesManager){};
|
||||
public:
|
||||
virtual void ExposeFile(gd::String& file) { files.push_back(file); };
|
||||
virtual void ExposeImage(gd::String& imageName) {
|
||||
images.push_back(imageName);
|
||||
@@ -61,7 +59,7 @@ TEST_CASE("ArbitraryResourceWorker", "[common][resources]") {
|
||||
"res3", "path/to/file3.png", "image");
|
||||
project.GetResourcesManager().AddResource(
|
||||
"res4", "path/to/file4.png", "audio");
|
||||
ArbitraryResourceWorkerTest worker(project.GetResourcesManager());
|
||||
ArbitraryResourceWorkerTest worker;
|
||||
|
||||
gd::ResourceExposer::ExposeWholeProjectResources(project, worker);
|
||||
REQUIRE(worker.files.size() == 4);
|
||||
@@ -83,7 +81,7 @@ TEST_CASE("ArbitraryResourceWorker", "[common][resources]") {
|
||||
"res3", "path/to/file3.png", "image");
|
||||
project.GetResourcesManager().AddResource(
|
||||
"res4", "path/to/file4.png", "audio");
|
||||
ArbitraryResourceWorkerTest worker(project.GetResourcesManager());
|
||||
ArbitraryResourceWorkerTest worker;
|
||||
|
||||
gd::SpriteObject spriteConfiguration;
|
||||
gd::Animation anim;
|
||||
@@ -128,7 +126,7 @@ TEST_CASE("ArbitraryResourceWorker", "[common][resources]") {
|
||||
"res3", "path/to/file3.png", "image");
|
||||
project.GetResourcesManager().AddResource(
|
||||
"res4", "path/to/file4.png", "audio");
|
||||
ArbitraryResourceWorkerTest worker(project.GetResourcesManager());
|
||||
ArbitraryResourceWorkerTest worker;
|
||||
|
||||
auto& layout = project.InsertNewLayout("Scene", 0);
|
||||
|
||||
@@ -163,7 +161,7 @@ TEST_CASE("ArbitraryResourceWorker", "[common][resources]") {
|
||||
"res3", "path/to/file3.fnt", "bitmapFont");
|
||||
project.GetResourcesManager().AddResource(
|
||||
"res4", "path/to/file4.png", "audio");
|
||||
ArbitraryResourceWorkerTest worker(project.GetResourcesManager());
|
||||
ArbitraryResourceWorkerTest worker;
|
||||
|
||||
auto& layout = project.InsertNewLayout("Scene", 0);
|
||||
|
||||
@@ -198,7 +196,7 @@ TEST_CASE("ArbitraryResourceWorker", "[common][resources]") {
|
||||
"res3", "path/to/file3.fnt", "bitmapFont");
|
||||
project.GetResourcesManager().AddResource(
|
||||
"res4", "path/to/file4.png", "audio");
|
||||
ArbitraryResourceWorkerTest worker(project.GetResourcesManager());
|
||||
ArbitraryResourceWorkerTest worker;
|
||||
|
||||
auto& externalEvents = project.InsertNewExternalEvents("MyExternalEvents", 0);
|
||||
|
||||
@@ -234,7 +232,7 @@ TEST_CASE("ArbitraryResourceWorker", "[common][resources]") {
|
||||
"res2", "path/to/file2.png", "image");
|
||||
project.GetResourcesManager().AddResource(
|
||||
"res3", "path/to/file3.png", "image");
|
||||
ArbitraryResourceWorkerTest worker(project.GetResourcesManager());
|
||||
ArbitraryResourceWorkerTest worker;
|
||||
|
||||
auto& extension = project.InsertNewEventsFunctionsExtension("MyEventExtension", 0);
|
||||
auto& function = extension.InsertNewEventsFunction("MyFreeFunction", 0);
|
||||
@@ -271,7 +269,7 @@ TEST_CASE("ArbitraryResourceWorker", "[common][resources]") {
|
||||
"res2", "path/to/file2.png", "image");
|
||||
project.GetResourcesManager().AddResource(
|
||||
"res3", "path/to/file3.png", "image");
|
||||
ArbitraryResourceWorkerTest worker(project.GetResourcesManager());
|
||||
ArbitraryResourceWorkerTest worker;
|
||||
|
||||
auto& extension = project.InsertNewEventsFunctionsExtension("MyEventExtension", 0);
|
||||
auto& behavior = extension.GetEventsBasedBehaviors().InsertNew("MyBehavior", 0);
|
||||
@@ -309,7 +307,7 @@ TEST_CASE("ArbitraryResourceWorker", "[common][resources]") {
|
||||
"res2", "path/to/file2.png", "image");
|
||||
project.GetResourcesManager().AddResource(
|
||||
"res3", "path/to/file3.png", "image");
|
||||
ArbitraryResourceWorkerTest worker(project.GetResourcesManager());
|
||||
ArbitraryResourceWorkerTest worker;
|
||||
|
||||
auto& extension = project.InsertNewEventsFunctionsExtension("MyEventExtension", 0);
|
||||
auto& object = extension.GetEventsBasedObjects().InsertNew("MyObject", 0);
|
||||
@@ -347,7 +345,7 @@ TEST_CASE("ArbitraryResourceWorker", "[common][resources]") {
|
||||
"res2", "path/to/file2.png", "image");
|
||||
project.GetResourcesManager().AddResource(
|
||||
"res3", "path/to/file3.png", "image");
|
||||
ArbitraryResourceWorkerTest worker(project.GetResourcesManager());
|
||||
ArbitraryResourceWorkerTest worker;
|
||||
|
||||
auto& layout = project.InsertNewLayout("Scene", 0);
|
||||
layout.InsertNewLayer("MyLayer", 0);
|
||||
@@ -373,7 +371,7 @@ TEST_CASE("ArbitraryResourceWorker", "[common][resources]") {
|
||||
"res2", "path/to/file2.png", "image");
|
||||
project.GetResourcesManager().AddResource(
|
||||
"res3", "path/to/file3.png", "image");
|
||||
ArbitraryResourceWorkerTest worker(project.GetResourcesManager());
|
||||
ArbitraryResourceWorkerTest worker;
|
||||
|
||||
auto& layout = project.InsertNewLayout("Scene", 0);
|
||||
layout.InsertNewLayer("MyLayer", 0);
|
||||
@@ -404,7 +402,7 @@ TEST_CASE("ArbitraryResourceWorker", "[common][resources]") {
|
||||
"res3", "path/to/file3.png", "image");
|
||||
project.GetResourcesManager().AddResource(
|
||||
"res4", "path/to/file4.png", "audio");
|
||||
ArbitraryResourceWorkerTest worker(project.GetResourcesManager());
|
||||
ArbitraryResourceWorkerTest worker;
|
||||
|
||||
auto& layout = project.InsertNewLayout("Scene", 0);
|
||||
|
||||
@@ -427,7 +425,7 @@ TEST_CASE("ArbitraryResourceWorker", "[common][resources]") {
|
||||
"res3", "path/to/file3.png", "image");
|
||||
project.GetResourcesManager().AddResource(
|
||||
"res4", "path/to/file4.png", "audio");
|
||||
ArbitraryResourceWorkerTest worker(project.GetResourcesManager());
|
||||
ArbitraryResourceWorkerTest worker;
|
||||
|
||||
auto& layout = project.InsertNewLayout("Scene", 0);
|
||||
|
||||
@@ -461,7 +459,7 @@ TEST_CASE("ArbitraryResourceWorker", "[common][resources]") {
|
||||
"res3", "path/to/file3.fnt", "bitmapFont");
|
||||
project.GetResourcesManager().AddResource(
|
||||
"res4", "path/to/file4.png", "audio");
|
||||
ArbitraryResourceWorkerTest worker(project.GetResourcesManager());
|
||||
ArbitraryResourceWorkerTest worker;
|
||||
|
||||
auto& layout = project.InsertNewLayout("Scene", 0);
|
||||
|
||||
@@ -496,7 +494,7 @@ TEST_CASE("ArbitraryResourceWorker", "[common][resources]") {
|
||||
"res3", "path/to/file3.fnt", "bitmapFont");
|
||||
project.GetResourcesManager().AddResource(
|
||||
"res4", "path/to/file4.png", "audio");
|
||||
ArbitraryResourceWorkerTest worker(project.GetResourcesManager());
|
||||
ArbitraryResourceWorkerTest worker;
|
||||
|
||||
auto& layout = project.InsertNewLayout("MyScene", 0);
|
||||
auto& externalEvents = project.InsertNewExternalEvents("MyExternalEvents", 0);
|
||||
@@ -532,7 +530,7 @@ TEST_CASE("ArbitraryResourceWorker", "[common][resources]") {
|
||||
"res3", "path/to/file3.fnt", "bitmapFont");
|
||||
project.GetResourcesManager().AddResource(
|
||||
"res4", "path/to/file4.png", "audio");
|
||||
ArbitraryResourceWorkerTest worker(project.GetResourcesManager());
|
||||
ArbitraryResourceWorkerTest worker;
|
||||
|
||||
auto& layout = project.InsertNewLayout("MyScene", 0);
|
||||
auto& externalEvents = project.InsertNewExternalEvents("MyExternalEvents", 0);
|
||||
@@ -574,7 +572,7 @@ TEST_CASE("ArbitraryResourceWorker", "[common][resources]") {
|
||||
"res3", "path/to/file3.fnt", "bitmapFont");
|
||||
project.GetResourcesManager().AddResource(
|
||||
"res4", "path/to/file4.png", "audio");
|
||||
ArbitraryResourceWorkerTest worker(project.GetResourcesManager());
|
||||
ArbitraryResourceWorkerTest worker;
|
||||
|
||||
auto& layout = project.InsertNewLayout("Scene", 0);
|
||||
auto& externalEventsA = project.InsertNewExternalEvents("MyExternalEventsA", 0);
|
||||
@@ -621,7 +619,7 @@ TEST_CASE("ArbitraryResourceWorker", "[common][resources]") {
|
||||
"res3", "path/to/file3.fnt", "bitmapFont");
|
||||
project.GetResourcesManager().AddResource(
|
||||
"res4", "path/to/file4.png", "audio");
|
||||
ArbitraryResourceWorkerTest worker(project.GetResourcesManager());
|
||||
ArbitraryResourceWorkerTest worker;
|
||||
|
||||
auto& layout = project.InsertNewLayout("MyScene", 0);
|
||||
auto& otherLayout = project.InsertNewLayout("MyOtherScene", 0);
|
||||
@@ -656,7 +654,7 @@ TEST_CASE("ArbitraryResourceWorker", "[common][resources]") {
|
||||
"res3", "path/to/file3.fnt", "bitmapFont");
|
||||
project.GetResourcesManager().AddResource(
|
||||
"res4", "path/to/file4.png", "audio");
|
||||
ArbitraryResourceWorkerTest worker(project.GetResourcesManager());
|
||||
ArbitraryResourceWorkerTest worker;
|
||||
|
||||
auto& layout = project.InsertNewLayout("MyScene", 0);
|
||||
auto& otherLayout = project.InsertNewLayout("MyOtherScene", 0);
|
||||
@@ -698,7 +696,7 @@ TEST_CASE("ArbitraryResourceWorker", "[common][resources]") {
|
||||
"res3", "path/to/file3.fnt", "bitmapFont");
|
||||
project.GetResourcesManager().AddResource(
|
||||
"res4", "path/to/file4.png", "audio");
|
||||
ArbitraryResourceWorkerTest worker(project.GetResourcesManager());
|
||||
ArbitraryResourceWorkerTest worker;
|
||||
|
||||
auto& layout = project.InsertNewLayout("MyScene", 0);
|
||||
|
||||
@@ -742,7 +740,7 @@ TEST_CASE("ArbitraryResourceWorker", "[common][resources]") {
|
||||
"res2", "path/to/file2.png", "image");
|
||||
project.GetResourcesManager().AddResource(
|
||||
"res3", "path/to/file3.png", "image");
|
||||
ArbitraryResourceWorkerTest worker(project.GetResourcesManager());
|
||||
ArbitraryResourceWorkerTest worker;
|
||||
|
||||
auto& extension = project.InsertNewEventsFunctionsExtension("MyEventExtension", 0);
|
||||
auto& function = extension.InsertNewEventsFunction("MyFreeFunction", 0);
|
||||
@@ -782,7 +780,7 @@ TEST_CASE("ArbitraryResourceWorker", "[common][resources]") {
|
||||
"res2", "path/to/file2.png", "image");
|
||||
project.GetResourcesManager().AddResource(
|
||||
"res3", "path/to/file3.png", "image");
|
||||
ArbitraryResourceWorkerTest worker(project.GetResourcesManager());
|
||||
ArbitraryResourceWorkerTest worker;
|
||||
|
||||
auto& extension = project.InsertNewEventsFunctionsExtension("MyEventExtension", 0);
|
||||
auto& behavior = extension.GetEventsBasedBehaviors().InsertNew("MyBehavior", 0);
|
||||
@@ -823,7 +821,7 @@ TEST_CASE("ArbitraryResourceWorker", "[common][resources]") {
|
||||
"res2", "path/to/file2.png", "image");
|
||||
project.GetResourcesManager().AddResource(
|
||||
"res3", "path/to/file3.png", "image");
|
||||
ArbitraryResourceWorkerTest worker(project.GetResourcesManager());
|
||||
ArbitraryResourceWorkerTest worker;
|
||||
|
||||
auto& extension = project.InsertNewEventsFunctionsExtension("MyEventExtension", 0);
|
||||
auto& object = extension.GetEventsBasedObjects().InsertNew("MyObject", 0);
|
||||
@@ -864,7 +862,7 @@ TEST_CASE("ArbitraryResourceWorker", "[common][resources]") {
|
||||
"res2", "path/to/file2.png", "image");
|
||||
project.GetResourcesManager().AddResource(
|
||||
"res3", "path/to/file3.png", "image");
|
||||
ArbitraryResourceWorkerTest worker(project.GetResourcesManager());
|
||||
ArbitraryResourceWorkerTest worker;
|
||||
|
||||
auto& layout = project.InsertNewLayout("Scene", 0);
|
||||
layout.InsertNewLayer("MyLayer", 0);
|
||||
@@ -889,7 +887,7 @@ TEST_CASE("ArbitraryResourceWorker", "[common][resources]") {
|
||||
"res2", "path/to/file2.png", "image");
|
||||
project.GetResourcesManager().AddResource(
|
||||
"res3", "path/to/file3.png", "image");
|
||||
ArbitraryResourceWorkerTest worker(project.GetResourcesManager());
|
||||
ArbitraryResourceWorkerTest worker;
|
||||
|
||||
auto& layout = project.InsertNewLayout("Scene", 0);
|
||||
layout.InsertNewLayer("MyLayer", 0);
|
||||
|
@@ -1252,49 +1252,6 @@ TEST_CASE("ExpressionCodeGenerator", "[common][events]") {
|
||||
"MySpriteObject.getObjectStringWith2ObjectParam(fakeObjectListOf_"
|
||||
"Object1, fakeObjectListOf_Object2) ?? \"\"");
|
||||
}
|
||||
SECTION("Edge cases (variables with object name in objectvar parameter)") {
|
||||
SECTION("Simple case") {
|
||||
gd::String output = gd::ExpressionCodeGenerator::GenerateExpressionCode(
|
||||
codeGenerator,
|
||||
context,
|
||||
"objectvar", // We suppose we generate an "objectvar" parameter.
|
||||
"MyOtherSpriteObject", // This "variable name" is the same as an object name (but this is valid).
|
||||
"MySpriteObject" // The object owning the variable: MySpriteObject.
|
||||
);
|
||||
|
||||
// This seems "obvious", but we had cases where MyOtherSpriteObject could have been interpreted as an object
|
||||
// when the code generation is not properly recognizing "objectvar".
|
||||
REQUIRE(output == "getVariableForObject(MySpriteObject, MyOtherSpriteObject)");
|
||||
}
|
||||
|
||||
SECTION("With child variable") {
|
||||
gd::String output = gd::ExpressionCodeGenerator::GenerateExpressionCode(
|
||||
codeGenerator,
|
||||
context,
|
||||
"objectvar", // We suppose we generate an "objectvar" parameter.
|
||||
"MyOtherSpriteObject.Child", // This "variable name" is the same as an object name (but this is valid).
|
||||
"MySpriteObject" // The object owning the variable: MySpriteObject.
|
||||
);
|
||||
|
||||
// This seems "obvious", but we had cases where MyOtherSpriteObject could have been interpreted as an object
|
||||
// when the code generation is not properly recognizing "objectvar".
|
||||
REQUIRE(output == "getVariableForObject(MySpriteObject, MyOtherSpriteObject).getChild(\"Child\")");
|
||||
}
|
||||
|
||||
SECTION("With child and grandchild variable") {
|
||||
gd::String output = gd::ExpressionCodeGenerator::GenerateExpressionCode(
|
||||
codeGenerator,
|
||||
context,
|
||||
"objectvar", // We suppose we generate an "objectvar" parameter.
|
||||
"MyOtherSpriteObject.Child.Grandchild", // This "variable name" is the same as an object name (but this is valid).
|
||||
"MySpriteObject" // The object owning the variable: MySpriteObject.
|
||||
);
|
||||
|
||||
// This seems "obvious", but we had cases where MyOtherSpriteObject could have been interpreted as an object
|
||||
// when the code generation is not properly recognizing "objectvar".
|
||||
REQUIRE(output == "getVariableForObject(MySpriteObject, MyOtherSpriteObject).getChild(\"Child\").getChild(\"Grandchild\")");
|
||||
}
|
||||
}
|
||||
SECTION("Mixed test (1)") {
|
||||
{
|
||||
auto node = parser.ParseExpression("-+-MyExtension::MouseX(,)");
|
||||
|
@@ -11,7 +11,6 @@
|
||||
#include "GDCore/IDE/Events/ExpressionValidator.h"
|
||||
#include "GDCore/IDE/Events/ExpressionTypeFinder.h"
|
||||
#include "GDCore/IDE/Events/ExpressionVariableOwnerFinder.h"
|
||||
#include "GDCore/IDE/Events/ExpressionVariableParentFinder.h"
|
||||
#include "GDCore/Project/Layout.h"
|
||||
#include "GDCore/Project/Project.h"
|
||||
#include "GDCore/Project/ProjectScopedContainers.h"
|
||||
@@ -1607,21 +1606,6 @@ TEST_CASE("ExpressionParser2", "[common][events]") {
|
||||
}
|
||||
}
|
||||
|
||||
SECTION("Invalid object variables (empty variable name, extra dot)") {
|
||||
{
|
||||
auto node =
|
||||
parser.ParseExpression("MySpriteObjects..");
|
||||
|
||||
gd::ExpressionValidator validator(platform, projectScopedContainers, "number|string");
|
||||
node->Visit(validator);
|
||||
REQUIRE(validator.GetFatalErrors().size() == 2);
|
||||
REQUIRE(validator.GetFatalErrors()[0]->GetMessage() ==
|
||||
"A name should be entered after the dot.");
|
||||
REQUIRE(validator.GetFatalErrors()[1]->GetMessage() ==
|
||||
"A name should be entered after the dot.");
|
||||
}
|
||||
}
|
||||
|
||||
SECTION("Invalid object variables (object group, partially existing variable)") {
|
||||
{
|
||||
auto node =
|
||||
@@ -1706,42 +1690,6 @@ TEST_CASE("ExpressionParser2", "[common][events]") {
|
||||
"An object variable or expression should be entered.");
|
||||
}
|
||||
}
|
||||
SECTION("Invalid object variables (extra dot)") {
|
||||
{
|
||||
auto node =
|
||||
parser.ParseExpression("MySpriteObject.MyVariable.");
|
||||
|
||||
gd::ExpressionValidator validator(platform, projectScopedContainers, "number|string");
|
||||
node->Visit(validator);
|
||||
REQUIRE(validator.GetFatalErrors().size() == 1);
|
||||
REQUIRE(validator.GetFatalErrors()[0]->GetMessage() ==
|
||||
"A name should be entered after the dot.");
|
||||
}
|
||||
}
|
||||
SECTION("Invalid object variables (extra dot after brackets)") {
|
||||
{
|
||||
auto node =
|
||||
parser.ParseExpression("MySpriteObject.MyVariable[\"MyChild\"].");
|
||||
|
||||
gd::ExpressionValidator validator(platform, projectScopedContainers, "number|string");
|
||||
node->Visit(validator);
|
||||
REQUIRE(validator.GetFatalErrors().size() == 1);
|
||||
REQUIRE(validator.GetFatalErrors()[0]->GetMessage() ==
|
||||
"A name should be entered after the dot.");
|
||||
}
|
||||
}
|
||||
SECTION("Invalid object variables (extra dot before brackets)") {
|
||||
{
|
||||
auto node =
|
||||
parser.ParseExpression("MySpriteObject.MyVariable.[\"MyChild\"]");
|
||||
|
||||
gd::ExpressionValidator validator(platform, projectScopedContainers, "number|string");
|
||||
node->Visit(validator);
|
||||
REQUIRE(validator.GetFatalErrors().size() == 1);
|
||||
REQUIRE(validator.GetFatalErrors()[0]->GetMessage() ==
|
||||
"A name should be entered after the dot.");
|
||||
}
|
||||
}
|
||||
|
||||
SECTION("Valid property") {
|
||||
gd::PropertiesContainer propertiesContainer(gd::EventsFunctionsContainer::Extension);
|
||||
@@ -2208,14 +2156,6 @@ TEST_CASE("ExpressionParser2", "[common][events]") {
|
||||
dynamic_cast<gd::IdentifierNode &>(*node);
|
||||
REQUIRE(identifierNode.identifierName == "MyObject");
|
||||
REQUIRE(identifierNode.childIdentifierName == "");
|
||||
|
||||
gd::ExpressionValidator validator(platform, projectScopedContainers, "number");
|
||||
node->Visit(validator);
|
||||
REQUIRE(validator.GetFatalErrors().size() == 2);
|
||||
REQUIRE(validator.GetFatalErrors()[0]->GetMessage() ==
|
||||
"A name should be entered after the dot.");
|
||||
REQUIRE(validator.GetFatalErrors()[1]->GetMessage() ==
|
||||
"An object variable or expression should be entered.");
|
||||
}
|
||||
|
||||
SECTION("Unfinished object function name of type string with parentheses") {
|
||||
@@ -2227,14 +2167,6 @@ TEST_CASE("ExpressionParser2", "[common][events]") {
|
||||
REQUIRE(objectFunctionCall.objectName == "MyObject");
|
||||
REQUIRE(objectFunctionCall.functionName == "");
|
||||
REQUIRE(type == "string");
|
||||
|
||||
gd::ExpressionValidator validator(platform, projectScopedContainers, "number");
|
||||
node->Visit(validator);
|
||||
REQUIRE(validator.GetFatalErrors().size() == 2);
|
||||
REQUIRE(validator.GetFatalErrors()[0]->GetMessage() ==
|
||||
"A name should be entered after the dot.");
|
||||
REQUIRE(validator.GetFatalErrors()[1]->GetMessage() ==
|
||||
"Enter the name of the function to call.");
|
||||
}
|
||||
|
||||
SECTION("Unfinished object function name of type number with parentheses") {
|
||||
@@ -2261,19 +2193,6 @@ TEST_CASE("ExpressionParser2", "[common][events]") {
|
||||
REQUIRE(type == "number|string");
|
||||
}
|
||||
|
||||
SECTION("Unfinished object function/variable name with multiple dots") {
|
||||
auto node = parser.ParseExpression("MyObject..");
|
||||
REQUIRE(node != nullptr);
|
||||
|
||||
gd::ExpressionValidator validator(platform, projectScopedContainers, "number");
|
||||
node->Visit(validator);
|
||||
REQUIRE(validator.GetFatalErrors().size() == 2);
|
||||
REQUIRE(validator.GetFatalErrors()[0]->GetMessage() ==
|
||||
"A name should be entered after the dot.");
|
||||
REQUIRE(validator.GetFatalErrors()[1]->GetMessage() ==
|
||||
"A name should be entered after the dot.");
|
||||
}
|
||||
|
||||
SECTION("Unfinished object behavior name") {
|
||||
auto node = parser.ParseExpression("MyObject.MyBehavior::");
|
||||
REQUIRE(node != nullptr);
|
||||
@@ -2282,12 +2201,6 @@ TEST_CASE("ExpressionParser2", "[common][events]") {
|
||||
REQUIRE(objectFunctionName.objectName == "MyObject");
|
||||
REQUIRE(objectFunctionName.objectFunctionOrBehaviorName == "MyBehavior");
|
||||
REQUIRE(objectFunctionName.behaviorFunctionName == "");
|
||||
|
||||
gd::ExpressionValidator validator(platform, projectScopedContainers, "number");
|
||||
node->Visit(validator);
|
||||
REQUIRE(validator.GetFatalErrors().size() == 1);
|
||||
REQUIRE(validator.GetFatalErrors()[0]->GetMessage() ==
|
||||
"An opening parenthesis was expected here to call a function.");
|
||||
}
|
||||
|
||||
SECTION("Unfinished object behavior name of type string with parentheses") {
|
||||
@@ -2300,12 +2213,6 @@ TEST_CASE("ExpressionParser2", "[common][events]") {
|
||||
REQUIRE(objectFunctionName.behaviorName == "MyBehavior");
|
||||
REQUIRE(objectFunctionName.functionName == "");
|
||||
REQUIRE(type == "string");
|
||||
|
||||
gd::ExpressionValidator validator(platform, projectScopedContainers, "number");
|
||||
node->Visit(validator);
|
||||
REQUIRE(validator.GetFatalErrors().size() == 1);
|
||||
REQUIRE(validator.GetFatalErrors()[0]->GetMessage() ==
|
||||
"Enter the name of the function to call.");
|
||||
}
|
||||
|
||||
SECTION("Unfinished object behavior name of type number with parentheses") {
|
||||
@@ -2591,8 +2498,10 @@ TEST_CASE("ExpressionParser2", "[common][events]") {
|
||||
node->Visit(validator);
|
||||
REQUIRE(validator.GetFatalErrors().size() == 1);
|
||||
|
||||
// TODO: The error message could be improved
|
||||
REQUIRE(validator.GetFatalErrors()[0]->GetMessage() ==
|
||||
"Enter the name of the function to call.");
|
||||
"Cannot find an expression with this name: \nDouble "
|
||||
"check that you've not made any typo in the name.");
|
||||
REQUIRE(validator.GetFatalErrors()[0]->GetStartPosition() == 0);
|
||||
REQUIRE(validator.GetFatalErrors()[0]->GetEndPosition() == 25);
|
||||
}
|
||||
@@ -2900,8 +2809,8 @@ TEST_CASE("ExpressionParser2", "[common][events]") {
|
||||
// as ExpressionVariableOwnerFinder depends on this parameter type
|
||||
// information.
|
||||
auto node = parser.ParseExpression(
|
||||
"MyExtension::GetStringWith2ObjectParamAnd2ObjectVarParam(MySpriteObject, "
|
||||
"MyVariable, MySpriteObject2, MyVariable2)");
|
||||
"MyExtension::GetStringWith2ObjectParamAnd2ObjectVarParam(MyObject1, "
|
||||
"MyVar1, MyObject2, MyVar2)");
|
||||
REQUIRE(node != nullptr);
|
||||
auto &functionNode = dynamic_cast<gd::FunctionCallNode &>(*node);
|
||||
auto &identifierObject1Node =
|
||||
@@ -2913,25 +2822,17 @@ TEST_CASE("ExpressionParser2", "[common][events]") {
|
||||
auto &variable2Node =
|
||||
dynamic_cast<gd::IdentifierNode &>(*functionNode.parameters[3]);
|
||||
|
||||
REQUIRE(identifierObject1Node.identifierName == "MySpriteObject");
|
||||
REQUIRE(identifierObject2Node.identifierName == "MySpriteObject2");
|
||||
REQUIRE(variable1Node.identifierName == "MyVariable");
|
||||
REQUIRE(variable2Node.identifierName == "MyVariable2");
|
||||
REQUIRE(identifierObject1Node.identifierName == "MyObject1");
|
||||
REQUIRE(identifierObject2Node.identifierName == "MyObject2");
|
||||
REQUIRE(variable1Node.identifierName == "MyVar1");
|
||||
REQUIRE(variable2Node.identifierName == "MyVar2");
|
||||
|
||||
auto variable1ObjectName = gd::ExpressionVariableOwnerFinder::GetObjectName(
|
||||
platform, objectsContainersList, "", variable1Node);
|
||||
REQUIRE(variable1ObjectName == "MySpriteObject");
|
||||
REQUIRE(variable1ObjectName == "MyObject1");
|
||||
auto variable2ObjectName = gd::ExpressionVariableOwnerFinder::GetObjectName(
|
||||
platform, objectsContainersList, "", variable2Node);
|
||||
REQUIRE(variable2ObjectName == "MySpriteObject2");
|
||||
|
||||
// Also check the ability to find the last parent of the variables:
|
||||
auto lastParentOfVariable1Node = gd::ExpressionVariableParentFinder::GetLastParentOfNode(
|
||||
platform, projectScopedContainers, variable1Node);
|
||||
REQUIRE(lastParentOfVariable1Node.parentVariablesContainer == &mySpriteObject.GetVariables());
|
||||
auto lastParentOfVariable2Node = gd::ExpressionVariableParentFinder::GetLastParentOfNode(
|
||||
platform, projectScopedContainers, variable2Node);
|
||||
REQUIRE(lastParentOfVariable2Node.parentVariablesContainer == &mySpriteObject2.GetVariables());
|
||||
REQUIRE(variable2ObjectName == "MyObject2");
|
||||
|
||||
gd::ExpressionValidator validator(platform, projectScopedContainers, "string");
|
||||
node->Visit(validator);
|
||||
@@ -2942,8 +2843,8 @@ TEST_CASE("ExpressionParser2", "[common][events]") {
|
||||
SECTION("Valid function call with 2 object variable from the same object") {
|
||||
{
|
||||
auto node = parser.ParseExpression(
|
||||
"MyExtension::GetStringWith1ObjectParamAnd2ObjectVarParam(MySpriteObject, "
|
||||
"MyVariable, MyVariable2)");
|
||||
"MyExtension::GetStringWith1ObjectParamAnd2ObjectVarParam(MyObject1, "
|
||||
"MyVar1, MyVar2)");
|
||||
REQUIRE(node != nullptr);
|
||||
auto &functionNode = dynamic_cast<gd::FunctionCallNode &>(*node);
|
||||
auto &identifierObject1Node =
|
||||
@@ -2953,24 +2854,16 @@ TEST_CASE("ExpressionParser2", "[common][events]") {
|
||||
auto &variable2Node =
|
||||
dynamic_cast<gd::IdentifierNode &>(*functionNode.parameters[2]);
|
||||
|
||||
REQUIRE(identifierObject1Node.identifierName == "MySpriteObject");
|
||||
REQUIRE(variable1Node.identifierName == "MyVariable");
|
||||
REQUIRE(variable2Node.identifierName == "MyVariable2");
|
||||
REQUIRE(identifierObject1Node.identifierName == "MyObject1");
|
||||
REQUIRE(variable1Node.identifierName == "MyVar1");
|
||||
REQUIRE(variable2Node.identifierName == "MyVar2");
|
||||
|
||||
auto variable1ObjectName = gd::ExpressionVariableOwnerFinder::GetObjectName(
|
||||
platform, objectsContainersList, "", variable1Node);
|
||||
REQUIRE(variable1ObjectName == "MySpriteObject");
|
||||
REQUIRE(variable1ObjectName == "MyObject1");
|
||||
auto variable2ObjectName = gd::ExpressionVariableOwnerFinder::GetObjectName(
|
||||
platform, objectsContainersList, "", variable2Node);
|
||||
REQUIRE(variable2ObjectName == "MySpriteObject");
|
||||
|
||||
// Also check the ability to find the last parent of the variables:
|
||||
auto lastParentOfVariable1Node = gd::ExpressionVariableParentFinder::GetLastParentOfNode(
|
||||
platform, projectScopedContainers, variable1Node);
|
||||
REQUIRE(lastParentOfVariable1Node.parentVariablesContainer == &mySpriteObject.GetVariables());
|
||||
auto lastParentOfVariable2Node = gd::ExpressionVariableParentFinder::GetLastParentOfNode(
|
||||
platform, projectScopedContainers, variable2Node);
|
||||
REQUIRE(lastParentOfVariable2Node.parentVariablesContainer == &mySpriteObject.GetVariables());
|
||||
REQUIRE(variable2ObjectName == "MyObject1");
|
||||
|
||||
gd::ExpressionValidator validator(platform, projectScopedContainers, "string");
|
||||
node->Visit(validator);
|
||||
@@ -2981,23 +2874,18 @@ TEST_CASE("ExpressionParser2", "[common][events]") {
|
||||
SECTION("Valid object function call with 1 object variable from the object of the function") {
|
||||
{
|
||||
auto node = parser.ParseExpression(
|
||||
"MySpriteObject.GetObjectVariableAsNumber(MyVariable)");
|
||||
"MySpriteObject.GetObjectVariableAsNumber(MyVar1)");
|
||||
REQUIRE(node != nullptr);
|
||||
auto &functionNode = dynamic_cast<gd::FunctionCallNode &>(*node);
|
||||
auto &variable1Node =
|
||||
dynamic_cast<gd::IdentifierNode &>(*functionNode.parameters[0]);
|
||||
|
||||
REQUIRE(variable1Node.identifierName == "MyVariable");
|
||||
REQUIRE(variable1Node.identifierName == "MyVar1");
|
||||
|
||||
auto variable1ObjectName = gd::ExpressionVariableOwnerFinder::GetObjectName(
|
||||
platform, objectsContainersList, "MySpriteObject", variable1Node);
|
||||
REQUIRE(variable1ObjectName == "MySpriteObject");
|
||||
|
||||
// Also check the ability to find the last parent of the variable:
|
||||
auto lastParentOfVariable1Node = gd::ExpressionVariableParentFinder::GetLastParentOfNode(
|
||||
platform, projectScopedContainers, variable1Node);
|
||||
REQUIRE(lastParentOfVariable1Node.parentVariablesContainer == &mySpriteObject.GetVariables());
|
||||
|
||||
gd::ExpressionValidator validator(platform, projectScopedContainers, "number");
|
||||
node->Visit(validator);
|
||||
REQUIRE(validator.GetFatalErrors().size() == 0);
|
||||
@@ -3007,24 +2895,19 @@ TEST_CASE("ExpressionParser2", "[common][events]") {
|
||||
SECTION("Valid object function call with 1 object variable from the object of the function with a child") {
|
||||
{
|
||||
auto node = parser.ParseExpression(
|
||||
"MySpriteObject.GetObjectVariableAsNumber(MyVariable.MyChild)");
|
||||
"MySpriteObject.GetObjectVariableAsNumber(MyVar1.MyChild)");
|
||||
REQUIRE(node != nullptr);
|
||||
auto &functionNode = dynamic_cast<gd::FunctionCallNode &>(*node);
|
||||
auto &variable1Node =
|
||||
dynamic_cast<gd::IdentifierNode &>(*functionNode.parameters[0]);
|
||||
|
||||
REQUIRE(variable1Node.identifierName == "MyVariable");
|
||||
REQUIRE(variable1Node.identifierName == "MyVar1");
|
||||
REQUIRE(variable1Node.childIdentifierName == "MyChild");
|
||||
|
||||
auto variable1ObjectName = gd::ExpressionVariableOwnerFinder::GetObjectName(
|
||||
platform, objectsContainersList, "MySpriteObject", variable1Node);
|
||||
REQUIRE(variable1ObjectName == "MySpriteObject");
|
||||
|
||||
// Also check the ability to find the last parent of the variable:
|
||||
auto lastParentOfVariable1Node = gd::ExpressionVariableParentFinder::GetLastParentOfNode(
|
||||
platform, projectScopedContainers, variable1Node);
|
||||
REQUIRE(lastParentOfVariable1Node.parentVariable == &mySpriteObject.GetVariables().Get("MyVariable"));
|
||||
|
||||
gd::ExpressionValidator validator(platform, projectScopedContainers, "number");
|
||||
node->Visit(validator);
|
||||
REQUIRE(validator.GetFatalErrors().size() == 0);
|
||||
|
@@ -91,7 +91,8 @@ TEST_CASE("PropertyFunctionGenerator", "[common]") {
|
||||
auto &getterAction = getterEvent.GetActions().at(0);
|
||||
REQUIRE(getterAction.GetType() == "SetReturnNumber");
|
||||
REQUIRE(getterAction.GetParametersCount() == 1);
|
||||
REQUIRE(getterAction.GetParameter(0).GetPlainString() == "MovementAngle");
|
||||
REQUIRE(getterAction.GetParameter(0).GetPlainString() ==
|
||||
"Object.Behavior::PropertyMovementAngle()");
|
||||
}
|
||||
{
|
||||
auto &setter =
|
||||
@@ -123,7 +124,8 @@ TEST_CASE("PropertyFunctionGenerator", "[common]") {
|
||||
REQUIRE(setterAction.GetParameter(0).GetPlainString() == "Object");
|
||||
REQUIRE(setterAction.GetParameter(1).GetPlainString() == "Behavior");
|
||||
REQUIRE(setterAction.GetParameter(2).GetPlainString() == "=");
|
||||
REQUIRE(setterAction.GetParameter(3).GetPlainString() == "Value");
|
||||
REQUIRE(setterAction.GetParameter(3).GetPlainString() ==
|
||||
"GetArgumentAsNumber(\"Value\")");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -341,7 +343,8 @@ TEST_CASE("PropertyFunctionGenerator", "[common]") {
|
||||
auto &getterAction = getterEvent.GetActions().at(0);
|
||||
REQUIRE(getterAction.GetType() == "SetReturnNumber");
|
||||
REQUIRE(getterAction.GetParametersCount() == 1);
|
||||
REQUIRE(getterAction.GetParameter(0).GetPlainString() == "MovementAngle");
|
||||
REQUIRE(getterAction.GetParameter(0).GetPlainString() ==
|
||||
"Object.PropertyMovementAngle()");
|
||||
}
|
||||
{
|
||||
auto &setter =
|
||||
@@ -372,7 +375,8 @@ TEST_CASE("PropertyFunctionGenerator", "[common]") {
|
||||
REQUIRE(setterAction.GetParametersCount() == 3);
|
||||
REQUIRE(setterAction.GetParameter(0).GetPlainString() == "Object");
|
||||
REQUIRE(setterAction.GetParameter(1).GetPlainString() == "=");
|
||||
REQUIRE(setterAction.GetParameter(2).GetPlainString() == "Value");
|
||||
REQUIRE(setterAction.GetParameter(2).GetPlainString() ==
|
||||
"GetArgumentAsNumber(\"Value\")");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -574,7 +578,8 @@ TEST_CASE("PropertyFunctionGenerator", "[common]") {
|
||||
auto &getterAction = getterEvent.GetActions().at(0);
|
||||
REQUIRE(getterAction.GetType() == "SetReturnNumber");
|
||||
REQUIRE(getterAction.GetParametersCount() == 1);
|
||||
REQUIRE(getterAction.GetParameter(0).GetPlainString() == "MovementAngle");
|
||||
REQUIRE(getterAction.GetParameter(0).GetPlainString() ==
|
||||
"Object.Behavior::SharedPropertyMovementAngle()");
|
||||
}
|
||||
{
|
||||
auto &setter =
|
||||
|
@@ -65,11 +65,11 @@ class MockFileSystem : public gd::AbstractFileSystem {
|
||||
|
||||
TEST_CASE("ResourcesMergingHelper", "[common]") {
|
||||
SECTION("Basics") {
|
||||
gd::Project project;
|
||||
MockFileSystem fs;
|
||||
gd::ResourcesMergingHelper resourcesMerger(project.GetResourcesManager(), fs);
|
||||
gd::ResourcesMergingHelper resourcesMerger(fs);
|
||||
resourcesMerger.SetBaseDirectory("/game/base/folder/");
|
||||
|
||||
gd::Project project;
|
||||
project.GetResourcesManager().AddResource("Image1", "/image1.png", "image");
|
||||
project.GetResourcesManager().AddResource("Image2", "image2.png", "image");
|
||||
project.GetResourcesManager().AddResource("Audio1", "audio1.png", "audio");
|
||||
@@ -90,12 +90,12 @@ TEST_CASE("ResourcesMergingHelper", "[common]") {
|
||||
"FileNameFrom(MakeAbsolute(subfolder/image3.png))");
|
||||
}
|
||||
SECTION("Can preserve directories structure") {
|
||||
gd::Project project;
|
||||
MockFileSystem fs;
|
||||
gd::ResourcesMergingHelper resourcesMerger(project.GetResourcesManager(), fs);
|
||||
gd::ResourcesMergingHelper resourcesMerger(fs);
|
||||
resourcesMerger.SetBaseDirectory("/game/base/folder/");
|
||||
resourcesMerger.PreserveDirectoriesStructure(true);
|
||||
|
||||
gd::Project project;
|
||||
project.GetResourcesManager().AddResource("Image1", "/image1.png", "image");
|
||||
project.GetResourcesManager().AddResource("Image2", "image2.png", "image");
|
||||
project.GetResourcesManager().AddResource("Audio1", "audio1.png", "audio");
|
||||
|
@@ -15,10 +15,11 @@
|
||||
|
||||
TEST_CASE("ResourcesRenamer", "[common]") {
|
||||
SECTION("It renames resources that are exposed") {
|
||||
gd::Project project;
|
||||
std::map<gd::String, gd::String> renamings = {
|
||||
{"Resource1", "RenamedResource1"}};
|
||||
gd::ResourcesRenamer resourcesRenamer(project.GetResourcesManager(), renamings);
|
||||
gd::ResourcesRenamer resourcesRenamer(renamings);
|
||||
|
||||
gd::Project project;
|
||||
|
||||
// Add "classic", plain resources.
|
||||
gd::ImageResource resource1;
|
||||
@@ -44,10 +45,11 @@ TEST_CASE("ResourcesRenamer", "[common]") {
|
||||
}
|
||||
|
||||
SECTION("It renames embedded resources") {
|
||||
gd::Project project;
|
||||
std::map<gd::String, gd::String> renamings = {
|
||||
{"Resource1", "RenamedResource1"}};
|
||||
gd::ResourcesRenamer resourcesRenamer(project.GetResourcesManager(), renamings);
|
||||
gd::ResourcesRenamer resourcesRenamer(renamings);
|
||||
|
||||
gd::Project project;
|
||||
|
||||
// Add "classic", plain resources.
|
||||
gd::ImageResource resource1;
|
||||
|
@@ -201,34 +201,39 @@ TEST_CASE("WholeProjectRefactorer::ApplyRefactoringForVariablesContainer",
|
||||
"MyRenamedGlobalStructureVariable");
|
||||
project.GetVariables().Rename("SharedVariableName",
|
||||
"RenamedGlobalVariableFromASharedName");
|
||||
auto changeset =
|
||||
gd::WholeProjectRefactorer::ComputeChangesetForVariablesContainer(
|
||||
project,
|
||||
originalSerializedProjectVariables,
|
||||
project.GetVariables());
|
||||
auto changeset = gd::WholeProjectRefactorer::ComputeChangesetForVariablesContainer(
|
||||
project,
|
||||
originalSerializedProjectVariables,
|
||||
project.GetVariables());
|
||||
gd::WholeProjectRefactorer::ApplyRefactoringForVariablesContainer(
|
||||
project, project.GetVariables(), changeset);
|
||||
project,
|
||||
project.GetVariables(),
|
||||
changeset);
|
||||
|
||||
layout1.GetVariables().Rename("MySceneVariable", "MyRenamedSceneVariable");
|
||||
layout1.GetVariables().Rename("MySceneStructureVariable",
|
||||
"MyRenamedSceneStructureVariable");
|
||||
changeset =
|
||||
gd::WholeProjectRefactorer::ComputeChangesetForVariablesContainer(
|
||||
project, originalSerializedLayoutVariables, layout1.GetVariables());
|
||||
changeset = gd::WholeProjectRefactorer::ComputeChangesetForVariablesContainer(
|
||||
project,
|
||||
originalSerializedLayoutVariables,
|
||||
layout1.GetVariables());
|
||||
gd::WholeProjectRefactorer::ApplyRefactoringForVariablesContainer(
|
||||
project, layout1.GetVariables(), changeset);
|
||||
project,
|
||||
layout1.GetVariables(),
|
||||
changeset);
|
||||
|
||||
object1.GetVariables().Rename("MyObjectVariable",
|
||||
"MyRenamedObjectVariable");
|
||||
object1.GetVariables().Rename("MyObjectStructureVariable",
|
||||
"MyRenamedObjectStructureVariable");
|
||||
changeset =
|
||||
gd::WholeProjectRefactorer::ComputeChangesetForVariablesContainer(
|
||||
project,
|
||||
originalSerializedObject1Variables,
|
||||
object1.GetVariables());
|
||||
changeset = gd::WholeProjectRefactorer::ComputeChangesetForVariablesContainer(
|
||||
project,
|
||||
originalSerializedObject1Variables,
|
||||
object1.GetVariables());
|
||||
gd::WholeProjectRefactorer::ApplyRefactoringForVariablesContainer(
|
||||
project, object1.GetVariables(), changeset);
|
||||
project,
|
||||
object1.GetVariables(),
|
||||
changeset);
|
||||
|
||||
// Check the first layout is updated.
|
||||
// clang-format off
|
||||
@@ -324,182 +329,6 @@ TEST_CASE("WholeProjectRefactorer::ApplyRefactoringForVariablesContainer",
|
||||
gd::Serializer::ToJSON(originalSerializedLayout2));
|
||||
}
|
||||
}
|
||||
|
||||
SECTION("Variable renamed (object group)") {
|
||||
gd::Project project;
|
||||
gd::Platform platform;
|
||||
SetupProjectWithDummyPlatform(project, platform);
|
||||
auto &layout1 = project.InsertNewLayout("Layout1", 0);
|
||||
gd::StandardEvent &event =
|
||||
dynamic_cast<gd::StandardEvent &>(layout1.GetEvents().InsertNewEvent(
|
||||
project, "BuiltinCommonInstructions::Standard"));
|
||||
gd::RepeatEvent &repeatEvent =
|
||||
dynamic_cast<gd::RepeatEvent &>(layout1.GetEvents().InsertNewEvent(
|
||||
project, "BuiltinCommonInstructions::Repeat"));
|
||||
|
||||
// Declare variables in objects.
|
||||
auto &object1 =
|
||||
layout1.InsertNewObject(project, "MyExtension::Sprite", "Object1", 0);
|
||||
object1.GetVariables().InsertNew("MyObjectVariable");
|
||||
object1.GetVariables()
|
||||
.InsertNew("MyObjectStructureVariable")
|
||||
.GetChild("MyChild")
|
||||
.SetValue(123);
|
||||
auto &object2 =
|
||||
layout1.InsertNewObject(project, "MyExtension::Sprite", "Object2", 0);
|
||||
object2.GetVariables().InsertNew("MyObjectVariable");
|
||||
object2.GetVariables()
|
||||
.InsertNew("MyObjectStructureVariable")
|
||||
.GetChild("MyChild")
|
||||
.SetValue(123);
|
||||
|
||||
auto& group = layout1.GetObjectGroups().InsertNew("MyObjectGroup");
|
||||
group.AddObject("Object1");
|
||||
group.AddObject("Object2");
|
||||
|
||||
// Create an event using the variables.
|
||||
// clang-format off
|
||||
{
|
||||
gd::Instruction action;
|
||||
action.SetType("MyExtension::DoSomething");
|
||||
action.SetParametersCount(1);
|
||||
action.SetParameter(
|
||||
0,
|
||||
gd::Expression(
|
||||
"1 + "
|
||||
"Object1.MyObjectVariable + "
|
||||
"Object2.MyObjectVariable + "
|
||||
"MyObjectGroup.MyObjectVariable + "
|
||||
"Object1.MyObjectStructureVariable.MyChild + "
|
||||
"Object2.MyObjectStructureVariable.MyChild + "
|
||||
"MyObjectGroup.MyObjectStructureVariable.MyChild"));
|
||||
event.GetActions().Insert(action);
|
||||
}
|
||||
// Expressions with "old" "scenevar", "globalvar", "objectvar":
|
||||
{
|
||||
gd::Instruction action;
|
||||
action.SetType("MyExtension::DoSomething");
|
||||
action.SetParametersCount(1);
|
||||
action.SetParameter(
|
||||
0,
|
||||
gd::Expression(
|
||||
// "objectvar" (in a free expression):
|
||||
"1 + "
|
||||
"MyExtension::GetStringWith2ObjectParamAnd2ObjectVarParam(Object1, MyObjectVariable, Object2, MyObjectVariable) + "
|
||||
"MyExtension::GetStringWith2ObjectParamAnd2ObjectVarParam(MyObjectGroup, MyObjectVariable, MyObjectGroup, MyObjectVariable) + "
|
||||
"MyExtension::GetStringWith2ObjectParamAnd2ObjectVarParam(Object1, MyObjectStructureVariable.MyChild, Object2, MyObjectStructureVariable.MyChild) + "
|
||||
"MyExtension::GetStringWith2ObjectParamAnd2ObjectVarParam(MyObjectGroup, MyObjectStructureVariable.MyChild, MyObjectGroup, MyObjectStructureVariable.MyChild) + "
|
||||
// "objectvar" (using the name of the object being called):
|
||||
"Object1.GetObjectVariableAsNumber(MyObjectVariable) + "
|
||||
"Object2.GetObjectVariableAsNumber(MyObjectVariable) + "
|
||||
"MyObjectGroup.GetObjectVariableAsNumber(MyObjectVariable) + "
|
||||
"Object1.GetObjectVariableAsNumber(MyObjectStructureVariable.MyChild) + "
|
||||
"Object2.GetObjectVariableAsNumber(MyObjectStructureVariable.MyChild) + "
|
||||
"MyObjectGroup.GetObjectVariableAsNumber(MyObjectStructureVariable.MyChild) + "
|
||||
"Object1.GetObjectVariableAsNumber(MyObjectStructureVariable.MyChild.GrandChild) + "
|
||||
"Object2.GetObjectVariableAsNumber(MyObjectStructureVariable.MyChild.GrandChild) + "
|
||||
"MyObjectGroup.GetObjectVariableAsNumber(MyObjectStructureVariable.MyChild.GrandChild)"));
|
||||
event.GetActions().Insert(action);
|
||||
}
|
||||
{
|
||||
gd::Instruction action;
|
||||
action.SetType("MyExtension::DoSomethingWithLegacyPreScopedVariables");
|
||||
action.SetParametersCount(4);
|
||||
action.SetParameter(0, gd::Expression("MySceneVariable"));
|
||||
action.SetParameter(1, gd::Expression("MyGlobalVariable"));
|
||||
action.SetParameter(2, gd::Expression("MyObjectGroup"));
|
||||
action.SetParameter(3, gd::Expression("MyObjectVariable"));
|
||||
event.GetActions().Insert(action);
|
||||
}
|
||||
|
||||
repeatEvent.SetRepeatExpression("1 + Object1.MyObjectVariable + Object2.MyObjectVariable + MyObjectGroup.MyObjectVariable");
|
||||
// clang-format on
|
||||
|
||||
// Do a copy of layout1 to ensure other scene is unchanged after the
|
||||
// refactoring.
|
||||
gd::Layout layout2 = layout1;
|
||||
layout2.SetName("Layout2");
|
||||
project.InsertLayout(layout2, 1);
|
||||
gd::SerializerElement originalSerializedLayout2;
|
||||
layout2.SerializeTo(originalSerializedLayout2);
|
||||
|
||||
// Do the changes and launch the refactoring.
|
||||
project.GetVariables().ResetPersistentUuid();
|
||||
layout1.GetVariables().ResetPersistentUuid();
|
||||
object1.ResetPersistentUuid();
|
||||
gd::SerializerElement originalSerializedObject1Variables;
|
||||
object1.GetVariables().SerializeTo(originalSerializedObject1Variables);
|
||||
|
||||
object1.GetVariables().Rename("MyObjectVariable",
|
||||
"MyRenamedObjectVariable");
|
||||
object1.GetVariables().Rename("MyObjectStructureVariable",
|
||||
"MyRenamedObjectStructureVariable");
|
||||
auto changeset =
|
||||
gd::WholeProjectRefactorer::ComputeChangesetForVariablesContainer(
|
||||
project,
|
||||
originalSerializedObject1Variables,
|
||||
object1.GetVariables());
|
||||
gd::WholeProjectRefactorer::ApplyRefactoringForVariablesContainer(
|
||||
project, object1.GetVariables(), changeset);
|
||||
|
||||
// Check the first layout is updated.
|
||||
// clang-format off
|
||||
{
|
||||
// Updated direct access to variables:
|
||||
REQUIRE(event.GetActions()[0].GetParameter(0).GetPlainString() ==
|
||||
"1 + "
|
||||
"Object1.MyRenamedObjectVariable + "
|
||||
"Object2.MyObjectVariable + "
|
||||
"MyObjectGroup.MyRenamedObjectVariable + "
|
||||
"Object1.MyRenamedObjectStructureVariable.MyChild + "
|
||||
"Object2.MyObjectStructureVariable.MyChild + "
|
||||
"MyObjectGroup.MyRenamedObjectStructureVariable.MyChild"
|
||||
);
|
||||
|
||||
// Updated access to variables using the legacy "pre-scoped" "scenevar",
|
||||
// "globalvar" and "objectvar" parameters in expressions:
|
||||
REQUIRE(event.GetActions()[1].GetParameter(0).GetPlainString() ==
|
||||
"1 + "
|
||||
// Multiple "objectvar" parameters in a free function:
|
||||
"MyExtension::GetStringWith2ObjectParamAnd2ObjectVarParam(Object1, MyRenamedObjectVariable, Object2, MyObjectVariable) + "
|
||||
"MyExtension::GetStringWith2ObjectParamAnd2ObjectVarParam(MyObjectGroup, MyRenamedObjectVariable, MyObjectGroup, MyRenamedObjectVariable) + "
|
||||
// Multiple "objectvar" parameters in a free function, with child
|
||||
// variable:
|
||||
"MyExtension::GetStringWith2ObjectParamAnd2ObjectVarParam(Object1, MyRenamedObjectStructureVariable.MyChild, Object2, MyObjectStructureVariable.MyChild) + "
|
||||
"MyExtension::GetStringWith2ObjectParamAnd2ObjectVarParam(MyObjectGroup, MyRenamedObjectStructureVariable.MyChild, MyObjectGroup, MyRenamedObjectStructureVariable.MyChild) + "
|
||||
// Single "objectvar" from the object being accessed:
|
||||
"Object1.GetObjectVariableAsNumber(MyRenamedObjectVariable) + "
|
||||
"Object2.GetObjectVariableAsNumber(MyObjectVariable) + "
|
||||
"MyObjectGroup.GetObjectVariableAsNumber(MyRenamedObjectVariable) + "
|
||||
// Single "objectvar" from the object being accessed, with child
|
||||
// variales:
|
||||
"Object1.GetObjectVariableAsNumber(MyRenamedObjectStructureVariable.MyChild) + "
|
||||
"Object2.GetObjectVariableAsNumber(MyObjectStructureVariable.MyChild) + "
|
||||
"MyObjectGroup.GetObjectVariableAsNumber(MyRenamedObjectStructureVariable.MyChild) + "
|
||||
"Object1.GetObjectVariableAsNumber(MyRenamedObjectStructureVariable.MyChild.GrandChild) + "
|
||||
"Object2.GetObjectVariableAsNumber(MyObjectStructureVariable.MyChild.GrandChild) + "
|
||||
"MyObjectGroup.GetObjectVariableAsNumber(MyRenamedObjectStructureVariable.MyChild.GrandChild)");
|
||||
|
||||
// Updated "objectvar" parameters of an
|
||||
// instruction:
|
||||
REQUIRE(event.GetActions()[2].GetParameter(2).GetPlainString() ==
|
||||
"MyObjectGroup");
|
||||
REQUIRE(event.GetActions()[2].GetParameter(3).GetPlainString() ==
|
||||
"MyRenamedObjectVariable");
|
||||
}
|
||||
|
||||
REQUIRE(repeatEvent.GetRepeatExpression() == "1 + Object1.MyRenamedObjectVariable + Object2.MyObjectVariable + MyObjectGroup.MyRenamedObjectVariable");
|
||||
// clang-format on
|
||||
|
||||
// Check the other layout is untouched.
|
||||
{
|
||||
gd::SerializerElement serializedLayout2;
|
||||
layout2.SerializeTo(serializedLayout2);
|
||||
REQUIRE(gd::Serializer::ToJSON(serializedLayout2) ==
|
||||
gd::Serializer::ToJSON(originalSerializedLayout2));
|
||||
}
|
||||
}
|
||||
|
||||
SECTION("Variable removed (project, layout, object)") {
|
||||
gd::Project project;
|
||||
gd::Platform platform;
|
||||
@@ -666,31 +495,36 @@ TEST_CASE("WholeProjectRefactorer::ApplyRefactoringForVariablesContainer",
|
||||
project.GetVariables().Remove("MyGlobalVariable");
|
||||
project.GetVariables().Remove("MyGlobalStructureVariable");
|
||||
project.GetVariables().Remove("SharedVariableName");
|
||||
auto changeset =
|
||||
gd::WholeProjectRefactorer::ComputeChangesetForVariablesContainer(
|
||||
project,
|
||||
originalSerializedProjectVariables,
|
||||
project.GetVariables());
|
||||
auto changeset = gd::WholeProjectRefactorer::ComputeChangesetForVariablesContainer(
|
||||
project,
|
||||
originalSerializedProjectVariables,
|
||||
project.GetVariables());
|
||||
gd::WholeProjectRefactorer::ApplyRefactoringForVariablesContainer(
|
||||
project, project.GetVariables(), changeset);
|
||||
project,
|
||||
project.GetVariables(),
|
||||
changeset);
|
||||
|
||||
layout1.GetVariables().Remove("MySceneVariable");
|
||||
layout1.GetVariables().Remove("MySceneStructureVariable");
|
||||
changeset =
|
||||
gd::WholeProjectRefactorer::ComputeChangesetForVariablesContainer(
|
||||
project, originalSerializedLayoutVariables, layout1.GetVariables());
|
||||
changeset = gd::WholeProjectRefactorer::ComputeChangesetForVariablesContainer(
|
||||
project,
|
||||
originalSerializedLayoutVariables,
|
||||
layout1.GetVariables());
|
||||
gd::WholeProjectRefactorer::ApplyRefactoringForVariablesContainer(
|
||||
project, layout1.GetVariables(), changeset);
|
||||
project,
|
||||
layout1.GetVariables(),
|
||||
changeset);
|
||||
|
||||
object1.GetVariables().Remove("MyObjectVariable");
|
||||
object1.GetVariables().Remove("MyObjectStructureVariable");
|
||||
changeset =
|
||||
gd::WholeProjectRefactorer::ComputeChangesetForVariablesContainer(
|
||||
project,
|
||||
originalSerializedObject1Variables,
|
||||
object1.GetVariables());
|
||||
changeset = gd::WholeProjectRefactorer::ComputeChangesetForVariablesContainer(
|
||||
project,
|
||||
originalSerializedObject1Variables,
|
||||
object1.GetVariables());
|
||||
gd::WholeProjectRefactorer::ApplyRefactoringForVariablesContainer(
|
||||
project, object1.GetVariables(), changeset);
|
||||
project,
|
||||
object1.GetVariables(),
|
||||
changeset);
|
||||
|
||||
// Check the first layout is updated.
|
||||
{
|
||||
|
@@ -61,30 +61,13 @@ namespace gdjs {
|
||||
this.light.intensity = value;
|
||||
}
|
||||
}
|
||||
getDoubleParameter(parameterName: string): number {
|
||||
if (parameterName === 'intensity') {
|
||||
return this.light.intensity;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
updateStringParameter(parameterName: string, value: string): void {
|
||||
if (parameterName === 'color') {
|
||||
this.light.color.setHex(
|
||||
this.light.color = new THREE.Color(
|
||||
gdjs.PixiFiltersTools.rgbOrHexToHexNumber(value)
|
||||
);
|
||||
}
|
||||
}
|
||||
updateColorParameter(parameterName: string, value: number): void {
|
||||
if (parameterName === 'color') {
|
||||
this.light.color.setHex(value);
|
||||
}
|
||||
}
|
||||
getColorParameter(parameterName: string): number {
|
||||
if (parameterName === 'color') {
|
||||
return this.light.color.getHex();
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
updateBooleanParameter(parameterName: string, value: boolean): void {}
|
||||
})();
|
||||
}
|
||||
|
@@ -74,16 +74,6 @@ namespace gdjs {
|
||||
this.updateRotation();
|
||||
}
|
||||
}
|
||||
getDoubleParameter(parameterName: string): number {
|
||||
if (parameterName === 'intensity') {
|
||||
return this.light.intensity;
|
||||
} else if (parameterName === 'elevation') {
|
||||
return this.elevation;
|
||||
} else if (parameterName === 'rotation') {
|
||||
return this.rotation;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
updateStringParameter(parameterName: string, value: string): void {
|
||||
if (parameterName === 'color') {
|
||||
this.light.color = new THREE.Color(
|
||||
@@ -95,17 +85,6 @@ namespace gdjs {
|
||||
this.updateRotation();
|
||||
}
|
||||
}
|
||||
updateColorParameter(parameterName: string, value: number): void {
|
||||
if (parameterName === 'color') {
|
||||
this.light.color.setHex(value);
|
||||
}
|
||||
}
|
||||
getColorParameter(parameterName: string): number {
|
||||
if (parameterName === 'color') {
|
||||
return this.light.color.getHex();
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
updateBooleanParameter(parameterName: string, value: boolean): void {}
|
||||
updateRotation() {
|
||||
if (this.top === 'Z+') {
|
||||
@@ -114,7 +93,7 @@ namespace gdjs {
|
||||
this.rotationObject.rotation.y = -gdjs.toRad(this.elevation);
|
||||
} else {
|
||||
// 0° becomes a light from Z+.
|
||||
this.rotationObject.rotation.y = gdjs.toRad(this.rotation - 90);
|
||||
this.rotationObject.rotation.y = gdjs.toRad(this.rotation) - 90;
|
||||
this.rotationObject.rotation.z = -gdjs.toRad(this.elevation);
|
||||
}
|
||||
}
|
||||
|
@@ -58,12 +58,6 @@ namespace gdjs {
|
||||
this.fog.density = value;
|
||||
}
|
||||
}
|
||||
getDoubleParameter(parameterName: string): number {
|
||||
if (parameterName === 'density') {
|
||||
return this.fog.density;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
updateStringParameter(parameterName: string, value: string): void {
|
||||
if (parameterName === 'color') {
|
||||
this.fog.color = new THREE.Color(
|
||||
@@ -71,17 +65,6 @@ namespace gdjs {
|
||||
);
|
||||
}
|
||||
}
|
||||
updateColorParameter(parameterName: string, value: number): void {
|
||||
if (parameterName === 'color') {
|
||||
this.fog.color.setHex(value);
|
||||
}
|
||||
}
|
||||
getColorParameter(parameterName: string): number {
|
||||
if (parameterName === 'color') {
|
||||
return this.fog.color.getHex();
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
updateBooleanParameter(parameterName: string, value: boolean): void {}
|
||||
})();
|
||||
}
|
||||
|
@@ -74,16 +74,6 @@ namespace gdjs {
|
||||
this.updateRotation();
|
||||
}
|
||||
}
|
||||
getDoubleParameter(parameterName: string): number {
|
||||
if (parameterName === 'intensity') {
|
||||
return this.light.intensity;
|
||||
} else if (parameterName === 'elevation') {
|
||||
return this.elevation;
|
||||
} else if (parameterName === 'rotation') {
|
||||
return this.rotation;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
updateStringParameter(parameterName: string, value: string): void {
|
||||
if (parameterName === 'skyColor') {
|
||||
this.light.color = new THREE.Color(
|
||||
@@ -100,23 +90,6 @@ namespace gdjs {
|
||||
this.updateRotation();
|
||||
}
|
||||
}
|
||||
updateColorParameter(parameterName: string, value: number): void {
|
||||
if (parameterName === 'skyColor') {
|
||||
this.light.color.setHex(value);
|
||||
}
|
||||
if (parameterName === 'groundColor') {
|
||||
this.light.groundColor.setHex(value);
|
||||
}
|
||||
}
|
||||
getColorParameter(parameterName: string): number {
|
||||
if (parameterName === 'skyColor') {
|
||||
return this.light.color.getHex();
|
||||
}
|
||||
if (parameterName === 'groundColor') {
|
||||
return this.light.groundColor.getHex();
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
updateBooleanParameter(parameterName: string, value: boolean): void {}
|
||||
updateRotation() {
|
||||
if (this.top === 'Z+') {
|
||||
@@ -125,7 +98,7 @@ namespace gdjs {
|
||||
this.rotationObject.rotation.y = -gdjs.toRad(this.elevation);
|
||||
} else {
|
||||
// 0° becomes a light from Z+.
|
||||
this.rotationObject.rotation.y = gdjs.toRad(this.rotation - 90);
|
||||
this.rotationObject.rotation.y = gdjs.toRad(this.rotation) - 90;
|
||||
this.rotationObject.rotation.z = -gdjs.toRad(this.elevation);
|
||||
}
|
||||
}
|
||||
|
@@ -64,7 +64,7 @@ module.exports = {
|
||||
_('Position'),
|
||||
'res/conditions/3d_box.svg'
|
||||
)
|
||||
.addParameter('object', _('3D object'), '', false)
|
||||
.addParameter('object', _('3D object'))
|
||||
.addParameter('behavior', _('Behavior'), 'Base3DBehavior')
|
||||
.useStandardParameters('number', gd.ParameterOptions.makeNewOptions())
|
||||
.setFunctionName('setZ')
|
||||
@@ -80,7 +80,7 @@ module.exports = {
|
||||
_('Position/Center'),
|
||||
'res/conditions/3d_box.svg'
|
||||
)
|
||||
.addParameter('object', _('3D object'), '', false)
|
||||
.addParameter('object', _('3D object'))
|
||||
.addParameter('behavior', _('Behavior'), 'Base3DBehavior')
|
||||
.useStandardParameters('number', gd.ParameterOptions.makeNewOptions())
|
||||
.setFunctionName('setCenterZInScene')
|
||||
@@ -96,7 +96,7 @@ module.exports = {
|
||||
_('Size'),
|
||||
'res/conditions/3d_box.svg'
|
||||
)
|
||||
.addParameter('object', _('3D object'), '', false)
|
||||
.addParameter('object', _('3D object'))
|
||||
.addParameter('behavior', _('Behavior'), 'Base3DBehavior')
|
||||
.useStandardParameters('number', gd.ParameterOptions.makeNewOptions())
|
||||
.setFunctionName('setDepth')
|
||||
@@ -112,7 +112,7 @@ module.exports = {
|
||||
_('Size'),
|
||||
'res/conditions/3d_box.svg'
|
||||
)
|
||||
.addParameter('object', _('3D object'), '', false)
|
||||
.addParameter('object', _('3D object'))
|
||||
.addParameter('behavior', _('Behavior'), 'Base3DBehavior')
|
||||
.useStandardParameters(
|
||||
'number',
|
||||
@@ -134,7 +134,7 @@ module.exports = {
|
||||
'res/conditions/3d_box.svg',
|
||||
'res/conditions/3d_box.svg'
|
||||
)
|
||||
.addParameter('object', _('3D object'), '', false)
|
||||
.addParameter('object', _('3D object'))
|
||||
.addParameter('behavior', _('Behavior'), 'Base3DBehavior')
|
||||
.addParameter('yesorno', _('Activate flipping'))
|
||||
.markAsSimple()
|
||||
@@ -150,7 +150,7 @@ module.exports = {
|
||||
'res/conditions/3d_box.svg',
|
||||
'res/conditions/3d_box.svg'
|
||||
)
|
||||
.addParameter('object', _('3D object'), '', false)
|
||||
.addParameter('object', _('3D object'))
|
||||
.addParameter('behavior', _('Behavior'), 'Base3DBehavior')
|
||||
.setFunctionName('isFlippedZ');
|
||||
|
||||
@@ -164,7 +164,7 @@ module.exports = {
|
||||
_('Angle'),
|
||||
'res/conditions/3d_box.svg'
|
||||
)
|
||||
.addParameter('object', _('3D object'), '', false)
|
||||
.addParameter('object', _('3D object'))
|
||||
.addParameter('behavior', _('Behavior'), 'Base3DBehavior')
|
||||
.useStandardParameters('number', gd.ParameterOptions.makeNewOptions())
|
||||
.setFunctionName('setRotationX')
|
||||
@@ -180,7 +180,7 @@ module.exports = {
|
||||
_('Angle'),
|
||||
'res/conditions/3d_box.svg'
|
||||
)
|
||||
.addParameter('object', _('3D object'), '', false)
|
||||
.addParameter('object', _('3D object'))
|
||||
.addParameter('behavior', _('Behavior'), 'Base3DBehavior')
|
||||
.useStandardParameters('number', gd.ParameterOptions.makeNewOptions())
|
||||
.setFunctionName('setRotationY')
|
||||
@@ -198,7 +198,7 @@ module.exports = {
|
||||
'res/conditions/3d_box.svg',
|
||||
'res/conditions/3d_box.svg'
|
||||
)
|
||||
.addParameter('object', _('3D object'), '', false)
|
||||
.addParameter('object', _('3D object'))
|
||||
.addParameter('behavior', _('Behavior'), 'Base3DBehavior')
|
||||
.addParameter('number', _('Rotation angle'), '', false)
|
||||
.markAsAdvanced()
|
||||
@@ -216,7 +216,7 @@ module.exports = {
|
||||
'res/conditions/3d_box.svg',
|
||||
'res/conditions/3d_box.svg'
|
||||
)
|
||||
.addParameter('object', _('3D object'), '', false)
|
||||
.addParameter('object', _('3D object'))
|
||||
.addParameter('behavior', _('Behavior'), 'Base3DBehavior')
|
||||
.addParameter('number', _('Rotation angle'), '', false)
|
||||
.markAsAdvanced()
|
||||
@@ -234,7 +234,7 @@ module.exports = {
|
||||
'res/conditions/3d_box.svg',
|
||||
'res/conditions/3d_box.svg'
|
||||
)
|
||||
.addParameter('object', _('3D object'), '', false)
|
||||
.addParameter('object', _('3D object'))
|
||||
.addParameter('behavior', _('Behavior'), 'Base3DBehavior')
|
||||
.addParameter('number', _('Rotation angle'), '', false)
|
||||
.markAsAdvanced()
|
||||
@@ -501,7 +501,7 @@ module.exports = {
|
||||
'res/actions/flipX24.png',
|
||||
'res/actions/flipX.png'
|
||||
)
|
||||
.addParameter('object', _('3D model'), 'Model3DObject', false)
|
||||
.addParameter('object', _('3D model'), 'Model3DObject')
|
||||
.addParameter('yesorno', _('Activate flipping'))
|
||||
.setHidden()
|
||||
.markAsSimple()
|
||||
@@ -518,7 +518,7 @@ module.exports = {
|
||||
'res/actions/flipY24.png',
|
||||
'res/actions/flipY.png'
|
||||
)
|
||||
.addParameter('object', _('3D model'), 'Model3DObject', false)
|
||||
.addParameter('object', _('3D model'), 'Model3DObject')
|
||||
.addParameter('yesorno', _('Activate flipping'))
|
||||
.setHidden()
|
||||
.markAsSimple()
|
||||
@@ -535,7 +535,7 @@ module.exports = {
|
||||
'res/conditions/3d_box.svg',
|
||||
'res/conditions/3d_box.svg'
|
||||
)
|
||||
.addParameter('object', _('3D model'), 'Model3DObject', false)
|
||||
.addParameter('object', _('3D model'), 'Model3DObject')
|
||||
.addParameter('yesorno', _('Activate flipping'))
|
||||
.markAsSimple()
|
||||
.setHidden()
|
||||
@@ -552,7 +552,7 @@ module.exports = {
|
||||
'res/actions/flipX24.png',
|
||||
'res/actions/flipX.png'
|
||||
)
|
||||
.addParameter('object', _('3D model'), 'Model3DObject', false)
|
||||
.addParameter('object', _('3D model'), 'Model3DObject')
|
||||
.setHidden()
|
||||
.setFunctionName('isFlippedX');
|
||||
|
||||
@@ -567,7 +567,7 @@ module.exports = {
|
||||
'res/actions/flipY24.png',
|
||||
'res/actions/flipY.png'
|
||||
)
|
||||
.addParameter('object', _('3D model'), 'Model3DObject', false)
|
||||
.addParameter('object', _('3D model'), 'Model3DObject')
|
||||
.setHidden()
|
||||
.setFunctionName('isFlippedY');
|
||||
|
||||
@@ -582,7 +582,7 @@ module.exports = {
|
||||
'res/conditions/3d_box.svg',
|
||||
'res/conditions/3d_box.svg'
|
||||
)
|
||||
.addParameter('object', _('3D model'), 'Model3DObject', false)
|
||||
.addParameter('object', _('3D model'), 'Model3DObject')
|
||||
.setHidden()
|
||||
.setFunctionName('isFlippedZ');
|
||||
|
||||
@@ -690,7 +690,7 @@ module.exports = {
|
||||
_('Animations and images'),
|
||||
'res/actions/animation24.png'
|
||||
)
|
||||
.addParameter('object', _('3D model'), 'Model3DObject', false)
|
||||
.addParameter('object', _('3D model'), 'Model3DObject')
|
||||
.useStandardParameters('number', gd.ParameterOptions.makeNewOptions())
|
||||
.markAsSimple()
|
||||
.setHidden()
|
||||
@@ -708,7 +708,7 @@ module.exports = {
|
||||
_('Animations and images'),
|
||||
'res/actions/animation24.png'
|
||||
)
|
||||
.addParameter('object', _('3D model'), 'Model3DObject', false)
|
||||
.addParameter('object', _('3D model'), 'Model3DObject')
|
||||
.useStandardParameters(
|
||||
'objectAnimationName',
|
||||
gd.ParameterOptions.makeNewOptions().setDescription(
|
||||
@@ -731,7 +731,7 @@ module.exports = {
|
||||
'res/actions/animation24.png',
|
||||
'res/actions/animation.png'
|
||||
)
|
||||
.addParameter('object', _('3D model'), 'Model3DObject', false)
|
||||
.addParameter('object', _('3D model'), 'Model3DObject')
|
||||
.markAsSimple()
|
||||
.setHidden()
|
||||
.setFunctionName('pauseAnimation');
|
||||
@@ -747,7 +747,7 @@ module.exports = {
|
||||
'res/actions/animation24.png',
|
||||
'res/actions/animation.png'
|
||||
)
|
||||
.addParameter('object', _('3D model'), 'Model3DObject', false)
|
||||
.addParameter('object', _('3D model'), 'Model3DObject')
|
||||
.markAsSimple()
|
||||
.setHidden()
|
||||
.setFunctionName('resumeAnimation');
|
||||
@@ -765,7 +765,7 @@ module.exports = {
|
||||
_('Animations and images'),
|
||||
'res/actions/animation24.png'
|
||||
)
|
||||
.addParameter('object', _('3D model'), 'Model3DObject', false)
|
||||
.addParameter('object', _('3D model'), 'Model3DObject')
|
||||
.useStandardParameters(
|
||||
'number',
|
||||
gd.ParameterOptions.makeNewOptions().setDescription(_('Speed scale'))
|
||||
@@ -786,7 +786,7 @@ module.exports = {
|
||||
'res/conditions/animation24.png',
|
||||
'res/conditions/animation.png'
|
||||
)
|
||||
.addParameter('object', _('3D model'), 'Model3DObject', false)
|
||||
.addParameter('object', _('3D model'), 'Model3DObject')
|
||||
.markAsSimple()
|
||||
.setHidden()
|
||||
.setFunctionName('isAnimationPaused');
|
||||
@@ -804,7 +804,7 @@ module.exports = {
|
||||
'res/conditions/animation24.png',
|
||||
'res/conditions/animation.png'
|
||||
)
|
||||
.addParameter('object', _('3D model'), 'Model3DObject', false)
|
||||
.addParameter('object', _('3D model'), 'Model3DObject')
|
||||
.markAsSimple()
|
||||
.setHidden()
|
||||
.setFunctionName('hasAnimationEnded');
|
||||
@@ -1364,7 +1364,7 @@ module.exports = {
|
||||
'res/actions/flipX24.png',
|
||||
'res/actions/flipX.png'
|
||||
)
|
||||
.addParameter('object', _('3D cube'), 'Cube3DObject', false)
|
||||
.addParameter('object', _('3D cube'), 'Cube3DObject')
|
||||
.addParameter('yesorno', _('Activate flipping'))
|
||||
.markAsSimple()
|
||||
.setHidden()
|
||||
@@ -1381,7 +1381,7 @@ module.exports = {
|
||||
'res/actions/flipY24.png',
|
||||
'res/actions/flipY.png'
|
||||
)
|
||||
.addParameter('object', _('3D cube'), 'Cube3DObject', false)
|
||||
.addParameter('object', _('3D cube'), 'Cube3DObject')
|
||||
.addParameter('yesorno', _('Activate flipping'))
|
||||
.markAsSimple()
|
||||
.setHidden()
|
||||
@@ -1398,7 +1398,7 @@ module.exports = {
|
||||
'res/conditions/3d_box.svg',
|
||||
'res/conditions/3d_box.svg'
|
||||
)
|
||||
.addParameter('object', _('3D cube'), 'Cube3DObject', false)
|
||||
.addParameter('object', _('3D cube'), 'Cube3DObject')
|
||||
.addParameter('yesorno', _('Activate flipping'))
|
||||
.markAsSimple()
|
||||
.setHidden()
|
||||
@@ -1415,7 +1415,7 @@ module.exports = {
|
||||
'res/actions/flipX24.png',
|
||||
'res/actions/flipX.png'
|
||||
)
|
||||
.addParameter('object', _('3D cube'), 'Cube3DObject', false)
|
||||
.addParameter('object', _('3D cube'), 'Cube3DObject')
|
||||
.setHidden()
|
||||
.setFunctionName('isFlippedX');
|
||||
|
||||
@@ -1430,7 +1430,7 @@ module.exports = {
|
||||
'res/actions/flipY24.png',
|
||||
'res/actions/flipY.png'
|
||||
)
|
||||
.addParameter('object', _('3D cube'), 'Cube3DObject', false)
|
||||
.addParameter('object', _('3D cube'), 'Cube3DObject')
|
||||
.setHidden()
|
||||
.setFunctionName('isFlippedY');
|
||||
|
||||
@@ -1445,7 +1445,7 @@ module.exports = {
|
||||
'res/conditions/3d_box.svg',
|
||||
'res/conditions/3d_box.svg'
|
||||
)
|
||||
.addParameter('object', _('3D cube'), 'Cube3DObject', false)
|
||||
.addParameter('object', _('3D cube'), 'Cube3DObject')
|
||||
.setHidden()
|
||||
.setFunctionName('isFlippedZ');
|
||||
|
||||
|
@@ -60,14 +60,6 @@ namespace gdjs {
|
||||
this.fog.far = value;
|
||||
}
|
||||
}
|
||||
getDoubleParameter(parameterName: string): number {
|
||||
if (parameterName === 'near') {
|
||||
return this.fog.near;
|
||||
} else if (parameterName === 'far') {
|
||||
return this.fog.far;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
updateStringParameter(parameterName: string, value: string): void {
|
||||
if (parameterName === 'color') {
|
||||
this.fog.color = new THREE.Color(
|
||||
@@ -75,17 +67,6 @@ namespace gdjs {
|
||||
);
|
||||
}
|
||||
}
|
||||
updateColorParameter(parameterName: string, value: number): void {
|
||||
if (parameterName === 'color') {
|
||||
this.fog.color.setHex(value);
|
||||
}
|
||||
}
|
||||
getColorParameter(parameterName: string): number {
|
||||
if (parameterName === 'color') {
|
||||
return this.fog.color.getHex();
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
updateBooleanParameter(parameterName: string, value: boolean): void {}
|
||||
})();
|
||||
}
|
||||
|
@@ -31,47 +31,11 @@ namespace gdjs {
|
||||
adjustmentFilter.alpha = value;
|
||||
}
|
||||
}
|
||||
getDoubleParameter(filter: PIXI.Filter, parameterName: string): number {
|
||||
const adjustmentFilter = (filter as unknown) as PIXI.filters.AdjustmentFilter;
|
||||
if (parameterName === 'gamma') {
|
||||
return adjustmentFilter.gamma;
|
||||
}
|
||||
if (parameterName === 'saturation') {
|
||||
return adjustmentFilter.saturation;
|
||||
}
|
||||
if (parameterName === 'contrast') {
|
||||
return adjustmentFilter.contrast;
|
||||
}
|
||||
if (parameterName === 'brightness') {
|
||||
return adjustmentFilter.brightness;
|
||||
}
|
||||
if (parameterName === 'red') {
|
||||
return adjustmentFilter.red;
|
||||
}
|
||||
if (parameterName === 'green') {
|
||||
return adjustmentFilter.green;
|
||||
}
|
||||
if (parameterName === 'blue') {
|
||||
return adjustmentFilter.blue;
|
||||
}
|
||||
if (parameterName === 'alpha') {
|
||||
return adjustmentFilter.alpha;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
updateStringParameter(
|
||||
filter: PIXI.Filter,
|
||||
parameterName: string,
|
||||
value: string
|
||||
) {}
|
||||
updateColorParameter(
|
||||
filter: PIXI.Filter,
|
||||
parameterName: string,
|
||||
value: number
|
||||
): void {}
|
||||
getColorParameter(filter: PIXI.Filter, parameterName: string): number {
|
||||
return 0;
|
||||
}
|
||||
updateBooleanParameter(
|
||||
filter: PIXI.Filter,
|
||||
parameterName: string,
|
||||
|
@@ -27,41 +27,11 @@ namespace gdjs {
|
||||
advancedBloomFilter.padding = value;
|
||||
}
|
||||
}
|
||||
getDoubleParameter(filter: PIXI.Filter, parameterName: string): number {
|
||||
const advancedBloomFilter = (filter as unknown) as PIXI.filters.AdvancedBloomFilter;
|
||||
if (parameterName === 'threshold') {
|
||||
return advancedBloomFilter.threshold;
|
||||
}
|
||||
if (parameterName === 'bloomScale') {
|
||||
return advancedBloomFilter.bloomScale;
|
||||
}
|
||||
if (parameterName === 'brightness') {
|
||||
return advancedBloomFilter.brightness;
|
||||
}
|
||||
if (parameterName === 'blur') {
|
||||
return advancedBloomFilter.blur;
|
||||
}
|
||||
if (parameterName === 'quality') {
|
||||
return advancedBloomFilter.quality;
|
||||
}
|
||||
if (parameterName === 'padding') {
|
||||
return advancedBloomFilter.padding;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
updateStringParameter(
|
||||
filter: PIXI.Filter,
|
||||
parameterName: string,
|
||||
value: string
|
||||
) {}
|
||||
updateColorParameter(
|
||||
filter: PIXI.Filter,
|
||||
parameterName: string,
|
||||
value: number
|
||||
): void {}
|
||||
getColorParameter(filter: PIXI.Filter, parameterName: string): number {
|
||||
return 0;
|
||||
}
|
||||
updateBooleanParameter(
|
||||
filter: PIXI.Filter,
|
||||
parameterName: string,
|
||||
|
@@ -17,26 +17,11 @@ namespace gdjs {
|
||||
asciiFilter.size = value;
|
||||
}
|
||||
}
|
||||
getDoubleParameter(filter: PIXI.Filter, parameterName: string): number {
|
||||
const asciiFilter = (filter as unknown) as PIXI.filters.AsciiFilter;
|
||||
if (parameterName === 'size') {
|
||||
return asciiFilter.size;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
updateStringParameter(
|
||||
filter: PIXI.Filter,
|
||||
parameterName: string,
|
||||
value: string
|
||||
) {}
|
||||
updateColorParameter(
|
||||
filter: PIXI.Filter,
|
||||
parameterName: string,
|
||||
value: number
|
||||
): void {}
|
||||
getColorParameter(filter: PIXI.Filter, parameterName: string): number {
|
||||
return 0;
|
||||
}
|
||||
updateBooleanParameter(
|
||||
filter: PIXI.Filter,
|
||||
parameterName: string,
|
||||
|
@@ -1,8 +1,4 @@
|
||||
namespace gdjs {
|
||||
interface BevelFilterExtra {
|
||||
/** It's defined for the configuration but not for the filter. */
|
||||
distance: number;
|
||||
}
|
||||
gdjs.PixiFiltersTools.registerFilterCreator(
|
||||
'Bevel',
|
||||
new (class extends gdjs.PixiFiltersTools.PixiFilterCreator {
|
||||
@@ -16,13 +12,13 @@ namespace gdjs {
|
||||
parameterName: string,
|
||||
value: number
|
||||
) {
|
||||
const bevelFilter = (filter as unknown) as PIXI.filters.BevelFilter &
|
||||
BevelFilterExtra;
|
||||
const bevelFilter = (filter as unknown) as PIXI.filters.BevelFilter;
|
||||
if (parameterName === 'rotation') {
|
||||
bevelFilter.rotation = value;
|
||||
} else if (parameterName === 'thickness') {
|
||||
bevelFilter.thickness = value;
|
||||
} else if (parameterName === 'distance') {
|
||||
// @ts-ignore
|
||||
bevelFilter.distance = value;
|
||||
} else if (parameterName === 'lightAlpha') {
|
||||
bevelFilter.lightAlpha = value;
|
||||
@@ -30,33 +26,12 @@ namespace gdjs {
|
||||
bevelFilter.shadowAlpha = value;
|
||||
}
|
||||
}
|
||||
getDoubleParameter(filter: PIXI.Filter, parameterName: string): number {
|
||||
const bevelFilter = (filter as unknown) as PIXI.filters.BevelFilter &
|
||||
BevelFilterExtra;
|
||||
if (parameterName === 'rotation') {
|
||||
return bevelFilter.rotation;
|
||||
}
|
||||
if (parameterName === 'thickness') {
|
||||
return bevelFilter.thickness;
|
||||
}
|
||||
if (parameterName === 'distance') {
|
||||
return bevelFilter.distance;
|
||||
}
|
||||
if (parameterName === 'lightAlpha') {
|
||||
return bevelFilter.lightAlpha;
|
||||
}
|
||||
if (parameterName === 'shadowAlpha') {
|
||||
return bevelFilter.shadowAlpha;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
updateStringParameter(
|
||||
filter: PIXI.Filter,
|
||||
parameterName: string,
|
||||
value: string
|
||||
) {
|
||||
const bevelFilter = (filter as unknown) as PIXI.filters.BevelFilter &
|
||||
BevelFilterExtra;
|
||||
const bevelFilter = (filter as unknown) as PIXI.filters.BevelFilter;
|
||||
if (parameterName === 'lightColor') {
|
||||
bevelFilter.lightColor = gdjs.PixiFiltersTools.rgbOrHexToHexNumber(
|
||||
value
|
||||
@@ -68,30 +43,6 @@ namespace gdjs {
|
||||
);
|
||||
}
|
||||
}
|
||||
updateColorParameter(
|
||||
filter: PIXI.Filter,
|
||||
parameterName: string,
|
||||
value: number
|
||||
): void {
|
||||
const bevelFilter = (filter as unknown) as PIXI.filters.BevelFilter &
|
||||
BevelFilterExtra;
|
||||
if (parameterName === 'lightColor') {
|
||||
bevelFilter.lightColor = value;
|
||||
}
|
||||
if (parameterName === 'shadowColor') {
|
||||
bevelFilter.shadowColor = value;
|
||||
}
|
||||
}
|
||||
getColorParameter(filter: PIXI.Filter, parameterName: string): number {
|
||||
const bevelFilter = (filter as unknown) as PIXI.filters.BevelFilter;
|
||||
if (parameterName === 'lightColor') {
|
||||
return bevelFilter.lightColor;
|
||||
}
|
||||
if (parameterName === 'shadowColor') {
|
||||
return bevelFilter.shadowColor;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
updateBooleanParameter(
|
||||
filter: PIXI.Filter,
|
||||
parameterName: string,
|
||||
|
@@ -19,26 +19,11 @@ namespace gdjs {
|
||||
}
|
||||
colorMatrix.alpha = gdjs.PixiFiltersTools.clampValue(value, 0, 1);
|
||||
}
|
||||
getDoubleParameter(filter: PIXI.Filter, parameterName: string): number {
|
||||
const colorMatrix = (filter as unknown) as PIXI.ColorMatrixFilter;
|
||||
if (parameterName === 'opacity') {
|
||||
return colorMatrix.alpha;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
updateStringParameter(
|
||||
filter: PIXI.Filter,
|
||||
parameterName: string,
|
||||
value: string
|
||||
) {}
|
||||
updateColorParameter(
|
||||
filter: PIXI.Filter,
|
||||
parameterName: string,
|
||||
value: number
|
||||
): void {}
|
||||
getColorParameter(filter: PIXI.Filter, parameterName: string): number {
|
||||
return 0;
|
||||
}
|
||||
updateBooleanParameter(
|
||||
filter: PIXI.Filter,
|
||||
parameterName: string,
|
||||
|
@@ -19,29 +19,11 @@ namespace gdjs {
|
||||
blendingModeFilter.blendMode = value;
|
||||
}
|
||||
}
|
||||
getDoubleParameter(filter: PIXI.Filter, parameterName: string): number {
|
||||
const blendingModeFilter = (filter as unknown) as PIXI.AlphaFilter;
|
||||
if (parameterName === 'alpha') {
|
||||
return blendingModeFilter.alpha;
|
||||
}
|
||||
if (parameterName === 'blendmode') {
|
||||
return blendingModeFilter.blendMode;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
updateStringParameter(
|
||||
filter: PIXI.Filter,
|
||||
parameterName: string,
|
||||
value: string
|
||||
) {}
|
||||
updateColorParameter(
|
||||
filter: PIXI.Filter,
|
||||
parameterName: string,
|
||||
value: number
|
||||
): void {}
|
||||
getColorParameter(filter: PIXI.Filter, parameterName: string): number {
|
||||
return 0;
|
||||
}
|
||||
updateBooleanParameter(
|
||||
filter: PIXI.Filter,
|
||||
parameterName: string,
|
||||
|
@@ -25,22 +25,11 @@ namespace gdjs {
|
||||
}
|
||||
filter[parameterName] = value;
|
||||
}
|
||||
getDoubleParameter(filter: PIXI.Filter, parameterName: string): number {
|
||||
return filter[parameterName] || 0;
|
||||
}
|
||||
updateStringParameter(
|
||||
filter: PIXI.Filter,
|
||||
parameterName: string,
|
||||
value: string
|
||||
) {}
|
||||
updateColorParameter(
|
||||
filter: PIXI.Filter,
|
||||
parameterName: string,
|
||||
value: number
|
||||
): void {}
|
||||
getColorParameter(filter: PIXI.Filter, parameterName: string): number {
|
||||
return 0;
|
||||
}
|
||||
updateBooleanParameter(
|
||||
filter: PIXI.Filter,
|
||||
parameterName: string,
|
||||
|
@@ -1,8 +1,4 @@
|
||||
namespace gdjs {
|
||||
interface BrightnessFilterExtra {
|
||||
/** It allows to get back the value as the filter uses a matrix. */
|
||||
__brightness: number;
|
||||
}
|
||||
gdjs.PixiFiltersTools.registerFilterCreator(
|
||||
'Brightness',
|
||||
new (class extends gdjs.PixiFiltersTools.PixiFilterCreator {
|
||||
@@ -17,36 +13,20 @@ namespace gdjs {
|
||||
parameterName: string,
|
||||
value: number
|
||||
) {
|
||||
const brightnessFilter = (filter as unknown) as PIXI.ColorMatrixFilter &
|
||||
BrightnessFilterExtra;
|
||||
const brightnessFilter = (filter as unknown) as PIXI.ColorMatrixFilter;
|
||||
if (parameterName !== 'brightness') {
|
||||
return;
|
||||
}
|
||||
const brightness = gdjs.PixiFiltersTools.clampValue(value, 0, 1);
|
||||
brightnessFilter.__brightness = brightness;
|
||||
brightnessFilter.brightness(brightness, false);
|
||||
}
|
||||
getDoubleParameter(filter: PIXI.Filter, parameterName: string): number {
|
||||
const brightnessFilter = (filter as unknown) as PIXI.ColorMatrixFilter &
|
||||
BrightnessFilterExtra;
|
||||
if (parameterName === 'brightness') {
|
||||
return brightnessFilter.__brightness;
|
||||
}
|
||||
return 0;
|
||||
brightnessFilter.brightness(
|
||||
gdjs.PixiFiltersTools.clampValue(value, 0, 1),
|
||||
false
|
||||
);
|
||||
}
|
||||
updateStringParameter(
|
||||
filter: PIXI.Filter,
|
||||
parameterName: string,
|
||||
value: string
|
||||
) {}
|
||||
updateColorParameter(
|
||||
filter: PIXI.Filter,
|
||||
parameterName: string,
|
||||
value: number
|
||||
): void {}
|
||||
getColorParameter(filter: PIXI.Filter, parameterName: string): number {
|
||||
return 0;
|
||||
}
|
||||
updateBooleanParameter(
|
||||
filter: PIXI.Filter,
|
||||
parameterName: string,
|
||||
|
@@ -27,35 +27,11 @@ namespace gdjs {
|
||||
);
|
||||
}
|
||||
}
|
||||
getDoubleParameter(filter: PIXI.Filter, parameterName: string): number {
|
||||
const bulgePinchFilter = (filter as unknown) as PIXI.filters.BulgePinchFilter;
|
||||
if (parameterName === 'centerX') {
|
||||
return bulgePinchFilter.center[0];
|
||||
}
|
||||
if (parameterName === 'centerY') {
|
||||
return bulgePinchFilter.center[1];
|
||||
}
|
||||
if (parameterName === 'radius') {
|
||||
return bulgePinchFilter.radius;
|
||||
}
|
||||
if (parameterName === 'strength') {
|
||||
return bulgePinchFilter.strength;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
updateStringParameter(
|
||||
filter: PIXI.Filter,
|
||||
parameterName: string,
|
||||
value: string
|
||||
) {}
|
||||
updateColorParameter(
|
||||
filter: PIXI.Filter,
|
||||
parameterName: string,
|
||||
value: number
|
||||
): void {}
|
||||
getColorParameter(filter: PIXI.Filter, parameterName: string): number {
|
||||
return 0;
|
||||
}
|
||||
updateBooleanParameter(
|
||||
filter: PIXI.Filter,
|
||||
parameterName: string,
|
||||
|
@@ -34,26 +34,11 @@ namespace gdjs {
|
||||
);
|
||||
}
|
||||
}
|
||||
getDoubleParameter(filter: PIXI.Filter, parameterName: string): number {
|
||||
const colorMapFilter = (filter as unknown) as PIXI.filters.ColorMapFilter;
|
||||
if (parameterName === 'mix') {
|
||||
return colorMapFilter.mix;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
updateStringParameter(
|
||||
filter: PIXI.Filter,
|
||||
parameterName: string,
|
||||
value: string
|
||||
) {}
|
||||
updateColorParameter(
|
||||
filter: PIXI.Filter,
|
||||
parameterName: string,
|
||||
value: number
|
||||
): void {}
|
||||
getColorParameter(filter: PIXI.Filter, parameterName: string): number {
|
||||
return 0;
|
||||
}
|
||||
updateBooleanParameter(
|
||||
filter: PIXI.Filter,
|
||||
parameterName: string,
|
||||
|
@@ -1,10 +1,4 @@
|
||||
namespace gdjs {
|
||||
interface ColorReplaceFilterExtra {
|
||||
/** It's only set to a number. */
|
||||
originalColor: number;
|
||||
/** It's only set to a number. */
|
||||
newColor: number;
|
||||
}
|
||||
gdjs.PixiFiltersTools.registerFilterCreator(
|
||||
'ColorReplace',
|
||||
new (class extends gdjs.PixiFiltersTools.PixiFilterCreator {
|
||||
@@ -18,27 +12,17 @@ namespace gdjs {
|
||||
parameterName: string,
|
||||
value: number
|
||||
) {
|
||||
const colorReplaceFilter = (filter as unknown) as PIXI.filters.ColorReplaceFilter &
|
||||
ColorReplaceFilterExtra;
|
||||
const colorReplaceFilter = (filter as unknown) as PIXI.filters.ColorReplaceFilter;
|
||||
if (parameterName === 'epsilon') {
|
||||
colorReplaceFilter.epsilon = value;
|
||||
}
|
||||
}
|
||||
getDoubleParameter(filter: PIXI.Filter, parameterName: string): number {
|
||||
const colorReplaceFilter = (filter as unknown) as PIXI.filters.ColorReplaceFilter &
|
||||
ColorReplaceFilterExtra;
|
||||
if (parameterName === 'epsilon') {
|
||||
return colorReplaceFilter.epsilon;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
updateStringParameter(
|
||||
filter: PIXI.Filter,
|
||||
parameterName: string,
|
||||
value: string
|
||||
) {
|
||||
const colorReplaceFilter = (filter as unknown) as PIXI.filters.ColorReplaceFilter &
|
||||
ColorReplaceFilterExtra;
|
||||
const colorReplaceFilter = (filter as unknown) as PIXI.filters.ColorReplaceFilter;
|
||||
if (parameterName === 'originalColor') {
|
||||
colorReplaceFilter.originalColor = gdjs.PixiFiltersTools.rgbOrHexToHexNumber(
|
||||
value
|
||||
@@ -49,29 +33,6 @@ namespace gdjs {
|
||||
);
|
||||
}
|
||||
}
|
||||
updateColorParameter(
|
||||
filter: PIXI.Filter,
|
||||
parameterName: string,
|
||||
value: number
|
||||
): void {
|
||||
const colorReplaceFilter = (filter as unknown) as PIXI.filters.ColorReplaceFilter &
|
||||
ColorReplaceFilterExtra;
|
||||
if (parameterName === 'originalColor') {
|
||||
colorReplaceFilter.originalColor = value;
|
||||
} else if (parameterName === 'newColor') {
|
||||
colorReplaceFilter.newColor = value;
|
||||
}
|
||||
}
|
||||
getColorParameter(filter: PIXI.Filter, parameterName: string): number {
|
||||
const colorReplaceFilter = (filter as unknown) as PIXI.filters.ColorReplaceFilter &
|
||||
ColorReplaceFilterExtra;
|
||||
if (parameterName === 'originalColor') {
|
||||
return colorReplaceFilter.originalColor;
|
||||
} else if (parameterName === 'newColor') {
|
||||
return colorReplaceFilter.newColor;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
updateBooleanParameter(
|
||||
filter: PIXI.Filter,
|
||||
parameterName: string,
|
||||
|
@@ -1,32 +1,25 @@
|
||||
// @ts-nocheck - TODO: fix typings in this file
|
||||
|
||||
namespace gdjs {
|
||||
interface CRTFilterExtra {
|
||||
_animationTimer: number;
|
||||
animationSpeed: number;
|
||||
animationFrequency: number;
|
||||
}
|
||||
gdjs.PixiFiltersTools.registerFilterCreator(
|
||||
'CRT',
|
||||
new (class extends gdjs.PixiFiltersTools.PixiFilterCreator {
|
||||
makePIXIFilter(layer, effectData) {
|
||||
const filter = new PIXI.filters.CRTFilter();
|
||||
const crtFilter = (filter as unknown) as PIXI.filters.CRTFilter &
|
||||
CRTFilterExtra;
|
||||
const crtFilter = new PIXI.filters.CRTFilter();
|
||||
crtFilter._animationTimer = 0;
|
||||
return crtFilter;
|
||||
}
|
||||
updatePreRender(filter: PIXI.Filter, target: EffectsTarget) {
|
||||
const crtFilter = (filter as unknown) as PIXI.filters.CRTFilter &
|
||||
CRTFilterExtra;
|
||||
if (crtFilter.animationSpeed !== 0) {
|
||||
if (filter.animationSpeed !== 0) {
|
||||
// Multiply by 10 so that the default value is a sensible speed
|
||||
crtFilter.time +=
|
||||
(target.getElapsedTime() / 1000) * 10 * crtFilter.animationSpeed;
|
||||
filter.time +=
|
||||
(target.getElapsedTime() / 1000) * 10 * filter.animationSpeed;
|
||||
}
|
||||
if (crtFilter.animationFrequency !== 0) {
|
||||
crtFilter._animationTimer += target.getElapsedTime() / 1000;
|
||||
if (crtFilter._animationTimer >= 1 / crtFilter.animationFrequency) {
|
||||
crtFilter.seed = Math.random();
|
||||
crtFilter._animationTimer = 0;
|
||||
if (filter.animationFrequency !== 0) {
|
||||
filter._animationTimer += target.getElapsedTime() / 1000;
|
||||
if (filter._animationTimer >= 1 / filter.animationFrequency) {
|
||||
filter.seed = Math.random();
|
||||
filter._animationTimer = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -35,91 +28,42 @@ namespace gdjs {
|
||||
parameterName: string,
|
||||
value: number
|
||||
) {
|
||||
const crtFilter = (filter as unknown) as PIXI.filters.CRTFilter &
|
||||
CRTFilterExtra;
|
||||
if (parameterName === 'lineWidth') {
|
||||
crtFilter.lineWidth = value;
|
||||
filter.lineWidth = value;
|
||||
} else if (parameterName === 'lineContrast') {
|
||||
crtFilter.lineContrast = value;
|
||||
filter.lineContrast = value;
|
||||
} else if (parameterName === 'noise') {
|
||||
crtFilter.noise = value;
|
||||
filter.noise = value;
|
||||
} else if (parameterName === 'curvature') {
|
||||
crtFilter.curvature = value;
|
||||
filter.curvature = value;
|
||||
} else if (parameterName === 'noiseSize') {
|
||||
crtFilter.noiseSize = value;
|
||||
filter.noiseSize = value;
|
||||
} else if (parameterName === 'vignetting') {
|
||||
crtFilter.vignetting = value;
|
||||
filter.vignetting = value;
|
||||
} else if (parameterName === 'vignettingAlpha') {
|
||||
crtFilter.vignettingAlpha = value;
|
||||
filter.vignettingAlpha = value;
|
||||
} else if (parameterName === 'vignettingBlur') {
|
||||
crtFilter.vignettingBlur = value;
|
||||
filter.vignettingBlur = value;
|
||||
} else if (parameterName === 'animationSpeed') {
|
||||
crtFilter.animationSpeed = value;
|
||||
filter.animationSpeed = value;
|
||||
} else if (parameterName === 'animationFrequency') {
|
||||
crtFilter.animationFrequency = value;
|
||||
filter.animationFrequency = value;
|
||||
} else if (parameterName === 'padding') {
|
||||
crtFilter.padding = value;
|
||||
filter.padding = value;
|
||||
}
|
||||
}
|
||||
getDoubleParameter(filter: PIXI.Filter, parameterName: string): number {
|
||||
const crtFilter = (filter as unknown) as PIXI.filters.CRTFilter &
|
||||
CRTFilterExtra;
|
||||
if (parameterName === 'lineWidth') {
|
||||
return crtFilter.lineWidth;
|
||||
}
|
||||
if (parameterName === 'lineContrast') {
|
||||
return crtFilter.lineContrast;
|
||||
}
|
||||
if (parameterName === 'noise') {
|
||||
return crtFilter.noise;
|
||||
}
|
||||
if (parameterName === 'curvature') {
|
||||
return crtFilter.curvature;
|
||||
}
|
||||
if (parameterName === 'noiseSize') {
|
||||
return crtFilter.noiseSize;
|
||||
}
|
||||
if (parameterName === 'vignetting') {
|
||||
return crtFilter.vignetting;
|
||||
}
|
||||
if (parameterName === 'vignettingAlpha') {
|
||||
return crtFilter.vignettingAlpha;
|
||||
}
|
||||
if (parameterName === 'vignettingBlur') {
|
||||
return crtFilter.vignettingBlur;
|
||||
}
|
||||
if (parameterName === 'animationSpeed') {
|
||||
return crtFilter.animationSpeed;
|
||||
}
|
||||
if (parameterName === 'animationFrequency') {
|
||||
return crtFilter.animationFrequency;
|
||||
}
|
||||
if (parameterName === 'padding') {
|
||||
return crtFilter.padding;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
updateStringParameter(
|
||||
filter: PIXI.Filter,
|
||||
parameterName: string,
|
||||
value: string
|
||||
) {}
|
||||
updateColorParameter(
|
||||
filter: PIXI.Filter,
|
||||
parameterName: string,
|
||||
value: number
|
||||
): void {}
|
||||
getColorParameter(filter: PIXI.Filter, parameterName: string): number {
|
||||
return 0;
|
||||
}
|
||||
updateBooleanParameter(
|
||||
filter: PIXI.Filter,
|
||||
parameterName: string,
|
||||
value: boolean
|
||||
) {
|
||||
const crtFilter = (filter as unknown) as PIXI.filters.CRTFilter;
|
||||
if (parameterName === 'verticalLine') {
|
||||
crtFilter.verticalLine = value;
|
||||
filter.verticalLine = value;
|
||||
}
|
||||
}
|
||||
})()
|
||||
|
@@ -29,29 +29,11 @@ namespace gdjs {
|
||||
displacementFilter.scale.y = value;
|
||||
}
|
||||
}
|
||||
getDoubleParameter(filter: PIXI.Filter, parameterName: string): number {
|
||||
const displacementFilter = (filter as unknown) as PIXI.DisplacementFilter;
|
||||
if (parameterName === 'scaleX') {
|
||||
return displacementFilter.scale.x;
|
||||
}
|
||||
if (parameterName === 'scaleY') {
|
||||
return displacementFilter.scale.y;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
updateStringParameter(
|
||||
filter: PIXI.Filter,
|
||||
parameterName: string,
|
||||
value: string
|
||||
) {}
|
||||
updateColorParameter(
|
||||
filter: PIXI.Filter,
|
||||
parameterName: string,
|
||||
value: number
|
||||
): void {}
|
||||
getColorParameter(filter: PIXI.Filter, parameterName: string): number {
|
||||
return 0;
|
||||
}
|
||||
updateBooleanParameter(
|
||||
filter: PIXI.Filter,
|
||||
parameterName: string,
|
||||
|
@@ -19,29 +19,11 @@ namespace gdjs {
|
||||
dotFilter.angle = value;
|
||||
}
|
||||
}
|
||||
getDoubleParameter(filter: PIXI.Filter, parameterName: string): number {
|
||||
const dotFilter = (filter as unknown) as PIXI.filters.DotFilter;
|
||||
if (parameterName === 'scale') {
|
||||
return dotFilter.scale;
|
||||
}
|
||||
if (parameterName === 'angle') {
|
||||
return dotFilter.angle;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
updateStringParameter(
|
||||
filter: PIXI.Filter,
|
||||
parameterName: string,
|
||||
value: string
|
||||
) {}
|
||||
updateColorParameter(
|
||||
filter: PIXI.Filter,
|
||||
parameterName: string,
|
||||
value: number
|
||||
): void {}
|
||||
getColorParameter(filter: PIXI.Filter, parameterName: string): number {
|
||||
return 0;
|
||||
}
|
||||
updateBooleanParameter(
|
||||
filter: PIXI.Filter,
|
||||
parameterName: string,
|
||||
|
@@ -27,28 +27,6 @@ namespace gdjs {
|
||||
dropShadowFilter.padding = value;
|
||||
}
|
||||
}
|
||||
getDoubleParameter(filter: PIXI.Filter, parameterName: string): number {
|
||||
const dropShadowFilter = (filter as unknown) as PIXI.filters.DropShadowFilter;
|
||||
if (parameterName === 'blur') {
|
||||
return dropShadowFilter.blur;
|
||||
}
|
||||
if (parameterName === 'quality') {
|
||||
return dropShadowFilter.quality;
|
||||
}
|
||||
if (parameterName === 'alpha') {
|
||||
return dropShadowFilter.alpha;
|
||||
}
|
||||
if (parameterName === 'distance') {
|
||||
return dropShadowFilter.distance;
|
||||
}
|
||||
if (parameterName === 'rotation') {
|
||||
return dropShadowFilter.rotation;
|
||||
}
|
||||
if (parameterName === 'padding') {
|
||||
return dropShadowFilter.padding;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
updateStringParameter(
|
||||
filter: PIXI.Filter,
|
||||
parameterName: string,
|
||||
@@ -61,23 +39,6 @@ namespace gdjs {
|
||||
);
|
||||
}
|
||||
}
|
||||
updateColorParameter(
|
||||
filter: PIXI.Filter,
|
||||
parameterName: string,
|
||||
value: number
|
||||
): void {
|
||||
const dropShadowFilter = (filter as unknown) as PIXI.filters.DropShadowFilter;
|
||||
if (parameterName === 'color') {
|
||||
dropShadowFilter.color = value;
|
||||
}
|
||||
}
|
||||
getColorParameter(filter: PIXI.Filter, parameterName: string): number {
|
||||
const dropShadowFilter = (filter as unknown) as PIXI.filters.DropShadowFilter;
|
||||
if (parameterName === 'color') {
|
||||
return dropShadowFilter.color;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
updateBooleanParameter(
|
||||
filter: PIXI.Filter,
|
||||
parameterName: string,
|
||||
|
@@ -1,29 +1,20 @@
|
||||
// @ts-nocheck - TODO: fix typings in this file
|
||||
|
||||
namespace gdjs {
|
||||
interface GlitchFilterExtra {
|
||||
_animationTimer: number;
|
||||
animationFrequency: number;
|
||||
}
|
||||
gdjs.PixiFiltersTools.registerFilterCreator(
|
||||
'Glitch',
|
||||
new (class extends gdjs.PixiFiltersTools.PixiFilterCreator {
|
||||
makePIXIFilter(layer, effectData) {
|
||||
const filter = new PIXI.filters.GlitchFilter();
|
||||
const glitchFilter = (filter as unknown) as PIXI.filters.GlitchFilter &
|
||||
GlitchFilterExtra;
|
||||
const glitchFilter = new PIXI.filters.GlitchFilter();
|
||||
glitchFilter._animationTimer = 0;
|
||||
return glitchFilter;
|
||||
}
|
||||
updatePreRender(filter: PIXI.Filter, target: EffectsTarget) {
|
||||
const glitchFilter = (filter as unknown) as PIXI.filters.GlitchFilter &
|
||||
GlitchFilterExtra;
|
||||
if (glitchFilter.animationFrequency !== 0) {
|
||||
glitchFilter._animationTimer += target.getElapsedTime() / 1000;
|
||||
if (
|
||||
glitchFilter._animationTimer >=
|
||||
1 / glitchFilter.animationFrequency
|
||||
) {
|
||||
glitchFilter.seed = Math.random();
|
||||
glitchFilter._animationTimer = 0;
|
||||
if (filter.animationFrequency !== 0) {
|
||||
filter._animationTimer += target.getElapsedTime() / 1000;
|
||||
if (filter._animationTimer >= 1 / filter.animationFrequency) {
|
||||
filter.seed = Math.random();
|
||||
filter._animationTimer = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -32,102 +23,46 @@ namespace gdjs {
|
||||
parameterName: string,
|
||||
value: number
|
||||
) {
|
||||
const glitchFilter = (filter as unknown) as PIXI.filters.GlitchFilter &
|
||||
GlitchFilterExtra;
|
||||
if (parameterName === 'slices') {
|
||||
glitchFilter.slices = value;
|
||||
filter.slices = value;
|
||||
} else if (parameterName === 'offset') {
|
||||
glitchFilter.offset = value;
|
||||
filter.offset = value;
|
||||
} else if (parameterName === 'direction') {
|
||||
glitchFilter.direction = value;
|
||||
filter.direction = value;
|
||||
} else if (parameterName === 'fillMode') {
|
||||
glitchFilter.fillMode = value;
|
||||
filter.fillMode = value;
|
||||
} else if (parameterName === 'minSize') {
|
||||
glitchFilter.minSize = value;
|
||||
filter.minSize = value;
|
||||
} else if (parameterName === 'sampleSize') {
|
||||
glitchFilter.sampleSize = value;
|
||||
filter.sampleSize = value;
|
||||
} else if (parameterName === 'redX') {
|
||||
glitchFilter.red.x = value;
|
||||
filter.red.x = value;
|
||||
} else if (parameterName === 'redY') {
|
||||
glitchFilter.red.y = value;
|
||||
filter.red.y = value;
|
||||
} else if (parameterName === 'greenX') {
|
||||
glitchFilter.green.x = value;
|
||||
filter.green.x = value;
|
||||
} else if (parameterName === 'greenY') {
|
||||
glitchFilter.green.y = value;
|
||||
filter.green.y = value;
|
||||
} else if (parameterName === 'blueX') {
|
||||
glitchFilter.blue.x = value;
|
||||
filter.blue.x = value;
|
||||
} else if (parameterName === 'blueY') {
|
||||
glitchFilter.blue.y = value;
|
||||
filter.blue.y = value;
|
||||
} else if (parameterName === 'animationFrequency') {
|
||||
glitchFilter.animationFrequency = value;
|
||||
filter.animationFrequency = value;
|
||||
}
|
||||
}
|
||||
getDoubleParameter(filter: PIXI.Filter, parameterName: string): number {
|
||||
const glitchFilter = (filter as unknown) as PIXI.filters.GlitchFilter &
|
||||
GlitchFilterExtra;
|
||||
if (parameterName === 'slices') {
|
||||
return glitchFilter.slices;
|
||||
}
|
||||
if (parameterName === 'offset') {
|
||||
return glitchFilter.offset;
|
||||
}
|
||||
if (parameterName === 'direction') {
|
||||
return glitchFilter.direction;
|
||||
}
|
||||
if (parameterName === 'fillMode') {
|
||||
return glitchFilter.fillMode;
|
||||
}
|
||||
if (parameterName === 'minSize') {
|
||||
return glitchFilter.minSize;
|
||||
}
|
||||
if (parameterName === 'sampleSize') {
|
||||
return glitchFilter.sampleSize;
|
||||
}
|
||||
if (parameterName === 'redX') {
|
||||
return glitchFilter.red.x;
|
||||
}
|
||||
if (parameterName === 'redY') {
|
||||
return glitchFilter.red.y;
|
||||
}
|
||||
if (parameterName === 'greenX') {
|
||||
return glitchFilter.green.x;
|
||||
}
|
||||
if (parameterName === 'greenY') {
|
||||
return glitchFilter.green.y;
|
||||
}
|
||||
if (parameterName === 'blueX') {
|
||||
return glitchFilter.blue.x;
|
||||
}
|
||||
if (parameterName === 'blueY') {
|
||||
return glitchFilter.blue.y;
|
||||
}
|
||||
if (parameterName === 'animationFrequency') {
|
||||
return glitchFilter.animationFrequency;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
updateStringParameter(
|
||||
filter: PIXI.Filter,
|
||||
parameterName: string,
|
||||
value: string
|
||||
) {}
|
||||
updateColorParameter(
|
||||
filter: PIXI.Filter,
|
||||
parameterName: string,
|
||||
value: number
|
||||
): void {}
|
||||
getColorParameter(filter: PIXI.Filter, parameterName: string): number {
|
||||
return 0;
|
||||
}
|
||||
updateBooleanParameter(
|
||||
filter: PIXI.Filter,
|
||||
parameterName: string,
|
||||
value: boolean
|
||||
) {
|
||||
const glitchFilter = (filter as unknown) as PIXI.filters.GlitchFilter &
|
||||
GlitchFilterExtra;
|
||||
if (parameterName === 'average') {
|
||||
glitchFilter.average = value;
|
||||
filter.average = value;
|
||||
}
|
||||
}
|
||||
})()
|
||||
|
@@ -1,7 +1,4 @@
|
||||
namespace gdjs {
|
||||
interface GlowFilterExtra {
|
||||
distance: number;
|
||||
}
|
||||
gdjs.PixiFiltersTools.registerFilterCreator(
|
||||
'Glow',
|
||||
new (class extends gdjs.PixiFiltersTools.PixiFilterCreator {
|
||||
@@ -15,60 +12,26 @@ namespace gdjs {
|
||||
parameterName: string,
|
||||
value: number
|
||||
) {
|
||||
const glowFilter = (filter as unknown) as PIXI.filters.GlowFilter &
|
||||
GlowFilterExtra;
|
||||
const glowFilter = (filter as unknown) as PIXI.filters.GlowFilter;
|
||||
if (parameterName === 'innerStrength') {
|
||||
glowFilter.innerStrength = value;
|
||||
} else if (parameterName === 'outerStrength') {
|
||||
glowFilter.outerStrength = value;
|
||||
} else if (parameterName === 'distance') {
|
||||
// @ts-ignore
|
||||
glowFilter.distance = value;
|
||||
}
|
||||
}
|
||||
getDoubleParameter(filter: PIXI.Filter, parameterName: string): number {
|
||||
const glowFilter = (filter as unknown) as PIXI.filters.GlowFilter &
|
||||
GlowFilterExtra;
|
||||
if (parameterName === 'innerStrength') {
|
||||
return glowFilter.innerStrength;
|
||||
}
|
||||
if (parameterName === 'outerStrength') {
|
||||
return glowFilter.outerStrength;
|
||||
}
|
||||
if (parameterName === 'distance') {
|
||||
return glowFilter.distance;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
updateStringParameter(
|
||||
filter: PIXI.Filter,
|
||||
parameterName: string,
|
||||
value: string
|
||||
) {
|
||||
const glowFilter = (filter as unknown) as PIXI.filters.GlowFilter &
|
||||
GlowFilterExtra;
|
||||
const glowFilter = (filter as unknown) as PIXI.filters.GlowFilter;
|
||||
if (parameterName === 'color') {
|
||||
glowFilter.color = gdjs.PixiFiltersTools.rgbOrHexToHexNumber(value);
|
||||
}
|
||||
}
|
||||
updateColorParameter(
|
||||
filter: PIXI.Filter,
|
||||
parameterName: string,
|
||||
value: number
|
||||
): void {
|
||||
const glowFilter = (filter as unknown) as PIXI.filters.GlowFilter &
|
||||
GlowFilterExtra;
|
||||
if (parameterName === 'color') {
|
||||
glowFilter.color = value;
|
||||
}
|
||||
}
|
||||
getColorParameter(filter: PIXI.Filter, parameterName: string): number {
|
||||
const glowFilter = (filter as unknown) as PIXI.filters.GlowFilter &
|
||||
GlowFilterExtra;
|
||||
if (parameterName === 'color') {
|
||||
return glowFilter.color;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
updateBooleanParameter(
|
||||
filter: PIXI.Filter,
|
||||
parameterName: string,
|
||||
|
@@ -1,10 +1,6 @@
|
||||
// @ts-nocheck - TODO: fix typings in this file
|
||||
|
||||
namespace gdjs {
|
||||
interface GodrayFilterExtra {
|
||||
animationSpeed: number;
|
||||
light: number;
|
||||
x: number;
|
||||
y: number;
|
||||
}
|
||||
gdjs.PixiFiltersTools.registerFilterCreator(
|
||||
'Godray',
|
||||
new (class extends gdjs.PixiFiltersTools.PixiFilterCreator {
|
||||
@@ -13,11 +9,9 @@ namespace gdjs {
|
||||
return godrayFilter;
|
||||
}
|
||||
updatePreRender(filter: PIXI.Filter, target: EffectsTarget) {
|
||||
const godrayFilter = (filter as unknown) as PIXI.filters.GodrayFilter &
|
||||
GodrayFilterExtra;
|
||||
if (godrayFilter.animationSpeed !== 0) {
|
||||
godrayFilter.time +=
|
||||
(target.getElapsedTime() / 1000) * godrayFilter.animationSpeed;
|
||||
if (filter.animationSpeed !== 0) {
|
||||
filter.time +=
|
||||
(target.getElapsedTime() / 1000) * filter.animationSpeed;
|
||||
}
|
||||
}
|
||||
updateDoubleParameter(
|
||||
@@ -25,77 +19,36 @@ namespace gdjs {
|
||||
parameterName: string,
|
||||
value: number
|
||||
) {
|
||||
const godrayFilter = (filter as unknown) as PIXI.filters.GodrayFilter &
|
||||
GodrayFilterExtra;
|
||||
if (parameterName === 'lacunarity') {
|
||||
godrayFilter.lacunarity = value;
|
||||
filter.lacunarity = value;
|
||||
} else if (parameterName === 'angle') {
|
||||
godrayFilter.angle = value;
|
||||
filter.angle = value;
|
||||
} else if (parameterName === 'gain') {
|
||||
godrayFilter.gain = value;
|
||||
filter.gain = value;
|
||||
} else if (parameterName === 'light') {
|
||||
godrayFilter.light = value;
|
||||
filter.light = value;
|
||||
} else if (parameterName === 'x') {
|
||||
godrayFilter.x = value;
|
||||
filter.x = value;
|
||||
} else if (parameterName === 'y') {
|
||||
godrayFilter.y = value;
|
||||
filter.y = value;
|
||||
} else if (parameterName === 'animationSpeed') {
|
||||
godrayFilter.animationSpeed = value;
|
||||
filter.animationSpeed = value;
|
||||
} else if (parameterName === 'padding') {
|
||||
godrayFilter.padding = value;
|
||||
filter.padding = value;
|
||||
}
|
||||
}
|
||||
getDoubleParameter(filter: PIXI.Filter, parameterName: string): number {
|
||||
const godrayFilter = (filter as unknown) as PIXI.filters.GodrayFilter &
|
||||
GodrayFilterExtra;
|
||||
if (parameterName === 'lacunarity') {
|
||||
return godrayFilter.lacunarity;
|
||||
}
|
||||
if (parameterName === 'angle') {
|
||||
return godrayFilter.angle;
|
||||
}
|
||||
if (parameterName === 'gain') {
|
||||
return godrayFilter.gain;
|
||||
}
|
||||
if (parameterName === 'light') {
|
||||
return godrayFilter.light;
|
||||
}
|
||||
if (parameterName === 'x') {
|
||||
return godrayFilter.x;
|
||||
}
|
||||
if (parameterName === 'y') {
|
||||
return godrayFilter.y;
|
||||
}
|
||||
if (parameterName === 'animationSpeed') {
|
||||
return godrayFilter.animationSpeed;
|
||||
}
|
||||
if (parameterName === 'padding') {
|
||||
return godrayFilter.padding;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
updateStringParameter(
|
||||
filter: PIXI.Filter,
|
||||
parameterName: string,
|
||||
value: string
|
||||
) {}
|
||||
updateColorParameter(
|
||||
filter: PIXI.Filter,
|
||||
parameterName: string,
|
||||
value: number
|
||||
): void {}
|
||||
getColorParameter(filter: PIXI.Filter, parameterName: string): number {
|
||||
return 0;
|
||||
}
|
||||
updateBooleanParameter(
|
||||
filter: PIXI.Filter,
|
||||
parameterName: string,
|
||||
value: boolean
|
||||
) {
|
||||
const godrayFilter = (filter as unknown) as PIXI.filters.GodrayFilter &
|
||||
GodrayFilterExtra;
|
||||
if (parameterName === 'parallel') {
|
||||
godrayFilter.parallel = value;
|
||||
filter.parallel = value;
|
||||
}
|
||||
}
|
||||
})()
|
||||
|
@@ -23,35 +23,11 @@ namespace gdjs {
|
||||
hslAdjustmentFilter.alpha = value;
|
||||
}
|
||||
}
|
||||
getDoubleParameter(filter: PIXI.Filter, parameterName: string): number {
|
||||
const hslAdjustmentFilter = filter as PIXI.filters.HslAdjustmentFilter;
|
||||
if (parameterName === 'hue') {
|
||||
return hslAdjustmentFilter.hue;
|
||||
}
|
||||
if (parameterName === 'saturation') {
|
||||
return hslAdjustmentFilter.saturation;
|
||||
}
|
||||
if (parameterName === 'lightness') {
|
||||
return hslAdjustmentFilter.lightness;
|
||||
}
|
||||
if (parameterName === 'alpha') {
|
||||
return hslAdjustmentFilter.alpha;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
updateStringParameter(
|
||||
filter: PIXI.Filter,
|
||||
parameterName: string,
|
||||
value: string
|
||||
) {}
|
||||
updateColorParameter(
|
||||
filter: PIXI.Filter,
|
||||
parameterName: string,
|
||||
value: number
|
||||
): void {}
|
||||
getColorParameter(filter: PIXI.Filter, parameterName: string): number {
|
||||
return 0;
|
||||
}
|
||||
updateBooleanParameter(
|
||||
filter: PIXI.Filter,
|
||||
parameterName: string,
|
||||
|
@@ -23,35 +23,11 @@ namespace gdjs {
|
||||
kawaseBlurFilter.quality = value;
|
||||
}
|
||||
}
|
||||
getDoubleParameter(filter: PIXI.Filter, parameterName: string): number {
|
||||
const kawaseBlurFilter = (filter as unknown) as PIXI.filters.KawaseBlurFilter;
|
||||
if (parameterName === 'pixelizeX') {
|
||||
return kawaseBlurFilter.pixelSize[0];
|
||||
}
|
||||
if (parameterName === 'pixelizeY') {
|
||||
return kawaseBlurFilter.pixelSize[1];
|
||||
}
|
||||
if (parameterName === 'blur') {
|
||||
return kawaseBlurFilter.blur;
|
||||
}
|
||||
if (parameterName === 'quality') {
|
||||
return kawaseBlurFilter.quality;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
updateStringParameter(
|
||||
filter: PIXI.Filter,
|
||||
parameterName: string,
|
||||
value: string
|
||||
) {}
|
||||
updateColorParameter(
|
||||
filter: PIXI.Filter,
|
||||
parameterName: string,
|
||||
value: number
|
||||
): void {}
|
||||
getColorParameter(filter: PIXI.Filter, parameterName: string): number {
|
||||
return 0;
|
||||
}
|
||||
updateBooleanParameter(
|
||||
filter: PIXI.Filter,
|
||||
parameterName: string,
|
||||
|
@@ -34,33 +34,16 @@ namespace gdjs {
|
||||
parameterName: string,
|
||||
value: number
|
||||
) {
|
||||
if (parameterName === 'opacity') {
|
||||
filter.uniforms.opacity = gdjs.PixiFiltersTools.clampValue(
|
||||
value,
|
||||
0,
|
||||
1
|
||||
);
|
||||
if (parameterName !== 'opacity') {
|
||||
return;
|
||||
}
|
||||
}
|
||||
getDoubleParameter(filter: PIXI.Filter, parameterName: string): number {
|
||||
if (parameterName === 'opacity') {
|
||||
return filter.uniforms.opacity;
|
||||
}
|
||||
return 0;
|
||||
filter.uniforms.opacity = gdjs.PixiFiltersTools.clampValue(value, 0, 1);
|
||||
}
|
||||
updateStringParameter(
|
||||
filter: PIXI.Filter,
|
||||
parameterName: string,
|
||||
value: string
|
||||
) {}
|
||||
updateColorParameter(
|
||||
filter: PIXI.Filter,
|
||||
parameterName: string,
|
||||
value: number
|
||||
): void {}
|
||||
getColorParameter(filter: PIXI.Filter, parameterName: string): number {
|
||||
return 0;
|
||||
}
|
||||
updateBooleanParameter(
|
||||
filter: PIXI.Filter,
|
||||
parameterName: string,
|
||||
|
@@ -1,8 +1,4 @@
|
||||
namespace gdjs {
|
||||
interface MotionBlurFilterExtra {
|
||||
/**Use the private member avoids to instantiate Arrays.*/
|
||||
_velocity: PIXI.Point;
|
||||
}
|
||||
gdjs.PixiFiltersTools.registerFilterCreator(
|
||||
'MotionBlur',
|
||||
new (class extends gdjs.PixiFiltersTools.PixiFilterCreator {
|
||||
@@ -16,11 +12,12 @@ namespace gdjs {
|
||||
parameterName: string,
|
||||
value: number
|
||||
) {
|
||||
const motionBlurFilter = filter as PIXI.filters.MotionBlurFilter &
|
||||
MotionBlurFilterExtra;
|
||||
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;
|
||||
@@ -28,36 +25,11 @@ namespace gdjs {
|
||||
motionBlurFilter.offset = value;
|
||||
}
|
||||
}
|
||||
getDoubleParameter(filter: PIXI.Filter, parameterName: string): number {
|
||||
const motionBlurFilter = filter as PIXI.filters.MotionBlurFilter &
|
||||
MotionBlurFilterExtra;
|
||||
if (parameterName === 'velocityX') {
|
||||
return motionBlurFilter._velocity.x;
|
||||
}
|
||||
if (parameterName === 'velocityY') {
|
||||
return motionBlurFilter._velocity.y;
|
||||
}
|
||||
if (parameterName === 'kernelSize') {
|
||||
return motionBlurFilter.kernelSize;
|
||||
}
|
||||
if (parameterName === 'offset') {
|
||||
return motionBlurFilter.offset;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
updateStringParameter(
|
||||
filter: PIXI.Filter,
|
||||
parameterName: string,
|
||||
value: string
|
||||
) {}
|
||||
updateColorParameter(
|
||||
filter: PIXI.Filter,
|
||||
parameterName: string,
|
||||
value: number
|
||||
): void {}
|
||||
getColorParameter(filter: PIXI.Filter, parameterName: string): number {
|
||||
return 0;
|
||||
}
|
||||
updateBooleanParameter(
|
||||
filter: PIXI.Filter,
|
||||
parameterName: string,
|
||||
|
@@ -47,22 +47,11 @@ namespace gdjs {
|
||||
1
|
||||
);
|
||||
}
|
||||
getDoubleParameter(filter: PIXI.Filter, parameterName: string): number {
|
||||
return filter.uniforms[parameterName] || 0;
|
||||
}
|
||||
updateStringParameter(
|
||||
filter: PIXI.Filter,
|
||||
parameterName: string,
|
||||
value: string
|
||||
) {}
|
||||
updateColorParameter(
|
||||
filter: PIXI.Filter,
|
||||
parameterName: string,
|
||||
value: number
|
||||
): void {}
|
||||
getColorParameter(filter: PIXI.Filter, parameterName: string): number {
|
||||
return 0;
|
||||
}
|
||||
updateBooleanParameter(
|
||||
filter: PIXI.Filter,
|
||||
parameterName: string,
|
||||
|
@@ -13,30 +13,16 @@ namespace gdjs {
|
||||
value: number
|
||||
) {
|
||||
const noiseFilter = (filter as unknown) as PIXI.NoiseFilter;
|
||||
if (parameterName === 'noise') {
|
||||
noiseFilter.noise = gdjs.PixiFiltersTools.clampValue(value, 0, 1);
|
||||
if (parameterName !== 'noise') {
|
||||
return;
|
||||
}
|
||||
}
|
||||
getDoubleParameter(filter: PIXI.Filter, parameterName: string): number {
|
||||
const noiseFilter = (filter as unknown) as PIXI.NoiseFilter;
|
||||
if (parameterName === 'noise') {
|
||||
return noiseFilter.noise;
|
||||
}
|
||||
return 0;
|
||||
noiseFilter.noise = gdjs.PixiFiltersTools.clampValue(value, 0, 1);
|
||||
}
|
||||
updateStringParameter(
|
||||
filter: PIXI.Filter,
|
||||
parameterName: string,
|
||||
value: string
|
||||
) {}
|
||||
updateColorParameter(
|
||||
filter: PIXI.Filter,
|
||||
parameterName: string,
|
||||
value: number
|
||||
): void {}
|
||||
getColorParameter(filter: PIXI.Filter, parameterName: string): number {
|
||||
return 0;
|
||||
}
|
||||
updateBooleanParameter(
|
||||
filter: PIXI.Filter,
|
||||
parameterName: string,
|
||||
|
@@ -1,29 +1,20 @@
|
||||
// @ts-nocheck - TODO: fix typings in this file
|
||||
|
||||
namespace gdjs {
|
||||
interface OldFilmFilterExtra {
|
||||
_animationTimer: number;
|
||||
animationFrequency: number;
|
||||
}
|
||||
gdjs.PixiFiltersTools.registerFilterCreator(
|
||||
'OldFilm',
|
||||
new (class extends gdjs.PixiFiltersTools.PixiFilterCreator {
|
||||
makePIXIFilter(layer, effectData) {
|
||||
const filter = new PIXI.filters.OldFilmFilter();
|
||||
const oldFilmFilter = (filter as unknown) as PIXI.filters.OldFilmFilter &
|
||||
OldFilmFilterExtra;
|
||||
const oldFilmFilter = new PIXI.filters.OldFilmFilter();
|
||||
oldFilmFilter._animationTimer = 0;
|
||||
return oldFilmFilter;
|
||||
}
|
||||
updatePreRender(filter: PIXI.Filter, target: EffectsTarget) {
|
||||
const oldFilmFilter = (filter as unknown) as PIXI.filters.OldFilmFilter &
|
||||
OldFilmFilterExtra;
|
||||
if (oldFilmFilter.animationFrequency !== 0) {
|
||||
oldFilmFilter._animationTimer += target.getElapsedTime() / 1000;
|
||||
if (
|
||||
oldFilmFilter._animationTimer >=
|
||||
1 / oldFilmFilter.animationFrequency
|
||||
) {
|
||||
oldFilmFilter.seed = Math.random();
|
||||
oldFilmFilter._animationTimer = 0;
|
||||
if (filter.animationFrequency !== 0) {
|
||||
filter._animationTimer += target.getElapsedTime() / 1000;
|
||||
if (filter._animationTimer >= 1 / filter.animationFrequency) {
|
||||
filter.seed = Math.random();
|
||||
filter._animationTimer = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -32,78 +23,33 @@ namespace gdjs {
|
||||
parameterName: string,
|
||||
value: number
|
||||
) {
|
||||
const oldFilmFilter = (filter as unknown) as PIXI.filters.OldFilmFilter &
|
||||
OldFilmFilterExtra;
|
||||
if (parameterName === 'sepia') {
|
||||
oldFilmFilter.sepia = value;
|
||||
filter.sepia = value;
|
||||
} else if (parameterName === 'noise') {
|
||||
oldFilmFilter.noise = value;
|
||||
filter.noise = value;
|
||||
} else if (parameterName === 'noiseSize') {
|
||||
oldFilmFilter.noiseSize = value;
|
||||
filter.noiseSize = value;
|
||||
} else if (parameterName === 'scratch') {
|
||||
oldFilmFilter.scratch = value;
|
||||
filter.scratch = value;
|
||||
} else if (parameterName === 'scratchDensity') {
|
||||
oldFilmFilter.scratchDensity = value;
|
||||
filter.scratchDensity = value;
|
||||
} else if (parameterName === 'scratchWidth') {
|
||||
oldFilmFilter.scratchWidth = value;
|
||||
filter.scratchWidth = value;
|
||||
} else if (parameterName === 'vignetting') {
|
||||
oldFilmFilter.vignetting = value;
|
||||
filter.vignetting = value;
|
||||
} else if (parameterName === 'vignettingAlpha') {
|
||||
oldFilmFilter.vignettingAlpha = value;
|
||||
filter.vignettingAlpha = value;
|
||||
} else if (parameterName === 'vignettingBlur') {
|
||||
oldFilmFilter.vignettingBlur = value;
|
||||
filter.vignettingBlur = value;
|
||||
} else if (parameterName === 'animationFrequency') {
|
||||
oldFilmFilter.animationFrequency = value;
|
||||
filter.animationFrequency = value;
|
||||
}
|
||||
}
|
||||
getDoubleParameter(filter: PIXI.Filter, parameterName: string): number {
|
||||
const oldFilmFilter = (filter as unknown) as PIXI.filters.OldFilmFilter &
|
||||
OldFilmFilterExtra;
|
||||
if (parameterName === 'sepia') {
|
||||
return oldFilmFilter.sepia;
|
||||
}
|
||||
if (parameterName === 'noise') {
|
||||
return oldFilmFilter.noise;
|
||||
}
|
||||
if (parameterName === 'noiseSize') {
|
||||
return oldFilmFilter.noiseSize;
|
||||
}
|
||||
if (parameterName === 'scratch') {
|
||||
return oldFilmFilter.scratch;
|
||||
}
|
||||
if (parameterName === 'scratchDensity') {
|
||||
return oldFilmFilter.scratchDensity;
|
||||
}
|
||||
if (parameterName === 'scratchWidth') {
|
||||
return oldFilmFilter.scratchWidth;
|
||||
}
|
||||
if (parameterName === 'vignetting') {
|
||||
return oldFilmFilter.vignetting;
|
||||
}
|
||||
if (parameterName === 'vignettingAlpha') {
|
||||
return oldFilmFilter.vignettingAlpha;
|
||||
}
|
||||
if (parameterName === 'vignettingBlur') {
|
||||
return oldFilmFilter.vignettingBlur;
|
||||
}
|
||||
if (parameterName === 'animationFrequency') {
|
||||
return oldFilmFilter.animationFrequency;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
updateStringParameter(
|
||||
filter: PIXI.Filter,
|
||||
parameterName: string,
|
||||
value: string
|
||||
) {}
|
||||
updateColorParameter(
|
||||
filter: PIXI.Filter,
|
||||
parameterName: string,
|
||||
value: number
|
||||
): void {}
|
||||
getColorParameter(filter: PIXI.Filter, parameterName: string): number {
|
||||
return 0;
|
||||
}
|
||||
updateBooleanParameter(
|
||||
filter: PIXI.Filter,
|
||||
parameterName: string,
|
||||
|
@@ -19,16 +19,6 @@ namespace gdjs {
|
||||
outlineFilter.padding = value;
|
||||
}
|
||||
}
|
||||
getDoubleParameter(filter: PIXI.Filter, parameterName: string): number {
|
||||
const outlineFilter = (filter as unknown) as PIXI.filters.OutlineFilter;
|
||||
if (parameterName === 'thickness') {
|
||||
return outlineFilter.thickness;
|
||||
}
|
||||
if (parameterName === 'padding') {
|
||||
return outlineFilter.padding;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
updateStringParameter(
|
||||
filter: PIXI.Filter,
|
||||
parameterName: string,
|
||||
@@ -41,23 +31,6 @@ namespace gdjs {
|
||||
);
|
||||
}
|
||||
}
|
||||
updateColorParameter(
|
||||
filter: PIXI.Filter,
|
||||
parameterName: string,
|
||||
value: number
|
||||
): void {
|
||||
const outlineFilter = (filter as unknown) as PIXI.filters.OutlineFilter;
|
||||
if (parameterName === 'color') {
|
||||
outlineFilter.color = value;
|
||||
}
|
||||
}
|
||||
getColorParameter(filter: PIXI.Filter, parameterName: string): number {
|
||||
const outlineFilter = (filter as unknown) as PIXI.filters.OutlineFilter;
|
||||
if (parameterName === 'color') {
|
||||
return outlineFilter.color;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
updateBooleanParameter(
|
||||
filter: PIXI.Filter,
|
||||
parameterName: string,
|
||||
|
@@ -1,8 +1,4 @@
|
||||
namespace gdjs {
|
||||
interface PixelateFilterExtra {
|
||||
/** It's only set to a number. */
|
||||
size: number;
|
||||
}
|
||||
gdjs.PixiFiltersTools.registerFilterCreator(
|
||||
'Pixelate',
|
||||
new (class extends gdjs.PixiFiltersTools.PixiFilterCreator {
|
||||
@@ -18,33 +14,16 @@ namespace gdjs {
|
||||
parameterName: string,
|
||||
value: number
|
||||
) {
|
||||
const pixelateFilter = (filter as unknown) as PIXI.filters.PixelateFilter &
|
||||
PixelateFilterExtra;
|
||||
const pixelateFilter = (filter as unknown) as PIXI.filters.PixelateFilter;
|
||||
if (parameterName === 'size') {
|
||||
pixelateFilter.size = value;
|
||||
}
|
||||
}
|
||||
getDoubleParameter(filter: PIXI.Filter, parameterName: string): number {
|
||||
const pixelateFilter = (filter as unknown) as PIXI.filters.PixelateFilter &
|
||||
PixelateFilterExtra;
|
||||
if (parameterName === 'size') {
|
||||
return pixelateFilter.size;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
updateStringParameter(
|
||||
filter: PIXI.Filter,
|
||||
parameterName: string,
|
||||
value: string
|
||||
) {}
|
||||
updateColorParameter(
|
||||
filter: PIXI.Filter,
|
||||
parameterName: string,
|
||||
value: number
|
||||
): void {}
|
||||
getColorParameter(filter: PIXI.Filter, parameterName: string): number {
|
||||
return 0;
|
||||
}
|
||||
updateBooleanParameter(
|
||||
filter: PIXI.Filter,
|
||||
parameterName: string,
|
||||
|
@@ -4,7 +4,7 @@ declare namespace PIXI.filters {
|
||||
curvature: number;
|
||||
lineWidth: number;
|
||||
lineContrast: number;
|
||||
verticalLine: boolean;
|
||||
verticalLine: number;
|
||||
noise: number;
|
||||
noiseSize: number;
|
||||
seed: number;
|
||||
@@ -17,7 +17,7 @@ declare namespace PIXI.filters {
|
||||
curvature?: number;
|
||||
lineWidth?: number;
|
||||
lineContrast?: number;
|
||||
verticalLine?: boolean;
|
||||
verticalLine?: number;
|
||||
noise?: number;
|
||||
noiseSize?: number;
|
||||
seed?: number;
|
||||
|
@@ -6,9 +6,6 @@ declare namespace PIXI.filters {
|
||||
direction: number;
|
||||
fillMode: number;
|
||||
seed: number;
|
||||
average: boolean;
|
||||
minSize: number;
|
||||
sampleSize: number;
|
||||
red: PIXI.Point;
|
||||
green: PIXI.Point;
|
||||
blue: PIXI.Point;
|
||||
@@ -24,13 +21,13 @@ declare namespace PIXI.filters {
|
||||
offset: number;
|
||||
direction: number;
|
||||
fillMode: number;
|
||||
seed: number;
|
||||
average: boolean;
|
||||
minSize: number;
|
||||
sampleSize: number;
|
||||
seed: number;
|
||||
red: PIXI.Point;
|
||||
green: PIXI.Point;
|
||||
blue: PIXI.Point;
|
||||
minSize: number;
|
||||
sampleSize: number;
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -1,9 +1,4 @@
|
||||
namespace gdjs {
|
||||
interface RadialBlurFilterExtra {
|
||||
// extra properties are stored on the filter.
|
||||
_centerX: number;
|
||||
_centerY: number;
|
||||
}
|
||||
gdjs.PixiFiltersTools.registerFilterCreator(
|
||||
'RadialBlur',
|
||||
new (class extends gdjs.PixiFiltersTools.PixiFilterCreator {
|
||||
@@ -12,12 +7,13 @@ namespace gdjs {
|
||||
return radialBlurFilter;
|
||||
}
|
||||
updatePreRender(filter: PIXI.Filter, target: EffectsTarget) {
|
||||
const radialBlurFilter = (filter as unknown) as PIXI.filters.RadialBlurFilter &
|
||||
RadialBlurFilterExtra;
|
||||
const radialBlurFilter = (filter as unknown) as PIXI.filters.RadialBlurFilter;
|
||||
radialBlurFilter.center[0] = Math.round(
|
||||
// @ts-ignore - extra properties are stored on the filter.
|
||||
radialBlurFilter._centerX * target.getWidth()
|
||||
);
|
||||
radialBlurFilter.center[1] = Math.round(
|
||||
// @ts-ignore - extra properties are stored on the filter.
|
||||
radialBlurFilter._centerY * target.getHeight()
|
||||
);
|
||||
}
|
||||
@@ -26,8 +22,7 @@ namespace gdjs {
|
||||
parameterName: string,
|
||||
value: number
|
||||
) {
|
||||
const radialBlurFilter = (filter as unknown) as PIXI.filters.RadialBlurFilter &
|
||||
RadialBlurFilterExtra;
|
||||
const radialBlurFilter = (filter as unknown) as PIXI.filters.RadialBlurFilter;
|
||||
if (parameterName === 'radius') {
|
||||
radialBlurFilter.radius = value < 0 ? -1 : value;
|
||||
} else if (parameterName === 'angle') {
|
||||
@@ -39,49 +34,20 @@ namespace gdjs {
|
||||
25
|
||||
);
|
||||
} else if (parameterName === 'centerX') {
|
||||
// @ts-ignore - extra properties are stored on the filter.
|
||||
radialBlurFilter._centerX = value;
|
||||
} else if (parameterName === 'centerY') {
|
||||
// @ts-ignore - extra properties are stored on the filter.
|
||||
radialBlurFilter._centerY = value;
|
||||
} else if (parameterName === 'padding') {
|
||||
radialBlurFilter.padding = value;
|
||||
}
|
||||
}
|
||||
getDoubleParameter(filter: PIXI.Filter, parameterName: string): number {
|
||||
const radialBlurFilter = (filter as unknown) as PIXI.filters.RadialBlurFilter &
|
||||
RadialBlurFilterExtra;
|
||||
if (parameterName === 'radius') {
|
||||
radialBlurFilter.radius;
|
||||
}
|
||||
if (parameterName === 'angle') {
|
||||
radialBlurFilter.angle;
|
||||
}
|
||||
if (parameterName === 'kernelSize') {
|
||||
radialBlurFilter.kernelSize;
|
||||
}
|
||||
if (parameterName === 'centerX') {
|
||||
radialBlurFilter._centerX;
|
||||
}
|
||||
if (parameterName === 'centerY') {
|
||||
radialBlurFilter._centerY;
|
||||
}
|
||||
if (parameterName === 'padding') {
|
||||
radialBlurFilter.padding;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
updateStringParameter(
|
||||
filter: PIXI.Filter,
|
||||
parameterName: string,
|
||||
value: string
|
||||
) {}
|
||||
updateColorParameter(
|
||||
filter: PIXI.Filter,
|
||||
parameterName: string,
|
||||
value: number
|
||||
): void {}
|
||||
getColorParameter(filter: PIXI.Filter, parameterName: string): number {
|
||||
return 0;
|
||||
}
|
||||
updateBooleanParameter(
|
||||
filter: PIXI.Filter,
|
||||
parameterName: string,
|
||||
|
@@ -1,39 +1,34 @@
|
||||
// @ts-nocheck - TODO: fix typings in this file
|
||||
|
||||
namespace gdjs {
|
||||
interface ReflectionFilterExtra {
|
||||
_animationTimer: number;
|
||||
animationSpeed: number;
|
||||
animationFrequency: number;
|
||||
}
|
||||
gdjs.PixiFiltersTools.registerFilterCreator(
|
||||
'Reflection',
|
||||
new (class extends gdjs.PixiFiltersTools.PixiFilterCreator {
|
||||
makePIXIFilter(layer, effectData) {
|
||||
let time = 0;
|
||||
const reflectionFilter = new PIXI.filters.ReflectionFilter({
|
||||
mirror: effectData.booleanParameters.mirror,
|
||||
boundary: effectData.doubleParameters.boundary,
|
||||
amplitude: [
|
||||
const reflectionFilter = new PIXI.filters.ReflectionFilter(
|
||||
effectData.booleanParameters.mirror,
|
||||
effectData.doubleParameters.boundary,
|
||||
[
|
||||
effectData.doubleParameters.amplitudeStart,
|
||||
effectData.doubleParameters.amplitudeEnding,
|
||||
],
|
||||
waveLength: [
|
||||
[
|
||||
effectData.doubleParameters.waveLengthStart,
|
||||
effectData.doubleParameters.waveLengthEnding,
|
||||
],
|
||||
alpha: [
|
||||
[
|
||||
effectData.doubleParameters.alphaStart,
|
||||
effectData.doubleParameters.alphaEnding,
|
||||
],
|
||||
time,
|
||||
});
|
||||
time
|
||||
);
|
||||
return reflectionFilter;
|
||||
}
|
||||
updatePreRender(filter: PIXI.Filter, target: EffectsTarget) {
|
||||
const reflectionFilter = (filter as unknown) as PIXI.filters.ReflectionFilter &
|
||||
ReflectionFilterExtra;
|
||||
if (reflectionFilter.animationSpeed !== 0) {
|
||||
reflectionFilter.time +=
|
||||
(target.getElapsedTime() / 1000) * reflectionFilter.animationSpeed;
|
||||
if (filter.animationSpeed !== 0) {
|
||||
filter.time +=
|
||||
(target.getElapsedTime() / 1000) * filter.animationSpeed;
|
||||
}
|
||||
}
|
||||
updateDoubleParameter(
|
||||
@@ -41,84 +36,43 @@ namespace gdjs {
|
||||
parameterName: string,
|
||||
value: number
|
||||
) {
|
||||
const reflectionFilter = (filter as unknown) as PIXI.filters.ReflectionFilter &
|
||||
ReflectionFilterExtra;
|
||||
if (parameterName === 'boundary') {
|
||||
reflectionFilter.boundary = value;
|
||||
filter.boundary = value;
|
||||
}
|
||||
if (parameterName === 'amplitudeStart') {
|
||||
reflectionFilter.amplitude[0] = value;
|
||||
filter.amplitude[0] = value;
|
||||
}
|
||||
if (parameterName === 'amplitudeEnding') {
|
||||
reflectionFilter.amplitude[1] = value;
|
||||
filter.amplitude[1] = value;
|
||||
}
|
||||
if (parameterName === 'waveLengthStart') {
|
||||
reflectionFilter.waveLength[0] = value;
|
||||
filter.waveLength[0] = value;
|
||||
}
|
||||
if (parameterName === 'waveLengthEnding') {
|
||||
reflectionFilter.waveLength[1] = value;
|
||||
filter.waveLength[1] = value;
|
||||
}
|
||||
if (parameterName === 'alphaStart') {
|
||||
reflectionFilter.alpha[0] = value;
|
||||
filter.alpha[0] = value;
|
||||
}
|
||||
if (parameterName === 'alphaEnding') {
|
||||
reflectionFilter.alpha[1] = value;
|
||||
filter.alpha[1] = value;
|
||||
}
|
||||
if (parameterName === 'animationSpeed') {
|
||||
reflectionFilter.animationSpeed = value;
|
||||
filter.animationSpeed = value;
|
||||
}
|
||||
}
|
||||
getDoubleParameter(filter: PIXI.Filter, parameterName: string): number {
|
||||
const reflectionFilter = (filter as unknown) as PIXI.filters.ReflectionFilter &
|
||||
ReflectionFilterExtra;
|
||||
if (parameterName === 'boundary') {
|
||||
return reflectionFilter.boundary;
|
||||
}
|
||||
if (parameterName === 'amplitudeStart') {
|
||||
return reflectionFilter.amplitude[0];
|
||||
}
|
||||
if (parameterName === 'amplitudeEnding') {
|
||||
return reflectionFilter.amplitude[1];
|
||||
}
|
||||
if (parameterName === 'waveLengthStart') {
|
||||
return reflectionFilter.waveLength[0];
|
||||
}
|
||||
if (parameterName === 'waveLengthEnding') {
|
||||
return reflectionFilter.waveLength[1];
|
||||
}
|
||||
if (parameterName === 'alphaStart') {
|
||||
return reflectionFilter.alpha[0];
|
||||
}
|
||||
if (parameterName === 'alphaEnding') {
|
||||
return reflectionFilter.alpha[1];
|
||||
}
|
||||
if (parameterName === 'animationSpeed') {
|
||||
return reflectionFilter.animationSpeed;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
updateStringParameter(
|
||||
filter: PIXI.Filter,
|
||||
parameterName: string,
|
||||
value: string
|
||||
) {}
|
||||
updateColorParameter(
|
||||
filter: PIXI.Filter,
|
||||
parameterName: string,
|
||||
value: number
|
||||
): void {}
|
||||
getColorParameter(filter: PIXI.Filter, parameterName: string): number {
|
||||
return 0;
|
||||
}
|
||||
updateBooleanParameter(
|
||||
filter: PIXI.Filter,
|
||||
parameterName: string,
|
||||
value: boolean
|
||||
) {
|
||||
const reflectionFilter = (filter as unknown) as PIXI.filters.ReflectionFilter &
|
||||
ReflectionFilterExtra;
|
||||
if (parameterName === 'mirror') {
|
||||
reflectionFilter.mirror = value;
|
||||
filter.mirror = value;
|
||||
}
|
||||
}
|
||||
})()
|
||||
|
@@ -27,41 +27,11 @@ namespace gdjs {
|
||||
rgbSplitFilter.blue.y = value;
|
||||
}
|
||||
}
|
||||
getDoubleParameter(filter: PIXI.Filter, parameterName: string): number {
|
||||
const rgbSplitFilter = (filter as unknown) as PIXI.filters.RGBSplitFilter;
|
||||
if (parameterName === 'redX') {
|
||||
return rgbSplitFilter.red.x;
|
||||
}
|
||||
if (parameterName === 'redY') {
|
||||
return rgbSplitFilter.red.y;
|
||||
}
|
||||
if (parameterName === 'greenX') {
|
||||
return rgbSplitFilter.green.x;
|
||||
}
|
||||
if (parameterName === 'greenY') {
|
||||
return rgbSplitFilter.green.y;
|
||||
}
|
||||
if (parameterName === 'blueX') {
|
||||
return rgbSplitFilter.blue.x;
|
||||
}
|
||||
if (parameterName === 'blueY') {
|
||||
return rgbSplitFilter.blue.y;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
updateStringParameter(
|
||||
filter: PIXI.Filter,
|
||||
parameterName: string,
|
||||
value: string
|
||||
) {}
|
||||
updateColorParameter(
|
||||
filter: PIXI.Filter,
|
||||
parameterName: string,
|
||||
value: number
|
||||
): void {}
|
||||
getColorParameter(filter: PIXI.Filter, parameterName: string): number {
|
||||
return 0;
|
||||
}
|
||||
updateBooleanParameter(
|
||||
filter: PIXI.Filter,
|
||||
parameterName: string,
|
||||
|
@@ -14,34 +14,16 @@ namespace gdjs {
|
||||
value: number
|
||||
) {
|
||||
const colorMatrixFilter = (filter as unknown) as PIXI.ColorMatrixFilter;
|
||||
if (parameterName === 'opacity') {
|
||||
colorMatrixFilter.alpha = gdjs.PixiFiltersTools.clampValue(
|
||||
value,
|
||||
0,
|
||||
1
|
||||
);
|
||||
if (parameterName !== 'opacity') {
|
||||
return;
|
||||
}
|
||||
}
|
||||
getDoubleParameter(filter: PIXI.Filter, parameterName: string): number {
|
||||
const colorMatrixFilter = (filter as unknown) as PIXI.ColorMatrixFilter;
|
||||
if (parameterName === 'opacity') {
|
||||
return colorMatrixFilter.alpha;
|
||||
}
|
||||
return 0;
|
||||
colorMatrixFilter.alpha = gdjs.PixiFiltersTools.clampValue(value, 0, 1);
|
||||
}
|
||||
updateStringParameter(
|
||||
filter: PIXI.Filter,
|
||||
parameterName: string,
|
||||
value: string
|
||||
) {}
|
||||
updateColorParameter(
|
||||
filter: PIXI.Filter,
|
||||
parameterName: string,
|
||||
value: number
|
||||
): void {}
|
||||
getColorParameter(filter: PIXI.Filter, parameterName: string): number {
|
||||
return 0;
|
||||
}
|
||||
updateBooleanParameter(
|
||||
filter: PIXI.Filter,
|
||||
parameterName: string,
|
||||
|
@@ -1,9 +1,4 @@
|
||||
namespace gdjs {
|
||||
interface ShockwaveFilterExtra {
|
||||
// extra properties are stored on the filter.
|
||||
_centerX: number;
|
||||
_centerY: number;
|
||||
}
|
||||
gdjs.PixiFiltersTools.registerFilterCreator(
|
||||
'Shockwave',
|
||||
new (class extends gdjs.PixiFiltersTools.PixiFilterCreator {
|
||||
@@ -12,15 +7,16 @@ namespace gdjs {
|
||||
return shockwaveFilter;
|
||||
}
|
||||
updatePreRender(filter: PIXI.Filter, target: EffectsTarget) {
|
||||
const shockwaveFilter = (filter as unknown) as PIXI.filters.ShockwaveFilter &
|
||||
ShockwaveFilterExtra;
|
||||
const shockwaveFilter = (filter as unknown) as PIXI.filters.ShockwaveFilter;
|
||||
if (shockwaveFilter.speed !== 0) {
|
||||
shockwaveFilter.time += target.getElapsedTime() / 1000;
|
||||
}
|
||||
shockwaveFilter.center[0] = Math.round(
|
||||
// @ts-ignore - extra properties are stored on the filter.
|
||||
shockwaveFilter._centerX * target.getWidth()
|
||||
);
|
||||
shockwaveFilter.center[1] = Math.round(
|
||||
// @ts-ignore - extra properties are stored on the filter.
|
||||
shockwaveFilter._centerY * target.getHeight()
|
||||
);
|
||||
}
|
||||
@@ -29,11 +25,12 @@ namespace gdjs {
|
||||
parameterName: string,
|
||||
value: number
|
||||
) {
|
||||
const shockwaveFilter = filter as PIXI.filters.ShockwaveFilter &
|
||||
ShockwaveFilterExtra;
|
||||
const shockwaveFilter = filter as PIXI.filters.ShockwaveFilter;
|
||||
if (parameterName === 'centerX') {
|
||||
// @ts-ignore - extra properties are stored on the filter.
|
||||
shockwaveFilter._centerX = value;
|
||||
} else if (parameterName === 'centerY') {
|
||||
// @ts-ignore - extra properties are stored on the filter.
|
||||
shockwaveFilter._centerY = value;
|
||||
} else if (parameterName === 'time') {
|
||||
shockwaveFilter.time = value;
|
||||
@@ -49,48 +46,11 @@ namespace gdjs {
|
||||
shockwaveFilter.radius = value;
|
||||
}
|
||||
}
|
||||
getDoubleParameter(filter: PIXI.Filter, parameterName: string): number {
|
||||
const shockwaveFilter = filter as PIXI.filters.ShockwaveFilter &
|
||||
ShockwaveFilterExtra;
|
||||
if (parameterName === 'centerX') {
|
||||
return shockwaveFilter._centerX;
|
||||
}
|
||||
if (parameterName === 'centerY') {
|
||||
return shockwaveFilter._centerY;
|
||||
}
|
||||
if (parameterName === 'time') {
|
||||
return shockwaveFilter.time;
|
||||
}
|
||||
if (parameterName === 'speed') {
|
||||
return shockwaveFilter.speed;
|
||||
}
|
||||
if (parameterName === 'amplitude') {
|
||||
return shockwaveFilter.amplitude;
|
||||
}
|
||||
if (parameterName === 'wavelength') {
|
||||
return shockwaveFilter.wavelength;
|
||||
}
|
||||
if (parameterName === 'brightness') {
|
||||
return shockwaveFilter.brightness;
|
||||
}
|
||||
if (parameterName === 'radius') {
|
||||
return shockwaveFilter.radius;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
updateStringParameter(
|
||||
filter: PIXI.Filter,
|
||||
parameterName: string,
|
||||
value: string
|
||||
) {}
|
||||
updateColorParameter(
|
||||
filter: PIXI.Filter,
|
||||
parameterName: string,
|
||||
value: number
|
||||
): void {}
|
||||
getColorParameter(filter: PIXI.Filter, parameterName: string): number {
|
||||
return 0;
|
||||
}
|
||||
updateBooleanParameter(
|
||||
filter: PIXI.Filter,
|
||||
parameterName: string,
|
||||
|
@@ -19,29 +19,11 @@ namespace gdjs {
|
||||
tiltShiftFilter.gradientBlur = value;
|
||||
}
|
||||
}
|
||||
getDoubleParameter(filter: PIXI.Filter, parameterName: string): number {
|
||||
const tiltShiftFilter = (filter as unknown) as PIXI.filters.TiltShiftFilter;
|
||||
if (parameterName === 'blur') {
|
||||
return tiltShiftFilter.blur;
|
||||
}
|
||||
if (parameterName === 'gradientBlur') {
|
||||
return tiltShiftFilter.gradientBlur;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
updateStringParameter(
|
||||
filter: PIXI.Filter,
|
||||
parameterName: string,
|
||||
value: string
|
||||
) {}
|
||||
updateColorParameter(
|
||||
filter: PIXI.Filter,
|
||||
parameterName: string,
|
||||
value: number
|
||||
): void {}
|
||||
getColorParameter(filter: PIXI.Filter, parameterName: string): number {
|
||||
return 0;
|
||||
}
|
||||
updateBooleanParameter(
|
||||
filter: PIXI.Filter,
|
||||
parameterName: string,
|
||||
|
@@ -1,9 +1,4 @@
|
||||
namespace gdjs {
|
||||
interface TwistFilterExtra {
|
||||
// extra properties are stored on the filter.
|
||||
_offsetX: number;
|
||||
_offsetY: number;
|
||||
}
|
||||
gdjs.PixiFiltersTools.registerFilterCreator(
|
||||
'Twist',
|
||||
new (class extends gdjs.PixiFiltersTools.PixiFilterCreator {
|
||||
@@ -13,12 +8,13 @@ namespace gdjs {
|
||||
return twistFilter;
|
||||
}
|
||||
updatePreRender(filter: PIXI.Filter, target: EffectsTarget) {
|
||||
const twistFilter = (filter as unknown) as PIXI.filters.TwistFilter &
|
||||
TwistFilterExtra;
|
||||
const twistFilter = (filter as unknown) as PIXI.filters.TwistFilter;
|
||||
twistFilter.offset.x = Math.round(
|
||||
// @ts-ignore - extra properties are stored on the filter.
|
||||
twistFilter._offsetX * target.getWidth()
|
||||
);
|
||||
twistFilter.offset.y = Math.round(
|
||||
// @ts-ignore - extra properties are stored on the filter.
|
||||
twistFilter._offsetY * target.getHeight()
|
||||
);
|
||||
}
|
||||
@@ -27,8 +23,7 @@ namespace gdjs {
|
||||
parameterName: string,
|
||||
value: number
|
||||
) {
|
||||
const twistFilter = (filter as unknown) as PIXI.filters.TwistFilter &
|
||||
TwistFilterExtra;
|
||||
const twistFilter = (filter as unknown) as PIXI.filters.TwistFilter;
|
||||
if (parameterName === 'radius') {
|
||||
twistFilter.radius = value;
|
||||
} else if (parameterName === 'angle') {
|
||||
@@ -36,44 +31,18 @@ namespace gdjs {
|
||||
} else if (parameterName === 'padding') {
|
||||
twistFilter.padding = value;
|
||||
} else if (parameterName === 'offsetX') {
|
||||
// @ts-ignore - extra properties are stored on the filter.
|
||||
twistFilter._offsetX = value;
|
||||
} else if (parameterName === 'offsetY') {
|
||||
// @ts-ignore - extra properties are stored on the filter.
|
||||
twistFilter._offsetY = value;
|
||||
}
|
||||
}
|
||||
getDoubleParameter(filter: PIXI.Filter, parameterName: string): number {
|
||||
const twistFilter = (filter as unknown) as PIXI.filters.TwistFilter &
|
||||
TwistFilterExtra;
|
||||
if (parameterName === 'radius') {
|
||||
return twistFilter.radius;
|
||||
}
|
||||
if (parameterName === 'angle') {
|
||||
return twistFilter.angle;
|
||||
}
|
||||
if (parameterName === 'padding') {
|
||||
return twistFilter.padding;
|
||||
}
|
||||
if (parameterName === 'offsetX') {
|
||||
return twistFilter._offsetX;
|
||||
}
|
||||
if (parameterName === 'offsetY') {
|
||||
return twistFilter._offsetY;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
updateStringParameter(
|
||||
filter: PIXI.Filter,
|
||||
parameterName: string,
|
||||
value: string
|
||||
) {}
|
||||
updateColorParameter(
|
||||
filter: PIXI.Filter,
|
||||
parameterName: string,
|
||||
value: number
|
||||
): void {}
|
||||
getColorParameter(filter: PIXI.Filter, parameterName: string): number {
|
||||
return 0;
|
||||
}
|
||||
updateBooleanParameter(
|
||||
filter: PIXI.Filter,
|
||||
parameterName: string,
|
||||
|
@@ -1,9 +1,4 @@
|
||||
namespace gdjs {
|
||||
interface ZoomBlurFilterExtra {
|
||||
// extra properties are stored on the filter.
|
||||
_centerX: number;
|
||||
_centerY: number;
|
||||
}
|
||||
gdjs.PixiFiltersTools.registerFilterCreator(
|
||||
'ZoomBlur',
|
||||
new (class extends gdjs.PixiFiltersTools.PixiFilterCreator {
|
||||
@@ -12,12 +7,13 @@ namespace gdjs {
|
||||
return zoomBlurFilter;
|
||||
}
|
||||
updatePreRender(filter: PIXI.Filter, target: EffectsTarget) {
|
||||
const zoomBlurFilter = (filter as unknown) as PIXI.filters.ZoomBlurFilter &
|
||||
ZoomBlurFilterExtra;
|
||||
const zoomBlurFilter = (filter as unknown) as PIXI.filters.ZoomBlurFilter;
|
||||
zoomBlurFilter.center[0] = Math.round(
|
||||
// @ts-ignore - extra properties are stored on the filter.
|
||||
zoomBlurFilter._centerX * target.getWidth()
|
||||
);
|
||||
zoomBlurFilter.center[1] = Math.round(
|
||||
// @ts-ignore - extra properties are stored on the filter.
|
||||
zoomBlurFilter._centerY * target.getHeight()
|
||||
);
|
||||
}
|
||||
@@ -26,11 +22,12 @@ namespace gdjs {
|
||||
parameterName: string,
|
||||
value: number
|
||||
) {
|
||||
const zoomBlurFilter = (filter as unknown) as PIXI.filters.ZoomBlurFilter &
|
||||
ZoomBlurFilterExtra;
|
||||
const zoomBlurFilter = (filter as unknown) as PIXI.filters.ZoomBlurFilter;
|
||||
if (parameterName === 'centerX') {
|
||||
// @ts-ignore - extra properties are stored on the filter.
|
||||
zoomBlurFilter._centerX = value;
|
||||
} else if (parameterName === 'centerY') {
|
||||
// @ts-ignore - extra properties are stored on the filter.
|
||||
zoomBlurFilter._centerY = value;
|
||||
} else if (parameterName === 'innerRadius') {
|
||||
zoomBlurFilter.innerRadius = value;
|
||||
@@ -44,39 +41,11 @@ namespace gdjs {
|
||||
zoomBlurFilter.padding = value;
|
||||
}
|
||||
}
|
||||
getDoubleParameter(filter: PIXI.Filter, parameterName: string): number {
|
||||
const zoomBlurFilter = (filter as unknown) as PIXI.filters.ZoomBlurFilter &
|
||||
ZoomBlurFilterExtra;
|
||||
if (parameterName === 'centerX') {
|
||||
return zoomBlurFilter._centerX;
|
||||
}
|
||||
if (parameterName === 'centerY') {
|
||||
return zoomBlurFilter._centerY;
|
||||
}
|
||||
if (parameterName === 'innerRadius') {
|
||||
return zoomBlurFilter.innerRadius;
|
||||
}
|
||||
if (parameterName === 'strength') {
|
||||
return zoomBlurFilter.strength;
|
||||
}
|
||||
if (parameterName === 'padding') {
|
||||
return zoomBlurFilter.padding;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
updateStringParameter(
|
||||
filter: PIXI.Filter,
|
||||
parameterName: string,
|
||||
value: string
|
||||
) {}
|
||||
updateColorParameter(
|
||||
filter: PIXI.Filter,
|
||||
parameterName: string,
|
||||
value: number
|
||||
): void {}
|
||||
getColorParameter(filter: PIXI.Filter, parameterName: string): number {
|
||||
return 0;
|
||||
}
|
||||
updateBooleanParameter(
|
||||
filter: PIXI.Filter,
|
||||
parameterName: string,
|
||||
|
@@ -79,26 +79,12 @@ namespace gdjs {
|
||||
);
|
||||
}
|
||||
}
|
||||
getDoubleParameter(filter: PIXI.Filter, parameterName: string): number {
|
||||
if (parameterName === 'opacity') {
|
||||
return filter.uniforms.opacity;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
// Function that will be called to update a (string) parameter of the PIXI filter with a new value
|
||||
updateStringParameter(
|
||||
filter: PIXI.Filter,
|
||||
parameterName: string,
|
||||
value: string
|
||||
) {}
|
||||
updateColorParameter(
|
||||
filter: PIXI.Filter,
|
||||
parameterName: string,
|
||||
value: number
|
||||
): void {}
|
||||
getColorParameter(filter: PIXI.Filter, parameterName: string): number {
|
||||
return 0;
|
||||
}
|
||||
// Function that will be called to update a (boolean) parameter of the PIXI filter with a new value
|
||||
updateBooleanParameter(
|
||||
filter: PIXI.Filter,
|
||||
|
@@ -1,11 +1,9 @@
|
||||
namespace gdjs {
|
||||
declare var rbush: any;
|
||||
|
||||
export class LightObstaclesManager {
|
||||
_obstacleRBush: any;
|
||||
_obstacleRBush: RBush<LightObstacleRuntimeBehavior>;
|
||||
|
||||
constructor(instanceContainer: gdjs.RuntimeInstanceContainer) {
|
||||
this._obstacleRBush = new rbush();
|
||||
this._obstacleRBush = new RBush<LightObstacleRuntimeBehavior>();
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -41,6 +39,9 @@ namespace gdjs {
|
||||
* added before.
|
||||
*/
|
||||
removeObstacle(obstacle: gdjs.LightObstacleRuntimeBehavior) {
|
||||
if (!obstacle.currentRBushAABB) {
|
||||
return;
|
||||
}
|
||||
this._obstacleRBush.remove(obstacle.currentRBushAABB);
|
||||
}
|
||||
|
||||
@@ -59,9 +60,9 @@ namespace gdjs {
|
||||
// is not necessarily in the middle of the object (for sprites for example).
|
||||
const x = object.getX();
|
||||
const y = object.getY();
|
||||
const searchArea = gdjs.staticObject(
|
||||
const searchArea: SearchArea = gdjs.staticObject(
|
||||
LightObstaclesManager.prototype.getAllObstaclesAround
|
||||
);
|
||||
) as SearchArea;
|
||||
// @ts-ignore
|
||||
searchArea.minX = x - radius;
|
||||
// @ts-ignore
|
||||
@@ -70,13 +71,8 @@ namespace gdjs {
|
||||
searchArea.maxX = x + radius;
|
||||
// @ts-ignore
|
||||
searchArea.maxY = y + radius;
|
||||
const nearbyObstacles: gdjs.BehaviorRBushAABB<
|
||||
gdjs.LightObstacleRuntimeBehavior
|
||||
>[] = this._obstacleRBush.search(searchArea);
|
||||
result.length = 0;
|
||||
nearbyObstacles.forEach((nearbyObstacle) =>
|
||||
result.push(nearbyObstacle.behavior)
|
||||
);
|
||||
this._obstacleRBush.search(searchArea, result);
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -7,7 +7,6 @@ namespace gdjs {
|
||||
export interface RuntimeInstanceContainer {
|
||||
pathfindingObstaclesManager: gdjs.PathfindingObstaclesManager;
|
||||
}
|
||||
declare var rbush: any;
|
||||
|
||||
/**
|
||||
* PathfindingObstaclesManager manages the common objects shared by objects
|
||||
@@ -18,10 +17,10 @@ namespace gdjs {
|
||||
* `gdjs.PathfindingRuntimeBehavior.obstaclesManagers`).
|
||||
*/
|
||||
export class PathfindingObstaclesManager {
|
||||
_obstaclesRBush: any;
|
||||
_obstaclesRBush: RBush<PathfindingObstacleRuntimeBehavior>;
|
||||
|
||||
constructor(instanceContainer: gdjs.RuntimeInstanceContainer) {
|
||||
this._obstaclesRBush = new rbush();
|
||||
this._obstaclesRBush = new RBush<PathfindingObstacleRuntimeBehavior>();
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -60,6 +59,9 @@ namespace gdjs {
|
||||
removeObstacle(
|
||||
pathfindingObstacleBehavior: PathfindingObstacleRuntimeBehavior
|
||||
) {
|
||||
if (!pathfindingObstacleBehavior.currentRBushAABB) {
|
||||
return;
|
||||
}
|
||||
this._obstaclesRBush.remove(pathfindingObstacleBehavior.currentRBushAABB);
|
||||
}
|
||||
|
||||
@@ -74,9 +76,9 @@ namespace gdjs {
|
||||
radius: float,
|
||||
result: gdjs.PathfindingObstacleRuntimeBehavior[]
|
||||
): void {
|
||||
const searchArea = gdjs.staticObject(
|
||||
const searchArea: SearchArea = gdjs.staticObject(
|
||||
PathfindingObstaclesManager.prototype.getAllObstaclesAround
|
||||
);
|
||||
) as SearchArea;
|
||||
// @ts-ignore
|
||||
searchArea.minX = x - radius;
|
||||
// @ts-ignore
|
||||
@@ -85,13 +87,8 @@ namespace gdjs {
|
||||
searchArea.maxX = x + radius;
|
||||
// @ts-ignore
|
||||
searchArea.maxY = y + radius;
|
||||
const nearbyObstacles: gdjs.BehaviorRBushAABB<
|
||||
gdjs.PathfindingObstacleRuntimeBehavior
|
||||
>[] = this._obstaclesRBush.search(searchArea);
|
||||
result.length = 0;
|
||||
nearbyObstacles.forEach((nearbyObstacle) =>
|
||||
result.push(nearbyObstacle.behavior)
|
||||
);
|
||||
this._obstaclesRBush.search(searchArea, result);
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -1,9 +1,9 @@
|
||||
namespace gdjs {
|
||||
export namespace physics2 {
|
||||
export const objectsCollide = function (
|
||||
objectsLists1: Hashtable<Array<gdjs.RuntimeObject>>,
|
||||
objectsLists1: ObjectsLists,
|
||||
behaviorName: string,
|
||||
objectsLists2: Hashtable<Array<gdjs.RuntimeObject>>,
|
||||
objectsLists2: ObjectsLists,
|
||||
inverted: boolean
|
||||
) {
|
||||
return gdjs.evtTools.object.twoListsTest(
|
||||
@@ -16,9 +16,9 @@ namespace gdjs {
|
||||
};
|
||||
|
||||
export const haveObjectsStartedColliding = function (
|
||||
objectsLists1: Hashtable<Array<gdjs.RuntimeObject>>,
|
||||
objectsLists1: ObjectsLists,
|
||||
behaviorName: string,
|
||||
objectsLists2: Hashtable<Array<gdjs.RuntimeObject>>,
|
||||
objectsLists2: ObjectsLists,
|
||||
inverted: boolean
|
||||
) {
|
||||
return gdjs.evtTools.object.twoListsTest(
|
||||
@@ -31,9 +31,9 @@ namespace gdjs {
|
||||
};
|
||||
|
||||
export const haveObjectsStoppedColliding = function (
|
||||
objectsLists1: Hashtable<Array<gdjs.RuntimeObject>>,
|
||||
objectsLists1: ObjectsLists,
|
||||
behaviorName: string,
|
||||
objectsLists2: Hashtable<Array<gdjs.RuntimeObject>>,
|
||||
objectsLists2: ObjectsLists,
|
||||
inverted: boolean
|
||||
) {
|
||||
return gdjs.evtTools.object.twoListsTest(
|
||||
@@ -45,7 +45,11 @@ namespace gdjs {
|
||||
);
|
||||
};
|
||||
|
||||
export const setTimeScale = function (objectsLists, behavior, timeScale) {
|
||||
export const setTimeScale = function (
|
||||
objectsLists: ObjectsLists,
|
||||
behavior: gdjs.Physics2RuntimeBehavior,
|
||||
timeScale: float
|
||||
) {
|
||||
const lists = gdjs.staticArray(gdjs.physics2.setTimeScale);
|
||||
objectsLists.values(lists);
|
||||
for (let i = 0, len = lists.length; i < len; i++) {
|
||||
|
@@ -211,6 +211,9 @@ namespace gdjs {
|
||||
}
|
||||
|
||||
doStepPreEvents(instanceContainer: gdjs.RuntimeInstanceContainer) {
|
||||
// Update platforms locations.
|
||||
this._manager.doStepPreEvents();
|
||||
|
||||
const LEFTKEY = 37;
|
||||
const UPKEY = 38;
|
||||
const RIGHTKEY = 39;
|
||||
|
@@ -3,7 +3,6 @@ GDevelop - Platform Behavior Extension
|
||||
Copyright (c) 2013-2016 Florian Rival (Florian.Rival@gmail.com)
|
||||
*/
|
||||
namespace gdjs {
|
||||
declare var rbush: any;
|
||||
type SearchArea = { minX: float; minY: float; maxX: float; maxY: float };
|
||||
|
||||
/**
|
||||
@@ -13,10 +12,12 @@ namespace gdjs {
|
||||
* of their associated container (see PlatformRuntimeBehavior.getManager).
|
||||
*/
|
||||
export class PlatformObjectsManager {
|
||||
private _platformRBush: any;
|
||||
private _platformRBush: RBush<PlatformRuntimeBehavior>;
|
||||
private movedPlatforms: Array<gdjs.PlatformRuntimeBehavior>;
|
||||
|
||||
constructor(instanceContainer: gdjs.RuntimeInstanceContainer) {
|
||||
this._platformRBush = new rbush();
|
||||
this._platformRBush = new RBush<PlatformRuntimeBehavior>();
|
||||
this.movedPlatforms = [];
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -53,9 +54,28 @@ namespace gdjs {
|
||||
* added before.
|
||||
*/
|
||||
removePlatform(platformBehavior: gdjs.PlatformRuntimeBehavior) {
|
||||
if (!platformBehavior.currentRBushAABB) {
|
||||
return;
|
||||
}
|
||||
this._platformRBush.remove(platformBehavior.currentRBushAABB);
|
||||
}
|
||||
|
||||
invalidatePlatformHitbox(platformBehavior: gdjs.PlatformRuntimeBehavior) {
|
||||
this.movedPlatforms.push(platformBehavior);
|
||||
}
|
||||
|
||||
doStepPreEvents() {
|
||||
for (const platformBehavior of this.movedPlatforms) {
|
||||
this.removePlatform(platformBehavior);
|
||||
// TODO What if the object is recycled before it can be removed from the tree?
|
||||
if (platformBehavior.activated() && platformBehavior.owner.isAlive()) {
|
||||
this.addPlatform(platformBehavior);
|
||||
}
|
||||
platformBehavior.onHitboxUpdatedInTree();
|
||||
}
|
||||
this.movedPlatforms.length = 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns all the platforms around the specified object.
|
||||
* @param maxMovementLength The maximum distance, in pixels, the object is going to do.
|
||||
@@ -75,21 +95,19 @@ namespace gdjs {
|
||||
const searchArea: SearchArea = gdjs.staticObject(
|
||||
PlatformObjectsManager.prototype.getAllPlatformsAround
|
||||
) as SearchArea;
|
||||
result.length = 0;
|
||||
searchArea.minX = x - ow / 2 - maxMovementLength;
|
||||
searchArea.minY = y - oh / 2 - maxMovementLength;
|
||||
searchArea.maxX = x + ow / 2 + maxMovementLength;
|
||||
searchArea.maxY = y + oh / 2 + maxMovementLength;
|
||||
const nearbyPlatforms: gdjs.BehaviorRBushAABB<
|
||||
PlatformRuntimeBehavior
|
||||
>[] = this._platformRBush.search(searchArea);
|
||||
|
||||
result.length = 0;
|
||||
this._platformRBush.search(searchArea, result);
|
||||
|
||||
// Extra check on the platform owner AABB
|
||||
// TODO: PR https://github.com/4ian/GDevelop/pull/2602 should remove the need
|
||||
// for this extra check once merged.
|
||||
for (let i = 0; i < nearbyPlatforms.length; i++) {
|
||||
const platform = nearbyPlatforms[i].behavior;
|
||||
let writtenIndex = 0;
|
||||
for (let readIndex = 0; readIndex < result.length; readIndex++) {
|
||||
const platform = result[readIndex];
|
||||
const platformAABB = platform.owner.getAABB();
|
||||
const platformIsStillAround =
|
||||
platformAABB.min[0] <= searchArea.maxX &&
|
||||
@@ -100,9 +118,11 @@ namespace gdjs {
|
||||
// This can happen because platforms are not updated in the RBush before that
|
||||
// characters movement are being processed.
|
||||
if (platformIsStillAround) {
|
||||
result.push(platform);
|
||||
result[writtenIndex] = platform;
|
||||
writtenIndex++;
|
||||
}
|
||||
}
|
||||
result.length = writtenIndex;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -127,6 +147,7 @@ namespace gdjs {
|
||||
> | null = null;
|
||||
_manager: gdjs.PlatformObjectsManager;
|
||||
_registeredInManager: boolean = false;
|
||||
_isAABBInvalidated = false;
|
||||
|
||||
constructor(
|
||||
instanceContainer: gdjs.RuntimeInstanceContainer,
|
||||
@@ -145,6 +166,10 @@ namespace gdjs {
|
||||
this._canBeGrabbed = behaviorData.canBeGrabbed || false;
|
||||
this._yGrabOffset = behaviorData.yGrabOffset || 0;
|
||||
this._manager = PlatformObjectsManager.getManager(instanceContainer);
|
||||
this.owner.registerHitboxChangedCallback((object) =>
|
||||
this.onHitboxChanged()
|
||||
);
|
||||
this.onHitboxChanged();
|
||||
}
|
||||
|
||||
updateFromBehaviorData(oldBehaviorData, newBehaviorData): boolean {
|
||||
@@ -161,9 +186,11 @@ namespace gdjs {
|
||||
}
|
||||
|
||||
onDestroy() {
|
||||
if (this._manager && this._registeredInManager) {
|
||||
this._manager.removePlatform(this);
|
||||
}
|
||||
this.onHitboxChanged();
|
||||
}
|
||||
|
||||
usesLifecycleFunction(): boolean {
|
||||
return false;
|
||||
}
|
||||
|
||||
doStepPreEvents(instanceContainer: gdjs.RuntimeInstanceContainer) {
|
||||
@@ -176,54 +203,28 @@ namespace gdjs {
|
||||
sceneManager = parentScene ? &ScenePlatformObjectsManager::managers[&scene] : NULL;
|
||||
registeredInManager = false;
|
||||
}*/
|
||||
|
||||
//Make sure the platform is or is not in the platforms manager.
|
||||
if (!this.activated() && this._registeredInManager) {
|
||||
this._manager.removePlatform(this);
|
||||
this._registeredInManager = false;
|
||||
} else {
|
||||
if (this.activated() && !this._registeredInManager) {
|
||||
this._manager.addPlatform(this);
|
||||
this._registeredInManager = true;
|
||||
}
|
||||
}
|
||||
|
||||
//Track changes in size or position
|
||||
if (
|
||||
this._oldX !== this.owner.getX() ||
|
||||
this._oldY !== this.owner.getY() ||
|
||||
this._oldWidth !== this.owner.getWidth() ||
|
||||
this._oldHeight !== this.owner.getHeight() ||
|
||||
this._oldAngle !== this.owner.getAngle()
|
||||
) {
|
||||
if (this._registeredInManager) {
|
||||
this._manager.removePlatform(this);
|
||||
this._manager.addPlatform(this);
|
||||
}
|
||||
this._oldX = this.owner.getX();
|
||||
this._oldY = this.owner.getY();
|
||||
this._oldWidth = this.owner.getWidth();
|
||||
this._oldHeight = this.owner.getHeight();
|
||||
this._oldAngle = this.owner.getAngle();
|
||||
}
|
||||
}
|
||||
|
||||
doStepPostEvents(instanceContainer: gdjs.RuntimeInstanceContainer) {}
|
||||
|
||||
onActivate() {
|
||||
if (this._registeredInManager) {
|
||||
return;
|
||||
}
|
||||
this._manager.addPlatform(this);
|
||||
this._registeredInManager = true;
|
||||
this.onHitboxChanged();
|
||||
}
|
||||
|
||||
onDeActivate() {
|
||||
if (!this._registeredInManager) {
|
||||
this.onHitboxChanged();
|
||||
}
|
||||
|
||||
onHitboxChanged() {
|
||||
if (this._isAABBInvalidated) {
|
||||
return;
|
||||
}
|
||||
this._manager.removePlatform(this);
|
||||
this._registeredInManager = false;
|
||||
this._isAABBInvalidated = true;
|
||||
this._manager.invalidatePlatformHitbox(this);
|
||||
}
|
||||
|
||||
onHitboxUpdatedInTree() {
|
||||
this._isAABBInvalidated = false;
|
||||
}
|
||||
|
||||
changePlatformType(platformType: string) {
|
||||
|
@@ -2,9 +2,9 @@ namespace gdjs {
|
||||
export namespace evtTools {
|
||||
export namespace platform {
|
||||
export const isOnPlatform = function (
|
||||
objectsLists1: Hashtable<Array<gdjs.RuntimeObject>>,
|
||||
objectsLists1: ObjectsLists,
|
||||
behaviorName: string,
|
||||
objectsLists2: Hashtable<Array<gdjs.RuntimeObject>>,
|
||||
objectsLists2: ObjectsLists,
|
||||
inverted: boolean
|
||||
) {
|
||||
return gdjs.evtTools.object.twoListsTest(
|
||||
|
@@ -1,8 +1,11 @@
|
||||
describe('gdjs.PlatformerObjectRuntimeBehavior', function () {
|
||||
const epsilon = 1 / (2 << 16);
|
||||
describe('(falling)', function () {
|
||||
/** @type {gdjs.RuntimeScene} */
|
||||
let runtimeScene;
|
||||
/** @type {gdjs.RuntimeObject} */
|
||||
let object;
|
||||
/** @type {gdjs.RuntimeObject} */
|
||||
let platform;
|
||||
|
||||
beforeEach(function () {
|
||||
@@ -114,7 +117,7 @@ describe('gdjs.PlatformerObjectRuntimeBehavior', function () {
|
||||
expect(object.getBehavior('auto1').isMoving()).to.be(false);
|
||||
|
||||
// Remove the platform
|
||||
runtimeScene.markObjectForDeletion(platform);
|
||||
platform.deleteFromScene(runtimeScene);
|
||||
runtimeScene.renderAndStep(1000 / 60);
|
||||
expect(object.getBehavior('auto1').isFalling()).to.be(true);
|
||||
expect(object.getBehavior('auto1').isFallingWithoutJumping()).to.be(true);
|
||||
|
@@ -158,28 +158,6 @@ void DeclarePrimitiveDrawingExtension(gd::PlatformExtension& extension) {
|
||||
.AddParameter("expression", _("Bottom Y position"))
|
||||
.AddParameter("expression", _("Chamfer (in pixels)"))
|
||||
.SetFunctionName("DrawChamferRectangle");
|
||||
|
||||
|
||||
obj.AddAction("Torus",
|
||||
_("Torus"),
|
||||
_("Draw a torus on screen"),
|
||||
_("Draw at _PARAM1_;_PARAM2_ a torus with inner radius"
|
||||
"_PARAM3_ and outer radius _PARAM4_ and "
|
||||
"with start arc _PARAM5_° and end arc _PARAM6_°"
|
||||
"with _PARAM0_"),
|
||||
_("Drawing"),
|
||||
"res/actions/torus24.png",
|
||||
"res/actions/torus.png")
|
||||
|
||||
.AddParameter("object", _("Shape Painter object"), "Drawer")
|
||||
.AddParameter("expression", _("X position of center"))
|
||||
.AddParameter("expression", _("Y position of center"))
|
||||
.AddParameter("expression", _("Inner Radius (in pixels)"))
|
||||
.AddParameter("expression", _("Outer Radius (in pixels)"))
|
||||
.AddParameter("expression", _("Start Arc (in degrees)"))
|
||||
.AddParameter("expression", _("End Arc (in degrees)"))
|
||||
.SetFunctionName("DrawTorus");
|
||||
|
||||
|
||||
obj.AddAction("RegularPolygon",
|
||||
_("Regular Polygon"),
|
||||
|
@@ -54,8 +54,6 @@ class PrimitiveDrawingJsExtension : public gd::PlatformExtension {
|
||||
.SetFunctionName("drawChamferRectangle");
|
||||
GetAllActionsForObject("PrimitiveDrawing::Drawer")["PrimitiveDrawing::RegularPolygon"]
|
||||
.SetFunctionName("drawRegularPolygon");
|
||||
GetAllActionsForObject("PrimitiveDrawing::Drawer")["PrimitiveDrawing::Torus"]
|
||||
.SetFunctionName("drawTorus");
|
||||
GetAllActionsForObject("PrimitiveDrawing::Drawer")["PrimitiveDrawing::Star"]
|
||||
.SetFunctionName("drawStar");
|
||||
GetAllActionsForObject("PrimitiveDrawing::Drawer")["PrimitiveDrawing::Arc"]
|
||||
|
@@ -155,33 +155,6 @@ namespace gdjs {
|
||||
this.invalidateBounds();
|
||||
}
|
||||
|
||||
drawTorus(
|
||||
x1: float,
|
||||
y1: float,
|
||||
innerRadius: float,
|
||||
outerRadius: float,
|
||||
startArc: float,
|
||||
endArc: float
|
||||
) {
|
||||
this.updateOutline();
|
||||
this._graphics.beginFill(
|
||||
this._object._fillColor,
|
||||
this._object._fillOpacity / 255
|
||||
);
|
||||
//@ts-ignore from @pixi/graphics-extras
|
||||
this._graphics.drawTorus(
|
||||
x1,
|
||||
y1,
|
||||
innerRadius,
|
||||
outerRadius,
|
||||
startArc ? gdjs.toRad(startArc) : 0,
|
||||
endArc ? gdjs.toRad(endArc) : 0
|
||||
);
|
||||
this._graphics.closePath();
|
||||
this._graphics.endFill();
|
||||
this.invalidateBounds();
|
||||
}
|
||||
|
||||
drawRegularPolygon(
|
||||
x1: float,
|
||||
y1: float,
|
||||
|
@@ -242,24 +242,6 @@ namespace gdjs {
|
||||
);
|
||||
}
|
||||
|
||||
drawTorus(
|
||||
centerX: float,
|
||||
centerY: float,
|
||||
innerRadius: float,
|
||||
outerRadius: float,
|
||||
startArc: float,
|
||||
endArc: float
|
||||
) {
|
||||
this._renderer.drawTorus(
|
||||
centerX,
|
||||
centerY,
|
||||
innerRadius,
|
||||
outerRadius,
|
||||
startArc,
|
||||
endArc
|
||||
);
|
||||
}
|
||||
|
||||
drawRegularPolygon(
|
||||
centerX: float,
|
||||
centerY: float,
|
||||
|
@@ -26,11 +26,12 @@ namespace gdjs {
|
||||
);
|
||||
};
|
||||
|
||||
class TextInputRuntimeObjectPixiRenderer {
|
||||
class TextInputRuntimeObjectPixiRenderer implements RendererObjectInterface {
|
||||
private _object: gdjs.TextInputRuntimeObject;
|
||||
private _input: HTMLInputElement | HTMLTextAreaElement | null = null;
|
||||
private _instanceContainer: gdjs.RuntimeInstanceContainer;
|
||||
private _runtimeGame: gdjs.RuntimeGame;
|
||||
private _isVisible = false;
|
||||
|
||||
constructor(
|
||||
runtimeObject: gdjs.TextInputRuntimeObject,
|
||||
@@ -113,14 +114,25 @@ namespace gdjs {
|
||||
this._destroyElement();
|
||||
}
|
||||
|
||||
//@ts-ignore
|
||||
set visible(isVisible: boolean) {
|
||||
this._isVisible = isVisible;
|
||||
if (!this._input) return;
|
||||
this._input.style.display = isVisible ? 'initial' : 'none';
|
||||
}
|
||||
|
||||
//@ts-ignore
|
||||
get visible(): boolean {
|
||||
return this._isVisible;
|
||||
}
|
||||
|
||||
updatePreRender() {
|
||||
if (!this._input) return;
|
||||
|
||||
// Hide the input entirely if the object is hidden.
|
||||
// Because this object is rendered as a DOM element (and not part of the PixiJS
|
||||
// scene graph), we have to do this manually.
|
||||
if (this._object.isHidden()) {
|
||||
this._input.style.display = 'none';
|
||||
if (!this._isVisible) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
@@ -102,7 +102,8 @@ namespace gdjs {
|
||||
}
|
||||
|
||||
getRendererObject() {
|
||||
return null;
|
||||
// The renderer is not a Pixi Object but it implements visible.
|
||||
return this._renderer;
|
||||
}
|
||||
|
||||
updateFromObjectData(
|
||||
|
@@ -95,7 +95,7 @@ module.exports = {
|
||||
.addParameter('expression', _('Weighting'))
|
||||
.setParameterLongDescription(_('From 0 to 1.'))
|
||||
.getCodeExtraInformation()
|
||||
.setIncludeFile('Extensions/TweenBehavior/TweenManager.js')
|
||||
.setIncludeFile('Extensions/TweenBehavior/standard-easing-functions.js')
|
||||
.setFunctionName('gdjs.evtTools.tween.ease');
|
||||
|
||||
// Deprecated
|
||||
@@ -122,7 +122,8 @@ module.exports = {
|
||||
.addParameter('expression', _('Duration (in milliseconds)'), '', false)
|
||||
.addParameter('stringWithSelector', _('Easing'), easingChoices, false)
|
||||
.getCodeExtraInformation()
|
||||
.setIncludeFile('Extensions/TweenBehavior/TweenManager.js')
|
||||
.setIncludeFile('Extensions/TweenBehavior/standard-easing-functions.js')
|
||||
.addIncludeFile('Extensions/TweenBehavior/tweenruntimebehavior.js')
|
||||
.addIncludeFile('Extensions/TweenBehavior/tweentools.js')
|
||||
.setFunctionName('gdjs.evtTools.tween.tweenVariableNumber');
|
||||
|
||||
@@ -149,7 +150,8 @@ module.exports = {
|
||||
.addParameter('expression', _('Duration (in milliseconds)'), '', false)
|
||||
.addParameter('stringWithSelector', _('Easing'), easingChoices, false)
|
||||
.getCodeExtraInformation()
|
||||
.setIncludeFile('Extensions/TweenBehavior/TweenManager.js')
|
||||
.setIncludeFile('Extensions/TweenBehavior/standard-easing-functions.js')
|
||||
.addIncludeFile('Extensions/TweenBehavior/tweenruntimebehavior.js')
|
||||
.addIncludeFile('Extensions/TweenBehavior/tweentools.js')
|
||||
.setFunctionName('gdjs.evtTools.tween.tweenVariableNumber2');
|
||||
|
||||
@@ -175,7 +177,8 @@ module.exports = {
|
||||
.setDefaultValue('linear')
|
||||
.addParameter('expression', _('Duration (in seconds)'), '', false)
|
||||
.getCodeExtraInformation()
|
||||
.setIncludeFile('Extensions/TweenBehavior/TweenManager.js')
|
||||
.setIncludeFile('Extensions/TweenBehavior/standard-easing-functions.js')
|
||||
.addIncludeFile('Extensions/TweenBehavior/tweenruntimebehavior.js')
|
||||
.addIncludeFile('Extensions/TweenBehavior/tweentools.js')
|
||||
.setFunctionName('gdjs.evtTools.tween.tweenVariableNumber3');
|
||||
|
||||
@@ -204,7 +207,8 @@ module.exports = {
|
||||
.setDefaultValue('no')
|
||||
.markAsAdvanced()
|
||||
.getCodeExtraInformation()
|
||||
.setIncludeFile('Extensions/TweenBehavior/TweenManager.js')
|
||||
.setIncludeFile('Extensions/TweenBehavior/standard-easing-functions.js')
|
||||
.addIncludeFile('Extensions/TweenBehavior/tweenruntimebehavior.js')
|
||||
.addIncludeFile('Extensions/TweenBehavior/tweentools.js')
|
||||
.setFunctionName('gdjs.evtTools.tween.addLayoutValueTween');
|
||||
|
||||
@@ -234,7 +238,8 @@ module.exports = {
|
||||
.setDefaultValue('no')
|
||||
.markAsAdvanced()
|
||||
.getCodeExtraInformation()
|
||||
.setIncludeFile('Extensions/TweenBehavior/TweenManager.js')
|
||||
.setIncludeFile('Extensions/TweenBehavior/standard-easing-functions.js')
|
||||
.addIncludeFile('Extensions/TweenBehavior/tweenruntimebehavior.js')
|
||||
.addIncludeFile('Extensions/TweenBehavior/tweentools.js')
|
||||
.setFunctionName('gdjs.evtTools.tween.addLayerValueTween');
|
||||
|
||||
@@ -260,7 +265,8 @@ module.exports = {
|
||||
.addParameter('expression', _('Duration (in milliseconds)'), '', false)
|
||||
.addParameter('stringWithSelector', _('Easing'), easingChoices, false)
|
||||
.getCodeExtraInformation()
|
||||
.setIncludeFile('Extensions/TweenBehavior/TweenManager.js')
|
||||
.setIncludeFile('Extensions/TweenBehavior/standard-easing-functions.js')
|
||||
.addIncludeFile('Extensions/TweenBehavior/tweenruntimebehavior.js')
|
||||
.addIncludeFile('Extensions/TweenBehavior/tweentools.js')
|
||||
.setFunctionName('gdjs.evtTools.tween.tweenCamera');
|
||||
|
||||
@@ -285,7 +291,8 @@ module.exports = {
|
||||
.setDefaultValue('linear')
|
||||
.addParameter('expression', _('Duration (in seconds)'), '', false)
|
||||
.getCodeExtraInformation()
|
||||
.setIncludeFile('Extensions/TweenBehavior/TweenManager.js')
|
||||
.setIncludeFile('Extensions/TweenBehavior/standard-easing-functions.js')
|
||||
.addIncludeFile('Extensions/TweenBehavior/tweenruntimebehavior.js')
|
||||
.addIncludeFile('Extensions/TweenBehavior/tweentools.js')
|
||||
.setFunctionName('gdjs.evtTools.tween.tweenCamera2');
|
||||
|
||||
@@ -310,7 +317,8 @@ module.exports = {
|
||||
.addParameter('expression', _('Duration (in milliseconds)'), '', false)
|
||||
.addParameter('stringWithSelector', _('Easing'), easingChoices, false)
|
||||
.getCodeExtraInformation()
|
||||
.setIncludeFile('Extensions/TweenBehavior/TweenManager.js')
|
||||
.setIncludeFile('Extensions/TweenBehavior/standard-easing-functions.js')
|
||||
.addIncludeFile('Extensions/TweenBehavior/tweenruntimebehavior.js')
|
||||
.addIncludeFile('Extensions/TweenBehavior/tweentools.js')
|
||||
.setFunctionName('gdjs.evtTools.tween.tweenCameraZoom');
|
||||
|
||||
@@ -334,7 +342,8 @@ module.exports = {
|
||||
.setDefaultValue('linear')
|
||||
.addParameter('expression', _('Duration (in seconds)'), '', false)
|
||||
.getCodeExtraInformation()
|
||||
.setIncludeFile('Extensions/TweenBehavior/TweenManager.js')
|
||||
.setIncludeFile('Extensions/TweenBehavior/standard-easing-functions.js')
|
||||
.addIncludeFile('Extensions/TweenBehavior/tweenruntimebehavior.js')
|
||||
.addIncludeFile('Extensions/TweenBehavior/tweentools.js')
|
||||
.setFunctionName('gdjs.evtTools.tween.tweenCameraZoom2');
|
||||
|
||||
@@ -359,7 +368,8 @@ module.exports = {
|
||||
.addParameter('expression', _('Duration (in milliseconds)'), '', false)
|
||||
.addParameter('stringWithSelector', _('Easing'), easingChoices, false)
|
||||
.getCodeExtraInformation()
|
||||
.setIncludeFile('Extensions/TweenBehavior/TweenManager.js')
|
||||
.setIncludeFile('Extensions/TweenBehavior/standard-easing-functions.js')
|
||||
.addIncludeFile('Extensions/TweenBehavior/tweenruntimebehavior.js')
|
||||
.addIncludeFile('Extensions/TweenBehavior/tweentools.js')
|
||||
.setFunctionName('gdjs.evtTools.tween.tweenCameraRotation');
|
||||
|
||||
@@ -383,62 +393,11 @@ module.exports = {
|
||||
.setDefaultValue('linear')
|
||||
.addParameter('expression', _('Duration (in seconds)'), '', false)
|
||||
.getCodeExtraInformation()
|
||||
.setIncludeFile('Extensions/TweenBehavior/TweenManager.js')
|
||||
.setIncludeFile('Extensions/TweenBehavior/standard-easing-functions.js')
|
||||
.addIncludeFile('Extensions/TweenBehavior/tweenruntimebehavior.js')
|
||||
.addIncludeFile('Extensions/TweenBehavior/tweentools.js')
|
||||
.setFunctionName('gdjs.evtTools.tween.tweenCameraRotation2');
|
||||
|
||||
extension
|
||||
.addAction(
|
||||
'TweenNumberEffectPropertyTween',
|
||||
_('Tween number effect property'),
|
||||
_('Tweens a number effect property from its current value to a new one.'),
|
||||
_(
|
||||
'Tween the property _PARAM5_ for effect _PARAM4_ of _PARAM3_ to _PARAM2_ with easing _PARAM6_ over _PARAM7_ seconds as _PARAM1_'
|
||||
),
|
||||
_('Scene Tweens'),
|
||||
'JsPlatform/Extensions/tween_behavior24.png',
|
||||
'JsPlatform/Extensions/tween_behavior32.png'
|
||||
)
|
||||
.addCodeOnlyParameter('currentScene', '')
|
||||
.addParameter('identifier', _('Tween Identifier'), 'sceneTween')
|
||||
.addParameter('expression', _('To value'), '', false)
|
||||
.addParameter('layer', _('Layer'), '', true)
|
||||
.addParameter("layerEffectName", _("Effect name"))
|
||||
.addParameter("layerEffectParameterName", _("Property name"))
|
||||
.addParameter('stringWithSelector', _('Easing'), easingChoices, false)
|
||||
.setDefaultValue('linear')
|
||||
.addParameter('expression', _('Duration (in seconds)'), '', false)
|
||||
.getCodeExtraInformation()
|
||||
.setIncludeFile('Extensions/TweenBehavior/TweenManager.js')
|
||||
.addIncludeFile('Extensions/TweenBehavior/tweentools.js')
|
||||
.setFunctionName('gdjs.evtTools.tween.tweenNumberEffectPropertyTween');
|
||||
|
||||
extension
|
||||
.addAction(
|
||||
'TweenColorEffectPropertyTween',
|
||||
_('Tween color effect property'),
|
||||
_('Tweens a color effect property from its current value to a new one.'),
|
||||
_(
|
||||
'Tween the color property _PARAM5_ for effect _PARAM4_ of _PARAM3_ to _PARAM2_ with easing _PARAM6_ over _PARAM7_ seconds as _PARAM1_'
|
||||
),
|
||||
_('Scene Tweens'),
|
||||
'JsPlatform/Extensions/tween_behavior24.png',
|
||||
'JsPlatform/Extensions/tween_behavior32.png'
|
||||
)
|
||||
.addCodeOnlyParameter('currentScene', '')
|
||||
.addParameter('identifier', _('Tween Identifier'), 'sceneTween')
|
||||
.addParameter('color', _('To color'), '', false)
|
||||
.addParameter('layer', _('Layer'), '', true)
|
||||
.addParameter("layerEffectName", _("Effect name"))
|
||||
.addParameter("layerEffectParameterName", _("Property name"))
|
||||
.addParameter('stringWithSelector', _('Easing'), easingChoices, false)
|
||||
.setDefaultValue('linear')
|
||||
.addParameter('expression', _('Duration (in seconds)'), '', false)
|
||||
.getCodeExtraInformation()
|
||||
.setIncludeFile('Extensions/TweenBehavior/TweenManager.js')
|
||||
.addIncludeFile('Extensions/TweenBehavior/tweentools.js')
|
||||
.setFunctionName('gdjs.evtTools.tween.tweenColorEffectPropertyTween');
|
||||
|
||||
extension
|
||||
.addCondition(
|
||||
'SceneTweenExists',
|
||||
@@ -452,7 +411,8 @@ module.exports = {
|
||||
.addCodeOnlyParameter('currentScene', '')
|
||||
.addParameter('identifier', _('Tween Identifier'), 'sceneTween')
|
||||
.getCodeExtraInformation()
|
||||
.setIncludeFile('Extensions/TweenBehavior/TweenManager.js')
|
||||
.setIncludeFile('Extensions/TweenBehavior/standard-easing-functions.js')
|
||||
.addIncludeFile('Extensions/TweenBehavior/tweenruntimebehavior.js')
|
||||
.addIncludeFile('Extensions/TweenBehavior/tweentools.js')
|
||||
.setFunctionName('gdjs.evtTools.tween.sceneTweenExists');
|
||||
|
||||
@@ -469,7 +429,8 @@ module.exports = {
|
||||
.addCodeOnlyParameter('currentScene', '')
|
||||
.addParameter('identifier', _('Tween Identifier'), 'sceneTween')
|
||||
.getCodeExtraInformation()
|
||||
.setIncludeFile('Extensions/TweenBehavior/TweenManager.js')
|
||||
.setIncludeFile('Extensions/TweenBehavior/standard-easing-functions.js')
|
||||
.addIncludeFile('Extensions/TweenBehavior/tweenruntimebehavior.js')
|
||||
.addIncludeFile('Extensions/TweenBehavior/tweentools.js')
|
||||
.setFunctionName('gdjs.evtTools.tween.sceneTweenIsPlaying');
|
||||
|
||||
@@ -486,7 +447,8 @@ module.exports = {
|
||||
.addCodeOnlyParameter('currentScene', '')
|
||||
.addParameter('identifier', _('Tween Identifier'), 'sceneTween')
|
||||
.getCodeExtraInformation()
|
||||
.setIncludeFile('Extensions/TweenBehavior/TweenManager.js')
|
||||
.setIncludeFile('Extensions/TweenBehavior/standard-easing-functions.js')
|
||||
.addIncludeFile('Extensions/TweenBehavior/tweenruntimebehavior.js')
|
||||
.addIncludeFile('Extensions/TweenBehavior/tweentools.js')
|
||||
.setFunctionName('gdjs.evtTools.tween.sceneTweenHasFinished');
|
||||
|
||||
@@ -503,7 +465,8 @@ module.exports = {
|
||||
.addCodeOnlyParameter('currentScene', '')
|
||||
.addParameter('identifier', _('Tween Identifier'), 'sceneTween')
|
||||
.getCodeExtraInformation()
|
||||
.setIncludeFile('Extensions/TweenBehavior/TweenManager.js')
|
||||
.setIncludeFile('Extensions/TweenBehavior/standard-easing-functions.js')
|
||||
.addIncludeFile('Extensions/TweenBehavior/tweenruntimebehavior.js')
|
||||
.addIncludeFile('Extensions/TweenBehavior/tweentools.js')
|
||||
.setFunctionName('gdjs.evtTools.tween.pauseSceneTween');
|
||||
|
||||
@@ -521,7 +484,8 @@ module.exports = {
|
||||
.addParameter('identifier', _('Tween Identifier'), 'sceneTween')
|
||||
.addParameter('yesorno', _('Jump to the end'), '', false)
|
||||
.getCodeExtraInformation()
|
||||
.setIncludeFile('Extensions/TweenBehavior/TweenManager.js')
|
||||
.setIncludeFile('Extensions/TweenBehavior/standard-easing-functions.js')
|
||||
.addIncludeFile('Extensions/TweenBehavior/tweenruntimebehavior.js')
|
||||
.addIncludeFile('Extensions/TweenBehavior/tweentools.js')
|
||||
.setFunctionName('gdjs.evtTools.tween.stopSceneTween');
|
||||
|
||||
@@ -538,7 +502,8 @@ module.exports = {
|
||||
.addCodeOnlyParameter('currentScene', '')
|
||||
.addParameter('identifier', _('Tween Identifier'), 'sceneTween')
|
||||
.getCodeExtraInformation()
|
||||
.setIncludeFile('Extensions/TweenBehavior/TweenManager.js')
|
||||
.setIncludeFile('Extensions/TweenBehavior/standard-easing-functions.js')
|
||||
.addIncludeFile('Extensions/TweenBehavior/tweenruntimebehavior.js')
|
||||
.addIncludeFile('Extensions/TweenBehavior/tweentools.js')
|
||||
.setFunctionName('gdjs.evtTools.tween.resumeSceneTween');
|
||||
|
||||
@@ -557,7 +522,8 @@ module.exports = {
|
||||
.addCodeOnlyParameter('currentScene', '')
|
||||
.addParameter('identifier', _('Tween Identifier'), 'sceneTween')
|
||||
.getCodeExtraInformation()
|
||||
.setIncludeFile('Extensions/TweenBehavior/TweenManager.js')
|
||||
.setIncludeFile('Extensions/TweenBehavior/standard-easing-functions.js')
|
||||
.addIncludeFile('Extensions/TweenBehavior/tweenruntimebehavior.js')
|
||||
.addIncludeFile('Extensions/TweenBehavior/tweentools.js')
|
||||
.setFunctionName('gdjs.evtTools.tween.removeSceneTween');
|
||||
|
||||
@@ -574,7 +540,8 @@ module.exports = {
|
||||
.addCodeOnlyParameter('currentScene', '')
|
||||
.addParameter('identifier', _('Tween Identifier'), 'sceneTween')
|
||||
.useStandardParameters('number', gd.ParameterOptions.makeNewOptions())
|
||||
.setIncludeFile('Extensions/TweenBehavior/TweenManager.js')
|
||||
.setIncludeFile('Extensions/TweenBehavior/standard-easing-functions.js')
|
||||
.addIncludeFile('Extensions/TweenBehavior/tweenruntimebehavior.js')
|
||||
.addIncludeFile('Extensions/TweenBehavior/tweentools.js')
|
||||
.setFunctionName('gdjs.evtTools.tween.getProgress');
|
||||
|
||||
@@ -591,7 +558,8 @@ module.exports = {
|
||||
.addCodeOnlyParameter('currentScene', '')
|
||||
.addParameter('identifier', _('Tween Identifier'), 'sceneTween')
|
||||
.getCodeExtraInformation()
|
||||
.setIncludeFile('Extensions/TweenBehavior/TweenManager.js')
|
||||
.setIncludeFile('Extensions/TweenBehavior/standard-easing-functions.js')
|
||||
.addIncludeFile('Extensions/TweenBehavior/tweenruntimebehavior.js')
|
||||
.addIncludeFile('Extensions/TweenBehavior/tweentools.js')
|
||||
.setFunctionName('gdjs.evtTools.tween.getValue');
|
||||
|
||||
@@ -629,7 +597,7 @@ module.exports = {
|
||||
tweenBehavior,
|
||||
new gd.BehaviorsSharedData()
|
||||
)
|
||||
.setIncludeFile('Extensions/TweenBehavior/TweenManager.js')
|
||||
.setIncludeFile('Extensions/TweenBehavior/standard-easing-functions.js')
|
||||
.addIncludeFile('Extensions/TweenBehavior/tweenruntimebehavior.js');
|
||||
|
||||
// Behavior related
|
||||
@@ -1537,70 +1505,6 @@ module.exports = {
|
||||
.getCodeExtraInformation()
|
||||
.setFunctionName('addObjectOpacityTween2');
|
||||
|
||||
behavior
|
||||
.addScopedAction(
|
||||
'AddNumberEffectPropertyTween',
|
||||
_('Tween number effect property'),
|
||||
_('Tweens a number effect property from its current value to a new one.'),
|
||||
_(
|
||||
'Tween the property _PARAM6_ for effect _PARAM5_ of _PARAM0_ to _PARAM4_ with easing _PARAM7_ over _PARAM8_ seconds as _PARAM3_'
|
||||
),
|
||||
_('Effects'),
|
||||
'JsPlatform/Extensions/tween_behavior24.png',
|
||||
'JsPlatform/Extensions/tween_behavior32.png'
|
||||
)
|
||||
.addParameter('object', _('Object'), '', false)
|
||||
.addParameter('behavior', _('Behavior'), 'TweenBehavior', false)
|
||||
.addParameter("behavior", _("Effect capability"), "EffectCapability::EffectBehavior")
|
||||
.addParameter('identifier', _('Tween Identifier'), 'objectTween')
|
||||
.addParameter('expression', _('To value'), '', false)
|
||||
.addParameter("objectEffectName", _("Effect name"))
|
||||
.addParameter("objectEffectParameterName", _("Property name"))
|
||||
.addParameter('stringWithSelector', _('Easing'), easingChoices, false)
|
||||
.setDefaultValue('linear')
|
||||
.addParameter('expression', _('Duration (in seconds)'), '', false)
|
||||
.addParameter(
|
||||
'yesorno',
|
||||
_('Destroy this object when tween finishes'),
|
||||
'',
|
||||
false
|
||||
)
|
||||
.setDefaultValue('no')
|
||||
.getCodeExtraInformation()
|
||||
.setFunctionName('addNumberEffectPropertyTween');
|
||||
|
||||
behavior
|
||||
.addScopedAction(
|
||||
'AddColorEffectPropertyTween',
|
||||
_('Tween color effect property'),
|
||||
_('Tweens a color effect property from its current value to a new one.'),
|
||||
_(
|
||||
'Tween the color property _PARAM6_ for effect _PARAM5_ of _PARAM0_ to _PARAM4_ with easing _PARAM7_ over _PARAM8_ seconds as _PARAM3_'
|
||||
),
|
||||
_('Effects'),
|
||||
'JsPlatform/Extensions/tween_behavior24.png',
|
||||
'JsPlatform/Extensions/tween_behavior32.png'
|
||||
)
|
||||
.addParameter('object', _('Object'), '', false)
|
||||
.addParameter('behavior', _('Behavior'), 'TweenBehavior', false)
|
||||
.addParameter("behavior", _("Effect capability"), "EffectCapability::EffectBehavior")
|
||||
.addParameter('identifier', _('Tween Identifier'), 'objectTween')
|
||||
.addParameter('color', _('To color'), '', false)
|
||||
.addParameter("objectEffectName", _("Effect name"))
|
||||
.addParameter("objectEffectParameterName", _("Property name"))
|
||||
.addParameter('stringWithSelector', _('Easing'), easingChoices, false)
|
||||
.setDefaultValue('linear')
|
||||
.addParameter('expression', _('Duration (in seconds)'), '', false)
|
||||
.addParameter(
|
||||
'yesorno',
|
||||
_('Destroy this object when tween finishes'),
|
||||
'',
|
||||
false
|
||||
)
|
||||
.setDefaultValue('no')
|
||||
.getCodeExtraInformation()
|
||||
.setFunctionName('addNumberEffectPropertyTween');
|
||||
|
||||
// deprecated
|
||||
behavior
|
||||
.addAction(
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user