From 1863399a044b1b41c9135208ae39080fa7790e1e Mon Sep 17 00:00:00 2001 From: Josef Date: Fri, 20 Mar 2026 14:31:31 +0100 Subject: [PATCH] Parsing Update --- Icons/UIRule.svg | 201 ++++ Icons/UIRule.svg.import | 43 + Icons/UIRuleSet.svg | 414 ++++++++ Icons/UIRuleSet.svg.import | 43 + Icons/UISelector.svg | 110 +++ Icons/UISelector.svg.import | 43 + Runtime/Actions/Action.cs | 385 ++++---- Runtime/Actions/Audio/MusicChannel.cs | 17 + Runtime/Actions/Audio/MusicChannel.cs.uid | 1 + Runtime/Actions/Audio/MusicChannelPlayer.cs | 89 ++ .../Actions/Audio/MusicChannelPlayer.cs.uid | 1 + Runtime/Actions/Audio/MusicData.cs | 26 + Runtime/Actions/Audio/MusicData.cs.uid | 1 + Runtime/Actions/Audio/ScheduleMusic.cs | 42 + Runtime/Actions/Audio/ScheduleMusic.cs.uid | 1 + .../NumberSetting/CompositorEffectSetting.cs | 55 ++ .../CompositorEffectSetting.cs.uid | 1 + .../Presets/Graphics/Graphics Category.tres | 37 +- Runtime/Audio/AudioManager/AudioManager.cs | 18 + .../Cameras/PostProcess/PostProcessVolume.cs | 2 + .../PostProcess/PostProcessVolumeEffect.cs | 12 +- Runtime/Files/FilePath.cs | 2 +- Runtime/Godot/Extensions/ControlExtensions.cs | 18 + .../Godot/Extensions/ControlExtensions.cs.uid | 1 + Runtime/Graphs/Trees/TreeWalker.cs | 17 + Runtime/Math/Math3D.cs | 31 +- .../Spline/SplineUp/AltByAngle_SplineUpGen.cs | 62 ++ .../SplineUp/AltByAngle_SplineUpGen.cs.uid | 1 + .../Spline/SplineUp/Constant_SplineUpGen.cs | 24 + .../SplineUp/Constant_SplineUpGen.cs.uid | 1 + .../SplineUp/SplineUpGeneratorStrategy.cs | 19 + .../SplineUp/SplineUpGeneratorStrategy.cs.uid | 1 + .../Spline/SplineUp/WorldUp_SplineUpGen.cs | 24 + .../SplineUp/WorldUp_SplineUpGen.cs.uid | 1 + Runtime/Random/RandomEngine.cs | 14 + .../Edge/DepthOutlines/DepthOutlinesEffect.cs | 16 +- .../good-graphics.png | Bin 0 -> 83128 bytes .../good-graphics.png.import | 40 + .../star-glow-blur.png | Bin 0 -> 909052 bytes .../star-glow-blur.png.import | 40 + .../Rainbow Star Glow Assets/star-glow.png | Bin 0 -> 306444 bytes .../star-glow.png.import | 40 + .../Glow/Rainbow Star Glow.tres | 54 +- .../CompositorVFXPresets/Screen/Sketch.tres | 7 +- .../Outlines/ZOutlines/ZOutlines.glsl | 66 +- .../Default-Input-Icons-Library.tres | 4 +- .../Default-Sensors/UI/Sensors/UI Left.tres | 9 +- .../Default-Sensors/UI/Sensors/UI Right.tres | 8 +- .../DeviceFilters/LastActiveDeviceFilter.cs | 2 + Runtime/Sensors/Devices/GamePadDevice.cs | 2 + Runtime/Sensors/Devices/SensorDevice.cs | 2 +- .../Sensors/InputIcons/Types/SensorIcon.cs | 7 + .../LineVFX-ApplyModelViewMatrix.gdshaderinc | 9 + ...neVFX-ApplyModelViewMatrix.gdshaderinc.uid | 1 + .../LineVFX/LineVFX-Includes.gdshaderinc | 4 + .../LineVFX/LineVFX-Includes.gdshaderinc.uid | 1 + .../LineVFX/LineVFX-Variables.gdshaderinc | 24 + .../LineVFX/LineVFX-Variables.gdshaderinc.uid | 1 + .../LineVFX/LineVFX-Vertex.gdshaderinc | 86 ++ .../LineVFX/LineVFX-Vertex.gdshaderinc.uid | 1 + .../GDScript/GDScriptFromCSAST.cs | 177 ++++ .../GDScript/GDScriptFromCSAST.cs.uid | 1 + .../GDScript/GDScriptGenerator.cs | 28 + .../GDScript/GDScriptGenerator.cs.uid | 1 + .../GDScript/GDScriptGeneratorClass.cs | 53 + .../GDScript/GDScriptGeneratorClass.cs.uid | 1 + .../GDScript/GDScriptGeneratorEnum.cs | 32 + .../GDScript/GDScriptGeneratorEnum.cs.uid | 1 + .../GDScript/GDScriptGeneratorField.cs | 24 + .../GDScript/GDScriptGeneratorField.cs.uid | 1 + .../GDScript/GDScriptGeneratorMember.cs | 17 + .../GDScript/GDScriptGeneratorMember.cs.uid | 1 + .../GDScript/GDScriptGeneratorMethod.cs | 75 ++ .../GDScript/GDScriptGeneratorMethod.cs.uid | 1 + .../GDScript/GDScriptGeneratorParameter.cs | 24 + .../GDScriptGeneratorParameter.cs.uid | 1 + Runtime/Text/Lexing/Lexer.cs | 14 + .../{CSharpLexer.cs => CSLexer.cs} | 13 +- .../{CSharpLexer.cs.uid => CSLexer.cs.uid} | 0 Runtime/Text/Lexing/LexerMatcherLibrary.cs | 10 +- Runtime/Text/Parsing/AST/ASTFileRoot.cs | 18 + Runtime/Text/Parsing/AST/ASTFileRoot.cs.uid | 1 + Runtime/Text/Parsing/AST/ASTNode.cs | 918 ++++++++++++++++++ Runtime/Text/Parsing/AST/ASTNode.cs.uid | 1 + Runtime/Text/Parsing/AST/ASTNodeList.cs | 15 + Runtime/Text/Parsing/AST/ASTNodeList.cs.uid | 1 + Runtime/Text/Parsing/AST/ASTWalker.cs | 36 + Runtime/Text/Parsing/AST/ASTWalker.cs.uid | 1 + .../Text/Parsing/AST/EnumValueDeclaration.cs | 15 + .../Parsing/AST/EnumValueDeclaration.cs.uid | 1 + Runtime/Text/Parsing/AST/ImportDeclaration.cs | 14 + .../Text/Parsing/AST/ImportDeclaration.cs.uid | 1 + .../Parsing/AST/Matchers/ASTMatchResult.cs | 55 ++ .../AST/Matchers/ASTMatchResult.cs.uid | 1 + .../Text/Parsing/AST/Matchers/ASTMatcher.cs | 26 + .../Parsing/AST/Matchers/ASTMatcher.cs.uid | 1 + .../AST/Matchers/BracketBlockASTMatcher.cs | 98 ++ .../Matchers/BracketBlockASTMatcher.cs.uid | 1 + .../AST/Matchers/CombinedASTMatcher.cs | 70 ++ .../AST/Matchers/CombinedASTMatcher.cs.uid | 1 + .../Parsing/AST/Matchers/LambdaASTMatcher.cs | 21 + .../AST/Matchers/LambdaASTMatcher.cs.uid | 1 + .../AST/Matchers/MultiTriggerASTMatcher.cs | 39 + .../Matchers/MultiTriggerASTMatcher.cs.uid | 1 + .../Matchers/TokenRepeatSequenceASTMatcher.cs | 65 ++ .../TokenRepeatSequenceASTMatcher.cs.uid | 1 + .../AST/Matchers/TokenSequenceASTMatcher.cs | 44 + .../Matchers/TokenSequenceASTMatcher.cs.uid | 1 + .../AST/Matchers/TokenWordASTMatcher.cs | 59 ++ .../AST/Matchers/TokenWordASTMatcher.cs.uid | 1 + Runtime/Text/Parsing/AST/MemberDeclaration.cs | 15 + .../Text/Parsing/AST/MemberDeclaration.cs.uid | 1 + Runtime/Text/Parsing/AST/NamespaceBlock.cs | 14 + .../Text/Parsing/AST/NamespaceBlock.cs.uid | 1 + .../Text/Parsing/AST/NamespaceDeclaration.cs | 14 + .../Parsing/AST/NamespaceDeclaration.cs.uid | 1 + .../AST/ObjectTypes/ClassDeclaration.cs | 14 + .../AST/ObjectTypes/ClassDeclaration.cs.uid | 1 + .../AST/ObjectTypes/EnumDeclaration.cs | 14 + .../AST/ObjectTypes/EnumDeclaration.cs.uid | 1 + .../AST/ObjectTypes/InterfaceDeclaration.cs | 14 + .../ObjectTypes/InterfaceDeclaration.cs.uid | 1 + .../Text/Parsing/AST/ParameterDeclaration.cs | 16 + .../Parsing/AST/ParameterDeclaration.cs.uid | 1 + Runtime/Text/Parsing/AST/ResolvableASTNode.cs | 14 + .../Text/Parsing/AST/ResolvableASTNode.cs.uid | 1 + .../AST/Resolver/ASTMatcherResolver.cs | 34 + .../AST/Resolver/ASTMatcherResolver.cs.uid | 1 + .../Text/Parsing/AST/Resolver/ASTParser.cs | 120 +++ .../Parsing/AST/Resolver/ASTParser.cs.uid | 1 + .../Text/Parsing/AST/Resolver/ASTResolver.cs | 14 + .../Parsing/AST/Resolver/ASTResolver.cs.uid | 1 + Runtime/Text/Parsing/AST/Token.cs | 163 ++++ Runtime/Text/Parsing/AST/Token.cs.uid | 1 + .../Text/Parsing/AST/TokenPredicateData.cs | 45 + .../Parsing/AST/TokenPredicateData.cs.uid | 1 + .../Evaluator/ExpressionContext.cs | 10 + .../Evaluator/ExpressionContext.cs.uid | 1 + .../Evaluator/ExpressionEvaluator.cs | 18 + .../Evaluator/ExpressionEvaluator.cs.uid | 1 + .../Expressions/Evaluator/ExpressionResult.cs | 12 + .../Evaluator/ExpressionResult.cs.uid | 1 + .../Parsing/Expressions/ExpressionParser.cs | 46 + .../Expressions/ExpressionParser.cs.uid | 1 + .../Expressions/Operators/BinaryExpression.cs | 41 + .../Operators/BinaryExpression.cs.uid | 1 + .../Expressions/Operators/BinaryOperator.cs | 40 + .../Operators/BinaryOperator.cs.uid | 1 + .../Operators/ConstantExpression.cs | 25 + .../Operators/ConstantExpression.cs.uid | 1 + .../Expressions/Operators/ConstantOperator.cs | 21 + .../Operators/ConstantOperator.cs.uid | 1 + .../Operators/ExpressionOperator.cs | 39 + .../Operators/ExpressionOperator.cs.uid | 1 + .../Expressions/Operators/GroupExpression.cs | 30 + .../Operators/GroupExpression.cs.uid | 1 + .../Expressions/Operators/GroupOperator.cs | 45 + .../Operators/GroupOperator.cs.uid | 1 + .../Operators/OperatorExpression.cs | 9 + .../Operators/OperatorExpression.cs.uid | 1 + .../Expressions/Operators/UnaryExpression.cs | 33 + .../Operators/UnaryExpression.cs.uid | 1 + .../Expressions/Operators/UnaryOperator.cs | 115 +++ .../Operators/UnaryOperator.cs.uid | 1 + .../Operators/VariableExpression.cs | 24 + .../Operators/VariableExpression.cs.uid | 1 + .../Expressions/Operators/VariableOperator.cs | 21 + .../Operators/VariableOperator.cs.uid | 1 + .../Parsing/Expressions/PrecedenceLevel.cs | 67 ++ .../Expressions/PrecedenceLevel.cs.uid | 1 + Runtime/Text/Parsing/Parser/ASTParserPhase.cs | 22 + .../Text/Parsing/Parser/ASTParserPhase.cs.uid | 1 + Runtime/Text/Parsing/Parser/LexerPhase.cs | 43 + Runtime/Text/Parsing/Parser/LexerPhase.cs.uid | 1 + Runtime/Text/Parsing/Parser/Parser.cs | 63 ++ Runtime/Text/Parsing/Parser/Parser.cs.uid | 1 + Runtime/Text/Parsing/Parser/ParserMessage.cs | 10 + .../Text/Parsing/Parser/ParserMessage.cs.uid | 1 + Runtime/Text/Parsing/Parser/ParserPhase.cs | 9 + .../Text/Parsing/Parser/ParserPhase.cs.uid | 1 + .../Parsing/ParserLibrary/CSharp/CSParser.cs | 26 + .../ParserLibrary/CSharp/CSParser.cs.uid | 1 + .../ParserLibrary/CSharp/CSParserTest.cs | 91 ++ .../ParserLibrary/CSharp/CSParserTest.cs.uid | 1 + .../ParserLibrary/CSharp/Nodes/CSFileRoot.cs | 57 ++ .../CSharp/Nodes/CSFileRoot.cs.uid | 1 + .../CSharp/Nodes/CSImportDeclaration.cs | 64 ++ .../CSharp/Nodes/CSImportDeclaration.cs.uid | 1 + .../CSharp/Nodes/CSNamespaceBlock.cs | 16 + .../CSharp/Nodes/CSNamespaceBlock.cs.uid | 1 + .../CSharp/Nodes/CSNamespaceDeclaration.cs | 63 ++ .../Nodes/CSNamespaceDeclaration.cs.uid | 1 + .../CSharp/Nodes/CSTypeDefinition.cs | 13 + .../CSharp/Nodes/CSTypeDefinition.cs.uid | 1 + .../CSEnumValueDeclaration.cs | 49 + .../CSEnumValueDeclaration.cs.uid | 1 + .../MemberDeclarations/CSFieldDeclaration.cs | 8 + .../CSFieldDeclaration.cs.uid | 1 + .../MemberDeclarations/CSMemberDeclaration.cs | 37 + .../CSMemberDeclaration.cs.uid | 1 + .../CSMethodMemberDeclaration.cs | 16 + .../CSMethodMemberDeclaration.cs.uid | 1 + .../CSParameterDeclaration.cs | 60 ++ .../CSParameterDeclaration.cs.uid | 1 + .../CSPropertyDeclaration.cs | 8 + .../CSPropertyDeclaration.cs.uid | 1 + .../ObjectDeclarations/CSClassDeclaration.cs | 16 + .../CSClassDeclaration.cs.uid | 1 + .../ObjectDeclarations/CSEnumDeclaration.cs | 16 + .../CSEnumDeclaration.cs.uid | 1 + .../CSInterfaceDeclaration.cs | 16 + .../CSInterfaceDeclaration.cs.uid | 1 + .../ObjectDeclarations/CSObjectDeclaration.cs | 170 ++++ .../CSObjectDeclaration.cs.uid | 1 + .../CSObjectDeclarationTail.cs | 35 + .../CSObjectDeclarationTail.cs.uid | 1 + .../ObjectDeclarations/CSObjectDependency.cs | 10 + .../CSObjectDependency.cs.uid | 1 + .../ObjectDeclarations/CSStructDeclaration.cs | 16 + .../CSStructDeclaration.cs.uid | 1 + .../ParserLibrary/CSharp/Nodes/SquareBlock.cs | 18 + .../CSharp/Nodes/SquareBlock.cs.uid | 1 + .../CSharp/Parsers/CSMemberResolver.cs | 317 ++++++ .../CSharp/Parsers/CSMemberResolver.cs.uid | 1 + .../Parsers/CSModifierAttributesParser.cs | 215 ++++ .../Parsers/CSModifierAttributesParser.cs.uid | 1 + .../CSharp/Parsers/CSObjectParser.cs | 54 ++ .../CSharp/Parsers/CSObjectParser.cs.uid | 1 + .../Parsers/CSPreProcessor/CSPreProcessor.cs | 121 +++ .../CSPreProcessor/CSPreProcessor.cs.uid | 1 + .../CSPreProcessorConditionalEvaluator.cs | 291 ++++++ .../CSPreProcessorConditionalEvaluator.cs.uid | 1 + .../CSPreProcessor/CSPreProcessorContext.cs | 8 + .../CSPreProcessorContext.cs.uid | 1 + .../CSPreProcessorExpressionParser.cs | 67 ++ .../CSPreProcessorExpressionParser.cs.uid | 1 + .../CSPreProcessor/CSPreProcessorStack.cs | 63 ++ .../CSPreProcessor/CSPreProcessorStack.cs.uid | 1 + .../CSharp/Parsers/CSRootFileParser.cs | 37 + .../CSharp/Parsers/CSRootFileParser.cs.uid | 1 + Runtime/Text/Text.cs | 31 + Runtime/Tools/Lists.cs | 22 +- Runtime/UI/Nodes/Image/UIImage.cs | 222 ++++- .../RoundedRectangleUIImageType.cs | 5 + .../Sliders/ScrollSlider/UIScrollSlider.cs | 54 ++ Runtime/UI/Nodes/Sliders/UISlider.cs | 101 +- Runtime/UI/Nodes/UIInputInfo.cs | 4 +- Runtime/UI/Nodes/UIRegion.cs | 305 +++++- Runtime/UI/Nodes/UIText.cs | 175 +++- .../Presets/Rule Sets/Active-Hover-Idle.tres | 11 + .../Presets/Rule Sets/Focus-Hover-Idle.tres | 11 + Runtime/UI/Presets/Rules/Active Rule.tres | 11 + Runtime/UI/Presets/Rules/Focus Rule.tres | 11 + Runtime/UI/Presets/Rules/Hover Rule.tres | 11 + Runtime/UI/Presets/Rules/Idle Rule.tres | 9 + .../Selectors}/Active Selector.tres | 0 .../Selectors}/Focus Selector.tres | 0 .../Selectors}/Hover Selector.tres | 0 .../Styles}/Mod 100% Style.tres | 8 +- Runtime/UI/Presets/Styles/Mod 65% Style.tres | 14 + .../Styles}/Mod 80% Style.tres | 8 +- Runtime/UI/Styling/UINumber.cs | 2 +- .../Styling/{UISelectorStyle.cs => UIRule.cs} | 4 +- Runtime/UI/Styling/UIRule.cs.uid | 1 + Runtime/UI/Styling/UISelector.cs | 76 +- Runtime/UI/Styling/UISelectorStyle.cs.uid | 1 - Runtime/UI/Styling/UIStyle.cs | 140 ++- .../UI/Styling/UIStylePropertyContainer.cs | 2 + .../Presets/Active 100% Selector Style.tres | 11 - .../Presets/Focus 100% Selector Style.tres | 11 - .../Presets/Hover 80% Selector Style.tres | 11 - Runtime/UI/UI.cs | 81 +- .../MinimalisticCategoryPagesGenerator.cs | 60 +- .../Handlers/Presets/List Controller.tscn | 31 +- .../Handlers/Presets/Number Controller.tscn | 120 ++- .../Headers/MinimalisticHeaderGenerator.cs | 72 +- .../Headers/SetFocusedUIAppSettings.cs | 39 + .../Headers/SetFocusedUIAppSettings.cs.uid | 1 + .../Headers/UIAppSettingsHeader.cs | 3 + .../UI/UIAppSettings/SetUIAppSettingsReady.cs | 1 + Runtime/UI/UIAppSettings/UIAppSettings.cs | 20 + Runtime/UI/UIRuleSet.cs | 16 + Runtime/UI/UIRuleSet.cs.uid | 1 + .../LineMaterial/CustomLineMaterialPreset.cs | 15 +- .../LineMaterial/LineMaterialPreset.cs | 1 + .../LineMaterial/LineVFXShaderSetup.cs | 3 + .../Shaders/PBR/LineVFX-PBR.gdshader | 60 ++ .../Shaders/PBR/LineVFX-PBR.gdshader.uid | 1 + .../LineMeshGenerator/RandomLineMeshEntry.cs | 16 + .../RandomLineMeshEntry.cs.uid | 1 + .../RandomLineMeshGenerator.cs | 19 + .../RandomLineMeshGenerator.cs.uid | 1 + .../LinePoint/AutoLine/AutoLinePointList.cs | 39 +- .../LinePoint/AutoLine/AutoLineVFXData.cs | 5 + .../CustomLine/CustomLinePointList.cs | 2 + .../LinePoint/CustomLine/CustomLineVFXData.cs | 7 + .../FollowAutoLine/FollowAutoLine.cs | 6 + .../VFX/LineVFX/LinePoint/LineVFXPointData.cs | 2 + Runtime/VFX/LineVFX/LineVFX.cs | 1 + Tools/FFmpeg/FFmpeg.cs | 129 +++ Tools/FFmpeg/FFmpeg.cs.uid | 1 + Tools/FFmpeg/FFmpegQuality.cs | 37 + Tools/FFmpeg/FFmpegQuality.cs.uid | 1 + Tools/FFmpeg/FFmpegTool.cs | 86 ++ Tools/FFmpeg/FFmpegTool.cs.uid | 1 + Tools/docs/ClassDocEditing/ClassDocParser.cs | 2 +- Tools/docs/CreateDoc.cs | 4 +- Tools/docs/DocComments.cs | 2 +- Tools/docs/DocGenerator.cs | 2 +- 309 files changed, 9030 insertions(+), 573 deletions(-) create mode 100644 Icons/UIRule.svg create mode 100644 Icons/UIRule.svg.import create mode 100644 Icons/UIRuleSet.svg create mode 100644 Icons/UIRuleSet.svg.import create mode 100644 Icons/UISelector.svg create mode 100644 Icons/UISelector.svg.import create mode 100644 Runtime/Actions/Audio/MusicChannel.cs create mode 100644 Runtime/Actions/Audio/MusicChannel.cs.uid create mode 100644 Runtime/Actions/Audio/MusicChannelPlayer.cs create mode 100644 Runtime/Actions/Audio/MusicChannelPlayer.cs.uid create mode 100644 Runtime/Actions/Audio/MusicData.cs create mode 100644 Runtime/Actions/Audio/MusicData.cs.uid create mode 100644 Runtime/Actions/Audio/ScheduleMusic.cs create mode 100644 Runtime/Actions/Audio/ScheduleMusic.cs.uid create mode 100644 Runtime/App/Settings/NumberSetting/CompositorEffectSetting.cs create mode 100644 Runtime/App/Settings/NumberSetting/CompositorEffectSetting.cs.uid create mode 100644 Runtime/Godot/Extensions/ControlExtensions.cs create mode 100644 Runtime/Godot/Extensions/ControlExtensions.cs.uid create mode 100644 Runtime/Procedural/Parametric/Spline/SplineUp/AltByAngle_SplineUpGen.cs create mode 100644 Runtime/Procedural/Parametric/Spline/SplineUp/AltByAngle_SplineUpGen.cs.uid create mode 100644 Runtime/Procedural/Parametric/Spline/SplineUp/Constant_SplineUpGen.cs create mode 100644 Runtime/Procedural/Parametric/Spline/SplineUp/Constant_SplineUpGen.cs.uid create mode 100644 Runtime/Procedural/Parametric/Spline/SplineUp/SplineUpGeneratorStrategy.cs create mode 100644 Runtime/Procedural/Parametric/Spline/SplineUp/SplineUpGeneratorStrategy.cs.uid create mode 100644 Runtime/Procedural/Parametric/Spline/SplineUp/WorldUp_SplineUpGen.cs create mode 100644 Runtime/Procedural/Parametric/Spline/SplineUp/WorldUp_SplineUpGen.cs.uid create mode 100644 Runtime/Rendering/Compositor/CompositorVFXPresets/Glow/Rainbow Star Glow Assets/good-graphics.png create mode 100644 Runtime/Rendering/Compositor/CompositorVFXPresets/Glow/Rainbow Star Glow Assets/good-graphics.png.import create mode 100644 Runtime/Rendering/Compositor/CompositorVFXPresets/Glow/Rainbow Star Glow Assets/star-glow-blur.png create mode 100644 Runtime/Rendering/Compositor/CompositorVFXPresets/Glow/Rainbow Star Glow Assets/star-glow-blur.png.import create mode 100644 Runtime/Rendering/Compositor/CompositorVFXPresets/Glow/Rainbow Star Glow Assets/star-glow.png create mode 100644 Runtime/Rendering/Compositor/CompositorVFXPresets/Glow/Rainbow Star Glow Assets/star-glow.png.import create mode 100644 Runtime/Shading/Library/LineVFX/LineVFX-ApplyModelViewMatrix.gdshaderinc create mode 100644 Runtime/Shading/Library/LineVFX/LineVFX-ApplyModelViewMatrix.gdshaderinc.uid create mode 100644 Runtime/Shading/Library/LineVFX/LineVFX-Includes.gdshaderinc create mode 100644 Runtime/Shading/Library/LineVFX/LineVFX-Includes.gdshaderinc.uid create mode 100644 Runtime/Shading/Library/LineVFX/LineVFX-Variables.gdshaderinc create mode 100644 Runtime/Shading/Library/LineVFX/LineVFX-Variables.gdshaderinc.uid create mode 100644 Runtime/Shading/Library/LineVFX/LineVFX-Vertex.gdshaderinc create mode 100644 Runtime/Shading/Library/LineVFX/LineVFX-Vertex.gdshaderinc.uid create mode 100644 Runtime/Text/CodeGenerators/GDScript/GDScriptFromCSAST.cs create mode 100644 Runtime/Text/CodeGenerators/GDScript/GDScriptFromCSAST.cs.uid create mode 100644 Runtime/Text/CodeGenerators/GDScript/GDScriptGenerator.cs create mode 100644 Runtime/Text/CodeGenerators/GDScript/GDScriptGenerator.cs.uid create mode 100644 Runtime/Text/CodeGenerators/GDScript/GDScriptGeneratorClass.cs create mode 100644 Runtime/Text/CodeGenerators/GDScript/GDScriptGeneratorClass.cs.uid create mode 100644 Runtime/Text/CodeGenerators/GDScript/GDScriptGeneratorEnum.cs create mode 100644 Runtime/Text/CodeGenerators/GDScript/GDScriptGeneratorEnum.cs.uid create mode 100644 Runtime/Text/CodeGenerators/GDScript/GDScriptGeneratorField.cs create mode 100644 Runtime/Text/CodeGenerators/GDScript/GDScriptGeneratorField.cs.uid create mode 100644 Runtime/Text/CodeGenerators/GDScript/GDScriptGeneratorMember.cs create mode 100644 Runtime/Text/CodeGenerators/GDScript/GDScriptGeneratorMember.cs.uid create mode 100644 Runtime/Text/CodeGenerators/GDScript/GDScriptGeneratorMethod.cs create mode 100644 Runtime/Text/CodeGenerators/GDScript/GDScriptGeneratorMethod.cs.uid create mode 100644 Runtime/Text/CodeGenerators/GDScript/GDScriptGeneratorParameter.cs create mode 100644 Runtime/Text/CodeGenerators/GDScript/GDScriptGeneratorParameter.cs.uid rename Runtime/Text/Lexing/LexerLibrary/{CSharpLexer.cs => CSLexer.cs} (92%) rename Runtime/Text/Lexing/LexerLibrary/{CSharpLexer.cs.uid => CSLexer.cs.uid} (100%) create mode 100644 Runtime/Text/Parsing/AST/ASTFileRoot.cs create mode 100644 Runtime/Text/Parsing/AST/ASTFileRoot.cs.uid create mode 100644 Runtime/Text/Parsing/AST/ASTNode.cs create mode 100644 Runtime/Text/Parsing/AST/ASTNode.cs.uid create mode 100644 Runtime/Text/Parsing/AST/ASTNodeList.cs create mode 100644 Runtime/Text/Parsing/AST/ASTNodeList.cs.uid create mode 100644 Runtime/Text/Parsing/AST/ASTWalker.cs create mode 100644 Runtime/Text/Parsing/AST/ASTWalker.cs.uid create mode 100644 Runtime/Text/Parsing/AST/EnumValueDeclaration.cs create mode 100644 Runtime/Text/Parsing/AST/EnumValueDeclaration.cs.uid create mode 100644 Runtime/Text/Parsing/AST/ImportDeclaration.cs create mode 100644 Runtime/Text/Parsing/AST/ImportDeclaration.cs.uid create mode 100644 Runtime/Text/Parsing/AST/Matchers/ASTMatchResult.cs create mode 100644 Runtime/Text/Parsing/AST/Matchers/ASTMatchResult.cs.uid create mode 100644 Runtime/Text/Parsing/AST/Matchers/ASTMatcher.cs create mode 100644 Runtime/Text/Parsing/AST/Matchers/ASTMatcher.cs.uid create mode 100644 Runtime/Text/Parsing/AST/Matchers/BracketBlockASTMatcher.cs create mode 100644 Runtime/Text/Parsing/AST/Matchers/BracketBlockASTMatcher.cs.uid create mode 100644 Runtime/Text/Parsing/AST/Matchers/CombinedASTMatcher.cs create mode 100644 Runtime/Text/Parsing/AST/Matchers/CombinedASTMatcher.cs.uid create mode 100644 Runtime/Text/Parsing/AST/Matchers/LambdaASTMatcher.cs create mode 100644 Runtime/Text/Parsing/AST/Matchers/LambdaASTMatcher.cs.uid create mode 100644 Runtime/Text/Parsing/AST/Matchers/MultiTriggerASTMatcher.cs create mode 100644 Runtime/Text/Parsing/AST/Matchers/MultiTriggerASTMatcher.cs.uid create mode 100644 Runtime/Text/Parsing/AST/Matchers/TokenRepeatSequenceASTMatcher.cs create mode 100644 Runtime/Text/Parsing/AST/Matchers/TokenRepeatSequenceASTMatcher.cs.uid create mode 100644 Runtime/Text/Parsing/AST/Matchers/TokenSequenceASTMatcher.cs create mode 100644 Runtime/Text/Parsing/AST/Matchers/TokenSequenceASTMatcher.cs.uid create mode 100644 Runtime/Text/Parsing/AST/Matchers/TokenWordASTMatcher.cs create mode 100644 Runtime/Text/Parsing/AST/Matchers/TokenWordASTMatcher.cs.uid create mode 100644 Runtime/Text/Parsing/AST/MemberDeclaration.cs create mode 100644 Runtime/Text/Parsing/AST/MemberDeclaration.cs.uid create mode 100644 Runtime/Text/Parsing/AST/NamespaceBlock.cs create mode 100644 Runtime/Text/Parsing/AST/NamespaceBlock.cs.uid create mode 100644 Runtime/Text/Parsing/AST/NamespaceDeclaration.cs create mode 100644 Runtime/Text/Parsing/AST/NamespaceDeclaration.cs.uid create mode 100644 Runtime/Text/Parsing/AST/ObjectTypes/ClassDeclaration.cs create mode 100644 Runtime/Text/Parsing/AST/ObjectTypes/ClassDeclaration.cs.uid create mode 100644 Runtime/Text/Parsing/AST/ObjectTypes/EnumDeclaration.cs create mode 100644 Runtime/Text/Parsing/AST/ObjectTypes/EnumDeclaration.cs.uid create mode 100644 Runtime/Text/Parsing/AST/ObjectTypes/InterfaceDeclaration.cs create mode 100644 Runtime/Text/Parsing/AST/ObjectTypes/InterfaceDeclaration.cs.uid create mode 100644 Runtime/Text/Parsing/AST/ParameterDeclaration.cs create mode 100644 Runtime/Text/Parsing/AST/ParameterDeclaration.cs.uid create mode 100644 Runtime/Text/Parsing/AST/ResolvableASTNode.cs create mode 100644 Runtime/Text/Parsing/AST/ResolvableASTNode.cs.uid create mode 100644 Runtime/Text/Parsing/AST/Resolver/ASTMatcherResolver.cs create mode 100644 Runtime/Text/Parsing/AST/Resolver/ASTMatcherResolver.cs.uid create mode 100644 Runtime/Text/Parsing/AST/Resolver/ASTParser.cs create mode 100644 Runtime/Text/Parsing/AST/Resolver/ASTParser.cs.uid create mode 100644 Runtime/Text/Parsing/AST/Resolver/ASTResolver.cs create mode 100644 Runtime/Text/Parsing/AST/Resolver/ASTResolver.cs.uid create mode 100644 Runtime/Text/Parsing/AST/Token.cs create mode 100644 Runtime/Text/Parsing/AST/Token.cs.uid create mode 100644 Runtime/Text/Parsing/AST/TokenPredicateData.cs create mode 100644 Runtime/Text/Parsing/AST/TokenPredicateData.cs.uid create mode 100644 Runtime/Text/Parsing/Expressions/Evaluator/ExpressionContext.cs create mode 100644 Runtime/Text/Parsing/Expressions/Evaluator/ExpressionContext.cs.uid create mode 100644 Runtime/Text/Parsing/Expressions/Evaluator/ExpressionEvaluator.cs create mode 100644 Runtime/Text/Parsing/Expressions/Evaluator/ExpressionEvaluator.cs.uid create mode 100644 Runtime/Text/Parsing/Expressions/Evaluator/ExpressionResult.cs create mode 100644 Runtime/Text/Parsing/Expressions/Evaluator/ExpressionResult.cs.uid create mode 100644 Runtime/Text/Parsing/Expressions/ExpressionParser.cs create mode 100644 Runtime/Text/Parsing/Expressions/ExpressionParser.cs.uid create mode 100644 Runtime/Text/Parsing/Expressions/Operators/BinaryExpression.cs create mode 100644 Runtime/Text/Parsing/Expressions/Operators/BinaryExpression.cs.uid create mode 100644 Runtime/Text/Parsing/Expressions/Operators/BinaryOperator.cs create mode 100644 Runtime/Text/Parsing/Expressions/Operators/BinaryOperator.cs.uid create mode 100644 Runtime/Text/Parsing/Expressions/Operators/ConstantExpression.cs create mode 100644 Runtime/Text/Parsing/Expressions/Operators/ConstantExpression.cs.uid create mode 100644 Runtime/Text/Parsing/Expressions/Operators/ConstantOperator.cs create mode 100644 Runtime/Text/Parsing/Expressions/Operators/ConstantOperator.cs.uid create mode 100644 Runtime/Text/Parsing/Expressions/Operators/ExpressionOperator.cs create mode 100644 Runtime/Text/Parsing/Expressions/Operators/ExpressionOperator.cs.uid create mode 100644 Runtime/Text/Parsing/Expressions/Operators/GroupExpression.cs create mode 100644 Runtime/Text/Parsing/Expressions/Operators/GroupExpression.cs.uid create mode 100644 Runtime/Text/Parsing/Expressions/Operators/GroupOperator.cs create mode 100644 Runtime/Text/Parsing/Expressions/Operators/GroupOperator.cs.uid create mode 100644 Runtime/Text/Parsing/Expressions/Operators/OperatorExpression.cs create mode 100644 Runtime/Text/Parsing/Expressions/Operators/OperatorExpression.cs.uid create mode 100644 Runtime/Text/Parsing/Expressions/Operators/UnaryExpression.cs create mode 100644 Runtime/Text/Parsing/Expressions/Operators/UnaryExpression.cs.uid create mode 100644 Runtime/Text/Parsing/Expressions/Operators/UnaryOperator.cs create mode 100644 Runtime/Text/Parsing/Expressions/Operators/UnaryOperator.cs.uid create mode 100644 Runtime/Text/Parsing/Expressions/Operators/VariableExpression.cs create mode 100644 Runtime/Text/Parsing/Expressions/Operators/VariableExpression.cs.uid create mode 100644 Runtime/Text/Parsing/Expressions/Operators/VariableOperator.cs create mode 100644 Runtime/Text/Parsing/Expressions/Operators/VariableOperator.cs.uid create mode 100644 Runtime/Text/Parsing/Expressions/PrecedenceLevel.cs create mode 100644 Runtime/Text/Parsing/Expressions/PrecedenceLevel.cs.uid create mode 100644 Runtime/Text/Parsing/Parser/ASTParserPhase.cs create mode 100644 Runtime/Text/Parsing/Parser/ASTParserPhase.cs.uid create mode 100644 Runtime/Text/Parsing/Parser/LexerPhase.cs create mode 100644 Runtime/Text/Parsing/Parser/LexerPhase.cs.uid create mode 100644 Runtime/Text/Parsing/Parser/Parser.cs create mode 100644 Runtime/Text/Parsing/Parser/Parser.cs.uid create mode 100644 Runtime/Text/Parsing/Parser/ParserMessage.cs create mode 100644 Runtime/Text/Parsing/Parser/ParserMessage.cs.uid create mode 100644 Runtime/Text/Parsing/Parser/ParserPhase.cs create mode 100644 Runtime/Text/Parsing/Parser/ParserPhase.cs.uid create mode 100644 Runtime/Text/Parsing/ParserLibrary/CSharp/CSParser.cs create mode 100644 Runtime/Text/Parsing/ParserLibrary/CSharp/CSParser.cs.uid create mode 100644 Runtime/Text/Parsing/ParserLibrary/CSharp/CSParserTest.cs create mode 100644 Runtime/Text/Parsing/ParserLibrary/CSharp/CSParserTest.cs.uid create mode 100644 Runtime/Text/Parsing/ParserLibrary/CSharp/Nodes/CSFileRoot.cs create mode 100644 Runtime/Text/Parsing/ParserLibrary/CSharp/Nodes/CSFileRoot.cs.uid create mode 100644 Runtime/Text/Parsing/ParserLibrary/CSharp/Nodes/CSImportDeclaration.cs create mode 100644 Runtime/Text/Parsing/ParserLibrary/CSharp/Nodes/CSImportDeclaration.cs.uid create mode 100644 Runtime/Text/Parsing/ParserLibrary/CSharp/Nodes/CSNamespaceBlock.cs create mode 100644 Runtime/Text/Parsing/ParserLibrary/CSharp/Nodes/CSNamespaceBlock.cs.uid create mode 100644 Runtime/Text/Parsing/ParserLibrary/CSharp/Nodes/CSNamespaceDeclaration.cs create mode 100644 Runtime/Text/Parsing/ParserLibrary/CSharp/Nodes/CSNamespaceDeclaration.cs.uid create mode 100644 Runtime/Text/Parsing/ParserLibrary/CSharp/Nodes/CSTypeDefinition.cs create mode 100644 Runtime/Text/Parsing/ParserLibrary/CSharp/Nodes/CSTypeDefinition.cs.uid create mode 100644 Runtime/Text/Parsing/ParserLibrary/CSharp/Nodes/MemberDeclarations/CSEnumValueDeclaration.cs create mode 100644 Runtime/Text/Parsing/ParserLibrary/CSharp/Nodes/MemberDeclarations/CSEnumValueDeclaration.cs.uid create mode 100644 Runtime/Text/Parsing/ParserLibrary/CSharp/Nodes/MemberDeclarations/CSFieldDeclaration.cs create mode 100644 Runtime/Text/Parsing/ParserLibrary/CSharp/Nodes/MemberDeclarations/CSFieldDeclaration.cs.uid create mode 100644 Runtime/Text/Parsing/ParserLibrary/CSharp/Nodes/MemberDeclarations/CSMemberDeclaration.cs create mode 100644 Runtime/Text/Parsing/ParserLibrary/CSharp/Nodes/MemberDeclarations/CSMemberDeclaration.cs.uid create mode 100644 Runtime/Text/Parsing/ParserLibrary/CSharp/Nodes/MemberDeclarations/CSMethodMemberDeclaration.cs create mode 100644 Runtime/Text/Parsing/ParserLibrary/CSharp/Nodes/MemberDeclarations/CSMethodMemberDeclaration.cs.uid create mode 100644 Runtime/Text/Parsing/ParserLibrary/CSharp/Nodes/MemberDeclarations/CSParameterDeclaration.cs create mode 100644 Runtime/Text/Parsing/ParserLibrary/CSharp/Nodes/MemberDeclarations/CSParameterDeclaration.cs.uid create mode 100644 Runtime/Text/Parsing/ParserLibrary/CSharp/Nodes/MemberDeclarations/CSPropertyDeclaration.cs create mode 100644 Runtime/Text/Parsing/ParserLibrary/CSharp/Nodes/MemberDeclarations/CSPropertyDeclaration.cs.uid create mode 100644 Runtime/Text/Parsing/ParserLibrary/CSharp/Nodes/ObjectDeclarations/CSClassDeclaration.cs create mode 100644 Runtime/Text/Parsing/ParserLibrary/CSharp/Nodes/ObjectDeclarations/CSClassDeclaration.cs.uid create mode 100644 Runtime/Text/Parsing/ParserLibrary/CSharp/Nodes/ObjectDeclarations/CSEnumDeclaration.cs create mode 100644 Runtime/Text/Parsing/ParserLibrary/CSharp/Nodes/ObjectDeclarations/CSEnumDeclaration.cs.uid create mode 100644 Runtime/Text/Parsing/ParserLibrary/CSharp/Nodes/ObjectDeclarations/CSInterfaceDeclaration.cs create mode 100644 Runtime/Text/Parsing/ParserLibrary/CSharp/Nodes/ObjectDeclarations/CSInterfaceDeclaration.cs.uid create mode 100644 Runtime/Text/Parsing/ParserLibrary/CSharp/Nodes/ObjectDeclarations/CSObjectDeclaration.cs create mode 100644 Runtime/Text/Parsing/ParserLibrary/CSharp/Nodes/ObjectDeclarations/CSObjectDeclaration.cs.uid create mode 100644 Runtime/Text/Parsing/ParserLibrary/CSharp/Nodes/ObjectDeclarations/CSObjectDeclarationTail.cs create mode 100644 Runtime/Text/Parsing/ParserLibrary/CSharp/Nodes/ObjectDeclarations/CSObjectDeclarationTail.cs.uid create mode 100644 Runtime/Text/Parsing/ParserLibrary/CSharp/Nodes/ObjectDeclarations/CSObjectDependency.cs create mode 100644 Runtime/Text/Parsing/ParserLibrary/CSharp/Nodes/ObjectDeclarations/CSObjectDependency.cs.uid create mode 100644 Runtime/Text/Parsing/ParserLibrary/CSharp/Nodes/ObjectDeclarations/CSStructDeclaration.cs create mode 100644 Runtime/Text/Parsing/ParserLibrary/CSharp/Nodes/ObjectDeclarations/CSStructDeclaration.cs.uid create mode 100644 Runtime/Text/Parsing/ParserLibrary/CSharp/Nodes/SquareBlock.cs create mode 100644 Runtime/Text/Parsing/ParserLibrary/CSharp/Nodes/SquareBlock.cs.uid create mode 100644 Runtime/Text/Parsing/ParserLibrary/CSharp/Parsers/CSMemberResolver.cs create mode 100644 Runtime/Text/Parsing/ParserLibrary/CSharp/Parsers/CSMemberResolver.cs.uid create mode 100644 Runtime/Text/Parsing/ParserLibrary/CSharp/Parsers/CSModifierAttributesParser.cs create mode 100644 Runtime/Text/Parsing/ParserLibrary/CSharp/Parsers/CSModifierAttributesParser.cs.uid create mode 100644 Runtime/Text/Parsing/ParserLibrary/CSharp/Parsers/CSObjectParser.cs create mode 100644 Runtime/Text/Parsing/ParserLibrary/CSharp/Parsers/CSObjectParser.cs.uid create mode 100644 Runtime/Text/Parsing/ParserLibrary/CSharp/Parsers/CSPreProcessor/CSPreProcessor.cs create mode 100644 Runtime/Text/Parsing/ParserLibrary/CSharp/Parsers/CSPreProcessor/CSPreProcessor.cs.uid create mode 100644 Runtime/Text/Parsing/ParserLibrary/CSharp/Parsers/CSPreProcessor/CSPreProcessorConditionalEvaluator.cs create mode 100644 Runtime/Text/Parsing/ParserLibrary/CSharp/Parsers/CSPreProcessor/CSPreProcessorConditionalEvaluator.cs.uid create mode 100644 Runtime/Text/Parsing/ParserLibrary/CSharp/Parsers/CSPreProcessor/CSPreProcessorContext.cs create mode 100644 Runtime/Text/Parsing/ParserLibrary/CSharp/Parsers/CSPreProcessor/CSPreProcessorContext.cs.uid create mode 100644 Runtime/Text/Parsing/ParserLibrary/CSharp/Parsers/CSPreProcessor/CSPreProcessorExpressionParser.cs create mode 100644 Runtime/Text/Parsing/ParserLibrary/CSharp/Parsers/CSPreProcessor/CSPreProcessorExpressionParser.cs.uid create mode 100644 Runtime/Text/Parsing/ParserLibrary/CSharp/Parsers/CSPreProcessor/CSPreProcessorStack.cs create mode 100644 Runtime/Text/Parsing/ParserLibrary/CSharp/Parsers/CSPreProcessor/CSPreProcessorStack.cs.uid create mode 100644 Runtime/Text/Parsing/ParserLibrary/CSharp/Parsers/CSRootFileParser.cs create mode 100644 Runtime/Text/Parsing/ParserLibrary/CSharp/Parsers/CSRootFileParser.cs.uid create mode 100644 Runtime/UI/Presets/Rule Sets/Active-Hover-Idle.tres create mode 100644 Runtime/UI/Presets/Rule Sets/Focus-Hover-Idle.tres create mode 100644 Runtime/UI/Presets/Rules/Active Rule.tres create mode 100644 Runtime/UI/Presets/Rules/Focus Rule.tres create mode 100644 Runtime/UI/Presets/Rules/Hover Rule.tres create mode 100644 Runtime/UI/Presets/Rules/Idle Rule.tres rename Runtime/UI/{UI-Selectors/Presets => Presets/Selectors}/Active Selector.tres (100%) rename Runtime/UI/{UI-Selectors/Presets => Presets/Selectors}/Focus Selector.tres (100%) rename Runtime/UI/{UI-Selectors/Presets => Presets/Selectors}/Hover Selector.tres (100%) rename Runtime/UI/{UI-Selectors/Presets => Presets/Styles}/Mod 100% Style.tres (86%) create mode 100644 Runtime/UI/Presets/Styles/Mod 65% Style.tres rename Runtime/UI/{UI-Selectors/Presets => Presets/Styles}/Mod 80% Style.tres (86%) rename Runtime/UI/Styling/{UISelectorStyle.cs => UIRule.cs} (62%) create mode 100644 Runtime/UI/Styling/UIRule.cs.uid delete mode 100644 Runtime/UI/Styling/UISelectorStyle.cs.uid delete mode 100644 Runtime/UI/UI-Selectors/Presets/Active 100% Selector Style.tres delete mode 100644 Runtime/UI/UI-Selectors/Presets/Focus 100% Selector Style.tres delete mode 100644 Runtime/UI/UI-Selectors/Presets/Hover 80% Selector Style.tres create mode 100644 Runtime/UI/UIAppSettings/Headers/SetFocusedUIAppSettings.cs create mode 100644 Runtime/UI/UIAppSettings/Headers/SetFocusedUIAppSettings.cs.uid create mode 100644 Runtime/UI/UIRuleSet.cs create mode 100644 Runtime/UI/UIRuleSet.cs.uid create mode 100644 Runtime/VFX/LineVFX/LineMaterial/Shaders/PBR/LineVFX-PBR.gdshader create mode 100644 Runtime/VFX/LineVFX/LineMaterial/Shaders/PBR/LineVFX-PBR.gdshader.uid create mode 100644 Runtime/VFX/LineVFX/LineMeshGenerator/RandomLineMeshEntry.cs create mode 100644 Runtime/VFX/LineVFX/LineMeshGenerator/RandomLineMeshEntry.cs.uid create mode 100644 Runtime/VFX/LineVFX/LineMeshGenerator/RandomLineMeshGenerator.cs create mode 100644 Runtime/VFX/LineVFX/LineMeshGenerator/RandomLineMeshGenerator.cs.uid create mode 100644 Tools/FFmpeg/FFmpeg.cs create mode 100644 Tools/FFmpeg/FFmpeg.cs.uid create mode 100644 Tools/FFmpeg/FFmpegQuality.cs create mode 100644 Tools/FFmpeg/FFmpegQuality.cs.uid create mode 100644 Tools/FFmpeg/FFmpegTool.cs create mode 100644 Tools/FFmpeg/FFmpegTool.cs.uid diff --git a/Icons/UIRule.svg b/Icons/UIRule.svg new file mode 100644 index 0000000..2572058 --- /dev/null +++ b/Icons/UIRule.svg @@ -0,0 +1,201 @@ + + diff --git a/Icons/UIRule.svg.import b/Icons/UIRule.svg.import new file mode 100644 index 0000000..bb3a487 --- /dev/null +++ b/Icons/UIRule.svg.import @@ -0,0 +1,43 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://b53un3tjulppj" +path="res://.godot/imported/UIRule.svg-dd35f8a9b19c4e01c4e95c28eb989981.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/rokojori_action_library/Icons/UIRule.svg" +dest_files=["res://.godot/imported/UIRule.svg-dd35f8a9b19c4e01c4e95c28eb989981.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 +svg/scale=1.0 +editor/scale_with_editor_scale=false +editor/convert_colors_with_editor_theme=false diff --git a/Icons/UIRuleSet.svg b/Icons/UIRuleSet.svg new file mode 100644 index 0000000..b12124d --- /dev/null +++ b/Icons/UIRuleSet.svg @@ -0,0 +1,414 @@ + + diff --git a/Icons/UIRuleSet.svg.import b/Icons/UIRuleSet.svg.import new file mode 100644 index 0000000..1e1afc7 --- /dev/null +++ b/Icons/UIRuleSet.svg.import @@ -0,0 +1,43 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bqo22c1m73dyu" +path="res://.godot/imported/UIRuleSet.svg-421bda2d7476eddcafe1e07da9c0badf.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/rokojori_action_library/Icons/UIRuleSet.svg" +dest_files=["res://.godot/imported/UIRuleSet.svg-421bda2d7476eddcafe1e07da9c0badf.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 +svg/scale=1.0 +editor/scale_with_editor_scale=false +editor/convert_colors_with_editor_theme=false diff --git a/Icons/UISelector.svg b/Icons/UISelector.svg new file mode 100644 index 0000000..bb08e74 --- /dev/null +++ b/Icons/UISelector.svg @@ -0,0 +1,110 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Icons/UISelector.svg.import b/Icons/UISelector.svg.import new file mode 100644 index 0000000..91d2b89 --- /dev/null +++ b/Icons/UISelector.svg.import @@ -0,0 +1,43 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://6rml2liif4ns" +path="res://.godot/imported/UISelector.svg-1da3b1c2f5d0e50773a94b5a365f6476.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/rokojori_action_library/Icons/UISelector.svg" +dest_files=["res://.godot/imported/UISelector.svg-1da3b1c2f5d0e50773a94b5a365f6476.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 +svg/scale=1.0 +editor/scale_with_editor_scale=false +editor/convert_colors_with_editor_theme=false diff --git a/Runtime/Actions/Action.cs b/Runtime/Actions/Action.cs index 676a827..56d1fb8 100644 --- a/Runtime/Actions/Action.cs +++ b/Runtime/Actions/Action.cs @@ -3,208 +3,225 @@ using Godot; using System.Collections.Generic; -namespace Rokojori -{ - [Tool] - [GlobalClass, Icon("res://addons/rokojori_action_library/Icons/Action.svg")] - public partial class Action : NetworkNode +namespace Rokojori; + +[Tool] +[GlobalClass, Icon("res://addons/rokojori_action_library/Icons/Action.svg")] +public partial class Action : NetworkNode +{ + public enum ActionTriggerMode { - public enum ActionTriggerMode + Only_When_Processing_In_Hierarchy, + Always + } + + [Export] + public ActionTriggerMode triggerMode = ActionTriggerMode.Always; + + #if !GD_SCRIPT_TRANSPILING + + [ExportToolButton( "(?) Help", Icon = "Help") ] + public Callable openHelpButton => Callable.From( ()=> + { + #if TOOLS + Rokojori.Tools.OnlineDocs.Open( GetType() ); + #endif + } + ); + + #endif + + [ExportToolButton( "Trigger Action in Editor")] + public Callable TriggerActionButton => Callable.From( ()=> Trigger() ); + + #if !GD_SCRIPT_TRANSPILING + + public static bool IsAction( Node n ) + { + if ( n == null ) { - Only_When_Processing_In_Hierarchy, - Always + return false; } - [Export] - public ActionTriggerMode triggerMode = ActionTriggerMode.Only_When_Processing_In_Hierarchy; - - [ExportToolButton( "(?) Help", Icon = "Help") ] - public Callable openHelpButton => Callable.From( ()=> - { - #if TOOLS - Rokojori.Tools.OnlineDocs.Open( GetType() ); - #endif - } - ); - - [ExportToolButton( "Trigger Action in Editor")] - public Callable TriggerActionButton => Callable.From( ()=> Trigger() ); - - NetworkNodeSlot _seedSlot = new NetworkNodeSlot(); - NetworkNodeSlot _dataSlot = new NetworkNodeSlot(); - NetworkNodeSlot _seedAndDataSlot = new NetworkNodeSlot(); - - public static bool IsAction( Node n ) - { - if ( n == null ) - { - return false; - } - - return n is Action || GDScriptAction.IsRJAction( n ); - } - - public void LogInfoFor( Node n, string message ) - { - var className = GDScriptNames.ExtractClassName( n ); - RJLog.GDLog( $"{className}._onTrigger()", n, message ); - } - - - protected override List CreateNetworkNodeMembers() - { - return new List() - { - _networkNodeSlot, - _seedSlot, - _dataSlot, - _seedAndDataSlot - }; - } - - public Action() - { - - } - - public void Trigger() - { - if ( ! IsInstanceValid( this ) ) - { - return; - } - - if ( triggerMode == ActionTriggerMode.Only_When_Processing_In_Hierarchy && ! this.IsProcessingInHierarchy() ) - { - return; - } - - _isNetworkedTrigger = false; - _sendsSeed = false; - _sendsData = false; - _OnTrigger(); - - SendOverNetwork(); - - } - - protected void SendOverNetwork() - { - // check which type - // 0 0 => vanilla - // 1 0 => with seed - // 0 1 => with data - // 1 1 => with seed + data - } - - protected void _OnNetworkTrigger( int seed, BitView data ) - { - _isNetworkedTrigger = true; - _receivedNetworkSeed = seed; - _receivedNetworkData = data; - - _OnTrigger(); - - _isNetworkedTrigger = false; - } - - bool _isNetworkedTrigger = false; - int _receivedNetworkSeed = -1; - int _sendingNetworkSeed = -1; - - bool _sendsSeed = false; - bool _sendsData = false; - - BitView _sendingNetworkData; - BitView _receivedNetworkData; - - public bool isNetworkedTrigger => _isNetworkedTrigger; - - static readonly int maxNetworkSeed = Mathf.RoundToInt( Mathf.Pow( 2, 30 ) ); - - protected int networkSeed - { - get - { - if ( _isNetworkedTrigger ) - { - return _receivedNetworkSeed; - } - - if ( _sendsSeed ) - { - return _sendingNetworkSeed; - } - - _sendingNetworkSeed = GodotRandom.Get().IntegerExclusive( 0, maxNetworkSeed ); - _sendsSeed = true; - - return _sendingNetworkSeed; - } - } - - protected BitView GetNetworkData( BitView view ) - { - if ( _isNetworkedTrigger ) - { - return _receivedNetworkData; - } - - _sendingNetworkData = view; - _sendsData = true; - return _sendingNetworkData; - } - - protected virtual void _OnTrigger() - { - - } + return n is Action || GDScriptAction.IsRJAction( n ); + } - public static void Trigger( Action action ) + public void LogInfoFor( Node n, string message ) + { + var className = GDScriptNames.ExtractClassName( n ); + RJLog.GDLog( $"{className}._onTrigger()", n, message ); + } + + #endif + + public void Trigger() + { + if ( ! IsInstanceValid( this ) ) { - if ( action == null ) - { - return; - } - - action.Trigger(); + return; } - public static void TriggerAll( Action[] actions, Node target, bool triggerDirectChildren, Action caller = null ) + if ( triggerMode == ActionTriggerMode.Only_When_Processing_In_Hierarchy && ! this.IsProcessingInHierarchy() ) { - if ( actions != null ) - { - for ( int i = 0; i < actions.Length; i++ ) - { - Action.Trigger( actions[ i ] ); - } - } - - if ( ! triggerDirectChildren ) - { - return; - } - - Nodes.ForEachDirectChild( target, ( a ) => Trigger( a ) ); + return; } - public static void TriggerAll( Action action, Node target, bool triggerDirectChildren ) + #if !GD_SCRIPT_TRANSPILING + + _isNetworkedTrigger = false; + _sendsSeed = false; + _sendsData = false; + + #endif + + _OnTrigger(); + + #if !GD_SCRIPT_TRANSPILING + + SendOverNetwork(); + + #endif + + } + + protected virtual void _OnTrigger() + { + + } + + #if !GD_SCRIPT_TRANSPILING + + NetworkNodeSlot _seedSlot = new NetworkNodeSlot(); + NetworkNodeSlot _dataSlot = new NetworkNodeSlot(); + NetworkNodeSlot _seedAndDataSlot = new NetworkNodeSlot(); + + protected void SendOverNetwork() + { + // check which type + // seed data => type + // 0 0 => vanilla + // 1 0 => with seed + // 0 1 => with data + // 1 1 => with seed + data + } + + protected override List CreateNetworkNodeMembers() + { + return new List() { - if ( action != null ) + _networkNodeSlot, + _seedSlot, + _dataSlot, + _seedAndDataSlot + }; + } + + protected void _OnNetworkTrigger( int seed, BitView data ) + { + _isNetworkedTrigger = true; + _receivedNetworkSeed = seed; + _receivedNetworkData = data; + + _OnTrigger(); + + _isNetworkedTrigger = false; + } + + bool _isNetworkedTrigger = false; + int _receivedNetworkSeed = -1; + int _sendingNetworkSeed = -1; + + bool _sendsSeed = false; + bool _sendsData = false; + + BitView _sendingNetworkData; + BitView _receivedNetworkData; + + public bool isNetworkedTrigger => _isNetworkedTrigger; + + static readonly int maxNetworkSeed = Mathf.RoundToInt( Mathf.Pow( 2, 30 ) ); + + protected int networkSeed + { + get + { + if ( _isNetworkedTrigger ) { - Action.Trigger( action ); - + return _receivedNetworkSeed; + } + + if ( _sendsSeed ) + { + return _sendingNetworkSeed; } - if ( ! triggerDirectChildren ) - { - return; - } + _sendingNetworkSeed = GodotRandom.Get().IntegerExclusive( 0, maxNetworkSeed ); + _sendsSeed = true; - Nodes.ForEachDirectChild( target, ( a ) => Trigger( a ) ); + return _sendingNetworkSeed; } } -} \ No newline at end of file + protected BitView GetNetworkData( BitView view ) + { + if ( _isNetworkedTrigger ) + { + return _receivedNetworkData; + } + + _sendingNetworkData = view; + _sendsData = true; + return _sendingNetworkData; + } + + + + public static void Trigger( Action action ) + { + if ( action == null ) + { + return; + } + + action.Trigger(); + } + + public static void TriggerAll( Action[] actions, Node target, bool triggerDirectChildren, Action caller = null ) + { + if ( actions != null ) + { + for ( int i = 0; i < actions.Length; i++ ) + { + Action.Trigger( actions[ i ] ); + } + } + + if ( ! triggerDirectChildren ) + { + return; + } + + Nodes.ForEachDirectChild( target, ( a ) => Trigger( a ) ); + } + + public static void TriggerAll( Action action, Node target, bool triggerDirectChildren ) + { + if ( action != null ) + { + Action.Trigger( action ); + + } + + if ( ! triggerDirectChildren ) + { + return; + } + + Nodes.ForEachDirectChild( target, ( a ) => Trigger( a ) ); + } + + #endif +} + diff --git a/Runtime/Actions/Audio/MusicChannel.cs b/Runtime/Actions/Audio/MusicChannel.cs new file mode 100644 index 0000000..3ab0cd8 --- /dev/null +++ b/Runtime/Actions/Audio/MusicChannel.cs @@ -0,0 +1,17 @@ + +using Godot; + +namespace Rokojori; + +[Tool] +[GlobalClass] +public partial class MusicChannel:Resource +{ + [Export] + public string playerName = ""; + + [Export] + public StringName audioBus = ""; + +} + diff --git a/Runtime/Actions/Audio/MusicChannel.cs.uid b/Runtime/Actions/Audio/MusicChannel.cs.uid new file mode 100644 index 0000000..8b98c4a --- /dev/null +++ b/Runtime/Actions/Audio/MusicChannel.cs.uid @@ -0,0 +1 @@ +uid://cs3ypfgd1r603 diff --git a/Runtime/Actions/Audio/MusicChannelPlayer.cs b/Runtime/Actions/Audio/MusicChannelPlayer.cs new file mode 100644 index 0000000..0693e0c --- /dev/null +++ b/Runtime/Actions/Audio/MusicChannelPlayer.cs @@ -0,0 +1,89 @@ + +using Godot; + +namespace Rokojori; + +[Tool] +[GlobalClass] +public partial class MusicChannelPlayer:Node +{ + [Export] + public MusicChannel channel; + + [Export] + public MusicData currentMusic; + + [Export] + public AudioStreamPlayer currentPlayer; + + + public void TweenVolume( AudioStreamPlayer target, float duration, float toVolume, bool clear, System.Action onReady = null ) + { + var tl = TimeLineManager.Ensure( null ); + var start = tl.position; + var fromVolume = target.VolumeLinear; + + TimeLineManager.ScheduleSpanIn( tl, 0, duration, + ( span, type )=> + { + if ( ! GodotObject.IsInstanceValid( target ) ) + { + return; + } + + var lerpedVolume = Mathf.Lerp( fromVolume, toVolume, span.phase ); + target.VolumeLinear = lerpedVolume; + + if ( type == TimeLineSpanUpdateType.End && clear ) + { + if ( clear ) + { + ClearAudioPlayer( target ); + } + + if ( onReady != null ) + { + onReady(); + } + + } + + }, + this + ); + } + + async void ClearAudioPlayer( AudioStreamPlayer target ) + { + await this.RequestNextFrame(); + target.DeleteSelf(); + } + + public void SchedulePlayer( MusicData nextMusic, float duration, System.Action onReady ) + { + if ( currentMusic != null ) + { + this.LogInfo( "Muting:", currentMusic ); + TweenVolume( currentPlayer, duration, 0f, true ); + currentMusic = null; + currentPlayer = null; + } + + this.LogInfo( "Playing:", nextMusic ); + + var name = FilePath.Absolute( nextMusic.audio.ResourcePath ).fileName; + var nextPlayer = this.CreateChild( "Player " + name ); + nextPlayer.VolumeLinear = 0f; + nextPlayer.Stream = nextMusic.audio; + nextPlayer.PitchScale = MathAudio.SemitonesToFrequencyScaler( nextMusic.pitchSemitonesOffset ); + nextPlayer.Bus = channel.audioBus; + + currentMusic = nextMusic; + currentPlayer = nextPlayer; + TweenVolume( nextPlayer, duration, nextMusic.volume, false, onReady ); + + nextPlayer.Play(); + } + +} + diff --git a/Runtime/Actions/Audio/MusicChannelPlayer.cs.uid b/Runtime/Actions/Audio/MusicChannelPlayer.cs.uid new file mode 100644 index 0000000..19ee9e4 --- /dev/null +++ b/Runtime/Actions/Audio/MusicChannelPlayer.cs.uid @@ -0,0 +1 @@ +uid://nwt0qlwimulf diff --git a/Runtime/Actions/Audio/MusicData.cs b/Runtime/Actions/Audio/MusicData.cs new file mode 100644 index 0000000..f23b550 --- /dev/null +++ b/Runtime/Actions/Audio/MusicData.cs @@ -0,0 +1,26 @@ + +using Godot; + +namespace Rokojori; + +[Tool] +[GlobalClass] +public partial class MusicData: Resource +{ + [Export] + public Godot.AudioStream audio; + + [Export( PropertyHint.Range, "0,1")] + public float volume = 1f; + + [Export( PropertyHint.Range, "-36,36")] + public float pitchSemitonesOffset = 0f; + + public override string ToString() + { + var prefix = pitchSemitonesOffset == 0 ? "+/-" : pitchSemitonesOffset > 0 ? "+" : ""; + return "MusicData: " + (100 * volume)._FF() + "% (" + prefix + pitchSemitonesOffset + " st) " + audio.ResourcePath; + } + +} + diff --git a/Runtime/Actions/Audio/MusicData.cs.uid b/Runtime/Actions/Audio/MusicData.cs.uid new file mode 100644 index 0000000..0b9cc40 --- /dev/null +++ b/Runtime/Actions/Audio/MusicData.cs.uid @@ -0,0 +1 @@ +uid://b5443aoeefkin diff --git a/Runtime/Actions/Audio/ScheduleMusic.cs b/Runtime/Actions/Audio/ScheduleMusic.cs new file mode 100644 index 0000000..e726bad --- /dev/null +++ b/Runtime/Actions/Audio/ScheduleMusic.cs @@ -0,0 +1,42 @@ + +using System; +using Godot; + + +namespace Rokojori; + +[Tool] +[GlobalClass, Icon("res://addons/rokojori_action_library/Icons/Tween.svg")] +public partial class ScheduleMusic:SequenceAction +{ + [Export] + public float duration = 0; + + [Export] + public MusicData musicData; + + [Export] + public MusicChannel channel; + + + protected override void _OnTrigger() + { + this.LogInfo( "Scheduling:", musicData ); + var id = DispatchStart(); + + var audioManager = Unique.Get(); + var player = audioManager.GetPlayer( channel ); + + player.SchedulePlayer( + musicData, Mathf.Max( 0.0f, duration), ()=> + { + DispatchEnd( id ); + } + ); + + } + + + + +} diff --git a/Runtime/Actions/Audio/ScheduleMusic.cs.uid b/Runtime/Actions/Audio/ScheduleMusic.cs.uid new file mode 100644 index 0000000..2475fd5 --- /dev/null +++ b/Runtime/Actions/Audio/ScheduleMusic.cs.uid @@ -0,0 +1 @@ +uid://tnm5c1nt0plk diff --git a/Runtime/App/Settings/NumberSetting/CompositorEffectSetting.cs b/Runtime/App/Settings/NumberSetting/CompositorEffectSetting.cs new file mode 100644 index 0000000..3965ed6 --- /dev/null +++ b/Runtime/App/Settings/NumberSetting/CompositorEffectSetting.cs @@ -0,0 +1,55 @@ + +using Godot; +using System.Collections.Generic; + +namespace Rokojori +{ + [Tool] + [GlobalClass] + public partial class CompositorEffectSetting:NumberAppSetting + { + [Export] + public float userRangeToEffectRange = 1f/100f; + + [Export] + public CompositorEffect compositorEffect; + + [Export] + public string effectSettingName = ""; + + public enum TargetType + { + Float, + Int, + Bool + } + + [Export] + public TargetType targetType = TargetType.Float; + + public override void ApplyValue( App app ) + { + var stringValue = app.GetSetting( id ); + var floatValue = RegexUtility.ParseFloat( stringValue ); + + var effectValue = floatValue * userRangeToEffectRange; + + var member = effectSettingName; + + if ( TargetType.Float == targetType ) + { + ReflectionHelper.SetValue( compositorEffect, member, effectValue ); + } + else if ( TargetType.Int == targetType ) + { + ReflectionHelper.SetValue( compositorEffect, member, (int)effectValue ); + } + else if ( TargetType.Bool == targetType ) + { + ReflectionHelper.SetValue( compositorEffect, member, effectValue > 0 ); + } + } + + + } +} \ No newline at end of file diff --git a/Runtime/App/Settings/NumberSetting/CompositorEffectSetting.cs.uid b/Runtime/App/Settings/NumberSetting/CompositorEffectSetting.cs.uid new file mode 100644 index 0000000..8e8611a --- /dev/null +++ b/Runtime/App/Settings/NumberSetting/CompositorEffectSetting.cs.uid @@ -0,0 +1 @@ +uid://fvqabvh4as0i diff --git a/Runtime/App/Settings/Presets/Graphics/Graphics Category.tres b/Runtime/App/Settings/Presets/Graphics/Graphics Category.tres index a79fd9b..567356f 100644 --- a/Runtime/App/Settings/Presets/Graphics/Graphics Category.tres +++ b/Runtime/App/Settings/Presets/Graphics/Graphics Category.tres @@ -1,13 +1,46 @@ -[gd_resource type="Resource" script_class="AppSettingsCategory" load_steps=5 format=3 uid="uid://4iqfk01k81nc"] +[gd_resource type="Resource" script_class="AppSettingsCategory" load_steps=13 format=3 uid="uid://4iqfk01k81nc"] [ext_resource type="Script" uid="uid://b3kfbhiwqt26o" path="res://addons/rokojori_action_library/Runtime/App/Settings/AppSettingsCategory.cs" id="1_g7ii0"] [ext_resource type="Resource" uid="uid://0itt52s066qp" path="res://addons/rokojori_action_library/Runtime/App/Settings/Presets/Graphics/UI Scale Setting.tres" id="2_xi6qd"] [ext_resource type="Resource" uid="uid://bpfrw7y8jx2wp" path="res://addons/rokojori_action_library/Runtime/App/Settings/Presets/Graphics/Graphics Label.tres" id="3_g7ii0"] [ext_resource type="Resource" uid="uid://cec7500hcn1e0" path="res://addons/rokojori_action_library/Runtime/App/Settings/Presets/Graphics/Resolution Scale Setting.tres" id="3_xi6qd"] +[ext_resource type="Resource" uid="uid://bd8cja8453an4" path="res://Rendering/FX-Anti-Aliasing.tres" id="4_27xtl"] +[ext_resource type="Script" uid="uid://bgw3wuqxbwrb0" path="res://addons/rokojori_action_library/Runtime/Rendering/Compositor/CompositorEffects/AntiAliasing/FXAA/FXAAEffect.cs" id="5_fe0r4"] +[ext_resource type="Script" uid="uid://fvqabvh4as0i" path="res://addons/rokojori_action_library/Runtime/App/Settings/NumberSetting/CompositorEffectSetting.cs" id="6_ajjd7"] +[ext_resource type="Resource" uid="uid://osfjg5u2jb4f" path="res://addons/rokojori_action_library/Runtime/Localization/DataBase/Numberic/Percantage-Suffix.tres" id="7_4upb4"] +[ext_resource type="Script" uid="uid://bvj322mokkq63" path="res://addons/rokojori_action_library/Runtime/Localization/LocaleText.cs" id="8_pdrnl"] + +[sub_resource type="CompositorEffect" id="CompositorEffect_b71pn"] +resource_local_to_scene = false +resource_name = "" +enabled = true +effect_callback_type = 4 +needs_motion_vectors = false +needs_normal_roughness = false +script = ExtResource("5_fe0r4") +amount = 4.0 +compositorEffectID = ExtResource("4_27xtl") +metadata/_custom_type_script = "uid://bgw3wuqxbwrb0" + +[sub_resource type="Resource" id="Resource_nhpaj"] +script = ExtResource("8_pdrnl") +en = "FX Anti-Aliasing" +metadata/_custom_type_script = "uid://bvj322mokkq63" + +[sub_resource type="Resource" id="Resource_6o5ni"] +script = ExtResource("6_ajjd7") +compositorEffect = SubResource("CompositorEffect_b71pn") +effectSettingName = "amount" +max = 400.0 +defaultValue = 100.0 +stepSize = 10.0 +suffix = ExtResource("7_4upb4") +title = SubResource("Resource_nhpaj") +metadata/_custom_type_script = "uid://fvqabvh4as0i" [resource] script = ExtResource("1_g7ii0") title = ExtResource("3_g7ii0") id = "graphics" -settings = [ExtResource("3_xi6qd"), ExtResource("2_xi6qd")] +settings = [ExtResource("2_xi6qd"), ExtResource("3_xi6qd"), SubResource("Resource_6o5ni")] metadata/_custom_type_script = "uid://b3kfbhiwqt26o" diff --git a/Runtime/Audio/AudioManager/AudioManager.cs b/Runtime/Audio/AudioManager/AudioManager.cs index 4c62ff0..2d1110d 100644 --- a/Runtime/Audio/AudioManager/AudioManager.cs +++ b/Runtime/Audio/AudioManager/AudioManager.cs @@ -12,6 +12,24 @@ namespace Rokojori Dictionary _lastPlayTime = new Dictionary(); + [Export] + public MusicChannelPlayer[] players = []; + + public MusicChannelPlayer GetPlayer( MusicChannel channel ) + { + var player = players.Find( p => p.channel == channel ); + + if ( player == null ) + { + player = this.CreateChild( channel.playerName ); + player.channel = channel; + + players = players.Add( player ); + } + + return player; + } + public float GetLastPlayed( AudioFlag selectorFlag ) { if ( ! _lastPlayTime.ContainsKey( selectorFlag ) ) diff --git a/Runtime/Cameras/PostProcess/PostProcessVolume.cs b/Runtime/Cameras/PostProcess/PostProcessVolume.cs index 95ea673..26967b5 100644 --- a/Runtime/Cameras/PostProcess/PostProcessVolume.cs +++ b/Runtime/Cameras/PostProcess/PostProcessVolume.cs @@ -20,6 +20,8 @@ namespace Rokojori [Export] public int priority = 0; + public int combinedPriority => ! enabled ? -1 : priority; + [Export] public PostProcessVolumeEffect[] effects; diff --git a/Runtime/Cameras/PostProcess/PostProcessVolumeEffect.cs b/Runtime/Cameras/PostProcess/PostProcessVolumeEffect.cs index 5c085bc..c7e61cc 100644 --- a/Runtime/Cameras/PostProcess/PostProcessVolumeEffect.cs +++ b/Runtime/Cameras/PostProcess/PostProcessVolumeEffect.cs @@ -90,18 +90,18 @@ namespace Rokojori continue; } - if ( volumes[ i ].priority < priorities[ j ] ) + if ( volumes[ i ].combinedPriority < priorities[ j ] ) { continue; } - if ( priorities[ j ] < volumes[ i ].priority ) + if ( priorities[ j ] < volumes[ i ].combinedPriority ) { valueWeights[ j ] = 0f; floatValues[ j ].SetFloatValue( 0f ); } - priorities[ j ] = volumes[ i ].priority; + priorities[ j ] = volumes[ i ].combinedPriority; var value = floatValues[ j ].GetFloatValue(); @@ -200,18 +200,18 @@ namespace Rokojori continue; } - if ( volumes[ i ].priority < priorities[ j ] ) + if ( volumes[ i ].combinedPriority < priorities[ j ] ) { continue; } - if ( priorities[ j ] < volumes[ i ].priority ) + if ( priorities[ j ] < volumes[ i ].combinedPriority ) { valueWeights[ j ] = 0f; colorValues[ j ].value = new Color( 0, 0, 0, 0 ); } - priorities[ j ] = volumes[ i ].priority; + priorities[ j ] = volumes[ i ].combinedPriority; var weight = volumes[ i ].combinedWeight; diff --git a/Runtime/Files/FilePath.cs b/Runtime/Files/FilePath.cs index 3ea41ed..4bd760b 100644 --- a/Runtime/Files/FilePath.cs +++ b/Runtime/Files/FilePath.cs @@ -45,7 +45,7 @@ namespace Rokojori { get { - if ( _fileName == null) + if ( _fileName == null ) { _fileName = Path.GetFileNameWithoutExtension( path ); } diff --git a/Runtime/Godot/Extensions/ControlExtensions.cs b/Runtime/Godot/Extensions/ControlExtensions.cs new file mode 100644 index 0000000..b12664d --- /dev/null +++ b/Runtime/Godot/Extensions/ControlExtensions.cs @@ -0,0 +1,18 @@ +using Godot; + +using System.Collections.Generic; +using System; +using System.Threading.Tasks; +using System.Reflection; + +namespace Rokojori +{ + public static class ControlExtensions + { + public static Vector2 GetCenter( this Control control ) + { + return control.Position + control.Size * 0.5f; + } + + } +} \ No newline at end of file diff --git a/Runtime/Godot/Extensions/ControlExtensions.cs.uid b/Runtime/Godot/Extensions/ControlExtensions.cs.uid new file mode 100644 index 0000000..ab26833 --- /dev/null +++ b/Runtime/Godot/Extensions/ControlExtensions.cs.uid @@ -0,0 +1 @@ +uid://b1efhjod1yomf diff --git a/Runtime/Graphs/Trees/TreeWalker.cs b/Runtime/Graphs/Trees/TreeWalker.cs index 1d641bc..5a61af4 100644 --- a/Runtime/Graphs/Trees/TreeWalker.cs +++ b/Runtime/Graphs/Trees/TreeWalker.cs @@ -470,6 +470,23 @@ namespace Rokojori return null; } + public T GetParentWithType( N node ) + { + var p = Parent( node ); + + while ( p != null ) + { + if ( p is T t ) + { + return t; + } + + p = Parent( p ); + } + + return default(T); + } + public int GetAncestorDistance( N child, N ancestor ) { if ( ancestor == null ) diff --git a/Runtime/Math/Math3D.cs b/Runtime/Math/Math3D.cs index f68cf2c..3046c94 100644 --- a/Runtime/Math/Math3D.cs +++ b/Runtime/Math/Math3D.cs @@ -12,7 +12,36 @@ namespace Rokojori { X, Y, Z } - + + + public static float ComputeLineDistance( IEnumerable points ) + { + return ComputeLineDistance( points, ( p ) => p ); + } + + public static float ComputeLineDistance( IEnumerable points, System.Func getPosition ) + { + var distance = 0f; + + Vector3? before = null; + + foreach ( var p in points ) + { + if ( before == null ) + { + before = getPosition( p ); + continue; + } + + var b = (Vector3)before; + var position = getPosition( p ); + distance += ( b - position ).Length(); + before = position; + } + + return distance; + } + public static float LookingAtEachOtherAngle( Vector3 lookDirectionA, Vector3 lookDirectionB ) { return Dot( lookDirectionA, lookDirectionB ); diff --git a/Runtime/Procedural/Parametric/Spline/SplineUp/AltByAngle_SplineUpGen.cs b/Runtime/Procedural/Parametric/Spline/SplineUp/AltByAngle_SplineUpGen.cs new file mode 100644 index 0000000..131d252 --- /dev/null +++ b/Runtime/Procedural/Parametric/Spline/SplineUp/AltByAngle_SplineUpGen.cs @@ -0,0 +1,62 @@ + +using Godot; +using Rokojori; +using System.Collections.Generic; + +namespace Rokojori +{ + [Tool, GlobalClass] + public partial class AltByAngle_SplineUpGen:SplineUpGeneratorStrategy + { + [Export] + public Vector3 alternativeUp; + + [Export( PropertyHint.Range, "0,90")] + public float angleThresholdDegrees = 5f; + + [Export] + public bool forceFromPositions = false; + + public override Vector3 ComputeUp( + int numReferences, + System.Func getPosition, + System.Func getForward, + System.Func getUp + ) + { + var usePositions = forceFromPositions || getForward == null; + + if ( numReferences <= 0 || usePositions && numReferences == 1 ) + { + return Vector3.Up; + } + + var forward = usePositions ? ( getPosition( 1 ) - getPosition( 0 ) ) : getForward( 0 ); + + var forwardNormalized = forward.Normalized(); + + var xzLength = forwardNormalized.XZ().Length(); + + if ( xzLength == 0 ) + { + return alternativeUp; + } + + var yawDir = new Vector2( xzLength, Mathf.Abs( forwardNormalized.Y ) ); + var angle = yawDir.Angle(); + + if ( angle > angleThresholdDegrees ) + { + return Vector3.Up; + } + + var amount = 1f - ( angle / angleThresholdDegrees ); + + var slerped = Vector3.Up.Slerp( alternativeUp, amount ); + + return slerped; + + } + + } +} diff --git a/Runtime/Procedural/Parametric/Spline/SplineUp/AltByAngle_SplineUpGen.cs.uid b/Runtime/Procedural/Parametric/Spline/SplineUp/AltByAngle_SplineUpGen.cs.uid new file mode 100644 index 0000000..cc389af --- /dev/null +++ b/Runtime/Procedural/Parametric/Spline/SplineUp/AltByAngle_SplineUpGen.cs.uid @@ -0,0 +1 @@ +uid://d0yj01q8hppot diff --git a/Runtime/Procedural/Parametric/Spline/SplineUp/Constant_SplineUpGen.cs b/Runtime/Procedural/Parametric/Spline/SplineUp/Constant_SplineUpGen.cs new file mode 100644 index 0000000..6b7660d --- /dev/null +++ b/Runtime/Procedural/Parametric/Spline/SplineUp/Constant_SplineUpGen.cs @@ -0,0 +1,24 @@ + +using Godot; +using Rokojori; +using System.Collections.Generic; + +namespace Rokojori +{ + [Tool, GlobalClass] + public partial class Constant_SplineUpGen:SplineUpGeneratorStrategy + { + [Export] + public Vector3 constantUp; + public override Vector3 ComputeUp( + int getNumReferences, + System.Func getPosition, + System.Func getForward, + System.Func getUp + ) + { + return constantUp; + } + + } +} diff --git a/Runtime/Procedural/Parametric/Spline/SplineUp/Constant_SplineUpGen.cs.uid b/Runtime/Procedural/Parametric/Spline/SplineUp/Constant_SplineUpGen.cs.uid new file mode 100644 index 0000000..3f28b3c --- /dev/null +++ b/Runtime/Procedural/Parametric/Spline/SplineUp/Constant_SplineUpGen.cs.uid @@ -0,0 +1 @@ +uid://c257amlha7moj diff --git a/Runtime/Procedural/Parametric/Spline/SplineUp/SplineUpGeneratorStrategy.cs b/Runtime/Procedural/Parametric/Spline/SplineUp/SplineUpGeneratorStrategy.cs new file mode 100644 index 0000000..bb13fce --- /dev/null +++ b/Runtime/Procedural/Parametric/Spline/SplineUp/SplineUpGeneratorStrategy.cs @@ -0,0 +1,19 @@ + +using Godot; +using Rokojori; +using System.Collections.Generic; + +namespace Rokojori +{ + [Tool, GlobalClass] + public abstract partial class SplineUpGeneratorStrategy:Resource + { + public abstract Vector3 ComputeUp( + int getNumReferences, + System.Func getPosition, + System.Func getForward, + System.Func getUp + ); + + } +} diff --git a/Runtime/Procedural/Parametric/Spline/SplineUp/SplineUpGeneratorStrategy.cs.uid b/Runtime/Procedural/Parametric/Spline/SplineUp/SplineUpGeneratorStrategy.cs.uid new file mode 100644 index 0000000..54f4249 --- /dev/null +++ b/Runtime/Procedural/Parametric/Spline/SplineUp/SplineUpGeneratorStrategy.cs.uid @@ -0,0 +1 @@ +uid://vl5tkdm7lnc0 diff --git a/Runtime/Procedural/Parametric/Spline/SplineUp/WorldUp_SplineUpGen.cs b/Runtime/Procedural/Parametric/Spline/SplineUp/WorldUp_SplineUpGen.cs new file mode 100644 index 0000000..40e2a13 --- /dev/null +++ b/Runtime/Procedural/Parametric/Spline/SplineUp/WorldUp_SplineUpGen.cs @@ -0,0 +1,24 @@ + +using Godot; +using Rokojori; +using System.Collections.Generic; + +namespace Rokojori +{ + [Tool, GlobalClass] + public partial class WorldUp_SplineUpGen:SplineUpGeneratorStrategy + { + public static readonly WorldUp_SplineUpGen instance = new WorldUp_SplineUpGen(); + + public override Vector3 ComputeUp( + int getNumReferences, + System.Func getPosition, + System.Func getForward, + System.Func getUp + ) + { + return Vector3.Up; + } + + } +} diff --git a/Runtime/Procedural/Parametric/Spline/SplineUp/WorldUp_SplineUpGen.cs.uid b/Runtime/Procedural/Parametric/Spline/SplineUp/WorldUp_SplineUpGen.cs.uid new file mode 100644 index 0000000..b1ebb00 --- /dev/null +++ b/Runtime/Procedural/Parametric/Spline/SplineUp/WorldUp_SplineUpGen.cs.uid @@ -0,0 +1 @@ +uid://d3x1tsjce28xe diff --git a/Runtime/Random/RandomEngine.cs b/Runtime/Random/RandomEngine.cs index fea771b..425265c 100644 --- a/Runtime/Random/RandomEngine.cs +++ b/Runtime/Random/RandomEngine.cs @@ -375,6 +375,20 @@ namespace Rokojori return selection; } + public T FromWeightedElements( IList elements, Func getWeight ) + { + var weights = new List( elements.Count ); + + foreach ( var e in elements ) + { + weights.Add( getWeight( e ) ); + } + + var index = IndexFromUnnormalizedWeights( weights ); + + return elements[ index ]; + } + public int IndexFromUnnormalizedWeights( List weights, float sumWeights = 0 ) { if ( sumWeights <= 0 ) diff --git a/Runtime/Rendering/Compositor/CompositorEffects/Edge/DepthOutlines/DepthOutlinesEffect.cs b/Runtime/Rendering/Compositor/CompositorEffects/Edge/DepthOutlines/DepthOutlinesEffect.cs index a13d6f8..a18878c 100644 --- a/Runtime/Rendering/Compositor/CompositorEffects/Edge/DepthOutlines/DepthOutlinesEffect.cs +++ b/Runtime/Rendering/Compositor/CompositorEffects/Edge/DepthOutlines/DepthOutlinesEffect.cs @@ -53,6 +53,12 @@ namespace Rokojori [Export( PropertyHint.Range, "0,1") ] public float normalEdgeAmountMax = 0.15f; + [Export( PropertyHint.Range, "0,1") ] + public float normalZFilterWeight = 1f; + + [Export] + public float normalZDiffWeight = 1.0f; + [Export] public float zTreshold = 0.1f; @@ -77,6 +83,9 @@ namespace Rokojori [Export ] public Vector2 zOutput = new Vector2( 0f, 1f ); + [Export( PropertyHint.Range, "0,1") ] + public float debugViewZ = 0; + RG_ScreenColorTexure screenColorTexture; RG_ScreenDepthTexture screenDepthTexture; @@ -186,7 +195,12 @@ namespace Rokojori rimContrast, rimStrength, Mathf.Pow( 10f, outlineWidth ), - edgeDistanceFade + edgeDistanceFade, + + debugViewZ, + normalZFilterWeight, + normalZDiffWeight, + 0f ); diff --git a/Runtime/Rendering/Compositor/CompositorVFXPresets/Glow/Rainbow Star Glow Assets/good-graphics.png b/Runtime/Rendering/Compositor/CompositorVFXPresets/Glow/Rainbow Star Glow Assets/good-graphics.png new file mode 100644 index 0000000000000000000000000000000000000000..91c06a15df46b0e9c92ebf0708556c59c78d5b87 GIT binary patch literal 83128 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]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 z zJ2T2^wO#!{oTJgbf(JC0`{2i2*KX`3F&HjWQ2Y8>Wz`}jI*V1_eyt8le&*jXLYi#1 zkQe_b1mDYXy3Lnh<~e?Qd&Zjxr(Yf1Zp~3CjG~n@rcFqfKd~bv(2K)}%hT#+9HwAB zf_@UViWzl)u1FzNF~7k*>~*W>8S{ff=g8p3Z+D>(-JNnp$9w6L5-q;z-84H&1;#s` zomdIeq4YU4G&FgO8Wy;atOkC;W&LKw6MYcib$7{dAzqzYp2wW7|HPjzKMAxMwZ5XQ z&fJlFMPHDp)ovmm@{!eVx>xnQe*ZX2q$H#&=sweW%y9_5w%(|BcbkUm5IA={YGf%5Ux> zB1aLGn$`oeXs!MDW1x$xt4QLW z_IYu(@5Udy680LKP2e?NrU{ZXc#~<3!-fs(%s2XE?I*QguEUF$5>J&=e{A^Dou>6i zkM_BUMm1JXg10pTeVERbaa(?D?JEw{=TrLV@cmE6^j-$+hy zLEE}*LL_EV(NeQ;*REZsf$e8~_{zMErd6o3NvrW^P*}NSi7!Rn1i3DQ%v~tVC5UYk zXhB~v)QZ7Hs{`ltf_&W+gfkVM{Z~C zWSkwuNgh8?#Y&J&&QY<_?!S4+KTa#R8T`9}TTl5ct@AYdfzMGL$>j z{rSS;?DxEv(Y>zGtjUwf7pAjMv$t@y1g=>qTw-&QnacJXwzocSHLc?CatOg3H>LW( zWBnB&D4|TvuY6{eg{9>I(|*kE(HWcq=;DCjwVWSnql_fgHWgS%ZtI_7(7o`68Dlnn zdfH~`xl=Ndyp)2WzFeHw5)w)lf$uK;0-|>ECwG6%jDzTy$XOY7I5KjBL2jcW4svK% z!{vT6{$70lS9UK;TcDpi|7gkcBW@!(+EPoDfi|k zv~|<(`_(W)f>j)FsHzGpR42S^$(0TK`f^UjKbHZXU~Y=^80YBz>b=&ZaIGO(4d2Km zSxFT#jt`Dz)+^K5Xt*~Bgx5rP`20T(;w)Wz}M4ix1v_#=kJ!reW-JgQx-{D*S zgt6UR(P^Mgw0g0UIiXi^S&-PmvE}N#etw5hkf^G?MpKRS)}w?) zfUn6RW833{$%`V{eCbViN^Wt{IHWG<2Xo@VA zyLXLwJUQ-^)GjChIs$OpRt{APv?tL8<=w-h%dz*N47_JoE)1UB{EseGgHHRvH%mns zc{lg@8zD2LY%KCGc^;E59riavlBar*e08f}_XXOAr*wzJs`umma(OIBadFj8_~5^5 zS6emTsp|DA%NYvkwXp@SNPcC@saMY+hbs9jziX@Pvvb))h%yZlXy zBVT^__~pyP=cF)WOxrOx*0P;Q7gqd6OfgrKdEHGCSU4Nuabh}3w1AjFLJEx zN9r;`CqCHE{HyD$N;`^>MACVZ9x_so_y?>P|J(F$Zb@T#1bzk1tQCl0K*D9-2K9_I zP?=D3L{{x3zJ!@wDEYJ(-|0j9Tc3YrdG66x^{6o7{+;Y+?;4~aE8XT~fbl_v);g+` z`lb;&tnAo#n1Vs;+kaK-XT2k za-T>#HH+sQ71Y>|vyl1Jv53o=X z;DK>Oo_f&_ftx?HV;Xbz(8gistzt7uBYh!_O*YmMwnVt;p}cxC00J@6`e)bB5+F)n zcFe=;w}(%ufmms?D$2CA$sH&4x7odX?lY0a2unX6i@%om93fEnozJ!1sAgxrH+8i> zXJMk?*Kz)vt1Ry-fm27(P`15vlwz{ zdL2LF1YM1}i(BB<4Cef)T5CkNe zGaqL#xRpd21g>|j+UrwwW7Nr~=VlKicYLUer+^}4uJjiKq)C zJ4mFsEA_(%DFvQDI0A&WRCxU{l?!7U|N8vT^@t#S2%XlL6SLbsHNH=uJ|e&f9fypp ztnB{Jf&a``RSABFv|J=$@f`k?zRH5LOu2nK{mmP@itla*uK>nMb8U%8fe0h-@mBGR znqC(R5@*Tf2t#eqHwD>AvR8Keosa^69VeR#y_xglLOP4{4bIkwVzd*xFH7fEjc_y= zK0F<$^WgbS2}n)8B`*5%^=ss#{_Gt~Jo1j~W0_8(cT4l6-(N%?f9(}choj4YC)3M$ zq)T-QU%rg=K>Af|akrm@zvzAV0do|1@;m)!eu)czARBn-`KS&q)@6@T-dKx-@k2_! zetmqs85x8Ao2f;l%%RNOGgfl$MEmV@#v9i4CcekKlsHqr3)7oGMzpkV0YHJ~YlS@k z51qYu@$qTP0gku*{t{{0kJF`lxt|1SPLlh;WFjs@wn{VtHHP++*c7Ea`VjXP)_!oj z1D~nvn~yyYbdvtQuSLmoR(<_J6DLk2=ft-ln$2Bgop>#GU&KK3XoU)K0Z;K%J#`D= z$%-X`=zoZIXZpGJWP&JfOB4@$pF2<>oeHw|l!zbEBQRX@=ljl{v)EucT}_*`_bLd%~Izjyu06f-Ch57>aw37 zCu)o%DQ+ic!u82!Uh14meN+{)9XpDwyf}S!NTgH22LRf3BCz3nA)nWThR!nkyv4~j zTi8wjU?p+{6P({oI5#i8Ut*&XIXH}$dTU?kWo2h;j`W&2b8o?q!7~o0G3}QCj-yv> z|L4!ofvRe%YUDL}cbtVcit@9CCfYnwzw}7$0eY8;gulr4@GK=dIHkb5mbv`fp0}i) zg2tp5e{HO9UgH3k*{wG5(|o5J0x?%qB)!*c#=qnx3A06<;bM$-6B4}@6@`tOG2q** z{AcH8w*_QWAGHqey=xs2jYUp>kV&;%F%Ox#11`e$k!|AozOGUD2BOOpVSmBhT2|fU z;e6l%_d0y=dLzfwxiA@L>g8IXpCQ|kFzA=gJ3F&)Tn!yrCcbFB@L^vkZvaDIR^J8H zfQCx&p!;h%MlrwWUP>2uLqo*4u){I+*>MizvGx)gt#3;OYo4@abI*S_U9`O20~^<` zBP(Kd@9yMZwUv(L>aI?}2qNXcwBKT;kR@^dro+&v<`m3$IeK%{vXpv z@S6@FHtg%`eQw-Padl!+Su)X{F~xipFm$%toKoJm9G5ARCm%FyyPY=Mxj1WyTk#u$ z6ki7Qx3wE%;*(_Gl|HHTCxPF1v{c{O}q(!eR&JZ>bwcKp;&}g6XD=?%u+OnQRg_n>l>kB@V*2pv?Xtd89!gGZ>>)|`J!HN@|NikmT-6y_ zg{q=#)EOovRG3NtrGMrm3)9wBhqG!0sJVn;$o=1L!S}WRpkcMpt+t*0!YO6(o>>sJ zp;Pk(AX$;XHm+A|T4%nHW0KaU#K$6x#CNfo#i^ydNgC6hzo`w5s5uMXeiI?*Im%DS zsl#bDzv5LJC(nUuwzs#25B)}0Iw(W%+vr^!x9YT!*faBrZ0$AJ~-@=+wP^4 zK>H)#PwSl@y{9R40#5cp88&ZPrh6C~E2`t`1T%_!f1uL)*$!fDiS=^szZ55lFdX^c z?;2=IGjRHNvnK^CCoYCNNIqP1uI1EkqHfc|-f8mYr{{cVe4+<*U3PgWwdz}O>SDFm zho`Fh(l}2ff0?_;Z{Z!VV~0f(70tTalrNv}{4S$i%ofM&FewJCz#jm|CPZqdf%Utu zoyGzx{`HB>W)9f&E#EvP>ZBVmS$mYK)O%A zKPDYGMGMcO6iP6jNHfPb%G4*Ja)@x z+wct_BxIOsC|Gl)kUq4`tVK{rRSA33!M#FdLuB{)=A}_0R3fkzgBpbfI|xXMVS{0hLZ_JRH1`CwD?70ERI3v{Yb5{3S+ENl}s}= zv1)1B=N@O1qlG zE&~P22?p$($sR^(WHVV`w2|Uq`XY~wtr>^11Il&iq*Np~QVa>p2M%-GJxZ8S`E#Oq z6}jRbhR@0K481X1(5HoKG{BuYqx_A0G9sWB#xI;wn`CI^ z{rjyYqFfQ`U%mGJ;gQOl7M?w~as8@Q9jI0s3I~rJ6YDe&O)ob(g)m3BFKb2@*8Twz zz;ow3?w{EocUsLJNQ4L|ZzoRvFon0*R?T6&l1&`Gx7)?9b6!O>e<-p%S|+!uy+Yno zX2j&G{#c>$TE?#ZcP#$ft3wp$n!vi9AV#O;+qW)={(Qqi@BoXhazo!feZ1-u5d!J= zUND1Xg`Vjp)f7MjNp$XS-Ejkz+wtG;IO+<> zxc%zYaruy?|5Tll&;PvqG=mG9dRiY~np0-K9|xzUN2jqwXz%N#{fp&o}B@ZqFV)(ujMoCm|)lrPNIHfFM{8 z8~bo%!lJEY@eB>tbR!Z&&` z$+zjf{i4Xp1xD+hq(~NAJ4UpnuPkOxom#S5lD6<{_RecVy4g52;1=pI-fOzwHNUO% zA2?0wB-!$$o6%N>k}>ln5@bJ9&KGu_n@(8{E|3Tj9Z?p)ACb*wSlngVFl}x1PKS4- z(NDait2f^OL=wFdaPD}WeIb_Pm|4f;5{i&dSlWpjp4M1dtQk4^^Lb{b-@~pFHFD6; z+U{IFAp?Y$Icu(23`fkEcC0C3fQDmkTYH0TSFc|Wmt8t)_mXs!fF~jA6jW3OJ7^Sg zwTs;h*Ff@-erveC6?!s)6Hr(z4I-<)J#|f}v3TZDUtO6ZM8ukSBr!9iG_M+TUzOVJ zj=_s4*wr10{uoG*sf>0T|F;)yh=N83Wz3}5RMGKj8YffZ{$b9diXFBxrR&& z@8V|jXzsz_X^y88dTXcDJieJe`0Ki*&-YASMXXKo-96K++e+R#d8usbVRv9-^Xcg} z^xuQqN*pU~pAA^I^x!jNU$@oXF(J`M#6_XXl_hoFd#7!{PDfHxC}PXUaTd(UZ}zEr)4v+cPC4_QXaU zE_yq{Ol(*jFk(cgvWZ3Z(IJl(fcCCda^O-a*L(zGdxAqo<3F7H&gf<_`{-&J|ul{tD#F znf+tWZ#X{}$0 zvBl-$-)GvizHnxPVJ(Rz^TXtSZT*{G%)L?pSx3QN`vEj|L4+p*%$#i3-)w}cefY%L zAKI=m92(>@x1Il+ijQ_q^Ish~zdbR>zweol-0=A7_j;Qiy`H(H(lW%waoy{@JH0C- z9yc86{;W^5{t@YA5(^3HBC#c|><@zJ1HJCpr?)A)F^ar}HnR*K`q3JuA?)$$IRsG$ zX37f*djYCD!>2g}d7yzLvRP@=#l_n^<`>rt4%3kxUaO)1y~Fk2un~Vg=R0z#Svp<0 znw5$^EAse{X)|Z;%0DjR@=rO!TIxW<284*^y?)j;k zAs00@zF4oB{dwVGTX02}Lu*Ke-27&XhxebC_XmAW`Lr>vV*lvzD&e(Clh&6!dUYe( z)4Z^&3FLq<7c6lN$scDI-dLz*Tj z>~-~a_y9&btFj^1JbyH-K4g@$ciy6O_j)+3_CVBH1+pb8W=X)w7Gy~D;IL^yCr0gU z?J<_f!Ns?JTgqaAss`$t?+0S#+Jbs2IOAq7mQEKW z8~4ICDe10bdqU=SUwE8lTaO&I*gD{@;V!o(3@WOM%N-r>*&U?!NatA({+Y;7X#!vU zj>bw3$qunx$L#3(UfglGQy)LBvep>r&dl zS2%sL&tLdp>3%6mD{K_4VC3=r8H*vX9#roUt^ts46YwX|I-(_SFXBfThlI*IGTSnG zViXgo{yh(}^a2~oP^@VdRJV2VoX3nf^esKvpbUDJ!8LobGsp*7r!gl@x|CXEx$Ym7LE}XoQapxrRjdmGWG)q9aHDg`p?i$&4*z?2(k3rJ1Ef;i_*wkdb zx*yydGTaCiTvq`*^+{#I5IAVy4|1u>62*^}!%kvt^BW;7naPfOQ-LwFa&xWEnZvwC zcIvw#CVQ$S3^d8oWL-h@~=>y$o zEbg%Y0V+KknbyPR)&F&bNWgzUtCxA*n7Wb%IvujpdqF(kH2W3CiLalDM{Me_EL_N! z(}qi-!ukL6m2({{t?!7?$w4H1(9b#*ajB5JA}c^uA0HoQ{{K#4H>A`%2lc5)xLM@b zuJWD6nm0jRZMtmSQh5tf*8Jx&Qcd5*yhuxv2#LRIBpch59O!U%Q4c2M15_MrSobTV zC{!gpmuSoZDCmtN5L%MZzb81CoX2*^E&XGj6&AJ!*@~{P4QFIN0ZpOw4qub`XTG}R z>}n{lm@Rp>HCp+S?VF93jFU|UpbWGf2tn(;tA($A$zF2dq{LpmdV~30Zi-`C>rhZ@ zBM|AIxHIiR9OVvGavo`jmjn?9(}9wrQ?u?XFgm*W*Gj9lnJLJml#i9ze@o08yIE{a z9OLPrZ)$34%+;jcd@v$HmiM=)^LM7YE+A9FX0y4UaNnGr)gO6l8#1x|CKkE0Q@5KB($Q5XZC~m&f-{+gcgk z?c%Pb{PaQJjMQy+_-CA%78+6bl7Hxs&2*wW(@=KDX8vt_cAqr) zU*oe;&A>n;pi7mcF0>(R#y4!>x;ddW&i=I~i(q>q-rJGhqOY%?lzP@K3;=ZY$qiea zF2dsf0n~a&%!U7b5)uqLVP`b90hDt9m?6gY%7pw2v9amARqDrL2%GUoJ+Alg^{Gi6 zzissfs<(7&zTS^s%`vYI>_lz{bZw`xqPR^h;55tlV#JEuFhXsE0CuA zojTk)uBB|*;Ny(2o$j|6jvP7k&XHA&=za`%IBa$mENqdqxS#nf2=B8Ol<(17Rab!@VWLg#qu0hc^jazqEb(_O6BQ=)fF%oyI1R zd=P9n-71c4IVaumemn41L{?o`a9y)-E81PGfexAtxJUI9Jr90|7Z21pRC_kC&Q^P(p%)Ve4TK{z=-x`S@VPQMy`sS_f zt%H!hOAo!0vz6-y{KthnxTm1RLq=n}0H9m>y;a3`_x<$$DYK(PxVR^o-o;JbVZmOg z+Pll!RLaD|7lf?yEx^_wSc=_J#{4Uh6==1dTrUEOQVujVcVrN5JiF^1YIu?5A%gP+ zKFn{rmr_i2Q2+6~) zKRS-G1^Z~g^uo0sJ8S6b&Wh{&0sUTwF{d-lvcn!AFx0i)sWf)omm2znk9&*5;6%?Et$wkQ!3_Y{XQgj-$)tIBbN z?@qegTLRDKz}+joxHweG_@RMBgHTD;bsH&yIr{LhefeFbzv^DBoHoCcgpOhd%;2O~ z$GA;{__bO-*B>#UU4NKzjMx6UX+1<%{@V_%JpR3~U()~U3zaEp5{Z8D+3@yxMOIgC zx_NO$p%@S_PSV4C6u}@;qeF}M9KMKh!UDc~lCl`H1w25Cw6yi53rNS~-Lt*3E%|8@ zTCKMDP1!XV^5+QmH~7J>m(Mn#sqchc0E#hFxfq4p`3AR1S zQH*a?C|O=T$C+aP@?4pN<2y<$PEYP^F=vjJ!f!m=3_Kxg?udrmH4YihMg{ifIJdco;1Yo=-lNv=mfdcv1ijgKa;PP9wS;(JaS$8-WvY?nab81C;qx z7=Jv&ZGtJgV`UI$`&ZR9)?LlG!cMw$0Pz!OIn94E24sybR31XuMaCV^2I2n^%h{5v zS3SSj(+X)6=`Ekycaoxhwa0%XbP92GUGNuL$JutEk@UY01JI60GyxSATv~YONGGm} zlG4(4+>1*OOjJRol=Ad!a+nW&_jWujf}NziI*`ZYJN{o9Mk91iW+!L$RaFz2X_$-T zcD#Q5TC@^wV_Qe^paK7f0a*&kr&xYMYbCoNm$3;1<3gIr;$)Z76LbwfXb~plPoZ_= z3Qc}Ef;<(0CFdWx0Li(No>ae73ta(Um95*^`1mKk)-QF~LOdxE^26_SmX~i25*=3~ zQnsrdPBAx0BzP2*Sf*C0sf!j(tWsE!d(>g(2=}UG-_{*3l{8<--PNgQhF$r^Qm3LM zMN>6J+>^dLcWyJ1XRHwUb^;_W8wnHqF0Psnq0(@fhfpn6o`_q~wHMc8+2x>a7mwU# zU{rDd4{!p6c7~T%a$49u+&614D&w0{ng8t={S%}DBfrK>+WddI`Vt7 ze+gV4^rbgF%FNF?QKWJvSN;ov$2H^VW%wS2n*Jd-PG@BC z^RET5p{hCt^Bd-IbtfN+BALUjq9A0NJfJxre`4gLo0OUA{9cPcfBK{mko&J&g}SSe zR`w7HPBO7#TZFb9`iRM+^pKY5RZ5Dof{BgC82SP(5kMq?Zm;7OI4#I8|-?0^c#^E;CI`q1QXWOK| z`1$CL5^)hK2j8=?+`vAP<#s^+@2F2<&ClM@^v=gHU<>2d zQP!vl;S_Jt?1>Zo))cRYp{JnsR8-^^n>kDJw5z0;7*1!C`n6ClbXeKi`*^dP zPu^)>dfTh17X;N#JTsbg9`n_e92n6pfS7+=VJh0oWZ=845Z*hh=}3T^-Sk%N+w4Kp z%>F*DkuGq=W?IuAd#4U7ej z=gX1O%RRn|!!xJOf5#5{X;YX>BWlvOmgMA1#7Y9qm+>g+cam;W{83%loc;C zgsa7F{To1lC0tY+7~i+>Eu^qZ<89K0wiFg0=9vfR8%m%doGF|y=p!NvzvgxNet6_6 zwW+r*Kye%!@7YUH5!wIwup4g~IU@IH*rcttb!3T;+l;9mL;l}t`XzViu(U2|qXYk#n?%mr^Ec=;D!_2!sUHy84*N{DqnjXA1MK!}zf*H(bulFRXl`nswxC2BA z7>(}(+85!BX0O4csCb2bgB28OzrG$4+J`An({*687EK2BvK#+w{A58UK!rgRFzTX{ zM{-lfE^G|o^?vx~M$iQ*mQnere)z!e7?Ev2?4+KuBJVmZV{!%mpztFpRdFLt`n*ej z@dmsH;m5R4?yzbuaJt=m`5wX95;7e+XJ%$5dlds&oy0QYI*vl-^|E}~@Hob^K?h|p zSnr%a1bTUBjf~ieCN%OLGIfMIN21bp?4mWlxdhKQI=uvDT7t%!-*UIdTZA)z_#K@L zVW1DaJQA65lq;gviExgLwX%&LUWBsNQoB=mt6N0<|L<5(v*&!Pk5)sM9qCkw*phG8 z9VWv3NOSfX1cN+Wzv<&xeKg3mPH=Qr4qg)nj%S8=4O z3pexE=R!UUZ)wYw*KRSZbZvHvh=VOW0c$z`nl9|63q>SaxnD>r@q_Clj54f%>9x z1XC1kgPR^Yh|)7Hci0d3L5_%BB zQkjGeP#Bnb#zocOH#;E(BJ+r|?8`yPwo`%oL24)=qeHDQ8St0v3ewkgYE$M|T9(kC zL@zh*7HBHEERmO6n?fj_s-|Yp(Dj6^sApixR@Pj+U@NDj%5ZU!!^10HvTh302oUf#!<(_3+Clj}H7 zTE}LEFyUhlOrTzkh`#;I$o0$rX#qTHb&76#9J*yrmZ*=2!VfzJD(e8)WLs6wz151J zZw!#d*5X?b&m8)L59fDy!GFUh5-p-iCZZ7eOl{`RArFSQ-eivJsJ4&7LFdqyE-To) z90Eu@H9G0;>O5X=+Tx+zmd29aEwZnXtEo?IhA5LU)gF0_7vxuE;Vd;<>kr)zCZD36 z6|{bs7tlwMnAx15_wRxY%Et(KR*G7nbL3iD0 zGNQ*Ln=T^1dh`+tH(tIlO~3ZmVYuKR(mHXk3Tdp#Zl!Q3x@o!tzZ_D7M~rIIPHcb! zdhDv*BG*kbjk#6iLTk=mOx+WVCDsVNQKL!^##51C!#WF2i59KVQ6$xWB9^ek&67}M z)ioPbaQavU8Edp$r;FX8Fq zA=Zru@CB8goQG^k5dcd%wmd*_pcoHw+HW1}uw+Rap*?OD?Y5ve;KG_5ca2>o-7%KV zS4ak8K~s2QYM1VW=afLawF5LUsd|!|E7QOKam(R*8LHBd4oHu%B^AqI{C=RDwqejz z#%$^7g+xe0U2K(k2LPnhbOQn*r)g@y$ukC@SR``GWnIWez$CHr$0?$B(ZrYPy#Y{*Zl=oPYMrnKV#A=?hLg3GvbN-y~Tn zBXSd=%)~W!y||m}F}>BZ)4+KC2TfnQ&`Z40VmUSXXN$wRbg={Q1nc>Alx#=cIf36i zu%8h~hk(o!`t}|6Dg7PXM}&d-MJVsoS+m;n;>V0s z3prQNZwE47CB!k7s|(Y?IZ8f$lokg&EKC~ucy2|n01N#MVsYA*pQlbZvOO^qAB|Z3 zZDwFS9N-$cR3^VhQk*v?GY3ky5Pn4#-h(O>s3SF0>Ehe5@RAV^pf83TT+VeC^=Ml$`k?jtZ`fUs(7YOlH|HS}(d0W=p~#Q0zGAuI zG_gVcXlxD?o@>6?T@#tjU%qXNx%%p^p)H_08!m)ur~d0T`Tw9hE$w}DU3vA+t5<7^ zpmIvMbW|nii`bC!2YhLQV=u8{&fQ>rQ4c1^_yip&Azz+k*E7wOtFrnx=)xkipXKEp zxcNNBv(sNW>ab}Y{`!%^CjzU)?ur2^%{ii!H+qsg!;>r;)$o{56l@N##f64Ip1dBV zYQ?l;VOLH1+Ywwuyxr`e6hPV+cRW45t-DE2y9J+k zbV2I{)n%pCJz+dQiQWoZxkB4EZO-(&($OEbarh%#Ugm*913Za>y?*k)3?fR7B0_4+ zKDz#n=i@104)pS2qvx?@;S?il?N$=&T|(kDI$_^LVwYn#gvmYUzTOoJT2PWL{i6FK z6xIllk?>Mwa`}ij4^fmkgTd5=92fSGzk8it!Dt+GTPlr;iL>cf@94fs^pE}9N+fBB zuA+Z`pi>tAAo^ezyF}7JRM7Tngi2k}mXXj$q+#G)zZGR*8V|%ZN=wuFV%D1;e}L|D z99sgYA5Ho*=oyonzO{~IAyZ`}f4}|Up^QU6`0bQ>cN{-{y#5;(dTrlgv*R?joMySL z5hFb7H;O!@&2?lGr_Gp2yT(Ro|Gd%45QoA9u#zW~m;;~w52}B$aVqa4JBfypI_6w0 ztJuB!*^w`ii#p>rUb%Md#is-6ffRqTr`9a=-|^#*J?cF2t&G^TeVWt)0Z#1 znFU0^*?S6^9!?-5uSOg7_AZcaIrVu&X>R@JJD{c8?xF+-zk-RFb==Bczq@F#zH}0| z218U|lmQx_ie3T?Y-5Ya<~k<3ZWXoX?RiQh@;$LL;H4>T?%PmPxl8&k&rRb?yAwP^ z#vG9?0w}weFC)qEk&4jKk-MRF?cnrTvmS7*bo&%MC|x3yXzku}KSgwsNRO2085rnZ z86{HO#n2}3h{)Y%;c^mCdNR!gaTSC%)b8Y22{k~^vILBT9m&P|+T>oc4*Zvx|$#vwoadt5aYpJnjFP{eO*>ewp9-*M) z6YDF9qQp8wZQbRY)rc`+`98Ue8xir)-BHS1Yp0V!DpgovW`xn*9tq8DKbQ;JE{f) z{8OHdf#O?Vr4lW*9i1&!)V;U71c@-ii1O(BxZ$26i2ATiG7`GM^7DQOi%TE`1<$7B z7$POPEJVeU$hCZ!_=Dg~t z|GCUe0$*_VJrTNMN>X zpAoj(NpaP94214rrSV(^ijp39=@ybZT~h&!cAEa-#$ML1d&h|o7=6ZX>w!C9o+_53 zmtrXoSrh(cEP0#_Qnv$exa0XLeBlB*W&Mj(oNaO&%vlP(ddX3*wxj7Q+Xmmtq#}dB z-<~uM3p%s(WemJ(U*6nGG`%Ls3ouE|+InH%RU0^P!1(ct-lYHspTHq)Tgp;-U*3bZ zYI5g`8BN4G*TS*9ow9%i=1ocJVu~vH{#_nrl0w(66GIhzwCK2GD8k!CqCjLPsv1(c zbkCfU4k*jT9uHv_cuYKBKiH@eu0$cy7COf29`jPYJYNtaC~%&>wRdksv0 zznH#<%SZH_qSwR45z}R=n4o;+eE+97Rn_Rmm7hR#%8y^av=zoXWJuF2j1m@+r(*?- zj%!FrknqEFw-q7XIO^&)Nsgg20ATq+ye#Tdaa|jehQI~LW{UdBjH@e)l7=(fb>v+v zap6_#ije(opJJQ?t+MaUe5v;Msevzt=KVg+#%bKGn)%1LjM`$mShhEwcL<`&T@20%Tp z1q&DY0lN}9vt#H!5zq%*2#Yqy*^|8hK8R5;BYGeC4pSkbk?~l_(@u%^kB?w)Z!h6( z$HyUyCRzdnF64R`bYyi_P1QpY8L_+rZx6Viypv0Tl97=MZz1v^jZzx`yW%UgWu8;Fyz3PP*OTv@V{cq`78ZoeIVMrhjsSS(37FO);C!5_? zEdyb|J9=H;Ui-Uk77B7|TKayIYnH^(*;vGYjx3pi93y{BdM1*|3x{@ed_hs zwyHKelI$>T6v5MoDMj?ZEc*d++{RB{<@KooN4&X)c@JAIhF%Cn6oiyMM*P1@krfCx%Eqb&%{OP$2^(DE#o48I;>Qd)Gk9 z4eeIHfsDAkX}o!7#(%arIiX!_>MERudjbL|Ng7IlEBF0Pwdr=I*Gr>Ty`iziXgoL) z5t?oK2kF0%N3F!3ZhQdoq6sR`p+d9&9TgX&t zO#dNCQOyk1HUKs!t^ngr+ac^~jI&RUP7yH-{l?uieY53IcW#(4!u- z1jL_*_%Qqi{yE>QYn~08IN4S~i=bNDeJCBurwef}03*>c~-E8uS|9QD6c}kJz_u338Se_|x{5 z^)31JL9IZ-Gie%$);CW>NpLOHpn1*?r($IIVhvWVOt@{iBS8H6)V__e&r5011Vfhd zQ`89@i|zh+e|fXnMtQ~S(LY=v1g(_6^qsUP$ma5-J^$G(Q6A;4eEieW%;vj0R{Flt zc(_J;_UXX;>(y3kn=Vc0-CNUSWKd@<+0o}WzNl>Y(DX6j<+6FRFVdWC3X^BIwaIL zNMY?_8f;^&me67@D9%)t054@4EEvUoyN|}8(kg2N;~S9?^BwCEz1FyR|7s-Qf9ATA zg+q>SYlDpU((9Ku*7Zh(z942_6R(DwX5%@#TQ^=cNcCZ9j$S-1hivwW5f+z5yj@q_KdbKSO zHsbOzH^0`h;1BD&&yCyU=wlgsm-D?*Gl~B70j;)ha!B+>jL77C9dGbnCm8Otg_BmP zsj)fs=*-%n(fk>FLEYqredXVHH8+m0E5_Bmt>J5;W

1v3qH(6*}$9Xjo6rP)aW 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 z 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 literal 0 HcmV?d00001 diff --git a/Runtime/Rendering/Compositor/CompositorVFXPresets/Glow/Rainbow Star Glow Assets/good-graphics.png.import b/Runtime/Rendering/Compositor/CompositorVFXPresets/Glow/Rainbow Star Glow Assets/good-graphics.png.import new file mode 100644 index 0000000..bd8d87b --- /dev/null +++ b/Runtime/Rendering/Compositor/CompositorVFXPresets/Glow/Rainbow Star Glow Assets/good-graphics.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dpagciclpro4l" +path="res://.godot/imported/good-graphics.png-71a1fa2dc0da1570f69568e7db0767eb.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/rokojori_action_library/Runtime/Rendering/Compositor/CompositorVFXPresets/Glow/Rainbow Star Glow Assets/good-graphics.png" +dest_files=["res://.godot/imported/good-graphics.png-71a1fa2dc0da1570f69568e7db0767eb.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/Runtime/Rendering/Compositor/CompositorVFXPresets/Glow/Rainbow Star Glow Assets/star-glow-blur.png b/Runtime/Rendering/Compositor/CompositorVFXPresets/Glow/Rainbow Star Glow Assets/star-glow-blur.png new file mode 100644 index 0000000000000000000000000000000000000000..4730607bea24e29245b667cb6ea42383da039e2f GIT binary patch literal 909052 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

DH@d7&f4(9t;>-o@i5-oT5AXt-ZdwFj5&P4eqyb zzdl9oSERyzOUkgLF1C&u1vj0RC|boCXiX?3bG{U4<78f~cZiPcXMn@H&N8ai1sn=} zNAbF8DM5N|Gm0Id5I2iod5@$}+{q;;*bJkrZ%*8pOU%4kR4UUj#z(!KrC}dD&!lY5 zBh{+tic*Wl1zbQT8@3^wjkRSSbhzcJr6Z*yvrydbC4beZLkol89|DL-&-^b^gPd;;Gbm%EC0cMFyRR7Szs+-U3y#R z8?eRWlktu~g=)rb4q;F3j=N}*C5W~=1S^!deKvk1>WiV&8)L3`dMc^sudstsr$1s( z#_5Y~7iq>r*2jY$c4-UDl(#>Jk_buQ;tg0I364tUdg^iMtou*CDtkV5@{P{?IQwcJ z9PpAfJe|s6$tnloEq?ZZGf6{ejh)zM$A9IIv|x6!Nm-GFzj5)YKV0$)i}NmbgZvQE z`17X5^yh-IklJ73b|7&#&P3R9<*ZmnGVPJ3zcx31`Cf+P?dMX!^Jh?El~V|#Xth^8 zuLJ2-n_+GIp6xjwYML0m_4$?5# z{1{uplyuXpOl2HoFxRI~zRC zm4g8B;wkJnKMoBg*PwsLq%E4!`_5{Cccl`xpRBlvBb_!-U^0Yhay>o};ces+K|W2y ze(pIuO(HPTw(2&+!ocpxk;KIDYD;gr->5F}JuAg~gS^8;yv0bX9x%UhBpQ;A78Ao< z^Dj-hpPQ5@T}bXkP`&~+2;IXW-RUcX=D@Htkb%j~%c4ZU{uv0|JliD>>1G{L)pA{F zkjA~M?+UdGBV716&h{%w`pZLZz^=T_bDXAafRiYmbnL!>59PoqLI3bfPZbtg)W*T!{G5miTh* zDWdy!7(Qo&eVO5%PnmSsOsKK^2upgcTDz6GN{-r}YRTAmQa3uQF2 ze5Y|(1LVhSBbtbRal;jd26FVsf3DzQR zZh5|*DNHylP(QX4sAN8wG73uvrF>C2Mn|j5D|a7Gz8?nvIJ~ZbaE|&pTx3QfbC9#{ z`&h)@5U1o5DL<#gm)NHH`IB|(PEwzt%U{6)5&SEFW{j-m9$ukGhZFKFJ&YMBK{9(q zSdJZjL{{Z1n7o2CqmzT3R6s3b`y@eqWsd!T$6|%F zaA*FzE7JO%Q0st#W{V=<0n-9`YX%~eO9Otrgq8c7SCMhI zYZ|egW*bWj7a_%WiiZ-Z@gjiX4O#-x8A#v)bq+zE25o6c)+oCK|8eX3hzm5;b+_vA z(zzCz>XxjX{{vSdHYqfo4fl(jjoEC0TsmkY%z{%G?cnf~`1#&rQ-E5*8 zo+`stA3T8L9>7bA+Ib`c<8HxGOT*d8X@ANBiO&BqN859z3Ft}2Dq&_Ad<1mkG)bqq z0nz`m9dW~FR8K>~wE#s)Vu95)F`c#Ij{4Zl>Ajoh5!aJwH``hVOKRQ9LZAFv8X>h9 zTu!Ktz5r5%a1K;@cNN>D#~13B(qC*HP4ydi3NX9eLOXmr4jR}|iqRIHXmD341Ih6g z4<6Qf(hf0T3j>YepLfe5;S`w=J^a=Ne%%9B?zgCV8K8Y*Z@t0bDhG8`1m@?SLCJx_ zL<2>jc?otn#G3fI$p+d5Fy{ZAzooplY5U|ic${1Z{G5Iq%vfg)xptL!vAXBlwIwm#`e=$5q7MH8u2_%7EnI0?P2)B7>Yiyl&R7n*h z0bMRc^y|6`C-95ngKh_dcKk;rT6!L#?8}d>AHWZ#3X7vCc&*MeB9!*Tv@R&G#4jM; zAgPY=5>))z(oX_?6jzm69L2V#=m%&k4SL%SnG!)>|jL; zFTU5VeEjkGJojXs>vS{urahxMyYqg{&~T<37c1+-qP@h|UZp3WZ?qn=^4mDXal{S* zA95Hu2fWS;S|8BV8CqK%P+2lOwaM8VkwGJnoQ?RR5L~~YB)6lh)8veVqK1)nXJS^6 zGPj4gv& z#MLrpB5Y>)94Q>v4kZC)w?CTv%+WTSA*gd@;B4NFod&hXr5i3ndvt7SmLi&qKOC}bED4H=B-X+@2cmFOP}47WT0dxu1FxpXAjHL% z-1jUsgBiba5A+pwxXhwTYQLLQrVm?hr{!{x((L2K+L!H;Km$HZ`u68(JHd4l_M~*W zJIwBPFZy$|((?XE_kLHUSXZWsD}6xG6~DtREjK&d>~AWenI_yETa=DlX2I{cCQ+hK z$FunnQfp%zc`ybCoV3?z~{2Yk%lLLj|HH-Cq~S8{E-wOEz^0()Tu3x-J{X!Etf9As-4qKoh=1VR3JfDTgt=2o}C zLSbp5IL%uv(ciR}upu(J{M|IQp#1Y2HoP;0q_n-4>2=h?2Jsm9&O%a{-i?nS*oIZGU>)2Ot|IQm9U1N|tkGzrpFe@_PXEvl z^2pG<_eQGKg$(a$U}UJRcYcZ$q_=yR$a#o(gn@2HQC{`bW!BORex|g!#Wl0S!--Em z5$b?J_#@{fbbtqs2!~ZP0j*+n_xzba8`rlFYRVpvGPv=7C$5J@jfrqz?nOYylB)jg za`*{(MPDFt5zi)NnjvSU=)~2_<~S2Qr<#hk1}GFVH3NHpG;kDK06qTHv;S?RIP&&K zZo2G(jrql_#!mmJUp*j0JkgHNe>NO{Fc!009u@t`h5KO? zAf3e@jSF2pYOp#_m5Hi(Px#Nx*Pn7~Lt`ZS&fG*xuhNj)L_W=a!iiSr=|c7ZF8N&_ z54aIhpS=5SpW~ca_RojLFFw6e{=AkuB8}5l&jpIF9VKPF|M8*@^2U`ep`PwoPNf5Xs+SEe{r*6b^zS7vtIm5CyUtU4uz0XKeARsi% zNJmM&yC%u62|3U&l0XSS)_GI_g*JzdlQ%XJ%!|mtT^bfwVuNC2;1xnVX9C!hJLDcQ zYPI0z>eUxCV3|`FQsP~rh zrh)BY*@`f2xurV`N1}S1aKSc3A8jz@0+-_4& zY|46L{G42Vq`BS$hyMsFPaoG8brtVBTj*P17}DK@(u>TsA~fsHWOKJYfekgn!}){+ zlGEKJP=9I_`xcu3&acDPO?eB6ELsv1x;J;7fmkJ6oiajbCVS><)yL#=d=ktkr{pEx z8LD>CT^|V7mD(>Be_{(QJrlGgn^c_~XIhiK8(im0FqwnU;@*|3h<$G)l7BCw*X*aY?g>=NNeJXRO>uk7*FFCvI$JnH!FPEvHAz`#>mGCQO_fkw`+cD@WNK5eI zg2nHG@kFZ5yW)^U`vor-%3(c~L8Rs6M3tUq(NUz@(xEklooki1emIyRY&g4z#F%^@ z8(Y!2I%vRA8WY6eS_dR<)y#rj?%bcego$$jY;?0EwJChuDW|T{1)Q zhDsA8f(hlZSv8a<-m{ACNoFB~i%!%nuko7eeBgWLF}K$^tX{nCj}J`Wqbfi4f}L#< zl1ou^^!Zt(OIzcK(2Dr&ot1oARh|$GyugI<%bzaIk8~bMaXN~Rb((L$-uE zl&;n7u!--fxE$H$R~pt zFQ|OhTuB{@)JpkzGx4D!hOzaJ{}06^x6^7adkyu82|e9Gm+L8MmUvz#Et35;L(|h8)r`^LFuQCarbT%cPvV27`9S+aaLf>*eb-kW?mlYq> zgq*B}sN@0F`Yxd}ijZI*TFC?^!ImjJ@5V`rIj|NDR< z-nZ&S_Tk*^3)MDH15zyH{9Bb^5eM(U#ji;=Vz@zifRczlO~N`OWAA$PJ2FaezKlTP zi6&1SXJE?eoTxAEPVyfrfh(E3aQVgSEl;PE4rQ|ORXj+gM?^bYc{P6^))@-$_DKQb z-E4FwR?qVW-dDAJ$}h*7uj$zN#k}krmobumBZ&!8;{$|z);HeX2dXR?a0nkYXGNT~ zDQBtR*{_w*w1D?+-I53ZaS=U&DrWx_Qk=nd7df?jX5w(*~0WYejhsfk;6#p~NyHYWL5Cc=%-en^;ftl3=NpI#-3QM#E-v(j;4G;RNm{21*mH}=+2 za;y_}dt$m_d{0x&7RKS9>L1>ElHp>Wq;B}ew)=f4SU5yU+yXtu!DaetD9QcT0d4C> zJpOo1nc?DXE4cc!TRysN(L)ekmVVm^#%ejP4dtS45&$v2&$ zlvn3-FAoc&Gj2#hK0H>W5q=N1Gm|o7Ums5%nm|9I{~3ULR|tpr03KSsG*Ofe34XJ? zK--2M9p$>vl+F{4p+yQLocha}U1LxwF}Mj#IDs@Q83^=-u4?udse~ zt2*WQ=EBW7F~h_d7cBPj-yM)v=Kw5fZGV~?S$>XCb0Gvk|GV;c1AR8o;GDc3T?hm+ zdXf?W^T7ww30r5bC;E-5{$awcQ%^3G&wJcO%h??~p!H((?(GT*>(Rm)UFCJVfS6t3 z+rTfmtu-`oji4kOxI3ZVusS4?mG>5AA>n>@>TpvsU>sAP7XdexY`O$#_M{E)b7cK^ z>zh)q`dYy$l|5%(ZFY9;s3q*GEY}OdzK@w2gQ2O-dK`pRCl3%%DcGh^~hj)ffZnF}#{k8WR z@y))<1V6DVl?fx<`sBvf+gi69>;$N)<5?pw54ei>7^H@!Tb<#&TA0tty%%ZC3XlN$ zEuo7AocITQ@W}FyA$(lAxxjyhGDNjAp%B^{L%$LN_lhhIAY`9(ZGtU_&)jJ(zWn6X zKUk5+x-SbdBx^cjfP+r~^u0nbMn4d8U~(%78}pJ_wh!aUFUNkdY=ijNw|-S`cNDR+ zx6@J6`~ozbAmCb{g^ZnlSTA7Wn(oQOiOD%7gOj_i@^i)S&$ZQ1m?di@^%}CFUM|A)DC`5^punE!$-C} zE@is3%ZroeEKyXhMxhHnShA@D1@^eTLM7kD#*zG@oCor zVO6Q!2?Xz0PTd4ute?YuG{BIDz;fkrMg21U9K}}>Z=~Tu`>s55=nQx%(wJm^ZWY{g z)?C6kp>VEN5H}$}_S`{`WVmB?-y`YTI}ks6C@!z)nWcGpu5lj~z)VT1B?vJ>kZdn) zhT&X{w$^m2XsPa)o}1vSDmYwpdU!(@HD>gHo0NnKmjUv0-*6MXBEMDjt>DZRzve=@ zeO@Ga-DJ1(!7jRta2}Rf>eq5i&<5#yK9AvjC&J0Q1oxywSRZ&&`P=*O zaLeU{Kn~k|1=V?!ZIv@qctjJT%`A9p_B z*H?$lOIvo3A2V7S#HLdidq{V*@>^jt_!L_MKcYwQ7f$57Z&vqVp=fI2FU0n;*r|1v z)=-9`<-x+=aVM`NAww#M^d52{T&&psRo4I5xxyO=po`4OojM$dpk!LqX`k-n+eSa3 z8eEZu%Ij`3V(ye!;DVrKvTwVgw9!PtfE5?N?K=AiRrEiVt*ya&iu3sP!p(6HtS)di zB|-wijpFkWJ+3yMfy9dDEl2+fwITQaCq9XH+AweJ7C%hP(bW?S&j^vkJ)MOG8b#o; z`K@u+r=f4UfEfglH{bZppEEByfLS5vWl)fXx)S6ED&ibv=Sza0dhM6F=*%uD5Jaj}hfn%xN{e!}-Y5c0# zo5tS6o7_^mq{H#x4bnVBaevttc6h1o%}Hdy?u%%mx9#LTwICS}m)xF0^WRQwey`Q# z9Gc`37hckz)txrn(f5qUWaz_~c_{QL{>F=e4K z&~AU)ttDMGIiOqOoSPt^(%F0hUb+ZXBO1$==^UYr0cqvhCq<|LIMUhKZ}f|lG3p^! zn(?2tsUm0L&=Hi@rtW%CeTy_-Pi3d{%;Q~8jG9Y7OlJ0!;5ZqA$kkAor2otmOcUYc5zb{-67w{WM3xG04OPMDlIVFQ^ ztcU*4T7nhfVtLOmD&t$ZbcXm@CW}(^;8lXwcM!g<@)(5tOP>dgIhY@Ai>8dW5M=Tu zp7X8^Ok4;*YL7~fdJy0)5dV~wnA~ zT4~?_xsnim@U6{vsa~6qUk> zA{VA3*(+a{~sGN=`Z0lx1Nqo$2(747cB8i%vL`owh0_v}{T;-5Ie~`}s}nQx0J)`sIFA9B0@T4shGT3egx2$! zlF5f}9>iVU_YjGz3&~hhtnp6#TFp#bdHDE~6VK6%f&D1ol~x(pyU7=MOKjXe`-hXS zpqHsV4RlanEjI*u9Pw_}339mvLTjTyutYN*ZD4*+{Fv4vDH9)Za`NH$GwA6Lk9{*S zyuKz$Rh{YJBThpoyq$IWBixkUG~A~c!NbJNqq990l$JrtR`$t!BaHx~U?1oA&R_N4 zK4iknZ6C6hSJQfDfZ17&@T&x-sN2B17lRZ9rHYCTZ{J*U3h|=42H}T1UmVt!6dM(X ztvkq7znv?6YHVIpo1GDd*an2f9=;3a7)aSwDt7nL-Vr9A-|yZS7*EUBEX7-=?2?|n zLgf8Siiox3g3H0ytDNfi9z}b%1FTGUX1gXAyZVGe-PSUTj>NGk30uL!#MV$4X~-{f zx&-1CbV^`*%>xoF>C^H}=~`>)3(E%it)^$qi)71(H%U$PH{<3cds<8xtL)D{K3&80 z=uvyN_l;w-reZdJ4MKWc_H@`HwXJc!7hKE<3=WKYhknj9hS%g!cqYNuXy$sa$!b

&ZM;`Wxbkuy7rxlNDA2W?v-2vfgI)V&GQh+u9zr5IDvet z5>QV;Cl~KYa7y2IDe7Q`q?6FpSIRW&9OuV{@MKsZpqp^=8jCQV5zaSCyU(rZUM=(Iz1b zMQJy;VSWGJ|5SBuhgK<$*i;Hb-`M+{fh+U9yuV8Pp&Ss`CP;GSpQxz6bS!rXGQ1aA zCDXrbDNH0gbAXTQ!M7)1Cle5_i0hdnEtJW%_#!5IF?Xnk9*h5vrZbO*>W};Qy|Wo( z-}kir5PZSc8D9VM?+itu&HtM&|sqRm) zzPW0m7m(LC-zvbZt4w-WuP;JGK~MGu87hZOrdSNc6SbyQF~r9`G2#d)r4!cpcfI21 z+YY@ZgrNT3L#VZh%9mI3uAFtY>ojbtxp{Xr@Wz;jF)jH-c@P)LDC`FEZ3ut9b%Rp) z;nk83vzz8tCRb9sPOMF>SGLyO{wS>%9DPO>+SeMU>s#ZglM#P)Ai+v5zf$+VR5K|q zV8JH)P0qVwWN6o%NqCv<9)&>e=<4S6;fl9DgKUj$IC59c$K{b{6uY)Ji6b|Dy+d7u zso?FkQRk%BZ-OXNKI_JL&$*aMh1+=##eutp?*GMS$M0EfqE4d~YfD(3SK-vQFsTx4 zue4r;Q29d#-xL{N4wBNox8=aW&&FtiSByCgUuH9>Gk6_3hPLBhuXP*WtHH}mg58yOz?B~ zix2qg?2)3Vf8S@m#gKpyC$1=vwJEsdN`v#gmR^DI>ffDz^>b9cEseYYdMJy<$GcVZ z+4((3I0V5Vvw6~Vx3jzHL=!}k>+UMgU0gtD*ZkA&#{v*GTJo;T#~P$J>s76{=&bB- zAD6n8Qo7sE0)4gQQxXgv$9@uNYOwDn#BpoDqp@S z+pyhU5^L&NqDa?;>bhy2sn4%E1YNj&HD{#48PH3pxi#>4*$=_o6p*tXPpy@yv4HtP z8I@AE7##VW>U~c2K4r>X9C63z)pF~0Ypx!-)JSdD=*-;?jSokUYo{a}NSvu)AB}dq zMis3x0-hV7k6tAN<=Ie_upj30;@bUKskQCD$rDdSeS<((5iRQw_F*ZVqvU6E)Fy+6 z$4+t6pEoFCebvJ<-{;CYw-&iMi+L;U-FI3i-Z&?{W8h^Xn8qJ*AFvDsM|9DxhCahN zL8LUT53R)c%JrWi?9DIw-<_0!DAF_W?s{I3*4A<;8BV5uc=mkDa0yk+{l3m}XB_F9bW0uG3+x}zC7MGfoQeEPJe zjiQP3mAmlraUfbPNXA13kk$!t$z5sU1$s^ME4QfCT3ussR7>Bzl(Ji2v+JGU3ti55 zhrO7`%WW?f6gYkfmGHTt!wO+Ts?tg{<;nUO5a70GPj3=z?!)M1p+dQ#rym{|So2-J@#!fGE`%lj zfb~!UQZD(893UxJo@1sTC0c?}Hw)K0PH7h_gaWL8d-KPWTAt+WpD+8>Wg}MSf{ev1tAX*Z zVt1>>=vLcTC*poRo#WUD){$tNWk8(_ce4R%EEw&kc|S;uX5a&@Pi;QmCQQ{*Pd9*0 zH-VOs?>Qi2nwv`R{di+p2rLr?4HQStu7^^7EpKg$Z*{3~kPELN*cNExirUn6rciw` z>>}|13UJ<|6hmuj%iau_{`Nu$72rgp&MhwUFcj`Yc6^Q7-z_!#5u>u zRYOcD_wb0$$C=1`uBO`_Doy6TFCOejO-CL4H?@*1%B5*+zSLeW2>!f>ofR0GnAjxl za$hn8;slH=&S$(lMEi$*@F>pRJ7oqoHH3tR&wrLXy0%i@3xb1e}LwMSX z+`(!>K6GH=pGBwSK?RKA{e#D&q4_+w|I5_ z9eH$Jj2ifX#mw}zQC8P0;l@MQ`oX1REoP5D$#AYulvzF>K!f27O;F~&83A0GW+dS z(ZAnK!%wU*cSHM5VP!Y2D728{O}`qI^&XOUoycSTi@9uu5ZtHca$*HR@|-Ktwt-BY z3xP(QOv6k%f0P8<<~H@}g_^>&rWN?gI@Q@^GxYJT;1#&{7`+Wgw|b2#@Ck5dZB`a5 za2&t;j27;#A6a(V38rPp^;5YvCMHS-CS@Rd3B4D4k@Abtw7#-YgqAg=`fw|1fOHaZ zhgRTo`FBxS?s08Mn<+xLDL1G8uyKa$h9@6sf`x_*d@2EUbJ8o=t{m8C1vW@P8y{oS zT{c)MnlcR+#ZTq**mlkP*C=?9-e|}Et61uj5$2Q;g^b>FH+EuA)|ga*@J~JVGoNk$ z$~V7XMdiUetEM%>T*EX15X;%c;@hGeX_<$S{rJ+S&O1XzhR+k=h{$q^faweC$<+Js zm(y%VfzKgdnU9)FaxU3^IH|I%a9t(twbOQL!^BK!&lY!VSS~UAPv}`I3|rITLidKZ zxr@AaW!7*~WM}LtTeQy2pogwFcd?!4rk2 zuA%B~DjQd1Gc7e}Vj@L|9Rh+KT8kcn@13Pw+nzxI-5whR*WOQmCx&*vl>Bud9`)*l zg~&@AXT^4C&wmJg^^1-g$l zHmd+Bts&W$Ugu_-UGdXQWknWAju`WaTDMMW?rU;|Pwyzq$TgF$4$&vXxx*NJWQ~q* zk;!T$Y)MzSObz6pimk7fko(J0K>JTp$1MvLDPpeSPF1xh$oYXkaf11VPSrqIIYH`18WcM=mm>f^=xUz@Du#KLElozvLRvZ=8M?#eHZ?H7tnfw zyRF`EgjwUs!D)bn2YY~F4>0Kc`=V*RpY-K}!!WYfmwh2(zrGl)p7pQu`I4ppbxVAU zQhSJangvhw?ph~OD(6Fu1A!MpisURPqsgbXo6W;**M#_J1L4Sb?n0W}bq*-rWiBxV zqY3Yp`PDz1d$V)~7NQO7|B<9=Zox}*%E9f`3iusTN2S!U{z^|1+mA+VB2kq$356d= zYQapdFpAETypJEGhK#|7jWYYr$u}qbjj%QmjTp4 zU$Kant1nMy->)GJx~i&hy_l{+%yI!2tiE2o8bd0UK$s-Zk_#aJD#4XRySS#)`^AM(}c*&j)aE! zL{FaC5}82C`slg+n7EpQIx_1+8XNq@qeH}3swU<6-&Xd|_ubaOIjH>0TaOuh{G-G~ zVq`B>`)J*9tt@FJ=%pS_3>;V}18?p7RVZBSv|(0pKrb-3bDZ2 ztoYdS`$LMg(zt!}FaOyPH*QhFvai#JV)C-F;~$4Foma`*5JApKE7@CqMxdPi9`mBk zttUe^(PyQ>QeKDSdc`!Ux1xx^#)+g%FSKI+V;rD(?=)KH945v?iQ8OL2%z(x(NyFxRur}naSl4GYFB(5DexS* zVkYQ)VnrYnP5W|bBo#;8izsrM(s1OA;2%_p(SPB0etLphPJn=h7>zk)8h_8$DjJT!eEku(o2w?+uLmZc&X7_C0Oy!+sO;4aSMqn( zM7(k5#iO`BO9h#~aDBHA9_A@iO;Ko=9K6<0+JT?g<93`UOFiPU0TFXREnm(0k_vEu zTUYceQMbV8x>GS=z zH4nz;CwA{DO$0i>S`N?y0OeQzadGIO$GD;6Vl>2#wyU4xHTS!0_&p#v7&mM>gCuk} z_5^6c6OZpnKWD1^gejNkaA=e(Q`?`-W#Y>SqPQlopJ#6pT#6~+WK8BPI%Xc4iOK49Y@g2+ymsoSP``Z)5|fWCR_%z>A|m{COp6EZVi?qp5EH(Za$)NuRc= z5(C1R9V#}0zPkOQiIN&#~;Z-j%i!x^l?O0LG2z%lva@aoMT~Pvoe84 zt{Z|q?S#Wy1P;^le#xEm)F%`ZAPGq^BrZp&a8^AOeCx(p!)C8~{o~MD<2ENTzvveR zq*5Lt<1f>SC6#r~>C`KPv>Y#{gzr`uniP?mEp3x>5I@O9R6*ovE4|`9C7|xnZ(#8_ z=~iQs;GLJvuqs38?b*lb!er>u4fL9XFdgf7?I54d$@}}l*1Bo>=lAh@Jq2U^<|_?p zf=Y)MMJ|gL8%4jA8NXzYhmk}%C;jus>jv<&ts##W*T~FfN=kZ}bn{SN+1BN>;i6RW z$M-iCM&n}3a_T={WR>mpY{A%RR(La&murV+oUFHbW^W+cH(I{9oH3z_XKB_v<$I+w zxcqXd?DUZA$tzd8Cd{l|!jnWK2i){%*n`64)*@7XN1JV&Czn?PVqo|DOT>VZey(^z z>o*)@cx3ORV;8)B?8E&C4O1drAhUj-JaB5SrJ`*bXG0dymF#!*7vXBzj)^1-Nt*4g zh4de!C%wn*M6@4&P$V^TwU7GhS5h|ckBf z=nt9oZcOBN@m{4RsT)s$%gbJL|>Gj_-W$kXAMQPN8eBR+28iDBjX`*dLp2wUYhY+^+TQ<@!0tP!05;+uG zbI*tUyv8Us#rQbLY)&+y62XQz9S{=S`Iue_;l>am0hV|H1@|Oj&?{i zDbYij-!35sD3t?Fs|HF+Dq750d=Yu{t&B_#yBeq319K3&9uEY|c;IU*FQ`oVaG(o$OL zl6MHc4uAdx!Iel@;Sdeh2!;Pk9iYDELsHu7vbHmfbJ?2-?B2sG(Yb=nWkMm{3AXzA zq5r;H1G}F4kDuV|PXT*=DuSlETmDUA^w9ELPj8^!0c7&Qa_sq2+E4-#riYmno=^V9zUVoi~sBBvsF%B>Tm8Ow<<6|x~u zZwS!;{o`X4)j|}>IxZ-b_Y~`9U)6~>NupeEIf=y;rkww=C|9?6fFR8%Y9}P9Uv=FFq%2gaYJ4g&mgf=2TN8SeW!AO32Z`9wRH z_UDCf&=P3!)^fODlV+GdMopE|Bi>0Xp5;&d3Kg6D=RwP_>+T-APoKrp44#jKc?Ss& z%jc-tMRtW3Ea?mx`*>&E812k$|Db}E>v3Td9$xI5t~+vwKX~jUXOB3xWrecX_7C&u zMHIP64t``p&Ke!XnlxT~*kljRm&EFJOfz4WC}{a;r8E6ce42X``{p(C(6OjZS4+T5 z`d-AOYN$fKPi17N_OjUU<_!||wSLXd8mH;@Rg->NMXybMMPs6@d#Ms1-x*w5WBXtv z^rJ3}ZJcJj^t-KJyBc^e^Qa|4Y%A*mlQ>GeH?q1ES5!&maeevl&(DU(-t=bUUuEsDILE%#U1gOc%fDeb z!=0x;C8pjz{%DQy<+O8w)Dp0;pA7JZMO*l}7+4?nPW%uZ9c^K`gRFR3aS)}9Qc=tv z`(D0$FMHr{n3JK7()r;e!3!eFofu+D+{lxzg0q9(SQAT!lmfczT|b|@36|WlEVwE% znde=g6?Day*EHTX=VV$DBuEyzInew1u`}2&e64pL+NZ*Z*q)WFYx3SMF1v zpUCMNF;leJKBQITKd?n(N%~EhH8$HOJux8ry%b7&o&!Bcl1|~}ln~01C(1>@{+?5$ zqVNy!%0%MnK`~<8u|TT#!dPo|-t9MnmD7o>^+nZkw7w2Eao&gpl+HWHdNjcEz-vGn zVzz`%UKQ-S@3kU%d8EtDk^K#O>DSD;6#hziQd84YbE52XW1wDB@#xp$(a>s8yt{L5 zz3goLinqkoxV#2!uBKEbEFrf|p}eYP6}eAP;zd5&yoJpQIc7Qyqn+C73?B&go}-+x zyt?qBis|mM7Y%c-)e6tzA7yV)Iy)C@lJ|s-M zDx;vs9kzCaJ^3Mu87wM8+XJaar0=wMZ&OBFYpU}$_pe*Iu_+2_;1<;Y&7yvc?!Cmr zoS28Wv)kq!BV z2SEQv32Y2D<|u|Kp^yZ6k_qWYdl6MA?_tDPWw?FzFLH@Tq6$*&!ltkfb(SNu2lahX zq+HdzD3YIZOGTP(cT}N zW#1=3S5h8b2WSG=3*x}{MK$g^L|6cBtN~LZ`gs_?y_!Z|1zec1sUdVjTwSOYW+#`T zfFg)om#1f-3IN#~VS(Sd5PWw=*Zup8BEUldzQh zbV2{?f8PX0%X9mL7tx>B->`H;G%-RK&8(rD4xZ(+UE@h`>%#$Q#`(j)W_ zZZYP2%WS|1pGz_{=?0yAzZZ*qT%WL5+}p#6SB0t>!P68;(Ga@@X{aLG_UL%>j(tVP zyy+9Nj|YVk!h!nY&HJz)3EzhQ(D48B%<}ILEB8Tc9{DM zF3ePen^Alfs6f!n-w2qR-id`?nPWe(I$qc$`;7TL!nEg5ncw3y!M%G8r91u=Kf19`f@o=H zw@iI^?HESd%!K=Vr(d$E?&?wEZ~tjER)z&p8T=YQvIi6go>cMf4_m$VFmWER6*18) zzyijv7-f4{{Hk(yW!*2A?E2my9X^9foq4J6X3{h|@~_QCy`d0Rl#u`ATa%|uk)9yA z{5@0yLIF5ehIKO2o}J;a4&V6=|Cizu2)k;ltSwA2v|5LV_cYjY^r8wjfx|8FriW^< zxwkw8V1v44eq!5uBdd2cXL_Im3%ht_dc@koFC^rc!$+Jn6b562A^)iXc}5o_U4*+o zm}e`PX_O7X-Z=m@kOV#ILDXFU;gkTa<{d(WIE`YU4vb1OD4XX@;J8*6&MCfwaB+SyB;@2LxjVi-O4pIgNVeP)BpL{rxc?>s}NErs< z0N|py(Vo5RmgA^(32_V$HToAfj=ATn{{w(>lLlYnd{MNF;_x&Hkxa(5Il*{c{`*5wB3DH2}Ft^rRY0 zQ#3fN-}~RzXtztxQgrnea{VL@L|!g9T*+BjJ8fQY?*w=pVfX}5hbNkT$!8sL{<`g< zSd88PysWsxED&R!+Y?7FB1attO+W4j4_Tp?ZtUMv{GVEXADNKlF7+S++>KzqO7N|Y zxJBM~d{t!D);a16&L1~%-!2DRfvLlr-w6<<5%$rWh?K8a5(VFu5sZD$k|*=k6cAI7 zvso6X6FP^HO(dWr9X)@3f%J6pp?3fhl&Ibis6fnqT=3PWAo9*OX z^d_fj0+HQtwAjqVKZ7D@69lZUbuJ%2TEk9FLHrZkG*0;s&XMrJohcrK1zGabtQ+mT zid$>3$|Bhw%iy;N+Po!x+BG{Eb0^}64k{%%3C+=!4o+~TCpE_u*m1mU_%0AK9|?l(NE3G^^ZQA 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%0D#fgskriu)fW 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 {k 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 z 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 ( 1 - 0 ) => 1, edge + // Not same direction => ( 1 - 1 ) => 0, no edge + + float normalizedZDiff = abs( zA - zB ) * parameters.normalZDiffWeight * zScale; + // 1 => big z distance + // 0 => close z + + float zDiffAmount = clamp( normalizedZDiff, 0.0, 1.0 ); + // 0 distance => close => edge + // 1 distance => far => no edge + + float invZDIff = 1.0 - zDiffAmount; + + return clamp( angleAmount + invZDIff, 0.0, 1.0 ); +} + void main( ) { ivec2 size = imageSize( outputImage ); @@ -220,12 +247,35 @@ void main( ) float normalEdge = 0.0; - normalEdge = max( normalEdge, 1.0 - dot( n11, n01 ) ); - normalEdge = max( normalEdge, 1.0 - dot( n11, n21 ) ); - normalEdge = max( normalEdge, 1.0 - dot( n11, n10 ) ); - normalEdge = max( normalEdge, 1.0 - dot( n11, n12 ) ); + // float zDiffNormalizer = parameters.normalZDiffWeight; - float edgeWeight = smoothstep( parameters.normalEdgeZMin, parameters.normalEdgeZMax, normalEdge ); + // float zDiffAmount01 = max( 0.0, 1.0 - abs( z11 - z01 ) * zDiffNormalizer ); + // float zDiffAmount21 = max( 0.0, 1.0 - abs( z11 - z21 ) * zDiffNormalizer ); + // float zDiffAmount10 = max( 0.0, 1.0 - abs( z11 - z10 ) * zDiffNormalizer ); + // float zDiffAmount12 = max( 0.0, 1.0 - abs( z11 - z12 ) * zDiffNormalizer ); + + // normalEdge = max( normalEdge, 1.0 - ( dot( n11, n01 ) * zDiffAmount01 ) ); + // normalEdge = max( normalEdge, 1.0 - ( dot( n11, n21 ) * zDiffAmount21 ) ); + // normalEdge = max( normalEdge, 1.0 - ( dot( n11, n10 ) * zDiffAmount10 ) ); + // normalEdge = max( normalEdge, 1.0 - ( dot( n11, n12 ) * zDiffAmount12 ) ); + + // normalEdge = max( normalEdge, edgeFilter( n11, n01, z11, z01, adaptiveScale ) ); + // normalEdge = max( normalEdge, edgeFilter( n11, n21, z11, z21, adaptiveScale ) ); + // normalEdge = max( normalEdge, edgeFilter( n11, n10, z11, z10, adaptiveScale ) ); + // normalEdge = max( normalEdge, edgeFilter( n11, n12, z11, z12, adaptiveScale ) ); + + + normalEdge += edgeFilter( n11, n01, z11, z01, adaptiveScale ); + normalEdge += edgeFilter( n11, n21, z11, z21, adaptiveScale ); + normalEdge += edgeFilter( n11, n10, z11, z10, adaptiveScale ); + normalEdge += edgeFilter( n11, n12, z11, z12, adaptiveScale ); + + normalEdge /= 4.0; + + // float edgeWeight = smoothstep( parameters.normalEdgeZMin, parameters.normalEdgeZMax, normalEdge ); + float edgeWeight = normalEdge; + + edgeWeight = mix( 1.0, edgeWeight, parameters.normalFilterWeight ); float edge = max( normalEdge * parameters.normalEdgeAmount, zEdge * parameters.zEdgeAmount * edgeWeight ); edge = clamp01( edge ); @@ -240,7 +290,11 @@ void main( ) vec4 edgeColor = SRGBtoLINEAR( vec4( parameters.edgeR, parameters.edgeG, parameters.edgeB, 1.0 ) ); // originalColor.rgb = mix( originalColor.rgb, vec3( 0.0, 0.0, 0.0 ), shadowAmount ); vec4 mixedColor = mix( originalColor, edgeColor, parameters.amount * edge ); - + + if ( parameters.debugViewZ > 0.0 ) + { + mixedColor.rgb = mix( mixedColor.rgb, vec3( normalEdge * 1.0 ), parameters.debugViewZ ); + } imageStore( outputImage, xy, mixedColor ); } \ No newline at end of file diff --git a/Runtime/Sensors/Default-Sensors/Default-Input-Icons-Library.tres b/Runtime/Sensors/Default-Sensors/Default-Input-Icons-Library.tres index 52c7bef..2e682b6 100644 --- a/Runtime/Sensors/Default-Sensors/Default-Input-Icons-Library.tres +++ b/Runtime/Sensors/Default-Sensors/Default-Input-Icons-Library.tres @@ -192,7 +192,7 @@ directionUpTexture = ExtResource("6_0hfff") [sub_resource type="Resource" id="Resource_40bf3"] script = ExtResource("2_4sutq") -value = 0.7 +value = 1.5 unit = "em" [sub_resource type="Resource" id="Resource_xrtll"] @@ -274,7 +274,7 @@ backgroundTexture = ExtResource("21_hcyk3") [resource] script = ExtResource("1_urlfx") fontSize = SubResource("Resource_40bf3") -iconHeightInEm = 1.5 +iconHeightInEm = 3.0 mouseInputIcon = SubResource("Resource_34cgw") keyboardKeys = SubResource("Resource_nkgsq") keyboardModifiers = SubResource("Resource_wrdp7") diff --git a/Runtime/Sensors/Default-Sensors/UI/Sensors/UI Left.tres b/Runtime/Sensors/Default-Sensors/UI/Sensors/UI Left.tres index 50899c0..3bdfdf8 100644 --- a/Runtime/Sensors/Default-Sensors/UI/Sensors/UI Left.tres +++ b/Runtime/Sensors/Default-Sensors/UI/Sensors/UI Left.tres @@ -1,11 +1,18 @@ -[gd_resource type="Resource" script_class="CombineSensor" load_steps=4 format=3 uid="uid://cqatyb80rpor0"] +[gd_resource type="Resource" script_class="CombineSensor" load_steps=6 format=3 uid="uid://cqatyb80rpor0"] [ext_resource type="Script" uid="uid://eid0qnlvq4n1" path="res://addons/rokojori_action_library/Runtime/Sensors/CombineSensor.cs" id="1_u5wou"] [ext_resource type="Script" uid="uid://e7fduwypgvwr" path="res://addons/rokojori_action_library/Runtime/Sensors/InputMapActionSensor.cs" id="2_ibucs"] +[ext_resource type="Script" uid="uid://cc8g4jmyrpehg" path="res://addons/rokojori_action_library/Runtime/Sensors/InputIcons/Types/GamePadAxisIcon.cs" id="2_n3xai"] + +[sub_resource type="Resource" id="Resource_yth0n"] +script = ExtResource("2_n3xai") +type = 1 +metadata/_custom_type_script = "uid://cc8g4jmyrpehg" [sub_resource type="Resource" id="Resource_n3xai"] script = ExtResource("2_ibucs") inputActionName = "ui_left" +inputIcons = [SubResource("Resource_yth0n")] metadata/_custom_type_script = "uid://e7fduwypgvwr" [resource] diff --git a/Runtime/Sensors/Default-Sensors/UI/Sensors/UI Right.tres b/Runtime/Sensors/Default-Sensors/UI/Sensors/UI Right.tres index d9fd33f..d4ea6e2 100644 --- a/Runtime/Sensors/Default-Sensors/UI/Sensors/UI Right.tres +++ b/Runtime/Sensors/Default-Sensors/UI/Sensors/UI Right.tres @@ -1,11 +1,17 @@ -[gd_resource type="Resource" script_class="CombineSensor" load_steps=4 format=3 uid="uid://dafu3alp6wr25"] +[gd_resource type="Resource" script_class="CombineSensor" load_steps=6 format=3 uid="uid://dafu3alp6wr25"] [ext_resource type="Script" uid="uid://eid0qnlvq4n1" path="res://addons/rokojori_action_library/Runtime/Sensors/CombineSensor.cs" id="1_rqdfo"] [ext_resource type="Script" uid="uid://e7fduwypgvwr" path="res://addons/rokojori_action_library/Runtime/Sensors/InputMapActionSensor.cs" id="2_oj4wy"] +[ext_resource type="Script" uid="uid://cc8g4jmyrpehg" path="res://addons/rokojori_action_library/Runtime/Sensors/InputIcons/Types/GamePadAxisIcon.cs" id="2_tuqbj"] + +[sub_resource type="Resource" id="Resource_i2j76"] +script = ExtResource("2_tuqbj") +metadata/_custom_type_script = "uid://cc8g4jmyrpehg" [sub_resource type="Resource" id="Resource_tuqbj"] script = ExtResource("2_oj4wy") inputActionName = "ui_right" +inputIcons = [SubResource("Resource_i2j76")] metadata/_custom_type_script = "uid://e7fduwypgvwr" [resource] diff --git a/Runtime/Sensors/DeviceFilters/LastActiveDeviceFilter.cs b/Runtime/Sensors/DeviceFilters/LastActiveDeviceFilter.cs index 7cea961..b004a15 100644 --- a/Runtime/Sensors/DeviceFilters/LastActiveDeviceFilter.cs +++ b/Runtime/Sensors/DeviceFilters/LastActiveDeviceFilter.cs @@ -24,6 +24,8 @@ namespace Rokojori { return false; } + + this.LogInfo( "Checking Icon:", device.GetType().Name, icon.GetType().Name ); return device.ContainsIcon( icon ); } diff --git a/Runtime/Sensors/Devices/GamePadDevice.cs b/Runtime/Sensors/Devices/GamePadDevice.cs index 4c87a5a..6793464 100644 --- a/Runtime/Sensors/Devices/GamePadDevice.cs +++ b/Runtime/Sensors/Devices/GamePadDevice.cs @@ -45,6 +45,8 @@ namespace Rokojori return ci.icons.Length == 1 && ContainsIcon( ci.icons[ 0 ] ); } + + return ReflectionHelper.IsTypeOneOf( icon, typeof( GamePadAxisIcon ), typeof( GamePadButtonIcon ) diff --git a/Runtime/Sensors/Devices/SensorDevice.cs b/Runtime/Sensors/Devices/SensorDevice.cs index d7eac9e..f534b0b 100644 --- a/Runtime/Sensors/Devices/SensorDevice.cs +++ b/Runtime/Sensors/Devices/SensorDevice.cs @@ -6,7 +6,7 @@ namespace Rokojori { [Tool] [GlobalClass,Icon("res://addons/rokojori_action_library/Icons/SensorGroup.svg")] - public partial class SensorDevice: Resource + public abstract partial class SensorDevice: Resource { public virtual string GetInfo() diff --git a/Runtime/Sensors/InputIcons/Types/SensorIcon.cs b/Runtime/Sensors/InputIcons/Types/SensorIcon.cs index fac4797..5a950ef 100644 --- a/Runtime/Sensors/InputIcons/Types/SensorIcon.cs +++ b/Runtime/Sensors/InputIcons/Types/SensorIcon.cs @@ -11,6 +11,13 @@ namespace Rokojori [Export] public Sensor sensor; + public static SensorIcon Create( Sensor sensor ) + { + var si = new SensorIcon(); + si.sensor = sensor; + return si; + } + public override bool Equals( object obj ) { var value = obj as SensorIcon; diff --git a/Runtime/Shading/Library/LineVFX/LineVFX-ApplyModelViewMatrix.gdshaderinc b/Runtime/Shading/Library/LineVFX/LineVFX-ApplyModelViewMatrix.gdshaderinc new file mode 100644 index 0000000..0a36d53 --- /dev/null +++ b/Runtime/Shading/Library/LineVFX/LineVFX-ApplyModelViewMatrix.gdshaderinc @@ -0,0 +1,9 @@ + +vec3 translation; +mat3 rotation; + +#include "res://addons/rokojori_action_library/Runtime/Shading/Library/LineVFX/LineVFX-Vertex.gdshaderinc" +mat4 combined = createMat4FromBasisAndOrigin( rotation, translation ); + +MODELVIEW_MATRIX *= combined; +MODELVIEW_NORMAL_MATRIX *= rotation; \ No newline at end of file diff --git a/Runtime/Shading/Library/LineVFX/LineVFX-ApplyModelViewMatrix.gdshaderinc.uid b/Runtime/Shading/Library/LineVFX/LineVFX-ApplyModelViewMatrix.gdshaderinc.uid new file mode 100644 index 0000000..c850fcb --- /dev/null +++ b/Runtime/Shading/Library/LineVFX/LineVFX-ApplyModelViewMatrix.gdshaderinc.uid @@ -0,0 +1 @@ +uid://k6hhfjejkh5p diff --git a/Runtime/Shading/Library/LineVFX/LineVFX-Includes.gdshaderinc b/Runtime/Shading/Library/LineVFX/LineVFX-Includes.gdshaderinc new file mode 100644 index 0000000..e75021f --- /dev/null +++ b/Runtime/Shading/Library/LineVFX/LineVFX-Includes.gdshaderinc @@ -0,0 +1,4 @@ +// #include "res://addons/rokojori_action_library/Runtime/Shading/Library/LineVFX/LineVFX-Includes.gdshaderinc" + +#include "res://addons/rokojori_action_library/Runtime/Shading/Library/Transform.gdshaderinc" +#include "res://addons/rokojori_action_library/Runtime/Shading/Library/Bezier.gdshaderinc" \ No newline at end of file diff --git a/Runtime/Shading/Library/LineVFX/LineVFX-Includes.gdshaderinc.uid b/Runtime/Shading/Library/LineVFX/LineVFX-Includes.gdshaderinc.uid new file mode 100644 index 0000000..3cb28b8 --- /dev/null +++ b/Runtime/Shading/Library/LineVFX/LineVFX-Includes.gdshaderinc.uid @@ -0,0 +1 @@ +uid://c1f4jt1qpwk42 diff --git a/Runtime/Shading/Library/LineVFX/LineVFX-Variables.gdshaderinc b/Runtime/Shading/Library/LineVFX/LineVFX-Variables.gdshaderinc new file mode 100644 index 0000000..89262ff --- /dev/null +++ b/Runtime/Shading/Library/LineVFX/LineVFX-Variables.gdshaderinc @@ -0,0 +1,24 @@ +// #include "res://addons/rokojori_action_library/Runtime/Shading/Library/LineVFX/LineVFX-Includes.gdshaderinc" +// #include "res://addons/rokojori_action_library/Runtime/Shading/Library/LineVFX/LineVFX-Variables.gdshaderinc" + +instance uniform vec3 startPosition; +instance uniform vec3 startForward; +instance uniform vec3 startUp; +instance uniform float startNormalizedDistance; + +instance uniform vec3 endPosition; +instance uniform vec3 endForward; +instance uniform vec3 endUp; +instance uniform float endNormalizedDistance; + +instance uniform float lineLength; + +uniform float scaling:hint_range(0.0,2.0) = 1.0; +uniform int positionInterpolationMode = 0; +uniform float bezierCurvature:hint_range(0.0,0.5) = 0.3333333333; +uniform float rationalCurvature :hint_range(0.0,0.5) = 0.5; +uniform float rationalWeighting :hint_range(0.0,1.0) = 0.5; + +uniform int rotationInterpolationMode = 0; +varying float normalizedDistance; +varying float t; \ No newline at end of file diff --git a/Runtime/Shading/Library/LineVFX/LineVFX-Variables.gdshaderinc.uid b/Runtime/Shading/Library/LineVFX/LineVFX-Variables.gdshaderinc.uid new file mode 100644 index 0000000..c004245 --- /dev/null +++ b/Runtime/Shading/Library/LineVFX/LineVFX-Variables.gdshaderinc.uid @@ -0,0 +1 @@ +uid://buho4jxq4dkpl diff --git a/Runtime/Shading/Library/LineVFX/LineVFX-Vertex.gdshaderinc b/Runtime/Shading/Library/LineVFX/LineVFX-Vertex.gdshaderinc new file mode 100644 index 0000000..c72b92b --- /dev/null +++ b/Runtime/Shading/Library/LineVFX/LineVFX-Vertex.gdshaderinc @@ -0,0 +1,86 @@ +// #include "res://addons/rokojori_action_library/Runtime/Shading/Library/LineVFX/LineVFX-Includes.gdshaderinc" +// #include "res://addons/rokojori_action_library/Runtime/Shading/Library/LineVFX/LineVFX-Variables.gdshaderinc" +// #include "res://addons/rokojori_action_library/Runtime/Shading/Library/LineVFX/LineVFX-Vertex.gdshaderinc" + +// vec3 translation; mat3 rotation; + + if ( positionInterpolationMode == 0 ) + { + translation = mix( startPosition, endPosition, t ); + } + else if ( positionInterpolationMode == 1 ) + { + float controlLength = length( endPosition - startPosition ) * bezierCurvature; + vec3 c0 = startPosition + normalize( startForward ) * controlLength; + vec3 c1 = endPosition - normalize( endForward ) * controlLength; + + translation = cubicBezier( t, startPosition, c0, c1, endPosition ); + } + else if ( positionInterpolationMode == 2 ) + { + float controlLength = length( endPosition - startPosition ) * rationalCurvature; + vec3 c0 = startPosition + normalize( startForward ) * controlLength; + vec3 c1 = endPosition - normalize( endForward ) * controlLength; + + translation = rationalCubicBezier( t, + startPosition, c0, c1, endPosition, + 1.0, rationalWeighting, rationalWeighting, 1.0 + ); + + } + + + if ( rotationInterpolationMode == 0 ) + { + vec3 forward = normalize( mix( startForward, endForward, t ) ); + vec3 up = normalize( mix( startUp, endUp, t ) ); + rotation = lookRotation( forward, up ); + + } + else if ( rotationInterpolationMode == 1 ) + { + vec4 startRotation = quaternionFromLookRotation( startForward, startUp ); + vec4 endRotation = quaternionFromLookRotation( endForward, endUp ); + + vec4 qRotation = quaternionSlerp( startRotation, endRotation, t ); + rotation = quaternionToRotationMatrix( qRotation ); + } + else if ( rotationInterpolationMode == 2 ) + { + + float controlLength = length( endPosition - startPosition ) * bezierCurvature; + vec3 c0 = startPosition + normalize( startForward ) * controlLength; + vec3 c1 = endPosition - normalize( endForward ) * controlLength; + + vec3 forward = normalize( cubicBezierDerivative( t, startPosition, c0, c1, endPosition ) ); + vec3 up = normalize( mix( startUp, endUp, t ) ); + rotation = lookRotation( forward, up ); + } + else if ( rotationInterpolationMode == 3 ) + { + vec3 lineDirection = normalize( endPosition - startPosition ); + vec3 forward = t < 0.5 ? mix( startForward, lineDirection, t * 2.0 ) : + mix( lineDirection, endForward, ( t - 0.5 ) * 2.0 ); + vec3 up = normalize( mix( startUp, endUp, t ) ); + rotation = lookRotation( forward, up ); + } + else if ( rotationInterpolationMode == 4 ) + { + bool isStart = t < 0.5; + vec3 lineDirection = normalize( endPosition - startPosition ); + vec3 centerUp = normalize( mix( startUp, endUp, 0.5 ) ); + + vec3 forwardA = isStart ? startForward : lineDirection; + vec3 forwardB = isStart ? lineDirection : endForward; + + vec3 upA = isStart ? startUp : centerUp; + vec3 upB = isStart ? centerUp : endUp; + + vec4 rotationA = quaternionFromLookRotation( forwardA, upA ); + vec4 rotationB = quaternionFromLookRotation( forwardB, upB ); + + float rt = isStart ? ( t * 2.0 ) : ( ( t -0.5 ) * 2.0 ); + + vec4 qRotation = quaternionSlerp( rotationA, rotationB, rt ); + rotation = quaternionToRotationMatrix( qRotation ); + } \ No newline at end of file diff --git a/Runtime/Shading/Library/LineVFX/LineVFX-Vertex.gdshaderinc.uid b/Runtime/Shading/Library/LineVFX/LineVFX-Vertex.gdshaderinc.uid new file mode 100644 index 0000000..3f747d0 --- /dev/null +++ b/Runtime/Shading/Library/LineVFX/LineVFX-Vertex.gdshaderinc.uid @@ -0,0 +1 @@ +uid://dairdipwvqk75 diff --git a/Runtime/Text/CodeGenerators/GDScript/GDScriptFromCSAST.cs b/Runtime/Text/CodeGenerators/GDScript/GDScriptFromCSAST.cs new file mode 100644 index 0000000..8fdf53f --- /dev/null +++ b/Runtime/Text/CodeGenerators/GDScript/GDScriptFromCSAST.cs @@ -0,0 +1,177 @@ +using System.Collections; +using System.Collections.Generic; +using System.Text.RegularExpressions; +using System.Text; + +namespace Rokojori; + +public class GDScriptFromCSAST +{ + public GDScriptGeneratorClass gdClass = new GDScriptGeneratorClass(); + public string rokojoriPrefix = "RJ_"; + + + public static string CStoGDVariable( string csName ) + { + var sb = new StringBuilder(); + var hasUnderscore = false; + var wordStarted = false; + + for ( int i = 0; i < csName.Length; i++ ) + { + if ( char.IsUpper( csName[ i ] ) ) + { + if ( ! hasUnderscore && wordStarted ) + { + sb.Append( "_" ); + hasUnderscore = true; + } + + sb.Append( char.ToLower( csName[ i ] ) ); + wordStarted = true; + + } + else + { + sb.Append( csName[ i ] ); + hasUnderscore = csName[ i ] == '_'; + + if ( ! hasUnderscore ) + { + wordStarted = true; + } + } + } + + return sb.ToString(); + } + + + public string GetClassName( string className, string ns ) + { + if ( ns.StartsWith( "Rokojori" ) ) + { + return rokojoriPrefix + className; + } + + return className; + } + + public void Convert( CSFileRoot root ) + { + var walker = root.walker; + var csClass = walker.Find( root, n => n is CSClassDeclaration, true ) as CSClassDeclaration; + + gdClass.name = GetClassName( csClass.GetClassName(), "Rokojori" ); + + if ( csClass.objectTail != null && csClass.objectTail.inheritanceDeclaration != null ) + { + gdClass.extendingClassName = GetClassName( csClass.objectTail.GetExtendingObject(), "Rokojori" ); + } + + var atts = CSModifierAttributesParser.GetAttributes( csClass.attributeBrackets ); + + RJLog.Log( "Att:", atts.Map( a => "'" + a + "'" ) ); + + atts.ForEach( + ( att )=> + { + + if ( att == "Tool" ) + { + gdClass.annotations.Add( "tool" ); + } + else if ( att.StartsWith( "Icon" ) ) + { + var lcAtt = ( att[ 0 ] + "" ).ToLower() + att.Substring( 1 ); + gdClass.annotations.Add( lcAtt ); + } + } + ); + + + var members = new List(); + + walker.Iterate( csClass, + n => + { + if ( n is CSEnumDeclaration en ) + { + var enumType = new GDScriptGeneratorEnum(); + enumType.name = en.objectName.match; + + var values = en.objectBody.children.FilterType( ); + enumType.values =values.Map( v => v.GetEnumName() ); + + gdClass.members.Add( enumType ); + + return; + } + + if ( ! ( n is CSMemberDeclaration ) ) + { + return; + } + + + var m = n as CSMemberDeclaration; + + GDScriptGeneratorMember gdMember = null; + + if ( m is CSFieldDeclaration f ) + { + var gdField = new GDScriptGeneratorField(); + gdField.name = CStoGDVariable( f.GetMemberName() ); + gdField.memberType = f.GetMemberType(); + + gdMember = gdField; + } + else if ( m is CSMethodMemberDeclaration me ) + { + var gdMethod = new GDScriptGeneratorMethod(); + gdMethod.name = me.isContructor ? "_init" : CStoGDVariable( me.GetMemberName() ); + gdMethod.memberType = me.GetMemberType(); + gdMethod.isConstructor = me.isContructor; + + if ( me.parametersContent != null ) + { + me.parametersContent.children.ForEach( + ( c ) => + { + var p = c as CSParameterDeclaration; + + var gdParameter = new GDScriptGeneratorParameter(); + gdParameter.name = p.GetParameterName(); + gdParameter.parameterType = p.GetParameterType(); + + gdMethod.parameters.Add( gdParameter ); + + if ( p.parameterValue != null ) + { + gdParameter.parameterValue = p.GetParameterValue(); + } + } + ); + } + + gdMember = gdMethod; + } + + if ( gdMember == null ) + { + return; + } + + if ( CSModifierAttributesParser.IsExported( m.attributeBrackets ) ) + { + gdMember.annotations.Add( "export" ); + } + + gdClass.members.Add( gdMember ); + + }, + false + ); + + } +} \ No newline at end of file diff --git a/Runtime/Text/CodeGenerators/GDScript/GDScriptFromCSAST.cs.uid b/Runtime/Text/CodeGenerators/GDScript/GDScriptFromCSAST.cs.uid new file mode 100644 index 0000000..f1707d2 --- /dev/null +++ b/Runtime/Text/CodeGenerators/GDScript/GDScriptFromCSAST.cs.uid @@ -0,0 +1 @@ +uid://cgi2d0hhd5d6t diff --git a/Runtime/Text/CodeGenerators/GDScript/GDScriptGenerator.cs b/Runtime/Text/CodeGenerators/GDScript/GDScriptGenerator.cs new file mode 100644 index 0000000..585981c --- /dev/null +++ b/Runtime/Text/CodeGenerators/GDScript/GDScriptGenerator.cs @@ -0,0 +1,28 @@ +using System.Collections; +using System.Collections.Generic; +using System.Text; +using System.Text.RegularExpressions; + +namespace Rokojori; + +public class GDScriptGenerator +{ + public static readonly string GD_SCRIPT_TRANSPILING = "GD_SCRIPT_TRANSPILING"; + public List gdClasses = new List(); + + + public void Generate( string outputPath ) + { + gdClasses.ForEach( + ( gd )=> + { + var source = gd.Generate(); + RJLog.Log( "GD Script from:", gd.name, "\n" + source ); + var path = FilePath.Join( outputPath, gd.name + ".gd" ); + + RJLog.Log( "GD Script Save to:", path ); + FilesSync.SaveUTF8( path, source ); + } + ); + } +} \ No newline at end of file diff --git a/Runtime/Text/CodeGenerators/GDScript/GDScriptGenerator.cs.uid b/Runtime/Text/CodeGenerators/GDScript/GDScriptGenerator.cs.uid new file mode 100644 index 0000000..dd97096 --- /dev/null +++ b/Runtime/Text/CodeGenerators/GDScript/GDScriptGenerator.cs.uid @@ -0,0 +1 @@ +uid://duym6hiqy40dh diff --git a/Runtime/Text/CodeGenerators/GDScript/GDScriptGeneratorClass.cs b/Runtime/Text/CodeGenerators/GDScript/GDScriptGeneratorClass.cs new file mode 100644 index 0000000..d733200 --- /dev/null +++ b/Runtime/Text/CodeGenerators/GDScript/GDScriptGeneratorClass.cs @@ -0,0 +1,53 @@ +using System.Collections; +using System.Collections.Generic; +using System.Text; +using System.Text.RegularExpressions; + +namespace Rokojori; + +public class GDScriptGeneratorClass +{ + public List annotations = []; + public string name; + public string extendingClassName; + public List members = []; + + StringBuilder sb = new StringBuilder(); + + public string Generate() + { + sb.Append( "\n" ); + + annotations.ForEach( + annotation => + { + sb.Append( "@" ); + sb.Append( annotation ); + sb.Append( "\n" ); + } + ); + + AddClassHeader(); + sb.Append( "\n" ); + + members.ForEach( m => + { + m.Generate( sb ); + sb.Append( "\n" ); + }); + + return sb.ToString(); + } + + void AddClassHeader() + { + sb.Append( "class_name " + name ); + + if ( extendingClassName != null ) + { + sb.Append( " extends " + extendingClassName ); + } + + sb.Append( "\n" ); + } +} \ No newline at end of file diff --git a/Runtime/Text/CodeGenerators/GDScript/GDScriptGeneratorClass.cs.uid b/Runtime/Text/CodeGenerators/GDScript/GDScriptGeneratorClass.cs.uid new file mode 100644 index 0000000..b74042d --- /dev/null +++ b/Runtime/Text/CodeGenerators/GDScript/GDScriptGeneratorClass.cs.uid @@ -0,0 +1 @@ +uid://dvt4yeqpmmrur diff --git a/Runtime/Text/CodeGenerators/GDScript/GDScriptGeneratorEnum.cs b/Runtime/Text/CodeGenerators/GDScript/GDScriptGeneratorEnum.cs new file mode 100644 index 0000000..631599e --- /dev/null +++ b/Runtime/Text/CodeGenerators/GDScript/GDScriptGeneratorEnum.cs @@ -0,0 +1,32 @@ +using System.Collections; +using System.Collections.Generic; +using System.Text; +using System.Text.RegularExpressions; + +namespace Rokojori; + +public class GDScriptGeneratorEnum:GDScriptGeneratorMember +{ + public List values = new List(); + + public override void Generate( StringBuilder sb ) + { + sb.Append( "enum " + name + "\n" ); + sb.Append( "{\n" ); + + for ( int i = 0; i < values.Count; i ++ ) + { + var ending = "\n"; + + if ( i != ( values.Count - 1 ) ) + { + ending = ",\n"; + } + + sb.Append( " " + values[ i ] + ending ); + } + + sb.Append( "}\n" ); + } + +} \ No newline at end of file diff --git a/Runtime/Text/CodeGenerators/GDScript/GDScriptGeneratorEnum.cs.uid b/Runtime/Text/CodeGenerators/GDScript/GDScriptGeneratorEnum.cs.uid new file mode 100644 index 0000000..9be4ffc --- /dev/null +++ b/Runtime/Text/CodeGenerators/GDScript/GDScriptGeneratorEnum.cs.uid @@ -0,0 +1 @@ +uid://eqbysvejll0q diff --git a/Runtime/Text/CodeGenerators/GDScript/GDScriptGeneratorField.cs b/Runtime/Text/CodeGenerators/GDScript/GDScriptGeneratorField.cs new file mode 100644 index 0000000..81919f6 --- /dev/null +++ b/Runtime/Text/CodeGenerators/GDScript/GDScriptGeneratorField.cs @@ -0,0 +1,24 @@ +using System.Collections; +using System.Collections.Generic; +using System.Text; +using System.Text.RegularExpressions; + +namespace Rokojori; + +public class GDScriptGeneratorField:GDScriptGeneratorMember +{ + public override void Generate( StringBuilder sb ) + { + annotations.ForEach( + ( an )=> + { + sb.Append( "@" ); + sb.Append( an ); + sb.Append( "\n" ); + } + ); + + sb.Append( "var " + name + ": " + memberType + "; " ); + } + +} \ No newline at end of file diff --git a/Runtime/Text/CodeGenerators/GDScript/GDScriptGeneratorField.cs.uid b/Runtime/Text/CodeGenerators/GDScript/GDScriptGeneratorField.cs.uid new file mode 100644 index 0000000..e78ebb0 --- /dev/null +++ b/Runtime/Text/CodeGenerators/GDScript/GDScriptGeneratorField.cs.uid @@ -0,0 +1 @@ +uid://51c533ougel diff --git a/Runtime/Text/CodeGenerators/GDScript/GDScriptGeneratorMember.cs b/Runtime/Text/CodeGenerators/GDScript/GDScriptGeneratorMember.cs new file mode 100644 index 0000000..7684242 --- /dev/null +++ b/Runtime/Text/CodeGenerators/GDScript/GDScriptGeneratorMember.cs @@ -0,0 +1,17 @@ +using System.Collections; +using System.Collections.Generic; +using System.Text; +using System.Text.RegularExpressions; + +namespace Rokojori; + +public abstract class GDScriptGeneratorMember +{ + public string name; + public string memberType; + public List annotations = []; + + + public abstract void Generate( StringBuilder sb ); + +} \ No newline at end of file diff --git a/Runtime/Text/CodeGenerators/GDScript/GDScriptGeneratorMember.cs.uid b/Runtime/Text/CodeGenerators/GDScript/GDScriptGeneratorMember.cs.uid new file mode 100644 index 0000000..e864a06 --- /dev/null +++ b/Runtime/Text/CodeGenerators/GDScript/GDScriptGeneratorMember.cs.uid @@ -0,0 +1 @@ +uid://bnl20gavp2hi2 diff --git a/Runtime/Text/CodeGenerators/GDScript/GDScriptGeneratorMethod.cs b/Runtime/Text/CodeGenerators/GDScript/GDScriptGeneratorMethod.cs new file mode 100644 index 0000000..16fd301 --- /dev/null +++ b/Runtime/Text/CodeGenerators/GDScript/GDScriptGeneratorMethod.cs @@ -0,0 +1,75 @@ +using System.Collections; +using System.Collections.Generic; +using System.Text; +using System.Text.RegularExpressions; + +namespace Rokojori; + +public class GDScriptGeneratorMethod:GDScriptGeneratorMember +{ + public List parameters = []; + public string body = ""; + public bool isConstructor = false; + + public override void Generate( StringBuilder sb ) + { + sb.Append( "\n" ); + sb.Append( "func " + name + "(" ); + + var first = true; + + if ( parameters.Count > 0 ) + { + sb.Append( " " ); + } + + parameters.ForEach( + ( p ) => + { + if ( first ) + { + first = false; + } + else + { + sb.Append( ", " ); + } + + p.Generate( sb ); + + } + ); + + if ( parameters.Count > 0 ) + { + sb.Append( " " ); + } + + if ( isConstructor ) + { + sb.Append( "):\n" ); + } + else + { + sb.Append( ") -> " + memberType + ":\n" ); + } + + + if ( string.IsNullOrEmpty( body ) ) + { + sb.Append( " pass" ); + } + else + { + sb.Append( body ); + } + + + sb.Append( "\n" ); + sb.Append( "## ---"); + sb.Append( "\n" ); + + } + + +} \ No newline at end of file diff --git a/Runtime/Text/CodeGenerators/GDScript/GDScriptGeneratorMethod.cs.uid b/Runtime/Text/CodeGenerators/GDScript/GDScriptGeneratorMethod.cs.uid new file mode 100644 index 0000000..1b2114c --- /dev/null +++ b/Runtime/Text/CodeGenerators/GDScript/GDScriptGeneratorMethod.cs.uid @@ -0,0 +1 @@ +uid://ddcgqrokie8en diff --git a/Runtime/Text/CodeGenerators/GDScript/GDScriptGeneratorParameter.cs b/Runtime/Text/CodeGenerators/GDScript/GDScriptGeneratorParameter.cs new file mode 100644 index 0000000..9004d41 --- /dev/null +++ b/Runtime/Text/CodeGenerators/GDScript/GDScriptGeneratorParameter.cs @@ -0,0 +1,24 @@ +using System.Collections; +using System.Collections.Generic; +using System.Text; +using System.Text.RegularExpressions; + +namespace Rokojori; + +public class GDScriptGeneratorParameter +{ + public string name; + public string parameterType; + public string parameterValue; + + public void Generate( StringBuilder sb ) + { + sb.Append( name + ": " + parameterType ); + + if ( parameterValue != null ) + { + sb.Append( " = " + parameterValue ); + } + } + +} \ No newline at end of file diff --git a/Runtime/Text/CodeGenerators/GDScript/GDScriptGeneratorParameter.cs.uid b/Runtime/Text/CodeGenerators/GDScript/GDScriptGeneratorParameter.cs.uid new file mode 100644 index 0000000..c786982 --- /dev/null +++ b/Runtime/Text/CodeGenerators/GDScript/GDScriptGeneratorParameter.cs.uid @@ -0,0 +1 @@ +uid://bg3fdqomodfh2 diff --git a/Runtime/Text/Lexing/Lexer.cs b/Runtime/Text/Lexing/Lexer.cs index 9b66233..eff29e6 100644 --- a/Runtime/Text/Lexing/Lexer.cs +++ b/Runtime/Text/Lexing/Lexer.cs @@ -42,6 +42,10 @@ namespace Rokojori public bool hasError => _hasError; + public virtual void Clear() + { + _hasError = false; + } void AddMatcher( LexerMatcher matcher ) { @@ -74,6 +78,16 @@ namespace Rokojori AddMatcher( type, new Regex( regex ), mode, nextMode ); } + public virtual bool HasVariableMatch( string type ) + { + return LexerMatcherLibrary.CwordMatcher.type == type || LexerMatcherLibrary.CFunctionMatcher.type == type; + } + + public static bool IsVariableMatchType( string type ) + { + return LexerMatcherLibrary.CwordMatcher.type == type || LexerMatcherLibrary.CFunctionMatcher.type == type; + } + public LexerMatcher GetMatcher( string source, string mode ="" ) { var matchers = _modes[ mode ]; diff --git a/Runtime/Text/Lexing/LexerLibrary/CSharpLexer.cs b/Runtime/Text/Lexing/LexerLibrary/CSLexer.cs similarity index 92% rename from Runtime/Text/Lexing/LexerLibrary/CSharpLexer.cs rename to Runtime/Text/Lexing/LexerLibrary/CSLexer.cs index 198f374..e051c33 100644 --- a/Runtime/Text/Lexing/LexerLibrary/CSharpLexer.cs +++ b/Runtime/Text/Lexing/LexerLibrary/CSLexer.cs @@ -12,11 +12,11 @@ namespace Rokojori } - public class CSharpLexer:Lexer + public class CSLexer:Lexer { public static List Lex( string source ) { - var lexer = new CSharpLexer(); + var lexer = new CSLexer(); var events = lexer.LexToList( source ); if ( lexer.hasError ) @@ -36,8 +36,7 @@ namespace Rokojori } public static List GetAllObjectDefinitions( List tokens ) - { - + { var START = Trillean.True; var END = Trillean.False; @@ -72,7 +71,7 @@ namespace Rokojori return sequences.Map( s => new CSharpObjectDefinition{ type = s[ 0 ], name = s[ s.Count - 1 ] } ); } - public CSharpLexer() + public CSLexer() { AddAllMatchers( LexerMatcherLibrary.SingleLineCommentMatcher, @@ -87,7 +86,7 @@ namespace Rokojori LexerMatcherLibrary.WhiteSpaceMatcher, LexerMatcherLibrary.LogicMatcher, LexerMatcherLibrary.BracketMatcher, - LexerMatcherLibrary.AccessModifierMatcher, + LexerMatcherLibrary.CSAccessModifierMatcher, LexerMatcherLibrary.ClassMatcher, LexerMatcherLibrary.EnumMatcher, LexerMatcherLibrary.StructMatcher, @@ -95,6 +94,8 @@ namespace Rokojori LexerMatcherLibrary.RecordMatcher, LexerMatcherLibrary.OperatorMatcher, LexerMatcherLibrary.CFunctionMatcher, + LexerMatcherLibrary.UsingMatcher, + LexerMatcherLibrary.NamespaceMatcher, LexerMatcherLibrary.CwordMatcher, LexerMatcherLibrary.AnySymbolMatcher ); diff --git a/Runtime/Text/Lexing/LexerLibrary/CSharpLexer.cs.uid b/Runtime/Text/Lexing/LexerLibrary/CSLexer.cs.uid similarity index 100% rename from Runtime/Text/Lexing/LexerLibrary/CSharpLexer.cs.uid rename to Runtime/Text/Lexing/LexerLibrary/CSLexer.cs.uid diff --git a/Runtime/Text/Lexing/LexerMatcherLibrary.cs b/Runtime/Text/Lexing/LexerMatcherLibrary.cs index 1a8686f..fa998f9 100644 --- a/Runtime/Text/Lexing/LexerMatcherLibrary.cs +++ b/Runtime/Text/Lexing/LexerMatcherLibrary.cs @@ -18,6 +18,11 @@ namespace Rokojori public static readonly LexerMatcher PHPWordMatcher = new LexerMatcher( "PHPWord", @"\$?[a-zA-Z_]\w*" ); + public static readonly LexerMatcher UsingMatcher = + new LexerMatcher( "Using", @"using" ); + + public static readonly LexerMatcher NamespaceMatcher = + new LexerMatcher( "Namespace", @"namespace" ); public static readonly LexerMatcher CSS_ClassSelectorMatcher = new LexerMatcher( "CSS_ClassSelector", @"\.[a-zA-Z_](\w|\-)*" ); @@ -58,7 +63,7 @@ namespace Rokojori new LexerMatcher( "Logic", "if|else|switch|do|while|for|break|continue|return" ); public static readonly LexerMatcher OperatorMatcher = - new LexerMatcher( "Operator", "(?:\\=\\=)|(?:\\+\\+)|(?:\\-\\-)|(?:\\+\\=)|(?:\\*\\=)|(?:\\-\\=)|(?:\\/\\=)|\\+|\\-|\\*|\\/|\\^|\\||\\~|\\&|\\%|\\<|\\>|\\=|\\!|\\.|\\:|\\,|\\;" ); + new LexerMatcher( "Operator", "(?:\\=\\=)|(?:\\+\\+)|(?:\\-\\-)|(?:\\+\\=)|(?:\\*\\=)|(?:\\-\\=)|(?:\\/\\=)|(?:\\=\\>)|\\+|\\-|\\*|\\/|\\^|\\|\\||\\||\\~|\\&\\&|\\&|\\%|\\<|\\>|\\=|\\!|\\.|\\:|\\,|\\;" ); public static readonly LexerMatcher BracketMatcher = new LexerMatcher( "Bracket", @"\(|\)|\[|\]|\{|\}" ); @@ -87,6 +92,9 @@ namespace Rokojori public static readonly LexerMatcher AccessModifierMatcher = new LexerMatcher( "AccessModifier", @"\b(?:public|protected|private|const)\b" ); + public static readonly LexerMatcher CSAccessModifierMatcher = + new LexerMatcher( "AccessModifier", @"\b(?:public|protected|private|const|partial|internal|abstract|static|sealed|virtual|override|readonly|ref|unsafe|new)\b" ); + public static readonly LexerMatcher SingleLineCommentMatcher = new LexerMatcher( "SingleLineComment", @"//.*" ); diff --git a/Runtime/Text/Parsing/AST/ASTFileRoot.cs b/Runtime/Text/Parsing/AST/ASTFileRoot.cs new file mode 100644 index 0000000..59bc54c --- /dev/null +++ b/Runtime/Text/Parsing/AST/ASTFileRoot.cs @@ -0,0 +1,18 @@ +using System.Collections; +using System.Collections.Generic; +using System.Text.RegularExpressions; +using System.Text; + +using System.Globalization; +using Godot; + +namespace Rokojori; + +public interface ASTFileRoot +{ + public string GetFilePath(); + public string GetSource(); + public TextLinesMapper GetTextLinesMapper(); + public Parser GetParser(); + +} \ No newline at end of file diff --git a/Runtime/Text/Parsing/AST/ASTFileRoot.cs.uid b/Runtime/Text/Parsing/AST/ASTFileRoot.cs.uid new file mode 100644 index 0000000..d9acadb --- /dev/null +++ b/Runtime/Text/Parsing/AST/ASTFileRoot.cs.uid @@ -0,0 +1 @@ +uid://blsoe8oknj2wy diff --git a/Runtime/Text/Parsing/AST/ASTNode.cs b/Runtime/Text/Parsing/AST/ASTNode.cs new file mode 100644 index 0000000..f1e43ee --- /dev/null +++ b/Runtime/Text/Parsing/AST/ASTNode.cs @@ -0,0 +1,918 @@ +using System.Collections; +using System.Collections.Generic; +using System.Text.RegularExpressions; +using System.Text; + +using System.Globalization; +using Godot; +using System; + +namespace Rokojori; + +public abstract class ASTNode +{ + Parser _parser; + + public Parser parser + { + get + { + if ( _parser == null ) + { + var root = this is ASTFileRoot ? (ASTFileRoot) this : + ( ASTWalker.instance.GetParentWithType( this ) as ASTFileRoot ); + + _parser = root.GetParser(); + } + + return _parser; + } + } + + public ASTNode parent; + public List children = []; + + + int ComputeIndex( int index ) + { + return index >= 0 ? index : ( children.Count + index ); + } + + + public string CreateDebugTreeInfo() + { + var walker = ASTWalker.instance; + + var end = walker.IterationEndOf( this ); + + var it = this; + + var depthMap = new Dictionary(); + + Func GetDepth = null; + + GetDepth = n => + { + if ( depthMap.ContainsKey( n ) ) + { + return depthMap[ n ]; + } + + if ( n.parent == null ) + { + return 0; + } + + var parentDepth = GetDepth( n.parent ); + var ownDepth = parentDepth + 1; + + depthMap[ n ] = ownDepth; + + return ownDepth; + }; + + var lines = new List(); + + while ( it != end ) + { + var indent = " ".Repeat( GetDepth( it ) ); + var info = indent + "-- [#" + it.childIndex + "] " + it.GetType(); + + + if ( it is Token tk ) + { + info += "'" + tk.match+ "'"; + } + else + { + info += "(" + it.children.Count + ")"; + } + + lines.Add( info ); + + it = walker.NextNode( it ); + } + + return lines.Join( "\n"); + + } + + public List GrabTokenRange( Token start, Token end, bool filter ) + { + if ( start.parent != this || end.parent != this ) + { + RJLog.Error( "Tokens are not children of this", GetType().Name, "start:", start, "end:", end ); + return null; + } + + var startIndex = start.childIndex; + var endIndex = end.childIndex; + + // RJLog.Log( "Grabbing Child Range:", startIndex, "to", endIndex, " num children:", children.Count ); + var unfiltered = children.Range( start.childIndex, end.childIndex ); + var filtered = unfiltered.Filter( n => n is Token && ( ! filter || ! n.IsIgnoreToken() ) ); + return filtered.Map( f => f as Token ); + } + + public void MergeChildren( int start, int length, ASTNode merger ) + { + merger.parent = this; + merger.children = children.Sub( start, length ); + merger.children.ForEach( c => c.parent = merger ); + + children.ReplaceRange( start, length, [ merger ] ); + } + + public T MergeInner( int indexStart, int indexEnd ) where T:ASTNode,new() + { + var start = indexStart + 1; + var length = indexEnd - start; + + return MergeChildrenWith( start, length ); + } + + public T MergeOuter( int indexStart, int indexEnd ) where T:ASTNode,new() + { + var start = indexStart; + var length = indexEnd - start + 1; + + return MergeChildrenWith( start, length ); + } + + public T MergeOuter( ASTNode nodeStart, ASTNode nodeEnd ) where T:ASTNode,new() + { + if ( nodeStart.parent != this || nodeEnd.parent != this ) + { + RJLog.Error( "Nodes are not child of this node:", this, + "start:", nodeStart, "start is child:", nodeStart.parent == this, + "end:", nodeEnd, "end is child:", nodeEnd.parent == this + ); + return null; + } + + var startIndex = nodeStart.childIndex; + var endIndex = children.FindIndex( startIndex, c => c == nodeEnd ); + + return MergeOuter( startIndex, endIndex ); + } + + public T MergeInner( ASTNode nodeStart, ASTNode nodeEnd ) where T:ASTNode,new() + { + if ( nodeStart.parent != this || nodeEnd.parent != this ) + { + RJLog.Error( "Nodes are not child of this node:", this, "start:", nodeStart, "end:", nodeEnd ); + return null; + } + + var startIndex = nodeStart.childIndex; + var endIndex = children.FindIndex( startIndex, c => c == nodeEnd ); + + RJLog.Log( "Merging:", startIndex, endIndex ); + + if ( startIndex == -1 || endIndex == - 1 ) + { + return null; + } + + return MergeInner( startIndex, endIndex ); + } + + public int childIndex => parent == null ? -1 : parent.children.IndexOf( this ); + public int reverseIndexOffset => parent == null ? -1 : + ( ( parent.children.Count - 1 ) - childIndex ); + + public string CombinedMatch() + { + if ( this is Token tk ) + { + return tk.match; + } + + var tokens = children.FilterType(); + + return tokens.Map( t => t.match ).Join( "" ); + } + + public void ExpandToPrevious( ASTNode previousSibling ) + { + if ( parent == null || previousSibling == null || parent != previousSibling.parent ) + { + RJLog.Error( "Invalid sibling", previousSibling?.GetType().Name ?? "null" ); + return; + } + + var start = previousSibling.childIndex; + var length = childIndex - start; + + var beforeCount = children.Count; + + var range = parent.children.Sub( start, length ); + parent.children.RemoveRange( start, length ); + + range.ForEach( r => r.parent = this ); + children.Prepend( range ); + + RJLog.Log( "Expanded from", beforeCount, "to", children.Count, "( " + length + " )" ); + } + + public ASTWalker walker => Singleton.Get(); + + public T GetParentWithType() + { + return walker.GetParentWithType( this ); + } + + public T MergeChildrenWith( int start, int length ) where T:ASTNode, new() + { + var t = new T(); + MergeChildren( start, length, t ); + return t; + } + + public int FindIndex( System.Func evaluator, int offset = 0, int end = -1, bool forward = true ) + { + offset = ComputeIndex( offset ); + end = ComputeIndex( end ); + + var change = forward ? 1 : -1; + end += change; + + // RJLog.Log( "start:", offset, "end:", end, "direction:", change > 0 ? "forward" : "backwards", change, "children:", children.Count ); + for ( int i = offset; i != end; i += change ) + { + if ( evaluator( children[ i ] ) ) + { + return i; + } + else + { + // RJLog.Log( "not matching", children[ i ] ); + } + } + + return -1; + } + + public ASTNode FindNode( System.Func evaluator, int offset = 0 ) + { + var index = FindIndex( evaluator, offset ); + return index == -1 ? null : children[ index ]; + } + + public int ReverseFindBracketOpenerIndex( string open, string close, int closeIndex ) + { + closeIndex --; + var count = 1; + + // RJLog.Log( "ReverseFindBracketOpenerIndex", open, close, closeIndex ); + + for ( int i = closeIndex; i >= 0; i-- ) + { + + var child = children[ i ]; + + // RJLog.Log( "index", i, count, child ); + + if ( child.IsToken( LexerMatcherLibrary.BracketMatcher, open ) ) + { + count --; + + if ( count == 0 ) + { + return i; + } + } + else if ( child.IsToken( LexerMatcherLibrary.BracketMatcher, close ) ) + { + count ++; + } + + // RJLog.Log( "index", i, count ); + } + + return -1; + } + + public int FindBracketCloserIndex( string open, string close, int openIndex ) + { + openIndex ++; + var count = 1; + + // RJLog.Log( "ReverseFindBracketOpenerIndex", open, close, closeIndex ); + + for ( int i = openIndex; i < children.Count; i++ ) + { + + var child = children[ i ]; + + // RJLog.Log( "index", i, count, child ); + + if ( child.IsToken( LexerMatcherLibrary.BracketMatcher, close ) ) + { + count --; + + if ( count == 0 ) + { + return i; + } + } + else if ( child.IsToken( LexerMatcherLibrary.BracketMatcher, open ) ) + { + count ++; + } + + // RJLog.Log( "index", i, count ); + } + + return -1; + } + + public List GetSeparatorIndices( string separator, int start, int end, List blockPredicates = null, Lexer lexer = null ) + { + lexer = lexer ?? new CSLexer(); + + var hasBlockPredicated = blockPredicates != null; + + var separatorPredicate = TokenPredicateData.Lexed( lexer, separator ); + + if ( ! hasBlockPredicated ) + { + blockPredicates = new List(); + + blockPredicates.Add( TokenPredicateData.Lexed( lexer, "<" ) ); + blockPredicates.Add( TokenPredicateData.Lexed( lexer, ">" ) ); + + blockPredicates.Add( TokenPredicateData.Lexed( lexer, "[" ) ); + blockPredicates.Add( TokenPredicateData.Lexed( lexer, "]" ) ); + + blockPredicates.Add( TokenPredicateData.Lexed( lexer, "(" ) ); + blockPredicates.Add( TokenPredicateData.Lexed( lexer, ")" ) ); + + blockPredicates.Add( TokenPredicateData.Lexed( lexer, "{" ) ); + blockPredicates.Add( TokenPredicateData.Lexed( lexer, "}" ) ); + } + + var bcCounter = new List(); + + for ( int i = 0; i < blockPredicates.Count; i+= 2 ) + { + bcCounter.Add( 0 ); + } + + + var inBlock = false; + + var indices = new List(); + + for ( int i = start + 1; i < end; i++ ) + { + if ( children[ i ].IsIgnoreToken() ) + { + continue; + } + + if ( ! inBlock && separatorPredicate.Matches( children[ i ] ) ) + { + indices.Add( i ); + continue; + } + + var bcIndex = blockPredicates.FindIndex( bc => bc.Matches( children[ i ] ) ); + + if ( bcIndex == -1 ) + { + continue; + } + + var index = bcIndex / 2; + var isUp = index * 2 == bcIndex; + + var change = isUp ? 1 : -1; + + bcCounter[ index ] += change; + + var sum = 0; bcCounter.ForEach( b => sum += b ); + inBlock = sum != 0; + + } + + return indices; + } + + public void CreateSeperatedList( string separator, Action callback = null ) where T:ASTNode, new() + { + var indices = GetSeparatorIndices( separator, -1, children.Count ); + + indices.Insert( 0, -1 ); + indices.Add( children.Count ); + + RJLog.Log( "Parameters Indices:", indices.Count, CombinedMatch() ); + + var nodes = new List(); + + + for ( int i = 0; i < indices.Count - 1; i++ ) + { + var start = indices[ i ] + 1; + var end = indices[ i + 1 ] - 1; + + var t = new T(); + + RJLog.Log( "Parameters Grabbing Indices:", start, end ); + + if ( start > end || start < 0 || end < 0 || start >= children.Count || end >= children.Count ) + { + RJLog.Error( "Invalid seperation indices", this, CombinedMatch() ); + throw new Exception(); + } + + if ( start == end ) + { + t.children = [ children[ start ] ]; + } + else + { + t.children = children.Range( start, end ); + } + + t.children.ForEach( c => c.parent = t ); + nodes.Add( t ); + t.parent = this; + } + + children = nodes; + + if ( callback != null ) + { + children.ForEach( n => callback( n as T ) ); + } + + } + + + public Token FindBracketCloser( string open, string close, int openIndex ) + { + var index = FindBracketCloserIndex( open, close, openIndex ); + + return index == -1 ? null : ( children[ index ] as Token ); + } + + public Token ReverseFindBracketOpener( string open, string close, int closeIndex ) + { + var index = ReverseFindBracketOpenerIndex( open, close, closeIndex ); + + return index == -1 ? null : ( children[ index ] as Token ); + } + + public bool IsToken( LexerMatcher matcher, string match = null ) + { + return this is Token tk && tk.Is( matcher, match ); + } + + public bool IsToken( string type, string match = null ) + { + return this is Token tk && tk.Is( type, match ); + } + + public bool IsAnyTokenOf( LexerMatcher[] matchers ) + { + return this is Token tk && tk.lexerEvent.IsAnyOf( matchers ); + } + + public bool IsAnyTokenOf( List predicates ) + { + return this is Token && predicates.Find( p => p.Matches( this ) ) != null ; + } + + public bool IsIgnoreToken() + { + return IsAnyTokenOf( LexerMatcherLibrary.Ignore ); + } + + public int IndexOffset( int index, int offset ) + { + if ( offset < 0 ) + { + while ( offset < 0 ) + { + index = PreviousIndex( index ); + offset ++; + } + } + else + { + while ( offset > 0 ) + { + index = NextIndex( index ); + offset--; + } + } + + return index; + } + + public int PreviousIndex( int index ) + { + for ( int i = index - 1; i >= 0; i-- ) + { + if ( children[ i ].IsIgnoreToken() ) + { + continue; + } + + return i; + } + + return -1; + } + + public ASTNode PreviousNode( int index ) + { + return IndexToChildNode( PreviousIndex( index ) ); + } + + public int NextIndex( int index ) + { + for ( int i = index + 1; i < children.Count; i++ ) + { + if ( children[ i ].IsIgnoreToken() ) + { + continue; + } + + return i; + } + + return -1; + } + + public ASTNode NextNode( int index ) + { + return IndexToChildNode( NextIndex( index ) ); + } + + ASTNode IndexToChildNode( int index ) + { + return index == -1 ? null : children[ index ]; + } + + public Token FindToken( LexerMatcher matcher, int offset = 0 ) + { + return FindToken( matcher, null, offset ); + } + + public Token FindToken( TokenPredicateData predicateData, int offset = 0 ) + { + return FindToken( predicateData.type, predicateData.match, offset ); + } + + public Token FindToken( string type, string match, int offset = 0 ) + { + return FindNode( n => n.IsToken( type, match ), offset ) as Token; + } + + + public Token FindToken( LexerMatcher matcher, string match, int offset = 0 ) + { + return FindNode( n => n.IsToken( matcher, match ), offset ) as Token; + } + + public int FindTokenIndex( LexerMatcher matcher, string match, int offset = 0, int end = -1, bool forward = true ) + { + return FindIndex( n => n.IsToken( matcher, match ), offset, end, forward ); + } + + public int FindTokenIndex( string type, string match, int offset = 0, int end = -1, bool forward = true ) + { + return FindIndex( n => n.IsToken( type, match ), offset, end, forward ); + } + + public int FindTokenIndex( LexerMatcher matcher, int offset = 0, int end = -1, bool forward = true ) + { + return FindIndex( n => n.IsToken( matcher, null ), offset, end, forward ); + } + + public int ReverseFindTokenIndex( LexerMatcher matcher, int reverseOffset = 0) + { + return FindTokenIndex( matcher, -( 1 + reverseOffset ), 0, false ); + } + + public int ReverseFindTokenIndex( TokenPredicateData predicateData, int reverseOffset = 0 ) + { + return FindTokenIndex( predicateData.type, predicateData.match, -( 1 + reverseOffset ), 0, false ); + } + + public Token ReverseFindToken( TokenPredicateData predicateData, int reverseOffset = 0 ) + { + var index = ReverseFindTokenIndex( predicateData, reverseOffset ); + + return index == -1 ? null : ( children[ index ] as Token ); + } + + public List GetFilteredTokens( int offset = 0, int end = -1 ) + { + var tokens = new List(); + + IterateTokens( tokens.Add, offset, end ); + + return tokens; + } + + + + public void Iterate( Action action, Predicate filter = null, int offset = 0, int end = -1, bool forward = true ) + { + offset = ComputeIndex( offset ); + end = ComputeIndex( end ); + + int change = forward ? 1 : -1; + end += change; + + for ( int i = offset; i != end; i += change ) + { + if ( children[ i ] is T t && ( filter == null || filter( t ) ) ) + { + action( t ); + } + } + + + } + + public void IterateTokens( Action action, int start = 0, int end = -1, LexerMatcher[] ignoreMatchers = null, bool forward = true ) + { + start = ComputeIndex( start ); + end = ComputeIndex( end ); + + ignoreMatchers = ignoreMatchers ?? LexerMatcherLibrary.Ignore; + Iterate( action, ( t ) => ! t.IsAnyTokenOf( ignoreMatchers ), start, end, true ); + } + + public string GetTokenMatches( int offset = 0, int end = -1, LexerMatcher[] ignoreMatchers = null ) + { + var sb = new StringBuilder(); + + IterateTokens( + ( tk )=> + { + sb.Append( tk.match ); + }, + offset, end, + ignoreMatchers, + true + ); + + return sb.ToString(); + } + + public int SearchIndex( Predicate searchPredicate, Predicate ignore = null, int offset = 0, int end = -1, bool forward = true ) + { + offset = ComputeIndex( offset ); + end = ComputeIndex( end ); + + var change = forward ? 1 : -1; + end += change; + + // RJLog.Log( "SearchIndex", offset, end, "Change", change ); + + if ( change > 0 && end < offset ) + { + throw new System.Exception( "Invalid range, offset is higher than end: " + offset + " >> " + end ); + } + else if ( change < 0 && end > offset ) + { + throw new System.Exception( "Invalid range, offset is lower than end: " + offset + " >> " + end ); + } + + for ( int i = offset; i != end; i += change ) + { + if ( searchPredicate( children[ i ] ) ) + { + return i; + } + + if ( ignore( children[ i ] ) ) + { + continue; + } + + return -1; + } + + + return -1; + } + + public int SearchFilteredTokenIndex( LexerMatcher matcher, string match, int offset = 0 ) + { + return SearchIndex( + ( n ) => n.IsToken( matcher, match ), + ( n ) => n.IsAnyTokenOf( LexerMatcherLibrary.Ignore ), + offset, -1, + true + ); + } + + public int SearchFilteredTokenIndex( string type, string match, int offset = 0 ) + { + return SearchIndex( + ( n ) => n.IsToken( type, match ), + ( n ) => n.IsAnyTokenOf( LexerMatcherLibrary.Ignore ), + offset, -1, + true + ); + } + + public int SearchFilteredTokenIndex( Predicate predicate, int offset = 0 ) + { + return SearchIndex( + ( n ) => n is Token t && predicate( t ), + ( n ) => n.IsAnyTokenOf( LexerMatcherLibrary.Ignore ), + offset, -1, + true + ); + } + + public int SearchFilteredTokenIndex( LexerMatcher matcher, int offset = 0 ) + { + return SearchFilteredTokenIndex( matcher, null, offset ); + } + + public List SearchFilteredSequence( List> sequence, int offset = 0 ) + { + var output = new List(); + + for ( int i = 0; i < sequence.Count; i++ ) + { + var next = SearchFilteredTokenIndex( sequence[ i ], offset ); + + if ( next == -1 ) + { + // RJLog.Log( "Could not find sequence step", i, "at offset", offset ); + return null; + } + + // RJLog.Log( "Found sequence step", i, "at offset", offset, "in", next ); + output.Add( next ); + + offset = next + 1; + } + + + return output; + } + + public List SearchFilteredRepeatSequence( List> start, List> sequence, List> end, int offset = 0 ) + { + // RJLog.Log( "==== SearchFilteredRepeatSequence", offset ); + var output = new List(); + + if ( start != null ) + { + var startList = SearchFilteredSequence( start, offset ); + + if ( startList == null ) + { + // RJLog.Log( "Start not matched", offset ); + return null; + } + + // RJLog.Log( "Start matched", offset ); + output.AddRange( startList ); + + offset = output[ output.Count - 1 ] + 1; + + // RJLog.Log( "Offset after start", offset ); + } + + if ( sequence.Count > 0 ) + { + var repeatedNext = SearchFilteredSequence( sequence, offset ); + + if ( repeatedNext == null ) + { + // RJLog.Log( "Repeat not matched", offset ); + } + + var maxSteps = 1000; + var steps = 0; + + while ( repeatedNext != null && steps < maxSteps ) + { + // RJLog.Log( "Repeat matched:", + // "offset", offset, + // "steps", steps + // ); + output.AddRange( repeatedNext ); + offset = output[ output.Count - 1 ] + 1; + repeatedNext = SearchFilteredSequence( sequence, offset ); + + steps ++; + } + + + // RJLog.Log( "Offset after repeat", offset ); + + } + + if ( end != null ) + { + var endList = SearchFilteredSequence( end, offset ); + + if ( endList == null ) + { + // RJLog.Log( "End not matched", offset ); + return null; + } + + // RJLog.Log( "End matched", offset ); + output.AddRange( endList ); + } + + return output; + } + + public Token FindTriggerToken( int offset, List triggerPredicates, List blockPredicates ) + { + var index = FindTriggerTokenIndex( offset, triggerPredicates, blockPredicates ); + + return index == -1 ? null : children[ index ] as Token; + } + + static bool _IsInsideBlock( List counters ) + { + for ( int i = 0; i < counters.Count; i++ ) + { + if ( counters[ i ] > 0 ) + { + return true; + } + } + + return false; + } + + public int FindTriggerTokenIndex( int offset, List triggerPredicates, List blockPredicates ) + { + var blockTypesCounter = new List(); + var insideBlock = false; + + for ( int i = 0; i < blockPredicates.Count / 2; i++ ) + { + blockTypesCounter.Add( 0 ); + } + + for ( int i = offset; i < children.Count; i++ ) + { + + var child = children[ i ]; + + if ( child.IsIgnoreToken() ) + { + continue; + } + + + + if ( ! insideBlock ) + { + var triggerIndex = triggerPredicates.FindIndex( t => t.Matches( child ) ); + + // RJLog.Log( "Checking:", insideBlock, children[ i ], triggerIndex ); + + if ( triggerIndex != -1 ) + { + return i; + } + + } + else + { + // RJLog.Log( "Checking:", insideBlock, children[ i ] ); + } + + var blockIndex = blockPredicates.FindIndex( b => b.Matches( child ) ); + + if ( blockIndex == -1 ) + { + continue; + } + + var typeIndex = blockIndex / 2; + + var change = typeIndex * 2 == blockIndex ? 1 : -1; + + blockTypesCounter[ typeIndex ] += change; + + + insideBlock = _IsInsideBlock( blockTypesCounter ); + + + + // RJLog.Log( "bracket type:", typeIndex, "change:", change, "insideBlock:", insideBlock, "counters:", blockTypesCounter.Join( ", " ) ); + } + + return -1; + } + +} \ No newline at end of file diff --git a/Runtime/Text/Parsing/AST/ASTNode.cs.uid b/Runtime/Text/Parsing/AST/ASTNode.cs.uid new file mode 100644 index 0000000..11244aa --- /dev/null +++ b/Runtime/Text/Parsing/AST/ASTNode.cs.uid @@ -0,0 +1 @@ +uid://c2sgo6erb113h diff --git a/Runtime/Text/Parsing/AST/ASTNodeList.cs b/Runtime/Text/Parsing/AST/ASTNodeList.cs new file mode 100644 index 0000000..b27d055 --- /dev/null +++ b/Runtime/Text/Parsing/AST/ASTNodeList.cs @@ -0,0 +1,15 @@ +using System.Collections; +using System.Collections.Generic; +using System.Text.RegularExpressions; +using System.Text; + +using System.Globalization; +using Godot; + +namespace Rokojori; + + +public class ASTNodeList:ASTNode +{ + +} diff --git a/Runtime/Text/Parsing/AST/ASTNodeList.cs.uid b/Runtime/Text/Parsing/AST/ASTNodeList.cs.uid new file mode 100644 index 0000000..a87e025 --- /dev/null +++ b/Runtime/Text/Parsing/AST/ASTNodeList.cs.uid @@ -0,0 +1 @@ +uid://b7bdp0xuww804 diff --git a/Runtime/Text/Parsing/AST/ASTWalker.cs b/Runtime/Text/Parsing/AST/ASTWalker.cs new file mode 100644 index 0000000..a8b42e7 --- /dev/null +++ b/Runtime/Text/Parsing/AST/ASTWalker.cs @@ -0,0 +1,36 @@ +using System.Collections; +using System.Collections.Generic; +using System.Text.RegularExpressions; +using System.Text; + +using System.Globalization; +using Godot; +using System; + +namespace Rokojori; + + +public class ASTWalker:TreeWalker +{ + public static readonly ASTWalker instance = new ASTWalker(); + + public override ASTNode Parent( ASTNode node ) + { + return node?.parent; + } + + public override ASTNode ChildAt( ASTNode node, int index ) + { + if ( node == null || index < 0 || index >= node.children.Count ) + { + return null; + } + + return node.children[ index ]; + } + + public override int NumChildren( ASTNode node ) + { + return node?.children.Count ?? 0; + } +} \ No newline at end of file diff --git a/Runtime/Text/Parsing/AST/ASTWalker.cs.uid b/Runtime/Text/Parsing/AST/ASTWalker.cs.uid new file mode 100644 index 0000000..6af338c --- /dev/null +++ b/Runtime/Text/Parsing/AST/ASTWalker.cs.uid @@ -0,0 +1 @@ +uid://dckstcta240bf diff --git a/Runtime/Text/Parsing/AST/EnumValueDeclaration.cs b/Runtime/Text/Parsing/AST/EnumValueDeclaration.cs new file mode 100644 index 0000000..55111d9 --- /dev/null +++ b/Runtime/Text/Parsing/AST/EnumValueDeclaration.cs @@ -0,0 +1,15 @@ +using System.Collections; +using System.Collections.Generic; +using System.Text.RegularExpressions; +using System.Text; + +using System.Globalization; +using Godot; + +namespace Rokojori; + +public interface EnumValueDeclaration +{ + public string GetEnumName(); + public string GetEnumValue(); +} \ No newline at end of file diff --git a/Runtime/Text/Parsing/AST/EnumValueDeclaration.cs.uid b/Runtime/Text/Parsing/AST/EnumValueDeclaration.cs.uid new file mode 100644 index 0000000..1e3a888 --- /dev/null +++ b/Runtime/Text/Parsing/AST/EnumValueDeclaration.cs.uid @@ -0,0 +1 @@ +uid://bm88qdxlr5bbl diff --git a/Runtime/Text/Parsing/AST/ImportDeclaration.cs b/Runtime/Text/Parsing/AST/ImportDeclaration.cs new file mode 100644 index 0000000..31d3795 --- /dev/null +++ b/Runtime/Text/Parsing/AST/ImportDeclaration.cs @@ -0,0 +1,14 @@ +using System.Collections; +using System.Collections.Generic; +using System.Text.RegularExpressions; +using System.Text; + +using System.Globalization; +using Godot; + +namespace Rokojori; + +public interface ImportDeclaration +{ + public string GetImportPath(); +} \ No newline at end of file diff --git a/Runtime/Text/Parsing/AST/ImportDeclaration.cs.uid b/Runtime/Text/Parsing/AST/ImportDeclaration.cs.uid new file mode 100644 index 0000000..e3f3bc1 --- /dev/null +++ b/Runtime/Text/Parsing/AST/ImportDeclaration.cs.uid @@ -0,0 +1 @@ +uid://bb50r0rlavqev diff --git a/Runtime/Text/Parsing/AST/Matchers/ASTMatchResult.cs b/Runtime/Text/Parsing/AST/Matchers/ASTMatchResult.cs new file mode 100644 index 0000000..d0ea560 --- /dev/null +++ b/Runtime/Text/Parsing/AST/Matchers/ASTMatchResult.cs @@ -0,0 +1,55 @@ +using System.Collections; +using System.Collections.Generic; +using System.Text.RegularExpressions; +using System.Text; + +using System.Globalization; +using Godot; +using System; + +namespace Rokojori; + +public class ASTMatchResult +{ + public ASTNode parent = null; + public int childOffset = -1; + public int resultStart = -1; + public int resultEnd = -1; + public bool matched = false; + + public Token resultStartToken => ! matched ? null : parent.children[ resultStart ] as Token; + public Token resultEndToken => ! matched ? null : parent.children[ resultEnd ] as Token; + + public void SetMatchedByLength( int matchLength ) + { + resultStart = childOffset; + resultEnd = childOffset + ( matchLength - 1 ); + matched = true; + } + + public void SetMatched( int index, int endIndex = -1 ) + { + resultStart = index; + resultEnd = endIndex == -1 ? index : endIndex; + matched = true; + } + + + + public int matchLength => ( resultEnd - resultStart ) + 1; + public int childOffsetMatchLength => ( resultEnd - childOffset ) + 1; + + public ASTMatchResult Clone() + { + var c = new ASTMatchResult(); + c.parent = parent; + c.childOffset = childOffset; + c.resultStart = resultStart; + c.resultEnd = resultEnd; + c.matched = matched; + + return c; + } + + +} diff --git a/Runtime/Text/Parsing/AST/Matchers/ASTMatchResult.cs.uid b/Runtime/Text/Parsing/AST/Matchers/ASTMatchResult.cs.uid new file mode 100644 index 0000000..6cc5ddb --- /dev/null +++ b/Runtime/Text/Parsing/AST/Matchers/ASTMatchResult.cs.uid @@ -0,0 +1 @@ +uid://d0oglqq8hrpqq diff --git a/Runtime/Text/Parsing/AST/Matchers/ASTMatcher.cs b/Runtime/Text/Parsing/AST/Matchers/ASTMatcher.cs new file mode 100644 index 0000000..5ef5477 --- /dev/null +++ b/Runtime/Text/Parsing/AST/Matchers/ASTMatcher.cs @@ -0,0 +1,26 @@ +using System.Collections; +using System.Collections.Generic; +using System.Text.RegularExpressions; +using System.Text; + +using System.Globalization; +using Godot; +using System; + +namespace Rokojori; + +public abstract class ASTMatcher +{ + public virtual int GetMatchLength( ASTNode parent, int childOffset ) + { + var astResult = new ASTMatchResult(); + astResult.parent = parent; + astResult.childOffset = childOffset; + + Match( astResult ); + + return astResult.matched ? astResult.childOffsetMatchLength : -1; + } + + public abstract void Match( ASTMatchResult result ); +} diff --git a/Runtime/Text/Parsing/AST/Matchers/ASTMatcher.cs.uid b/Runtime/Text/Parsing/AST/Matchers/ASTMatcher.cs.uid new file mode 100644 index 0000000..c42cd26 --- /dev/null +++ b/Runtime/Text/Parsing/AST/Matchers/ASTMatcher.cs.uid @@ -0,0 +1 @@ +uid://djut8mpfu6sep diff --git a/Runtime/Text/Parsing/AST/Matchers/BracketBlockASTMatcher.cs b/Runtime/Text/Parsing/AST/Matchers/BracketBlockASTMatcher.cs new file mode 100644 index 0000000..98913c3 --- /dev/null +++ b/Runtime/Text/Parsing/AST/Matchers/BracketBlockASTMatcher.cs @@ -0,0 +1,98 @@ +using System.Collections; +using System.Collections.Generic; +using System.Text.RegularExpressions; +using System.Text; + +using System.Globalization; +using Godot; +using System; + +namespace Rokojori; + +public class BracketBlockMatcher:ASTMatcher +{ + public TokenPredicateData blockStart; + public TokenPredicateData blockEnd; + public bool matchingAtStartIsMandatory = true; + + public override void Match( ASTMatchResult result ) + { + var parent = result.parent; + var childOffset = result.childOffset; + + var count = 0; + + if ( matchingAtStartIsMandatory && ! blockStart.Matches( parent.children[ childOffset ] ) ) + { + return; + } + + for ( int i = childOffset; i < parent.children.Count; i++ ) + { + var child = parent.children[ i ]; + + if ( blockStart.Matches( child ) ) + { + if ( count == 0 ) + { + result.resultStart = i; + } + + count ++; + } + else if ( blockEnd.Matches( child ) ) + { + count --; + + if ( count == 0 ) + { + result.SetMatched( childOffset, i ); + return; + } + } + else if ( count < 0 ) + { + result.resultStart = -1; + return; + } + } + + result.resultStart = -1; + return; + } + + public override int GetMatchLength( ASTNode parent, int childOffset ) + { + var count = 0; + + if ( matchingAtStartIsMandatory && ! blockStart.Matches( parent.children[ childOffset ] ) ) + { + return -1; + } + + for ( int i = childOffset; i < parent.children.Count; i++ ) + { + var child = parent.children[ i ]; + + if ( blockStart.Matches( child ) ) + { + count ++; + } + else if ( blockEnd.Matches( child ) ) + { + count --; + + if ( count == 0 ) + { + return ( i - childOffset + 1 ); + } + } + else if ( count < 0 ) + { + return -1; + } + } + + return -1; + } +} diff --git a/Runtime/Text/Parsing/AST/Matchers/BracketBlockASTMatcher.cs.uid b/Runtime/Text/Parsing/AST/Matchers/BracketBlockASTMatcher.cs.uid new file mode 100644 index 0000000..8e85daf --- /dev/null +++ b/Runtime/Text/Parsing/AST/Matchers/BracketBlockASTMatcher.cs.uid @@ -0,0 +1 @@ +uid://c4niejh1k1gal diff --git a/Runtime/Text/Parsing/AST/Matchers/CombinedASTMatcher.cs b/Runtime/Text/Parsing/AST/Matchers/CombinedASTMatcher.cs new file mode 100644 index 0000000..382c62c --- /dev/null +++ b/Runtime/Text/Parsing/AST/Matchers/CombinedASTMatcher.cs @@ -0,0 +1,70 @@ +using System.Collections; +using System.Collections.Generic; +using System.Text.RegularExpressions; +using System.Text; + +using System.Globalization; +using Godot; +using System; + +namespace Rokojori; + +public class CombinedASTMatcher:ASTMatcher +{ + public List matchers; + + public override void Match( ASTMatchResult result ) + { + var offset = result.childOffset; + var end = -1; + + for ( int i = 0; i < matchers.Count; i++ ) + { + var subResult = result.Clone(); + subResult.childOffset = offset; + + matchers[ i ].Match( subResult ); + + end = subResult.resultEnd; + + // var matchLength = matchers[ i ].GetMatchLength( result.parent, offset ); + + if ( ! subResult.matched ) + { + return; + } + + offset = subResult.resultEnd + 1; + + // RJLog.Log( "Matched", i, matchers[ i ], "length:", matchLength, "combinedMatch:", combinedMatchLength, "offset:", matchOffset, ">>", offset ); + } + + result.SetMatched( result.childOffset, end ); + + return; + } + + public override int GetMatchLength( ASTNode parent, int childOffset ) + { + var offset = childOffset; + var combinedMatchLength = 0; + + for ( int i = 0; i < matchers.Count; i++ ) + { + var matchOffset = offset; + var matchLength = matchers[ i ].GetMatchLength( parent, offset ); + + if ( matchLength == -1 ) + { + return -1; + } + + combinedMatchLength += matchLength; + offset += matchLength; + + RJLog.Log( "Matched", i, matchers[ i ], "length:", matchLength, "combinedMatch:", combinedMatchLength, "offset:", matchOffset, ">>", offset ); + } + + return combinedMatchLength; + } +} \ No newline at end of file diff --git a/Runtime/Text/Parsing/AST/Matchers/CombinedASTMatcher.cs.uid b/Runtime/Text/Parsing/AST/Matchers/CombinedASTMatcher.cs.uid new file mode 100644 index 0000000..1f8813d --- /dev/null +++ b/Runtime/Text/Parsing/AST/Matchers/CombinedASTMatcher.cs.uid @@ -0,0 +1 @@ +uid://boxrq5cfmtlat diff --git a/Runtime/Text/Parsing/AST/Matchers/LambdaASTMatcher.cs b/Runtime/Text/Parsing/AST/Matchers/LambdaASTMatcher.cs new file mode 100644 index 0000000..d49d7d5 --- /dev/null +++ b/Runtime/Text/Parsing/AST/Matchers/LambdaASTMatcher.cs @@ -0,0 +1,21 @@ +using System.Collections; +using System.Collections.Generic; +using System.Text.RegularExpressions; +using System.Text; + +using System.Globalization; +using Godot; +using System; + +namespace Rokojori; + +public class LambdaASTMatcher:ASTMatcher +{ + public Action func; + + public override void Match( ASTMatchResult result ) + { + func( result ); + } + +} diff --git a/Runtime/Text/Parsing/AST/Matchers/LambdaASTMatcher.cs.uid b/Runtime/Text/Parsing/AST/Matchers/LambdaASTMatcher.cs.uid new file mode 100644 index 0000000..a524a75 --- /dev/null +++ b/Runtime/Text/Parsing/AST/Matchers/LambdaASTMatcher.cs.uid @@ -0,0 +1 @@ +uid://c2svke11rfs5p diff --git a/Runtime/Text/Parsing/AST/Matchers/MultiTriggerASTMatcher.cs b/Runtime/Text/Parsing/AST/Matchers/MultiTriggerASTMatcher.cs new file mode 100644 index 0000000..76a202a --- /dev/null +++ b/Runtime/Text/Parsing/AST/Matchers/MultiTriggerASTMatcher.cs @@ -0,0 +1,39 @@ +using System.Collections; +using System.Collections.Generic; +using System.Text.RegularExpressions; +using System.Text; + +using System.Globalization; +using Godot; +using System; + +namespace Rokojori; + +public class MultiTriggerASTMatcher:ASTMatcher +{ + public List triggerPredicates = []; + public List blockPredicates = []; + public bool matchSticky = false; + + public override void Match( ASTMatchResult result ) + { + var parent = result.parent; + var childOffset = result.childOffset; + + var triggerIndex = parent.FindTriggerTokenIndex( childOffset, triggerPredicates, blockPredicates ); + + if ( matchSticky && triggerIndex != childOffset ) + { + return; + } + + if ( triggerIndex == -1 ) + { + return; + } + + result.SetMatched( triggerIndex ); + + } + +} \ No newline at end of file diff --git a/Runtime/Text/Parsing/AST/Matchers/MultiTriggerASTMatcher.cs.uid b/Runtime/Text/Parsing/AST/Matchers/MultiTriggerASTMatcher.cs.uid new file mode 100644 index 0000000..5dbfdec --- /dev/null +++ b/Runtime/Text/Parsing/AST/Matchers/MultiTriggerASTMatcher.cs.uid @@ -0,0 +1 @@ +uid://ceitlc83bl3fv diff --git a/Runtime/Text/Parsing/AST/Matchers/TokenRepeatSequenceASTMatcher.cs b/Runtime/Text/Parsing/AST/Matchers/TokenRepeatSequenceASTMatcher.cs new file mode 100644 index 0000000..cd79060 --- /dev/null +++ b/Runtime/Text/Parsing/AST/Matchers/TokenRepeatSequenceASTMatcher.cs @@ -0,0 +1,65 @@ +using System.Collections; +using System.Collections.Generic; +using System.Text.RegularExpressions; +using System.Text; + +using System.Globalization; +using Godot; +using System; + +namespace Rokojori; + +public class TokenRepeatSequenceASTMatcher:ASTMatcher +{ + public List> startSequence = []; + public List> repeatSequence = []; + public List> endSequence = []; + + public override void Match( ASTMatchResult result ) + { + var parent = result.parent; + var childOffset = result.childOffset; + + var output = parent.SearchFilteredRepeatSequence( startSequence, repeatSequence, endSequence, childOffset ); + + if ( output == null ) + { + return; + } + + result.SetMatched( output.First(), output.Last() ); + + } + + public override int GetMatchLength( ASTNode parent, int childOffset ) + { + var output = parent.SearchFilteredRepeatSequence( startSequence, repeatSequence, endSequence, childOffset ); + + if ( output != null ) + { + var lastOffset = output.Last(); + // RJLog.Log( "First child:", childOffset, parent.children[ childOffset ] ); + // RJLog.Log( "Last child:", lastOffset, parent.children[ lastOffset ] ); + + var num = lastOffset - childOffset + 1; + // RJLog.Log( "Num Matches:", num ); + + + return num; + } + + return -1; + } + + public static TokenRepeatSequenceASTMatcher CreateWithLexer( Lexer lexer, string start, string repeat, string end ) + { + var trsm = new TokenRepeatSequenceASTMatcher(); + + trsm.startSequence = Token.CreateLexedSequence( lexer, start ); + trsm.repeatSequence = Token.CreateLexedSequence( lexer, repeat ); + trsm.endSequence = Token.CreateLexedSequence( lexer, end ); + + return trsm; + } + +} diff --git a/Runtime/Text/Parsing/AST/Matchers/TokenRepeatSequenceASTMatcher.cs.uid b/Runtime/Text/Parsing/AST/Matchers/TokenRepeatSequenceASTMatcher.cs.uid new file mode 100644 index 0000000..44ea7fb --- /dev/null +++ b/Runtime/Text/Parsing/AST/Matchers/TokenRepeatSequenceASTMatcher.cs.uid @@ -0,0 +1 @@ +uid://0duohxt3mrve diff --git a/Runtime/Text/Parsing/AST/Matchers/TokenSequenceASTMatcher.cs b/Runtime/Text/Parsing/AST/Matchers/TokenSequenceASTMatcher.cs new file mode 100644 index 0000000..cae87d3 --- /dev/null +++ b/Runtime/Text/Parsing/AST/Matchers/TokenSequenceASTMatcher.cs @@ -0,0 +1,44 @@ +using System.Collections; +using System.Collections.Generic; +using System.Text.RegularExpressions; +using System.Text; + +using System.Globalization; +using Godot; +using System; + +namespace Rokojori; + +public class TokenSequenceASTMatcher:ASTMatcher +{ + public List> sequence = []; + + public override void Match( ASTMatchResult result ) + { + var parent = result.parent; + var childOffset = result.childOffset; + + var output = parent.SearchFilteredSequence( sequence, childOffset ); + + if ( output == null ) + { + return; + } + + result.SetMatched( output.First(), output.Last() ); + + } + + public override int GetMatchLength( ASTNode parent, int childOffset ) + { + var output = parent.SearchFilteredSequence( sequence, childOffset ); + + if ( output != null ) + { + return output.Last() - childOffset + 1 ; + } + + return -1; + } + +} diff --git a/Runtime/Text/Parsing/AST/Matchers/TokenSequenceASTMatcher.cs.uid b/Runtime/Text/Parsing/AST/Matchers/TokenSequenceASTMatcher.cs.uid new file mode 100644 index 0000000..607c75d --- /dev/null +++ b/Runtime/Text/Parsing/AST/Matchers/TokenSequenceASTMatcher.cs.uid @@ -0,0 +1 @@ +uid://bbtojg1s1nyk3 diff --git a/Runtime/Text/Parsing/AST/Matchers/TokenWordASTMatcher.cs b/Runtime/Text/Parsing/AST/Matchers/TokenWordASTMatcher.cs new file mode 100644 index 0000000..96482c2 --- /dev/null +++ b/Runtime/Text/Parsing/AST/Matchers/TokenWordASTMatcher.cs @@ -0,0 +1,59 @@ +using System.Collections; +using System.Collections.Generic; +using System.Text.RegularExpressions; +using System.Text; + +using System.Globalization; +using Godot; +using System; + +namespace Rokojori; + +public class TokenWordASTMatcher:ASTMatcher +{ + public LexerMatcher matcher; + public string type; + public string match; + + public override void Match( ASTMatchResult result ) + { + var parent = result.parent; + var searchOffset = result.childOffset; + + var node = parent.children[ searchOffset ]; + + var resolvedType = matcher?.type ?? type; + + if ( ! node.IsToken( resolvedType, match ) ) + { + return; + } + + var endIndex = parent.SearchFilteredTokenIndex( LexerMatcherLibrary.CwordMatcher, searchOffset + 1 ); + + if ( endIndex == -1 ) + { + return; + } + + result.SetMatched( searchOffset, endIndex ); + + } + + public override int GetMatchLength( ASTNode parent, int childOffset ) + { + var node = parent.children[ childOffset ]; + + var resolvedType = matcher?.type ?? type; + + if ( ! node.IsToken( resolvedType, match ) ) + { + return -1; + } + + var endIndex = parent.SearchFilteredTokenIndex( LexerMatcherLibrary.CwordMatcher, childOffset + 1 ); + + return endIndex == -1 ? -1 : ( endIndex - childOffset + 1 ); + } + +} diff --git a/Runtime/Text/Parsing/AST/Matchers/TokenWordASTMatcher.cs.uid b/Runtime/Text/Parsing/AST/Matchers/TokenWordASTMatcher.cs.uid new file mode 100644 index 0000000..aa3aad9 --- /dev/null +++ b/Runtime/Text/Parsing/AST/Matchers/TokenWordASTMatcher.cs.uid @@ -0,0 +1 @@ +uid://4mc5huqdh54k diff --git a/Runtime/Text/Parsing/AST/MemberDeclaration.cs b/Runtime/Text/Parsing/AST/MemberDeclaration.cs new file mode 100644 index 0000000..8e58b10 --- /dev/null +++ b/Runtime/Text/Parsing/AST/MemberDeclaration.cs @@ -0,0 +1,15 @@ +using System.Collections; +using System.Collections.Generic; +using System.Text.RegularExpressions; +using System.Text; + +using System.Globalization; +using Godot; + +namespace Rokojori; + +public interface MemberDeclaration +{ + public string GetMemberName(); + public string GetMemberType(); +} \ No newline at end of file diff --git a/Runtime/Text/Parsing/AST/MemberDeclaration.cs.uid b/Runtime/Text/Parsing/AST/MemberDeclaration.cs.uid new file mode 100644 index 0000000..fe1eeac --- /dev/null +++ b/Runtime/Text/Parsing/AST/MemberDeclaration.cs.uid @@ -0,0 +1 @@ +uid://b2ny6t7p63kd5 diff --git a/Runtime/Text/Parsing/AST/NamespaceBlock.cs b/Runtime/Text/Parsing/AST/NamespaceBlock.cs new file mode 100644 index 0000000..61eb999 --- /dev/null +++ b/Runtime/Text/Parsing/AST/NamespaceBlock.cs @@ -0,0 +1,14 @@ +using System.Collections; +using System.Collections.Generic; +using System.Text.RegularExpressions; +using System.Text; + +using System.Globalization; +using Godot; + +namespace Rokojori; + +public interface NamespaceBlock +{ + public string GetNamespace(); +} \ No newline at end of file diff --git a/Runtime/Text/Parsing/AST/NamespaceBlock.cs.uid b/Runtime/Text/Parsing/AST/NamespaceBlock.cs.uid new file mode 100644 index 0000000..f9ea0a0 --- /dev/null +++ b/Runtime/Text/Parsing/AST/NamespaceBlock.cs.uid @@ -0,0 +1 @@ +uid://blj2e4c7oid0g diff --git a/Runtime/Text/Parsing/AST/NamespaceDeclaration.cs b/Runtime/Text/Parsing/AST/NamespaceDeclaration.cs new file mode 100644 index 0000000..6b5564a --- /dev/null +++ b/Runtime/Text/Parsing/AST/NamespaceDeclaration.cs @@ -0,0 +1,14 @@ +using System.Collections; +using System.Collections.Generic; +using System.Text.RegularExpressions; +using System.Text; + +using System.Globalization; +using Godot; + +namespace Rokojori; + +public interface NamespaceDeclaration +{ + public string GetNamespace(); +} \ No newline at end of file diff --git a/Runtime/Text/Parsing/AST/NamespaceDeclaration.cs.uid b/Runtime/Text/Parsing/AST/NamespaceDeclaration.cs.uid new file mode 100644 index 0000000..9fd6d2b --- /dev/null +++ b/Runtime/Text/Parsing/AST/NamespaceDeclaration.cs.uid @@ -0,0 +1 @@ +uid://cxa0tcnbff0ma diff --git a/Runtime/Text/Parsing/AST/ObjectTypes/ClassDeclaration.cs b/Runtime/Text/Parsing/AST/ObjectTypes/ClassDeclaration.cs new file mode 100644 index 0000000..571c860 --- /dev/null +++ b/Runtime/Text/Parsing/AST/ObjectTypes/ClassDeclaration.cs @@ -0,0 +1,14 @@ +using System.Collections; +using System.Collections.Generic; +using System.Text.RegularExpressions; +using System.Text; + +using System.Globalization; +using Godot; + +namespace Rokojori; + +public interface ClassDeclaration +{ + public string GetClassName(); +} \ No newline at end of file diff --git a/Runtime/Text/Parsing/AST/ObjectTypes/ClassDeclaration.cs.uid b/Runtime/Text/Parsing/AST/ObjectTypes/ClassDeclaration.cs.uid new file mode 100644 index 0000000..231f452 --- /dev/null +++ b/Runtime/Text/Parsing/AST/ObjectTypes/ClassDeclaration.cs.uid @@ -0,0 +1 @@ +uid://bj0nh64qu2by1 diff --git a/Runtime/Text/Parsing/AST/ObjectTypes/EnumDeclaration.cs b/Runtime/Text/Parsing/AST/ObjectTypes/EnumDeclaration.cs new file mode 100644 index 0000000..1e5aad7 --- /dev/null +++ b/Runtime/Text/Parsing/AST/ObjectTypes/EnumDeclaration.cs @@ -0,0 +1,14 @@ +using System.Collections; +using System.Collections.Generic; +using System.Text.RegularExpressions; +using System.Text; + +using System.Globalization; +using Godot; + +namespace Rokojori; + +public interface EnumDeclaration +{ + public string GetEnumName(); +} \ No newline at end of file diff --git a/Runtime/Text/Parsing/AST/ObjectTypes/EnumDeclaration.cs.uid b/Runtime/Text/Parsing/AST/ObjectTypes/EnumDeclaration.cs.uid new file mode 100644 index 0000000..0f93ff7 --- /dev/null +++ b/Runtime/Text/Parsing/AST/ObjectTypes/EnumDeclaration.cs.uid @@ -0,0 +1 @@ +uid://bsu314s2w3b38 diff --git a/Runtime/Text/Parsing/AST/ObjectTypes/InterfaceDeclaration.cs b/Runtime/Text/Parsing/AST/ObjectTypes/InterfaceDeclaration.cs new file mode 100644 index 0000000..295ec4f --- /dev/null +++ b/Runtime/Text/Parsing/AST/ObjectTypes/InterfaceDeclaration.cs @@ -0,0 +1,14 @@ +using System.Collections; +using System.Collections.Generic; +using System.Text.RegularExpressions; +using System.Text; + +using System.Globalization; +using Godot; + +namespace Rokojori; + +public interface InterfaceDeclaration +{ + public string GetInterfaceName(); +} \ No newline at end of file diff --git a/Runtime/Text/Parsing/AST/ObjectTypes/InterfaceDeclaration.cs.uid b/Runtime/Text/Parsing/AST/ObjectTypes/InterfaceDeclaration.cs.uid new file mode 100644 index 0000000..4b69256 --- /dev/null +++ b/Runtime/Text/Parsing/AST/ObjectTypes/InterfaceDeclaration.cs.uid @@ -0,0 +1 @@ +uid://j8qw38s8gwe1 diff --git a/Runtime/Text/Parsing/AST/ParameterDeclaration.cs b/Runtime/Text/Parsing/AST/ParameterDeclaration.cs new file mode 100644 index 0000000..919f4dc --- /dev/null +++ b/Runtime/Text/Parsing/AST/ParameterDeclaration.cs @@ -0,0 +1,16 @@ +using System.Collections; +using System.Collections.Generic; +using System.Text.RegularExpressions; +using System.Text; + +using System.Globalization; +using Godot; + +namespace Rokojori; + +public interface ParameterDeclaration +{ + public string GetParameterName(); + public string GetParameterType(); + public string GetParameterValue(); +} \ No newline at end of file diff --git a/Runtime/Text/Parsing/AST/ParameterDeclaration.cs.uid b/Runtime/Text/Parsing/AST/ParameterDeclaration.cs.uid new file mode 100644 index 0000000..3a9f87f --- /dev/null +++ b/Runtime/Text/Parsing/AST/ParameterDeclaration.cs.uid @@ -0,0 +1 @@ +uid://ijaip1ompbed diff --git a/Runtime/Text/Parsing/AST/ResolvableASTNode.cs b/Runtime/Text/Parsing/AST/ResolvableASTNode.cs new file mode 100644 index 0000000..43af084 --- /dev/null +++ b/Runtime/Text/Parsing/AST/ResolvableASTNode.cs @@ -0,0 +1,14 @@ +using System.Collections; +using System.Collections.Generic; +using System.Text.RegularExpressions; +using System.Text; + +using System.Globalization; +using Godot; + +namespace Rokojori; + +public interface ResolvableASTNode +{ + public void Resolve(); +} \ No newline at end of file diff --git a/Runtime/Text/Parsing/AST/ResolvableASTNode.cs.uid b/Runtime/Text/Parsing/AST/ResolvableASTNode.cs.uid new file mode 100644 index 0000000..1618308 --- /dev/null +++ b/Runtime/Text/Parsing/AST/ResolvableASTNode.cs.uid @@ -0,0 +1 @@ +uid://fd3sy5gl6b6 diff --git a/Runtime/Text/Parsing/AST/Resolver/ASTMatcherResolver.cs b/Runtime/Text/Parsing/AST/Resolver/ASTMatcherResolver.cs new file mode 100644 index 0000000..fd3f44d --- /dev/null +++ b/Runtime/Text/Parsing/AST/Resolver/ASTMatcherResolver.cs @@ -0,0 +1,34 @@ +using System.Collections; +using System.Collections.Generic; +using System.Text.RegularExpressions; +using System.Text; + +using System.Globalization; +using Godot; + +namespace Rokojori; + +public abstract class ASTMatcherResolver +{ + public ASTMatcher matcher; + + // public abstract void Resolve( ASTNode parent, ASTMatcher matcher, int start, int length ); + public abstract int Resolve( ASTMatchResult result, ASTMatcher matcher ); +} + +public class ASTMatcherResolver:ASTMatcherResolver where T:ASTNode, new() +{ + public System.Func initializer; + + // public override void Resolve( ASTNode parent, ASTMatcher matcher, int start, int length ) + // { + // var t = parent.MergeChildrenWith( start, length ); + // initializer( t, matcher ); + // } + + public override int Resolve( ASTMatchResult result, ASTMatcher matcher ) + { + var t = result.parent.MergeChildrenWith( result.childOffset, result.childOffsetMatchLength ); + return initializer( t, matcher ); + } +} \ No newline at end of file diff --git a/Runtime/Text/Parsing/AST/Resolver/ASTMatcherResolver.cs.uid b/Runtime/Text/Parsing/AST/Resolver/ASTMatcherResolver.cs.uid new file mode 100644 index 0000000..3854e8c --- /dev/null +++ b/Runtime/Text/Parsing/AST/Resolver/ASTMatcherResolver.cs.uid @@ -0,0 +1 @@ +uid://33q46ptb0ryn diff --git a/Runtime/Text/Parsing/AST/Resolver/ASTParser.cs b/Runtime/Text/Parsing/AST/Resolver/ASTParser.cs new file mode 100644 index 0000000..5f2167d --- /dev/null +++ b/Runtime/Text/Parsing/AST/Resolver/ASTParser.cs @@ -0,0 +1,120 @@ +using System.Collections; +using System.Collections.Generic; +using System.Text.RegularExpressions; +using System.Text; + +using System.Globalization; +using Godot; + +namespace Rokojori; + +public class ASTParser +{ + public ASTNode root; + public List resolvers = []; + + public int maxSteps = 1000; + + + public void Process() + { + var result = Resolve(); + + var steps = 0; + + while ( result && steps < maxSteps) + { + RJLog.Log( "Step", steps ); + result = Resolve(); + steps ++; + } + } + + bool Resolve() + { + var hasResult = false; + + for ( int tokenOffset = 0; tokenOffset < root.children.Count; tokenOffset++ ) + { + if ( root.children[ tokenOffset ].IsIgnoreToken() ) + { + continue; + } + + // RJLog.Log( "\n\n---- [ Checking node ]", root.children[ tokenOffset ], tokenOffset ); + + var matchResult = new ASTMatchResult(); + matchResult.childOffset = tokenOffset; + matchResult.parent = root; + + for ( int resolverIndex = 0; resolverIndex < resolvers.Count; resolverIndex++ ) + { + var matcherResolver = resolvers[ resolverIndex ]; + matcherResolver.matcher.Match( matchResult ); + + if ( ! matchResult.matched ) + { + // RJLog.Log( ">>> Not Matched:", resolverIndex, matcherResolver.matcher, matcherResolver ); + + continue; + } + + RJLog.Log( ">>> Matched:", resolverIndex, matcherResolver.matcher, matcherResolver ); + + if ( root.children[ tokenOffset ] is Token tk ) + { + RJLog.Log( "...", tk.lineInfo ); + } + + var resolvedOffset = matcherResolver.Resolve( matchResult, matcherResolver.matcher ); + tokenOffset = resolvedOffset; + + hasResult = true; + resolverIndex = resolvers.Count; + + // RJLog.Log( "Matched:", matcherIndex, matcherResolver.matcher, matcherResolver ); + //return true; + } + } + + return hasResult; + } + + // bool ResolveOld() + // { + // var hasResult = false; + + // for ( int tokenOffset = 0; tokenOffset < root.children.Count; tokenOffset++ ) + // { + // if ( root.children[ tokenOffset ].IsIgnoreToken() ) + // { + // continue; + // } + + // RJLog.Log( "Checking node:", tokenOffset, root.children[ tokenOffset ] ); + + // for ( int matcherIndex = 0; matcherIndex < resolvers.Count; matcherIndex++ ) + // { + // var matcherResolver = resolvers[ matcherIndex ]; + // var matchLength = matcherResolver.matcher.GetMatchLength( root, tokenOffset ); + + // if ( matchLength == -1 ) + // { + + // continue; + // } + + // matcherResolver.Resolve( root, matcherResolver.matcher, tokenOffset, matchLength ); + + + // hasResult = true; + + // RJLog.Log( "Matched:", matcherIndex, matcherResolver.matcher, matcherResolver ); + // //return true; + // } + // } + + // return hasResult; + // } + +} \ No newline at end of file diff --git a/Runtime/Text/Parsing/AST/Resolver/ASTParser.cs.uid b/Runtime/Text/Parsing/AST/Resolver/ASTParser.cs.uid new file mode 100644 index 0000000..af341d0 --- /dev/null +++ b/Runtime/Text/Parsing/AST/Resolver/ASTParser.cs.uid @@ -0,0 +1 @@ +uid://2i1vuxaa3b2w diff --git a/Runtime/Text/Parsing/AST/Resolver/ASTResolver.cs b/Runtime/Text/Parsing/AST/Resolver/ASTResolver.cs new file mode 100644 index 0000000..4ee06a9 --- /dev/null +++ b/Runtime/Text/Parsing/AST/Resolver/ASTResolver.cs @@ -0,0 +1,14 @@ +using System.Collections; +using System.Collections.Generic; +using System.Text.RegularExpressions; +using System.Text; + +using System.Globalization; +using Godot; + +namespace Rokojori; + +public abstract class ASTResolver +{ + public abstract void Resolve( ASTNode parent, ASTMatcher matcher, int start, int length ); +} \ No newline at end of file diff --git a/Runtime/Text/Parsing/AST/Resolver/ASTResolver.cs.uid b/Runtime/Text/Parsing/AST/Resolver/ASTResolver.cs.uid new file mode 100644 index 0000000..202acf7 --- /dev/null +++ b/Runtime/Text/Parsing/AST/Resolver/ASTResolver.cs.uid @@ -0,0 +1 @@ +uid://dijwir0cj2lkj diff --git a/Runtime/Text/Parsing/AST/Token.cs b/Runtime/Text/Parsing/AST/Token.cs new file mode 100644 index 0000000..fa6893e --- /dev/null +++ b/Runtime/Text/Parsing/AST/Token.cs @@ -0,0 +1,163 @@ +using System.Collections; +using System.Collections.Generic; +using System.Text.RegularExpressions; +using System.Text; + +using System.Globalization; +using Godot; + +namespace Rokojori; + + + +public class Token:ASTNode +{ + // public class PredicateData + // { + // public string type; + // public string match; + + // public bool Matches( ASTNode node ) + // { + // return node.IsToken( type, match ); + // } + + // public System.Predicate predicate + // { + // get + // { + // System.Predicate pred = ( tk ) => tk.Is( type, match ); + // return pred; + // } + // } + + // public static PredicateData Create( string type, string match = null ) + // { + // var pd = new PredicateData(); + // pd.type = type; + // pd.match = match; + // return pd; + // } + + // public static TokenPredicateData Lexed( Lexer lexer, string value ) + // { + // var lexedSequence = CreateLexedSequenceData( lexer, value ); + // return lexedSequence[ 0 ]; + // } + // } + + public LexerEvent lexerEvent; + + public string match => lexerEvent.match; + public string type => lexerEvent.type; + + + public override string ToString() + { + var matchInfo = match.Replace( "\n", "\\n" ).Replace( "\r", "\\r" ); + + return $"Token{{ '{matchInfo}' ({type}) }}"; + } + + public bool Is( string type, string match = null ) + { + return lexerEvent.Is( type, match ); + } + + public bool Is( LexerMatcher matcher, string match = null ) + { + return lexerEvent.Is( matcher.type, match ); + } + + + ASTFileRoot _root; + + public string lineInfo + { + get + { + if ( _root == null ) + { + _root = ASTWalker.instance.GetInParents( this, n => n is ASTFileRoot ) as ASTFileRoot; + } + + var textLine = _root.GetTextLinesMapper().GetLine( lexerEvent.offset ); + return "[ " + textLine.textEditorLineIndex + " ] | " + textLine.GetContent( _root.GetSource() ); + } + } + + public static Token Create( LexerEvent le, ASTNode parent = null ) + { + var t = new Token(); + t.lexerEvent = le; + t.parent = parent; + + return t; + } + + public System.Predicate ToPredicate( Lexer lexer = null ) + { + var isVariableMatch = lexer == null ? Lexer.IsVariableMatchType( type ) : lexer.HasVariableMatch( type ); + var match = isVariableMatch ? null : this.match; + System.Predicate predicate = ( tk ) => tk.Is( type, match ); + return predicate; + } + + public TokenPredicateData ToPredicateData( Lexer lexer = null ) + { + var isVariableMatch = lexer == null ? Lexer.IsVariableMatchType( type ) : lexer.HasVariableMatch( type ); + var match = isVariableMatch ? null : this.match; + return TokenPredicateData.Create( type, match ); + } + + + public static System.Predicate CreateRawPredicate( LexerMatcher matcher, string match = null ) + { + System.Predicate predicate = ( tk ) => tk.Is( matcher, match ); + return predicate; + } + + public static List> CreateLexedSequence( Lexer lexer, string sequence ) + { + lexer.Clear(); + var lexedSequence = lexer.LexToList( sequence ); + + if ( lexer.hasError ) + { + throw new System.Exception( "Lexer has error at char " + lexedSequence.Last().offset + " >> '" + sequence + "'" ); + } + + lexedSequence.Pop(); + lexer.GrabMatches( lexedSequence, sequence ); + + var filteredEvents = lexedSequence.Filter( le => ! le.IsAnyOf( LexerMatcherLibrary.Ignore ) ); + + // RJLog.Log( "Creating predicates:", "'" + sequence + "'", ">", filteredEvents.Count, ">>", filteredEvents.Map( e => e.type + " : " + e.match ).Join( ", " ) ); + + var tokenSequence = filteredEvents.Map( le => Create( le ).ToPredicate( lexer ) ); + + return tokenSequence; + } + + public static List CreateLexedSequenceData( Lexer lexer, string sequence ) + { + lexer.Clear(); + var lexedSequence = lexer.LexToList( sequence ); + + if ( lexer.hasError ) + { + throw new System.Exception( "Lexer has error at char " + lexedSequence.Last().offset + " >> '" + sequence + "'" ); + } + + lexedSequence.Pop(); + lexer.GrabMatches( lexedSequence, sequence ); + + var filteredEvents = lexedSequence.Filter( le => ! le.IsAnyOf( LexerMatcherLibrary.Ignore ) ); + + // RJLog.Log( "Creating predicates:", "'" + sequence + "'", ">", filteredEvents.Count, ">>", filteredEvents.Map( e => e.type + " : " + e.match ).Join( ", " ) ); + + var tokenSequence = filteredEvents.Map( le => Create( le ).ToPredicateData( lexer ) ); + + return tokenSequence; + } +} \ No newline at end of file diff --git a/Runtime/Text/Parsing/AST/Token.cs.uid b/Runtime/Text/Parsing/AST/Token.cs.uid new file mode 100644 index 0000000..e110739 --- /dev/null +++ b/Runtime/Text/Parsing/AST/Token.cs.uid @@ -0,0 +1 @@ +uid://cphvqqm60m3r7 diff --git a/Runtime/Text/Parsing/AST/TokenPredicateData.cs b/Runtime/Text/Parsing/AST/TokenPredicateData.cs new file mode 100644 index 0000000..7fd1837 --- /dev/null +++ b/Runtime/Text/Parsing/AST/TokenPredicateData.cs @@ -0,0 +1,45 @@ +using System.Collections; +using System.Collections.Generic; +using System.Text.RegularExpressions; +using System.Text; + +using System.Globalization; +using Godot; + +namespace Rokojori; + + + +public class TokenPredicateData +{ + public string type; + public string match; + + public bool Matches( ASTNode node ) + { + return node.IsToken( type, match ); + } + + public System.Predicate predicate + { + get + { + System.Predicate pred = ( tk ) => tk.Is( type, match ); + return pred; + } + } + + public static TokenPredicateData Create( string type, string match = null ) + { + var pd = new TokenPredicateData(); + pd.type = type; + pd.match = match; + return pd; + } + + public static TokenPredicateData Lexed( Lexer lexer, string value ) + { + var lexedSequence = Token.CreateLexedSequenceData( lexer, value ); + return lexedSequence[ 0 ]; + } +} diff --git a/Runtime/Text/Parsing/AST/TokenPredicateData.cs.uid b/Runtime/Text/Parsing/AST/TokenPredicateData.cs.uid new file mode 100644 index 0000000..ed0c756 --- /dev/null +++ b/Runtime/Text/Parsing/AST/TokenPredicateData.cs.uid @@ -0,0 +1 @@ +uid://ckmrtyfsdfncg diff --git a/Runtime/Text/Parsing/Expressions/Evaluator/ExpressionContext.cs b/Runtime/Text/Parsing/Expressions/Evaluator/ExpressionContext.cs new file mode 100644 index 0000000..a72d4aa --- /dev/null +++ b/Runtime/Text/Parsing/Expressions/Evaluator/ExpressionContext.cs @@ -0,0 +1,10 @@ +using System.Collections.Generic; +using System.Linq; + +namespace Rokojori; + +public class ExpressionContext +{ + public ExpressionResult result; + public List messages = []; +} \ No newline at end of file diff --git a/Runtime/Text/Parsing/Expressions/Evaluator/ExpressionContext.cs.uid b/Runtime/Text/Parsing/Expressions/Evaluator/ExpressionContext.cs.uid new file mode 100644 index 0000000..0f6700f --- /dev/null +++ b/Runtime/Text/Parsing/Expressions/Evaluator/ExpressionContext.cs.uid @@ -0,0 +1 @@ +uid://c6itj3geuk3nu diff --git a/Runtime/Text/Parsing/Expressions/Evaluator/ExpressionEvaluator.cs b/Runtime/Text/Parsing/Expressions/Evaluator/ExpressionEvaluator.cs new file mode 100644 index 0000000..7a3226c --- /dev/null +++ b/Runtime/Text/Parsing/Expressions/Evaluator/ExpressionEvaluator.cs @@ -0,0 +1,18 @@ +using System.Collections.Generic; +using System.Linq; + +namespace Rokojori; + +public abstract class ExpressionEvaluator +{ + protected virtual ExpressionContext _CreateContext(){ return new ExpressionContext(); } + protected abstract ExpressionResult _Evaluate( ExpressionContext context, OperatorExpression expression ); + + public ExpressionContext EvaluateExpression( OperatorExpression expression ) + { + var context = _CreateContext(); + context.result = _Evaluate( context, expression ); + + return context; + } +} \ No newline at end of file diff --git a/Runtime/Text/Parsing/Expressions/Evaluator/ExpressionEvaluator.cs.uid b/Runtime/Text/Parsing/Expressions/Evaluator/ExpressionEvaluator.cs.uid new file mode 100644 index 0000000..68ff8f9 --- /dev/null +++ b/Runtime/Text/Parsing/Expressions/Evaluator/ExpressionEvaluator.cs.uid @@ -0,0 +1 @@ +uid://bfwfkc6f5kl6o diff --git a/Runtime/Text/Parsing/Expressions/Evaluator/ExpressionResult.cs b/Runtime/Text/Parsing/Expressions/Evaluator/ExpressionResult.cs new file mode 100644 index 0000000..1bb5f6a --- /dev/null +++ b/Runtime/Text/Parsing/Expressions/Evaluator/ExpressionResult.cs @@ -0,0 +1,12 @@ +using System.Collections.Generic; +using System.Linq; + +namespace Rokojori; + +public class ExpressionResult +{ + public object value; + public List messages = []; + + public bool hasError => messages.Find( m => m.type == MessageType.Error ) != null; +} \ No newline at end of file diff --git a/Runtime/Text/Parsing/Expressions/Evaluator/ExpressionResult.cs.uid b/Runtime/Text/Parsing/Expressions/Evaluator/ExpressionResult.cs.uid new file mode 100644 index 0000000..2b9c24d --- /dev/null +++ b/Runtime/Text/Parsing/Expressions/Evaluator/ExpressionResult.cs.uid @@ -0,0 +1 @@ +uid://isphlk2qxbbd diff --git a/Runtime/Text/Parsing/Expressions/ExpressionParser.cs b/Runtime/Text/Parsing/Expressions/ExpressionParser.cs new file mode 100644 index 0000000..dbcf1f5 --- /dev/null +++ b/Runtime/Text/Parsing/Expressions/ExpressionParser.cs @@ -0,0 +1,46 @@ +using System.Collections.Generic; +using System.Linq; + +namespace Rokojori; + +public class ExpressionParser:ParserPhase +{ + public List levels = []; + + public override void Process( Parser parser ) + { + ProcessExpression( parser.root ); + } + + public void ProcessExpression( ASTNode expressionParent ) + { + var parser = expressionParent.parser; + + for ( int i = 0; i < levels.Count; i++ ) + { + var changed = levels[ i ].Process( expressionParent ); + + if ( parser.hasErrors ) + { + return; + } + + if ( changed ) + { + i = -1; + } + } + } + + protected PrecedenceLevel AddPrecedenceLevel( params ExpressionOperator[] operators ) + { + var level = new PrecedenceLevel(); + level.operators.AddRange( operators ); + + var isFromRight = operators.Find( op => ! op.IsFromLeft() ) != null; + level.fromLeft = ! isFromRight; + + this.levels.Add( level ); + return level; + } +} diff --git a/Runtime/Text/Parsing/Expressions/ExpressionParser.cs.uid b/Runtime/Text/Parsing/Expressions/ExpressionParser.cs.uid new file mode 100644 index 0000000..283bce8 --- /dev/null +++ b/Runtime/Text/Parsing/Expressions/ExpressionParser.cs.uid @@ -0,0 +1 @@ +uid://b21erul0athda diff --git a/Runtime/Text/Parsing/Expressions/Operators/BinaryExpression.cs b/Runtime/Text/Parsing/Expressions/Operators/BinaryExpression.cs new file mode 100644 index 0000000..eb9654b --- /dev/null +++ b/Runtime/Text/Parsing/Expressions/Operators/BinaryExpression.cs @@ -0,0 +1,41 @@ +using System.Collections.Generic; +using System.Linq; + +namespace Rokojori; + +public interface IBinaryExpression:OperatorExpression +{ + public void InitializeBinaryExpression( ASTNode left, ASTNode opNode, ASTNode right ); + public ASTNode GetLeftExpression(); + public ASTNode GetOperatorExpression(); + public ASTNode GetRightExpression(); +} + +public class BinaryExpression:ASTNode,IBinaryExpression +{ + public ASTNode left; + public ASTNode op; + public ASTNode right; + + public void InitializeBinaryExpression( ASTNode left, ASTNode op, ASTNode right ) + { + this.left = left; + this.op = op; + this.right = right; + } + + public ASTNode GetLeftExpression() + { + return left; + } + + public ASTNode GetOperatorExpression() + { + return op; + } + + public ASTNode GetRightExpression() + { + return right; + } +} \ No newline at end of file diff --git a/Runtime/Text/Parsing/Expressions/Operators/BinaryExpression.cs.uid b/Runtime/Text/Parsing/Expressions/Operators/BinaryExpression.cs.uid new file mode 100644 index 0000000..6811953 --- /dev/null +++ b/Runtime/Text/Parsing/Expressions/Operators/BinaryExpression.cs.uid @@ -0,0 +1 @@ +uid://h3v0ijwgdy5a diff --git a/Runtime/Text/Parsing/Expressions/Operators/BinaryOperator.cs b/Runtime/Text/Parsing/Expressions/Operators/BinaryOperator.cs new file mode 100644 index 0000000..90a25ef --- /dev/null +++ b/Runtime/Text/Parsing/Expressions/Operators/BinaryOperator.cs @@ -0,0 +1,40 @@ +using System.Collections.Generic; +using System.Linq; + +namespace Rokojori; + +public class BinaryOperator:ExpressionOperator where T:ASTNode,IBinaryExpression, new() +{ + bool _fromLeft = false; + + public BinaryOperator( string symbol, bool fromLeft = true ) + { + startTokenPredicate = TokenPredicateData.Create( LexerMatcherLibrary.OperatorMatcher.type, symbol ); + _fromLeft = fromLeft; + } + + public override bool IsFromLeft() + { + return _fromLeft; + } + + public override bool ProcessStartNode( ASTNode parent, int startChildIndex ) + { + var leftIndex = parent.PreviousIndex( startChildIndex ); + var rightIndex = parent.NextIndex( startChildIndex ); + + if ( leftIndex < 0 || rightIndex < 0 || leftIndex >= parent.children.Count || rightIndex >= parent.children.Count ) + { + parent.parser.AddError( "Could not find left/right expressions for " + this + " in parent:" + parent + " child start: " + startChildIndex ); + return false; + } + + var leftExpression = parent.children[ leftIndex ]; + var rightExpression = parent.children[ rightIndex ]; + var op = parent.children[ startChildIndex ]; + + var binaryExpression = parent.MergeOuter( leftIndex, rightIndex ); + binaryExpression.InitializeBinaryExpression( leftExpression, op, rightExpression ); + return true; + } +} \ No newline at end of file diff --git a/Runtime/Text/Parsing/Expressions/Operators/BinaryOperator.cs.uid b/Runtime/Text/Parsing/Expressions/Operators/BinaryOperator.cs.uid new file mode 100644 index 0000000..a6486a1 --- /dev/null +++ b/Runtime/Text/Parsing/Expressions/Operators/BinaryOperator.cs.uid @@ -0,0 +1 @@ +uid://buximvl87r1m2 diff --git a/Runtime/Text/Parsing/Expressions/Operators/ConstantExpression.cs b/Runtime/Text/Parsing/Expressions/Operators/ConstantExpression.cs new file mode 100644 index 0000000..b39b280 --- /dev/null +++ b/Runtime/Text/Parsing/Expressions/Operators/ConstantExpression.cs @@ -0,0 +1,25 @@ +using System.Collections.Generic; +using System.Linq; + +namespace Rokojori; + +public interface IConstantExpression:OperatorExpression +{ + public void InitializeConstantExpression( ASTNode expression ); + public ASTNode GetConstantExpression(); +} + +public class ConstantExpression:ASTNode,IConstantExpression +{ + public ASTNode constant; + + public void InitializeConstantExpression( ASTNode constant ) + { + this.constant = constant; + } + + public ASTNode GetConstantExpression() + { + return constant; + } +} \ No newline at end of file diff --git a/Runtime/Text/Parsing/Expressions/Operators/ConstantExpression.cs.uid b/Runtime/Text/Parsing/Expressions/Operators/ConstantExpression.cs.uid new file mode 100644 index 0000000..ed5414a --- /dev/null +++ b/Runtime/Text/Parsing/Expressions/Operators/ConstantExpression.cs.uid @@ -0,0 +1 @@ +uid://caqotfege5pwp diff --git a/Runtime/Text/Parsing/Expressions/Operators/ConstantOperator.cs b/Runtime/Text/Parsing/Expressions/Operators/ConstantOperator.cs new file mode 100644 index 0000000..38456d4 --- /dev/null +++ b/Runtime/Text/Parsing/Expressions/Operators/ConstantOperator.cs @@ -0,0 +1,21 @@ +using System.Collections.Generic; +using System.Linq; + +namespace Rokojori; + +public class ConstantOperator:ExpressionOperator where T:ASTNode,IConstantExpression, new() +{ + public ConstantOperator( TokenPredicateData predicateData ) + { + startTokenPredicate = predicateData; + } + + public override bool ProcessStartNode( ASTNode parent, int startChildIndex ) + { + var ce = parent.children[ startChildIndex ]; + var ve = parent.MergeOuter( ce, ce ); + ve.InitializeConstantExpression( ce ); + + return true; + } +} \ No newline at end of file diff --git a/Runtime/Text/Parsing/Expressions/Operators/ConstantOperator.cs.uid b/Runtime/Text/Parsing/Expressions/Operators/ConstantOperator.cs.uid new file mode 100644 index 0000000..8d12ab7 --- /dev/null +++ b/Runtime/Text/Parsing/Expressions/Operators/ConstantOperator.cs.uid @@ -0,0 +1 @@ +uid://jfvs735hl3ld diff --git a/Runtime/Text/Parsing/Expressions/Operators/ExpressionOperator.cs b/Runtime/Text/Parsing/Expressions/Operators/ExpressionOperator.cs new file mode 100644 index 0000000..dc5ce79 --- /dev/null +++ b/Runtime/Text/Parsing/Expressions/Operators/ExpressionOperator.cs @@ -0,0 +1,39 @@ +using System.Collections.Generic; +using System.Linq; + +namespace Rokojori; + +public abstract class ExpressionOperator +{ + public TokenPredicateData startTokenPredicate; + + public virtual bool IsFromLeft() + { + return true; + } + + public bool IsStartNode( ASTNode node ) + { + return startTokenPredicate.Matches( node ); + } + + public virtual int FindStartNodeIndex( ASTNode parent ) + { + var start = IsFromLeft() ? 0 : ( parent.children.Count - 1 ); + var end = IsFromLeft() ? parent.children.Count : -1; + + var step = IsFromLeft() ? 1 : -1; + + for ( int i = start; i != end; i += step ) + { + if ( IsStartNode( parent.children[ i ] ) ) + { + return i; + } + } + + return -1; + } + + public abstract bool ProcessStartNode( ASTNode parent, int startChildIndex ); +} diff --git a/Runtime/Text/Parsing/Expressions/Operators/ExpressionOperator.cs.uid b/Runtime/Text/Parsing/Expressions/Operators/ExpressionOperator.cs.uid new file mode 100644 index 0000000..377a09d --- /dev/null +++ b/Runtime/Text/Parsing/Expressions/Operators/ExpressionOperator.cs.uid @@ -0,0 +1 @@ +uid://bpa5v70lmadw7 diff --git a/Runtime/Text/Parsing/Expressions/Operators/GroupExpression.cs b/Runtime/Text/Parsing/Expressions/Operators/GroupExpression.cs new file mode 100644 index 0000000..bc9d237 --- /dev/null +++ b/Runtime/Text/Parsing/Expressions/Operators/GroupExpression.cs @@ -0,0 +1,30 @@ +using System.Collections.Generic; +using System.Linq; + +namespace Rokojori; + +public interface IGroupExpression:OperatorExpression +{ + public void InitializeGroup( ASTNode left, ASTNode groupBody, ASTNode right ); + public ASTNode GetGroupBody(); +} + +public class GroupExpression:ASTNode,IGroupExpression +{ + public ASTNode left; + public ASTNode groupBody; + public ASTNode right; + + + public void InitializeGroup( ASTNode left, ASTNode groupBody, ASTNode right ) + { + this.left = left; + this.groupBody = groupBody; + this.right = right; + } + + public ASTNode GetGroupBody() + { + return groupBody; + } +} \ No newline at end of file diff --git a/Runtime/Text/Parsing/Expressions/Operators/GroupExpression.cs.uid b/Runtime/Text/Parsing/Expressions/Operators/GroupExpression.cs.uid new file mode 100644 index 0000000..da6b6ef --- /dev/null +++ b/Runtime/Text/Parsing/Expressions/Operators/GroupExpression.cs.uid @@ -0,0 +1 @@ +uid://dxsmj25b5f13r diff --git a/Runtime/Text/Parsing/Expressions/Operators/GroupOperator.cs b/Runtime/Text/Parsing/Expressions/Operators/GroupOperator.cs new file mode 100644 index 0000000..a3bba34 --- /dev/null +++ b/Runtime/Text/Parsing/Expressions/Operators/GroupOperator.cs @@ -0,0 +1,45 @@ +using System.Collections.Generic; +using System.Linq; + +namespace Rokojori; + +public class GroupOperator:ExpressionOperator where T:ASTNode,IGroupExpression, new() +{ + public TokenPredicateData endTokenPredicate; + + public GroupOperator( string startSymbol, string endSymbol, string type = null ) + { + type = type ?? LexerMatcherLibrary.BracketMatcher.type; + + startTokenPredicate = TokenPredicateData.Create( type, startSymbol ); + endTokenPredicate = TokenPredicateData.Create( type, endSymbol ); + } + + public override bool ProcessStartNode( ASTNode parent, int startChildIndex ) + { + var endIndex = parent.FindBracketCloserIndex( startTokenPredicate.match, endTokenPredicate.match, startChildIndex ); + + if ( endIndex == -1 ) + { + parent.parser.AddError( "Missing end of " + this + "in parent:" + parent + " at: " + startChildIndex ); + return false; + } + + var start = parent.children[ startChildIndex ]; + var end = parent.children[ endIndex ]; + + var groupBodyExpression = parent.MergeInner( start, end ); + + var groupExpression = parent.MergeOuter( start, end ); + groupExpression.InitializeGroup( start, groupBodyExpression, end ); + + var expressionParser = parent.parser.GetExpressionParser(); + + if ( expressionParser != null ) + { + expressionParser.ProcessExpression( groupBodyExpression ); + } + + return true; + } +} \ No newline at end of file diff --git a/Runtime/Text/Parsing/Expressions/Operators/GroupOperator.cs.uid b/Runtime/Text/Parsing/Expressions/Operators/GroupOperator.cs.uid new file mode 100644 index 0000000..d5ca98a --- /dev/null +++ b/Runtime/Text/Parsing/Expressions/Operators/GroupOperator.cs.uid @@ -0,0 +1 @@ +uid://bbylgy3f16ly diff --git a/Runtime/Text/Parsing/Expressions/Operators/OperatorExpression.cs b/Runtime/Text/Parsing/Expressions/Operators/OperatorExpression.cs new file mode 100644 index 0000000..80695ce --- /dev/null +++ b/Runtime/Text/Parsing/Expressions/Operators/OperatorExpression.cs @@ -0,0 +1,9 @@ +using System.Collections.Generic; +using System.Linq; + +namespace Rokojori; + +public interface OperatorExpression +{ + +} \ No newline at end of file diff --git a/Runtime/Text/Parsing/Expressions/Operators/OperatorExpression.cs.uid b/Runtime/Text/Parsing/Expressions/Operators/OperatorExpression.cs.uid new file mode 100644 index 0000000..4857c4a --- /dev/null +++ b/Runtime/Text/Parsing/Expressions/Operators/OperatorExpression.cs.uid @@ -0,0 +1 @@ +uid://etmo2vwlenna diff --git a/Runtime/Text/Parsing/Expressions/Operators/UnaryExpression.cs b/Runtime/Text/Parsing/Expressions/Operators/UnaryExpression.cs new file mode 100644 index 0000000..60d6d7b --- /dev/null +++ b/Runtime/Text/Parsing/Expressions/Operators/UnaryExpression.cs @@ -0,0 +1,33 @@ +using System.Collections.Generic; +using System.Linq; + +namespace Rokojori; + +public interface IUnaryExpression:OperatorExpression +{ + public void InitializeUnaryExpression( ASTNode unary, ASTNode expression ); + public ASTNode GetExpression(); + public ASTNode GetOperator(); +} + +public class UnaryExpression:ASTNode,IUnaryExpression +{ + public ASTNode unaryOperator; + public ASTNode expression; + + public void InitializeUnaryExpression( ASTNode unaryOperator, ASTNode expression ) + { + this.unaryOperator = unaryOperator; + this.expression = expression; + } + + public ASTNode GetOperator() + { + return unaryOperator; + } + + public ASTNode GetExpression() + { + return expression; + } +} \ No newline at end of file diff --git a/Runtime/Text/Parsing/Expressions/Operators/UnaryExpression.cs.uid b/Runtime/Text/Parsing/Expressions/Operators/UnaryExpression.cs.uid new file mode 100644 index 0000000..4b4bcfb --- /dev/null +++ b/Runtime/Text/Parsing/Expressions/Operators/UnaryExpression.cs.uid @@ -0,0 +1 @@ +uid://denmdwmr7fq47 diff --git a/Runtime/Text/Parsing/Expressions/Operators/UnaryOperator.cs b/Runtime/Text/Parsing/Expressions/Operators/UnaryOperator.cs new file mode 100644 index 0000000..016f4f9 --- /dev/null +++ b/Runtime/Text/Parsing/Expressions/Operators/UnaryOperator.cs @@ -0,0 +1,115 @@ +using System.Collections.Generic; +using System.Linq; + +namespace Rokojori; + +public class UnaryOperator:ExpressionOperator where T:ASTNode,IUnaryExpression, new() +{ + bool _fromLeft = false; + bool _isPost = false; + bool _checkForOperators = false; + + public override bool IsFromLeft() + { + return _fromLeft; + } + + public UnaryOperator( string symbol, bool fromLeft = true, bool post = false, bool checkForOperators = false ) + { + startTokenPredicate = TokenPredicateData.Create( LexerMatcherLibrary.OperatorMatcher.type, symbol ); + _fromLeft = fromLeft; + _isPost = post; + _checkForOperators = checkForOperators; + } + + public override bool ProcessStartNode( ASTNode parent, int startChildIndex ) + { + var operatorNode = parent.children[ startChildIndex ]; + var isFirstIndex = startChildIndex == 0; + var isLastIndex = startChildIndex == ( parent.children.Count - 1 ); + + if ( _isPost && isFirstIndex ) + { + parent.parser.AddError( "Missing left for " + this + "in parent:" + parent + " at child:" + startChildIndex ); + return false; + } + + if ( ! _isPost && isLastIndex ) + { + parent.parser.AddError( "Missing right " + this + "in parent:" + parent + " at child:" + startChildIndex ); + + return false; + } + + var otherNodeIndexOff = _isPost ? -1 : 1; + var otherNodeIndex = parent.IndexOffset( startChildIndex, otherNodeIndexOff ); + var expressionNode = parent.children[ otherNodeIndex ]; + + var startNode = operatorNode; + var endNode = expressionNode; + + if ( _isPost ) + { + startNode = expressionNode; + endNode = operatorNode; + } + + var uniExpression = parent.MergeOuter( startNode, endNode ); + uniExpression.InitializeUnaryExpression( operatorNode, expressionNode ); + + return true; + } + + public override int FindStartNodeIndex( ASTNode parent ) + { + if ( ! _checkForOperators ) + { + return base.FindStartNodeIndex( parent ); + } + + var start = IsFromLeft() ? 0 : ( parent.children.Count - 1 ); + var end = IsFromLeft() ? parent.children.Count : -1; + + var step = IsFromLeft() ? 1 : -1; + + for ( int i = start; i != end; i += step ) + { + if ( IsStartNode( parent.children[ i ] ) && CheckStartWithOperators( parent, i ) ) + { + return i; + } + } + + return -1; + } + + + bool CheckStartWithOperators( ASTNode parent, int index ) + { + var isStartIndex = index == 0; + + var isPre = ! _isPost; + + if ( isPre ) + { + if ( isStartIndex ) + { + return true; + } + + var nodeBefore = parent.PreviousNode( index ); // nodes[ index - 1 ]; + + if ( nodeBefore.IsToken( LexerMatcherLibrary.OperatorMatcher.type ) ) + { + return true; + } + else + { + // console.log( "node before not a operator:", nodes[ index ], ">>", nodeBefore ); + } + } + + return false; + + } +} \ No newline at end of file diff --git a/Runtime/Text/Parsing/Expressions/Operators/UnaryOperator.cs.uid b/Runtime/Text/Parsing/Expressions/Operators/UnaryOperator.cs.uid new file mode 100644 index 0000000..f1365f4 --- /dev/null +++ b/Runtime/Text/Parsing/Expressions/Operators/UnaryOperator.cs.uid @@ -0,0 +1 @@ +uid://d3puyem33kchk diff --git a/Runtime/Text/Parsing/Expressions/Operators/VariableExpression.cs b/Runtime/Text/Parsing/Expressions/Operators/VariableExpression.cs new file mode 100644 index 0000000..34b110b --- /dev/null +++ b/Runtime/Text/Parsing/Expressions/Operators/VariableExpression.cs @@ -0,0 +1,24 @@ +using System.Collections.Generic; +using System.Linq; + +namespace Rokojori; + +public interface IVariableExpression:OperatorExpression +{ + public void InitializeVariableExpression( ASTNode expression ); +} + +public class VariableExpression:ASTNode,IVariableExpression +{ + public ASTNode expression; + + public void InitializeVariableExpression( ASTNode expression ) + { + this.expression = expression; + } + + public ASTNode GetExpression() + { + return expression; + } +} \ No newline at end of file diff --git a/Runtime/Text/Parsing/Expressions/Operators/VariableExpression.cs.uid b/Runtime/Text/Parsing/Expressions/Operators/VariableExpression.cs.uid new file mode 100644 index 0000000..9b0e43e --- /dev/null +++ b/Runtime/Text/Parsing/Expressions/Operators/VariableExpression.cs.uid @@ -0,0 +1 @@ +uid://bkuyqglhvww16 diff --git a/Runtime/Text/Parsing/Expressions/Operators/VariableOperator.cs b/Runtime/Text/Parsing/Expressions/Operators/VariableOperator.cs new file mode 100644 index 0000000..611f3b1 --- /dev/null +++ b/Runtime/Text/Parsing/Expressions/Operators/VariableOperator.cs @@ -0,0 +1,21 @@ +using System.Collections.Generic; +using System.Linq; + +namespace Rokojori; + +public class VariableOperator:ExpressionOperator where T:ASTNode,IVariableExpression, new() +{ + public VariableOperator() + { + startTokenPredicate = TokenPredicateData.Create( LexerMatcherLibrary.CwordMatcher.type, null ); + } + + public override bool ProcessStartNode( ASTNode parent, int startChildIndex ) + { + var v = parent.children[ startChildIndex ]; + var ve = parent.MergeOuter( v, v ); + ve.InitializeVariableExpression( v ); + + return true; + } +} \ No newline at end of file diff --git a/Runtime/Text/Parsing/Expressions/Operators/VariableOperator.cs.uid b/Runtime/Text/Parsing/Expressions/Operators/VariableOperator.cs.uid new file mode 100644 index 0000000..09d9bf6 --- /dev/null +++ b/Runtime/Text/Parsing/Expressions/Operators/VariableOperator.cs.uid @@ -0,0 +1 @@ +uid://b76eexwinywf7 diff --git a/Runtime/Text/Parsing/Expressions/PrecedenceLevel.cs b/Runtime/Text/Parsing/Expressions/PrecedenceLevel.cs new file mode 100644 index 0000000..f12ee00 --- /dev/null +++ b/Runtime/Text/Parsing/Expressions/PrecedenceLevel.cs @@ -0,0 +1,67 @@ +using System.Collections.Generic; +using System.Linq; + +namespace Rokojori; + +public class PrecedenceLevel +{ + public bool fromLeft = true; + public List operators = []; + + public bool Process( ASTNode parent ) + { + SearchExpressionForOperators( parent ); + + if ( _operatorIndex == -1 ) + { + return false; + } + + var currentOperator = operators[ _operatorIndex ]; + + var changed = currentOperator.ProcessStartNode( parent, _expressionIndex ); + + if ( changed ) + { + //console.log( "Processed", className( currentOperator ), currentOperator.tokenType, currentOperator.tokenValue ); + } + + return changed; + } + + + public bool HasHigherPrecedence( int i, int e ) + { + return fromLeft ? i < e : i > e; + } + + int _expressionIndex = -1; + int _operatorIndex = -1; + + + public void SearchExpressionForOperators( ASTNode parent ) + { + _expressionIndex = fromLeft ? parent.children.Count : -1; + _operatorIndex = -1; + + for ( int i = 0; i < operators.Count; i++ ) + { + var index = operators[ i ].FindStartNodeIndex( parent ); + + if ( index == -1 ) + { + continue; + } + + if ( ! HasHigherPrecedence( index, this._expressionIndex ) ) + { + continue; + } + + _expressionIndex = index; + _operatorIndex = i; + + } + + } +} diff --git a/Runtime/Text/Parsing/Expressions/PrecedenceLevel.cs.uid b/Runtime/Text/Parsing/Expressions/PrecedenceLevel.cs.uid new file mode 100644 index 0000000..fdb6fd0 --- /dev/null +++ b/Runtime/Text/Parsing/Expressions/PrecedenceLevel.cs.uid @@ -0,0 +1 @@ +uid://7dusnbxqom3j diff --git a/Runtime/Text/Parsing/Parser/ASTParserPhase.cs b/Runtime/Text/Parsing/Parser/ASTParserPhase.cs new file mode 100644 index 0000000..b54cc04 --- /dev/null +++ b/Runtime/Text/Parsing/Parser/ASTParserPhase.cs @@ -0,0 +1,22 @@ +using System.Collections.Generic; + +namespace Rokojori; + +public abstract class ASTParserPhase:ParserPhase +{ + public ASTParser parserProcessor; + + public ASTParserPhase( ASTParser parserProcessor ) + { + this.parserProcessor = parserProcessor; + } + + public abstract ASTNode GetParsingRoot( Parser parser ); + + public override void Process( Parser parser ) + { + parserProcessor.root = GetParsingRoot( parser ); + parserProcessor.Process(); + } + +} \ No newline at end of file diff --git a/Runtime/Text/Parsing/Parser/ASTParserPhase.cs.uid b/Runtime/Text/Parsing/Parser/ASTParserPhase.cs.uid new file mode 100644 index 0000000..4130bde --- /dev/null +++ b/Runtime/Text/Parsing/Parser/ASTParserPhase.cs.uid @@ -0,0 +1 @@ +uid://6uj7v6150kcc diff --git a/Runtime/Text/Parsing/Parser/LexerPhase.cs b/Runtime/Text/Parsing/Parser/LexerPhase.cs new file mode 100644 index 0000000..317c138 --- /dev/null +++ b/Runtime/Text/Parsing/Parser/LexerPhase.cs @@ -0,0 +1,43 @@ +using System.Collections.Generic; + +namespace Rokojori; + +public class LexerPhase:ParserPhase +{ + public LexerPhase( Lexer lexer ) + { + this.lexer = lexer; + } + public Lexer lexer; + + public bool outputDebugInfo = false; + + public override void Process( Parser parser ) + { + parser.lexerEvents = lexer.LexToList( parser.source ); + + if ( lexer.hasError ) + { + hasStopError = true; + return; + } + + parser.lexerEvents.Pop(); + + lexer.GrabMatches( parser.lexerEvents, parser.source ); + + var root = parser.root; + + parser.root.children.AddRange( parser.lexerEvents.Map( le => Token.Create( le, root ) ) ); + + if ( outputDebugInfo ) + { + var index = 0; + + RJLog.Log( "Lexer Info:", "\n" + + parser.lexerEvents.Map( le => "["+ ( index++ ) + "] '" + ( le.type == "Break" ? "\\n" : le.match ) + "' : " + le.type + " ("+ le.offset +")" ).Join( "\n" ) + ); + } + + } +} \ No newline at end of file diff --git a/Runtime/Text/Parsing/Parser/LexerPhase.cs.uid b/Runtime/Text/Parsing/Parser/LexerPhase.cs.uid new file mode 100644 index 0000000..410324c --- /dev/null +++ b/Runtime/Text/Parsing/Parser/LexerPhase.cs.uid @@ -0,0 +1 @@ +uid://q6mj5ke2y7h7 diff --git a/Runtime/Text/Parsing/Parser/Parser.cs b/Runtime/Text/Parsing/Parser/Parser.cs new file mode 100644 index 0000000..95f19b3 --- /dev/null +++ b/Runtime/Text/Parsing/Parser/Parser.cs @@ -0,0 +1,63 @@ +using System.Collections.Generic; + +namespace Rokojori; + +public abstract class Parser +{ + public string source; + public List lexerEvents = []; + public ASTNode root; + public List phases = []; + public List messages = []; + + + + public ParserPhase stoppedParsingPhase = null; + + public virtual ExpressionParser GetExpressionParser() + { + return null; + } + + public void Parse( string source ) + { + this.source = source; + + foreach ( var p in phases ) + { + p.Process( this ); + + if ( p.hasStopError ) + { + stoppedParsingPhase = p; + return; + } + } + } + + bool _hasErrors = false; + public bool hasErrors => _hasErrors; + + public void AddError( string message, params TextSelection[] textSelections ) + { + AddMessage( MessageType.Error, message, textSelections ); + } + + public void AddMessage( MessageType type, string message, params TextSelection[] textSelections ) + { + var pm = new ParserMessage(); + pm.message = Message.Create( type, message ); + + if ( textSelections != null && textSelections.Length > 0 ) + { + pm.selections.AddRange( textSelections ); + } + + messages.Add( pm ); + + if ( type == MessageType.Error ) + { + _hasErrors = true; + } + } +} \ No newline at end of file diff --git a/Runtime/Text/Parsing/Parser/Parser.cs.uid b/Runtime/Text/Parsing/Parser/Parser.cs.uid new file mode 100644 index 0000000..697bc5d --- /dev/null +++ b/Runtime/Text/Parsing/Parser/Parser.cs.uid @@ -0,0 +1 @@ +uid://7j0igvrgv6jp diff --git a/Runtime/Text/Parsing/Parser/ParserMessage.cs b/Runtime/Text/Parsing/Parser/ParserMessage.cs new file mode 100644 index 0000000..b5c69df --- /dev/null +++ b/Runtime/Text/Parsing/Parser/ParserMessage.cs @@ -0,0 +1,10 @@ +using System.Collections.Generic; + +namespace Rokojori; + +public class ParserMessage +{ + public Message message; + public List selections = []; + +} \ No newline at end of file diff --git a/Runtime/Text/Parsing/Parser/ParserMessage.cs.uid b/Runtime/Text/Parsing/Parser/ParserMessage.cs.uid new file mode 100644 index 0000000..23c412a --- /dev/null +++ b/Runtime/Text/Parsing/Parser/ParserMessage.cs.uid @@ -0,0 +1 @@ +uid://dci6pck0rxfu5 diff --git a/Runtime/Text/Parsing/Parser/ParserPhase.cs b/Runtime/Text/Parsing/Parser/ParserPhase.cs new file mode 100644 index 0000000..6ab4f42 --- /dev/null +++ b/Runtime/Text/Parsing/Parser/ParserPhase.cs @@ -0,0 +1,9 @@ +using System.Collections.Generic; + +namespace Rokojori; + +public abstract class ParserPhase +{ + public abstract void Process( Parser parser ); + public bool hasStopError = false; +} \ No newline at end of file diff --git a/Runtime/Text/Parsing/Parser/ParserPhase.cs.uid b/Runtime/Text/Parsing/Parser/ParserPhase.cs.uid new file mode 100644 index 0000000..ff27537 --- /dev/null +++ b/Runtime/Text/Parsing/Parser/ParserPhase.cs.uid @@ -0,0 +1 @@ +uid://c663techcgo6w diff --git a/Runtime/Text/Parsing/ParserLibrary/CSharp/CSParser.cs b/Runtime/Text/Parsing/ParserLibrary/CSharp/CSParser.cs new file mode 100644 index 0000000..96ab705 --- /dev/null +++ b/Runtime/Text/Parsing/ParserLibrary/CSharp/CSParser.cs @@ -0,0 +1,26 @@ +using System.Collections.Generic; + +namespace Rokojori; + +public class CSParser:Parser +{ + public LexerPhase lexerPhase = new LexerPhase( new CSLexer() ); + public CSPreProcessor preProcessor = new CSPreProcessor(); + public CSRootFileParser rootPhase = new CSRootFileParser(); + + public CSParser( string filePath, HashSet defines = null ) + { + root = CSFileRoot.Create( filePath, this ); + + phases = + [ + lexerPhase, + preProcessor, + rootPhase + ]; + + rootPhase.preProcessorContext.defines = defines ?? new HashSet(); + + Parse( FilesSync.LoadUTF8( filePath ) ); + } +} \ No newline at end of file diff --git a/Runtime/Text/Parsing/ParserLibrary/CSharp/CSParser.cs.uid b/Runtime/Text/Parsing/ParserLibrary/CSharp/CSParser.cs.uid new file mode 100644 index 0000000..d4f968e --- /dev/null +++ b/Runtime/Text/Parsing/ParserLibrary/CSharp/CSParser.cs.uid @@ -0,0 +1 @@ +uid://ckn0wj4udiupw diff --git a/Runtime/Text/Parsing/ParserLibrary/CSharp/CSParserTest.cs b/Runtime/Text/Parsing/ParserLibrary/CSharp/CSParserTest.cs new file mode 100644 index 0000000..a0e560f --- /dev/null +++ b/Runtime/Text/Parsing/ParserLibrary/CSharp/CSParserTest.cs @@ -0,0 +1,91 @@ +using System.Collections.Generic; +using Godot; + +namespace Rokojori; + +[Tool,GlobalClass] +public partial class CSParserTest:Node +{ + [Export] + public string defines = "a,b,c"; + + [Export] + public string formula = ""; + [ExportToolButton( "Parse Formula" )] + public Callable parseFormulaButton => Callable.From( + ()=> + { + ParseFormula(); + } + ); + + [Export( PropertyHint.File )] + public string path; + + [Export] + public bool createGD = false; + + + + [ExportToolButton( "Parse" )] + public Callable parseButton => Callable.From( + ()=> + { + Parse(); + } + ); + + void Parse() + { + var defines = new HashSet(); + defines.Add( GDScriptGenerator.GD_SCRIPT_TRANSPILING ); + + var parser = new CSParser( ProjectSettings.GlobalizePath( path ), defines ); + + var root = parser.root as CSFileRoot; + + this.LogInfo( "Parsed Nodes:", root.parsedNodes.Count ); + + + for ( int i = 0; i < root.parsedNodes.Count; i++ ) + { + this.LogInfo( i, root.parsedNodes[ i ] ); + } + + if ( createGD ) + { + CreateGDClass( root ); + } + } + + void CreateGDClass( CSFileRoot root ) + { + var originalPath = FilePath.Absolute( root.GetFilePath() ); + + var converter = new GDScriptFromCSAST(); + converter.Convert( root ); + var gdclass = converter.gdClass; + + var gdgenerator = new GDScriptGenerator(); + gdgenerator.gdClasses = [ gdclass ]; + gdgenerator.Generate( originalPath.parentAbsolutePath ); + + } + + void ParseFormula() + { + var defines = this.defines.Split( "," ); + var evaluator = new CSPreProcessorConditionalEvaluator(); + defines.ForEach( d => evaluator.defines.Add( d ) ); + evaluator.Parse( formula ); + + var result = evaluator.Evaluate(); + + this.LogInfo( "Result:", result ); + + this.LogInfo( "Context:", evaluator.context.messages ); + + var info = evaluator.root.CreateDebugTreeInfo(); + this.LogInfo( "\n" + info ); + } +} \ No newline at end of file diff --git a/Runtime/Text/Parsing/ParserLibrary/CSharp/CSParserTest.cs.uid b/Runtime/Text/Parsing/ParserLibrary/CSharp/CSParserTest.cs.uid new file mode 100644 index 0000000..296b402 --- /dev/null +++ b/Runtime/Text/Parsing/ParserLibrary/CSharp/CSParserTest.cs.uid @@ -0,0 +1 @@ +uid://btbsqwh2k3ocl diff --git a/Runtime/Text/Parsing/ParserLibrary/CSharp/Nodes/CSFileRoot.cs b/Runtime/Text/Parsing/ParserLibrary/CSharp/Nodes/CSFileRoot.cs new file mode 100644 index 0000000..8535a8e --- /dev/null +++ b/Runtime/Text/Parsing/ParserLibrary/CSharp/Nodes/CSFileRoot.cs @@ -0,0 +1,57 @@ +using System.Collections.Generic; + +namespace Rokojori; + +public class CSFileRoot:ASTNode, ASTFileRoot +{ + public string filePath; + CSParser _parser; + public CSParser parser => _parser; + public Parser GetParser() + { + return _parser; + } + + public string GetFilePath() + { + return filePath; + } + + public string GetSource() + { + return _parser.source; + } + + TextLinesMapper _textLinesMapper = null; + + public TextLinesMapper GetTextLinesMapper() + { + if ( _textLinesMapper == null ) + { + _textLinesMapper = new TextLinesMapper(); + _textLinesMapper.Map( GetSource() ); + } + + return _textLinesMapper; + } + + + + public static CSFileRoot Create( string path, CSParser parser ) + { + var root = new CSFileRoot(); + root.filePath = path; + root._parser = parser; + return root; + } + + public List parsedNodes = new List(); + + public List imports = []; + public CSNamespaceDeclaration namespaceDeclaration; + public List allMemberDeclarations = []; + public List blocks = []; + public List objectDefinitions = []; + + +} \ No newline at end of file diff --git a/Runtime/Text/Parsing/ParserLibrary/CSharp/Nodes/CSFileRoot.cs.uid b/Runtime/Text/Parsing/ParserLibrary/CSharp/Nodes/CSFileRoot.cs.uid new file mode 100644 index 0000000..6dfb829 --- /dev/null +++ b/Runtime/Text/Parsing/ParserLibrary/CSharp/Nodes/CSFileRoot.cs.uid @@ -0,0 +1 @@ +uid://dqq08jh3q0tx5 diff --git a/Runtime/Text/Parsing/ParserLibrary/CSharp/Nodes/CSImportDeclaration.cs b/Runtime/Text/Parsing/ParserLibrary/CSharp/Nodes/CSImportDeclaration.cs new file mode 100644 index 0000000..e0c8093 --- /dev/null +++ b/Runtime/Text/Parsing/ParserLibrary/CSharp/Nodes/CSImportDeclaration.cs @@ -0,0 +1,64 @@ +using System.Collections.Generic; +using System.Linq; + +namespace Rokojori; + +public class CSImportDeclaration: ASTNode, ImportDeclaration +{ + public Token usingToken; + public List importPath; + public Token end; + + public string GetImportPath() + { + return importPath.Map( tk => tk.match ).Join( "" ); + } + + public override string ToString() + { + return GetType().Name + "{ using " + GetImportPath()+ "; } "; + } + + public static ASTMatcherResolver Resolver() + { + var usingMR = new ASTMatcherResolver(); + + var sequenceMatcher = TokenRepeatSequenceASTMatcher.CreateWithLexer( new CSLexer(), + "using cword",".cword",";" + ); + + usingMR.matcher = sequenceMatcher; + + usingMR.initializer = ( imp, matcher ) => + { + var usingIndex = imp.FindTokenIndex( LexerMatcherLibrary.UsingMatcher ); + var endIndex = imp.ReverseFindTokenIndex( LexerMatcherLibrary.OperatorMatcher ); + + RJLog.Log( "Endindex:", endIndex ); + imp.usingToken = imp.children[ usingIndex ] as Token; + imp.end = imp.children[ endIndex ] as Token; + + var inbetween = imp.children.Sub( usingIndex + 1, endIndex - usingIndex - 1 ); + imp.importPath = inbetween.Filter( n => ! n.IsIgnoreToken() ).Map( n => n as Token ); + + RJLog.Log( + "INIT IMPORT:", imp.usingToken, ">>", inbetween.Join( ", " ), ">>", imp.end, + imp.children.Last(), + "path only:",imp.importPath.Join( "|| ") ); + + var root = imp.GetParentWithType(); + + if ( root == null ) + { + return imp.childIndex; + } + + root.parsedNodes.Add( imp ); + root.imports.Add( imp ); + + return imp.childIndex; + }; + + return usingMR; + } +} \ No newline at end of file diff --git a/Runtime/Text/Parsing/ParserLibrary/CSharp/Nodes/CSImportDeclaration.cs.uid b/Runtime/Text/Parsing/ParserLibrary/CSharp/Nodes/CSImportDeclaration.cs.uid new file mode 100644 index 0000000..a81b5f8 --- /dev/null +++ b/Runtime/Text/Parsing/ParserLibrary/CSharp/Nodes/CSImportDeclaration.cs.uid @@ -0,0 +1 @@ +uid://bhawdwu83nael diff --git a/Runtime/Text/Parsing/ParserLibrary/CSharp/Nodes/CSNamespaceBlock.cs b/Runtime/Text/Parsing/ParserLibrary/CSharp/Nodes/CSNamespaceBlock.cs new file mode 100644 index 0000000..cbbf2de --- /dev/null +++ b/Runtime/Text/Parsing/ParserLibrary/CSharp/Nodes/CSNamespaceBlock.cs @@ -0,0 +1,16 @@ +using System.Collections.Generic; + +namespace Rokojori; + +public class CSNamespaceBlock: ASTNode, NamespaceBlock +{ + public Token namespaceToken; + public List namespacePath; + public Token blockStart; + public Token blockEnd; + + public string GetNamespace() + { + return namespacePath.Map( tk => tk.match ).Join( "" ); + } +} \ No newline at end of file diff --git a/Runtime/Text/Parsing/ParserLibrary/CSharp/Nodes/CSNamespaceBlock.cs.uid b/Runtime/Text/Parsing/ParserLibrary/CSharp/Nodes/CSNamespaceBlock.cs.uid new file mode 100644 index 0000000..d404374 --- /dev/null +++ b/Runtime/Text/Parsing/ParserLibrary/CSharp/Nodes/CSNamespaceBlock.cs.uid @@ -0,0 +1 @@ +uid://dngeubh7s682t diff --git a/Runtime/Text/Parsing/ParserLibrary/CSharp/Nodes/CSNamespaceDeclaration.cs b/Runtime/Text/Parsing/ParserLibrary/CSharp/Nodes/CSNamespaceDeclaration.cs new file mode 100644 index 0000000..9d0e81b --- /dev/null +++ b/Runtime/Text/Parsing/ParserLibrary/CSharp/Nodes/CSNamespaceDeclaration.cs @@ -0,0 +1,63 @@ +using System.Collections.Generic; + +namespace Rokojori; + +public class CSNamespaceDeclaration: ASTNode, NamespaceDeclaration +{ + public Token namespaceToken; + public List namespacePath; + public Token end; + + public string GetNamespace() + { + return namespacePath.Map( tk => tk.match ).Join( "" ); + } + + public override string ToString() + { + return GetType().Name + "{ namespace " + GetNamespace()+ "; } "; + } + + public static ASTMatcherResolver Resolver() + { + var namespaceMR = new ASTMatcherResolver(); + + var sequenceMatcher = TokenRepeatSequenceASTMatcher.CreateWithLexer( new CSLexer(), + "namespace cword",".cword",";" + ); + + namespaceMR.matcher = sequenceMatcher; + + namespaceMR.initializer = ( nsd, matcher ) => + { + var nsIndex = nsd.FindTokenIndex( LexerMatcherLibrary.NamespaceMatcher ); + var endIndex = nsd.ReverseFindTokenIndex( LexerMatcherLibrary.OperatorMatcher ); + + RJLog.Log( "Endindex:", endIndex ); + nsd.namespaceToken = nsd.children[ nsIndex ] as Token; + nsd.end = nsd.children[ endIndex ] as Token; + + var inbetween = nsd.children.Sub( nsIndex + 1, endIndex - nsIndex - 1 ); + nsd.namespacePath = inbetween.Filter( n => ! n.IsIgnoreToken() ).Map( n => n as Token ); + + RJLog.Log( + "INIT IMPORT:", nsd.namespaceToken, ">>", inbetween.Join( ", " ), ">>", nsd.end, + nsd.children.Last(), + "path only:",nsd.namespacePath.Join( "|| ") ); + + var root = nsd.GetParentWithType(); + + if ( root == null ) + { + return nsd.childIndex; + } + + root.parsedNodes.Add( nsd ); + root.namespaceDeclaration = nsd; + + return nsd.childIndex; + }; + + return namespaceMR; + } +} \ No newline at end of file diff --git a/Runtime/Text/Parsing/ParserLibrary/CSharp/Nodes/CSNamespaceDeclaration.cs.uid b/Runtime/Text/Parsing/ParserLibrary/CSharp/Nodes/CSNamespaceDeclaration.cs.uid new file mode 100644 index 0000000..b52ff0f --- /dev/null +++ b/Runtime/Text/Parsing/ParserLibrary/CSharp/Nodes/CSNamespaceDeclaration.cs.uid @@ -0,0 +1 @@ +uid://c5j8xld75nofs diff --git a/Runtime/Text/Parsing/ParserLibrary/CSharp/Nodes/CSTypeDefinition.cs b/Runtime/Text/Parsing/ParserLibrary/CSharp/Nodes/CSTypeDefinition.cs new file mode 100644 index 0000000..3feb2cd --- /dev/null +++ b/Runtime/Text/Parsing/ParserLibrary/CSharp/Nodes/CSTypeDefinition.cs @@ -0,0 +1,13 @@ +using System.Collections.Generic; + +namespace Rokojori; + +public class CSTypeDefinition: ASTNode +{ + public string GetTypeDefinition() + { + return CombinedMatch().Trim(); + } + + +} \ No newline at end of file diff --git a/Runtime/Text/Parsing/ParserLibrary/CSharp/Nodes/CSTypeDefinition.cs.uid b/Runtime/Text/Parsing/ParserLibrary/CSharp/Nodes/CSTypeDefinition.cs.uid new file mode 100644 index 0000000..aae00f5 --- /dev/null +++ b/Runtime/Text/Parsing/ParserLibrary/CSharp/Nodes/CSTypeDefinition.cs.uid @@ -0,0 +1 @@ +uid://brtto8fv57gml diff --git a/Runtime/Text/Parsing/ParserLibrary/CSharp/Nodes/MemberDeclarations/CSEnumValueDeclaration.cs b/Runtime/Text/Parsing/ParserLibrary/CSharp/Nodes/MemberDeclarations/CSEnumValueDeclaration.cs new file mode 100644 index 0000000..b24844d --- /dev/null +++ b/Runtime/Text/Parsing/ParserLibrary/CSharp/Nodes/MemberDeclarations/CSEnumValueDeclaration.cs @@ -0,0 +1,49 @@ +using System.Collections.Generic; + +namespace Rokojori; + +public class CSEnumValueDeclaration: ASTNode, EnumDeclaration +{ + public Token parameterName; + public ASTNode parameterValue; + + public void Resolve() + { + var assignmentToken = FindToken( TokenPredicateData.Lexed( new CSLexer(), "=" ) ); + + if ( assignmentToken != null ) + { + var start = assignmentToken.childIndex + 1; + var length = ( children.Count - 1 ) - start; + parameterValue = MergeChildrenWith( start, length ); + } + + + var last = assignmentToken == null ? children.Last() : PreviousNode( assignmentToken.childIndex ); + + if ( ! last.IsToken( LexerMatcherLibrary.CwordMatcher ) ) + { + last = PreviousNode( last.childIndex ); + } + + parameterName = last as Token; + + } + + + public string GetEnumName() + { + return parameterName.match; + } + + public string GetEnumValue() + { + return parameterValue?.CombinedMatch().Trim(); + } + + public override string ToString() + { + return GetType().Name + " " + GetEnumName() + " ( ''" + parameterName.lineInfo + "'' ) "; + } + +} \ No newline at end of file diff --git a/Runtime/Text/Parsing/ParserLibrary/CSharp/Nodes/MemberDeclarations/CSEnumValueDeclaration.cs.uid b/Runtime/Text/Parsing/ParserLibrary/CSharp/Nodes/MemberDeclarations/CSEnumValueDeclaration.cs.uid new file mode 100644 index 0000000..ccc2e02 --- /dev/null +++ b/Runtime/Text/Parsing/ParserLibrary/CSharp/Nodes/MemberDeclarations/CSEnumValueDeclaration.cs.uid @@ -0,0 +1 @@ +uid://7jnddwcp20jd diff --git a/Runtime/Text/Parsing/ParserLibrary/CSharp/Nodes/MemberDeclarations/CSFieldDeclaration.cs b/Runtime/Text/Parsing/ParserLibrary/CSharp/Nodes/MemberDeclarations/CSFieldDeclaration.cs new file mode 100644 index 0000000..77e7a6a --- /dev/null +++ b/Runtime/Text/Parsing/ParserLibrary/CSharp/Nodes/MemberDeclarations/CSFieldDeclaration.cs @@ -0,0 +1,8 @@ +using System.Collections.Generic; + +namespace Rokojori; + +public class CSFieldDeclaration: CSMemberDeclaration +{ + +} \ No newline at end of file diff --git a/Runtime/Text/Parsing/ParserLibrary/CSharp/Nodes/MemberDeclarations/CSFieldDeclaration.cs.uid b/Runtime/Text/Parsing/ParserLibrary/CSharp/Nodes/MemberDeclarations/CSFieldDeclaration.cs.uid new file mode 100644 index 0000000..3544921 --- /dev/null +++ b/Runtime/Text/Parsing/ParserLibrary/CSharp/Nodes/MemberDeclarations/CSFieldDeclaration.cs.uid @@ -0,0 +1 @@ +uid://00vegm6r68g8 diff --git a/Runtime/Text/Parsing/ParserLibrary/CSharp/Nodes/MemberDeclarations/CSMemberDeclaration.cs b/Runtime/Text/Parsing/ParserLibrary/CSharp/Nodes/MemberDeclarations/CSMemberDeclaration.cs new file mode 100644 index 0000000..71cd34e --- /dev/null +++ b/Runtime/Text/Parsing/ParserLibrary/CSharp/Nodes/MemberDeclarations/CSMemberDeclaration.cs @@ -0,0 +1,37 @@ +using System.Collections.Generic; + +namespace Rokojori; + +public abstract class CSMemberDeclaration: ASTNode, MemberDeclaration +{ + public List attributeBrackets; + public List modifiers; + public Token memberName; + public CSTypeDefinition memberType; + + public List GetMemberModifiers() + { + return new List(); + } + + public string GetMemberName() + { + return memberName.match; + } + + public string GetMemberType() + { + if ( this is CSMethodMemberDeclaration mm && mm.isContructor ) + { + return GetMemberName(); + } + + return memberType == null ? "void" : memberType.GetTypeDefinition(); + } + + public override string ToString() + { + return GetType().Name + " " + GetMemberType() + " " + GetMemberName() + " ( ''" + memberName.lineInfo + "'' ) "; + } + +} \ No newline at end of file diff --git a/Runtime/Text/Parsing/ParserLibrary/CSharp/Nodes/MemberDeclarations/CSMemberDeclaration.cs.uid b/Runtime/Text/Parsing/ParserLibrary/CSharp/Nodes/MemberDeclarations/CSMemberDeclaration.cs.uid new file mode 100644 index 0000000..f4955cd --- /dev/null +++ b/Runtime/Text/Parsing/ParserLibrary/CSharp/Nodes/MemberDeclarations/CSMemberDeclaration.cs.uid @@ -0,0 +1 @@ +uid://bi4sl13ggdb7d diff --git a/Runtime/Text/Parsing/ParserLibrary/CSharp/Nodes/MemberDeclarations/CSMethodMemberDeclaration.cs b/Runtime/Text/Parsing/ParserLibrary/CSharp/Nodes/MemberDeclarations/CSMethodMemberDeclaration.cs new file mode 100644 index 0000000..45c2fb1 --- /dev/null +++ b/Runtime/Text/Parsing/ParserLibrary/CSharp/Nodes/MemberDeclarations/CSMethodMemberDeclaration.cs @@ -0,0 +1,16 @@ +using System.Collections.Generic; + +namespace Rokojori; + +public class CSMethodMemberDeclaration: CSMemberDeclaration +{ + public bool isContructor = false; + public Token parametersStart; + public ASTNode parametersContent; + public Token parametersEnd; + + public Token blockStart; + public ASTNode blockContent; + public Token blockEnd; + +} \ No newline at end of file diff --git a/Runtime/Text/Parsing/ParserLibrary/CSharp/Nodes/MemberDeclarations/CSMethodMemberDeclaration.cs.uid b/Runtime/Text/Parsing/ParserLibrary/CSharp/Nodes/MemberDeclarations/CSMethodMemberDeclaration.cs.uid new file mode 100644 index 0000000..d675a6f --- /dev/null +++ b/Runtime/Text/Parsing/ParserLibrary/CSharp/Nodes/MemberDeclarations/CSMethodMemberDeclaration.cs.uid @@ -0,0 +1 @@ +uid://bf4bnrj5kdugb diff --git a/Runtime/Text/Parsing/ParserLibrary/CSharp/Nodes/MemberDeclarations/CSParameterDeclaration.cs b/Runtime/Text/Parsing/ParserLibrary/CSharp/Nodes/MemberDeclarations/CSParameterDeclaration.cs new file mode 100644 index 0000000..98cf9ef --- /dev/null +++ b/Runtime/Text/Parsing/ParserLibrary/CSharp/Nodes/MemberDeclarations/CSParameterDeclaration.cs @@ -0,0 +1,60 @@ +using System.Collections.Generic; + +namespace Rokojori; + +public class CSParameterDeclaration: ASTNode, ParameterDeclaration +{ + public Token parameterName; + public CSTypeDefinition parameterType; + public ASTNode parameterValue; + + public void ResolveNameAndType() + { + var assignmentToken = FindToken( TokenPredicateData.Lexed( new CSLexer(), "=" ) ); + + if ( assignmentToken != null ) + { + var start = assignmentToken.childIndex + 1; + var length = ( children.Count - 1 ) - start; + parameterValue = MergeChildrenWith( start, length ); + } + + + var last = assignmentToken == null ? children.Last() : PreviousNode( assignmentToken.childIndex ); + + if ( ! last.IsToken( LexerMatcherLibrary.CwordMatcher ) ) + { + last = PreviousNode( last.childIndex ); + } + + // RJLog.Log( "parameterName:", last, children.Count, children.Map( c => "'" + c.CombinedMatch() + "'" ).Join( " " )); + + parameterName = last as Token; + + // RJLog.Log( "Creating type:", 0, parameterName.childIndex - 1 ); + parameterType = MergeOuter( 0, parameterName.childIndex - 1 ); + } + + + public string GetParameterName() + { + return parameterName.match; + } + + public string GetParameterType() + { + return parameterType.GetTypeDefinition(); + } + + public string GetParameterValue() + { + return parameterValue?.CombinedMatch().Trim(); + } + + + public override string ToString() + { + return GetType().Name + " " + GetParameterType() + " " + GetParameterName() + " ( ''" + parameterName.lineInfo + "'' ) "; + } + +} \ No newline at end of file diff --git a/Runtime/Text/Parsing/ParserLibrary/CSharp/Nodes/MemberDeclarations/CSParameterDeclaration.cs.uid b/Runtime/Text/Parsing/ParserLibrary/CSharp/Nodes/MemberDeclarations/CSParameterDeclaration.cs.uid new file mode 100644 index 0000000..82f79e6 --- /dev/null +++ b/Runtime/Text/Parsing/ParserLibrary/CSharp/Nodes/MemberDeclarations/CSParameterDeclaration.cs.uid @@ -0,0 +1 @@ +uid://cuw23g0pnu3md diff --git a/Runtime/Text/Parsing/ParserLibrary/CSharp/Nodes/MemberDeclarations/CSPropertyDeclaration.cs b/Runtime/Text/Parsing/ParserLibrary/CSharp/Nodes/MemberDeclarations/CSPropertyDeclaration.cs new file mode 100644 index 0000000..c79a1f4 --- /dev/null +++ b/Runtime/Text/Parsing/ParserLibrary/CSharp/Nodes/MemberDeclarations/CSPropertyDeclaration.cs @@ -0,0 +1,8 @@ +using System.Collections.Generic; + +namespace Rokojori; + +public class CSPropertyDeclaration: CSMemberDeclaration +{ + +} \ No newline at end of file diff --git a/Runtime/Text/Parsing/ParserLibrary/CSharp/Nodes/MemberDeclarations/CSPropertyDeclaration.cs.uid b/Runtime/Text/Parsing/ParserLibrary/CSharp/Nodes/MemberDeclarations/CSPropertyDeclaration.cs.uid new file mode 100644 index 0000000..a91b589 --- /dev/null +++ b/Runtime/Text/Parsing/ParserLibrary/CSharp/Nodes/MemberDeclarations/CSPropertyDeclaration.cs.uid @@ -0,0 +1 @@ +uid://cnomgidksu0i8 diff --git a/Runtime/Text/Parsing/ParserLibrary/CSharp/Nodes/ObjectDeclarations/CSClassDeclaration.cs b/Runtime/Text/Parsing/ParserLibrary/CSharp/Nodes/ObjectDeclarations/CSClassDeclaration.cs new file mode 100644 index 0000000..19c2b35 --- /dev/null +++ b/Runtime/Text/Parsing/ParserLibrary/CSharp/Nodes/ObjectDeclarations/CSClassDeclaration.cs @@ -0,0 +1,16 @@ +using System.Collections.Generic; + +namespace Rokojori; + +public class CSClassDeclaration: CSObjectDeclaration, ClassDeclaration +{ + public string GetClassName() + { + return objectName.match; + } + + public static ASTMatcherResolver Resolver() + { + return Resolver( "class" ); + } +} \ No newline at end of file diff --git a/Runtime/Text/Parsing/ParserLibrary/CSharp/Nodes/ObjectDeclarations/CSClassDeclaration.cs.uid b/Runtime/Text/Parsing/ParserLibrary/CSharp/Nodes/ObjectDeclarations/CSClassDeclaration.cs.uid new file mode 100644 index 0000000..e362a0b --- /dev/null +++ b/Runtime/Text/Parsing/ParserLibrary/CSharp/Nodes/ObjectDeclarations/CSClassDeclaration.cs.uid @@ -0,0 +1 @@ +uid://c4gua113a0b3a diff --git a/Runtime/Text/Parsing/ParserLibrary/CSharp/Nodes/ObjectDeclarations/CSEnumDeclaration.cs b/Runtime/Text/Parsing/ParserLibrary/CSharp/Nodes/ObjectDeclarations/CSEnumDeclaration.cs new file mode 100644 index 0000000..6f4da9b --- /dev/null +++ b/Runtime/Text/Parsing/ParserLibrary/CSharp/Nodes/ObjectDeclarations/CSEnumDeclaration.cs @@ -0,0 +1,16 @@ +using System.Collections.Generic; + +namespace Rokojori; + +public class CSEnumDeclaration: CSObjectDeclaration, EnumDeclaration +{ + public string GetEnumName() + { + return objectName.match; + } + + public static ASTMatcherResolver Resolver() + { + return Resolver( "enum" ); + } +} \ No newline at end of file diff --git a/Runtime/Text/Parsing/ParserLibrary/CSharp/Nodes/ObjectDeclarations/CSEnumDeclaration.cs.uid b/Runtime/Text/Parsing/ParserLibrary/CSharp/Nodes/ObjectDeclarations/CSEnumDeclaration.cs.uid new file mode 100644 index 0000000..fe2ea3a --- /dev/null +++ b/Runtime/Text/Parsing/ParserLibrary/CSharp/Nodes/ObjectDeclarations/CSEnumDeclaration.cs.uid @@ -0,0 +1 @@ +uid://b1wp4j3s7wxip diff --git a/Runtime/Text/Parsing/ParserLibrary/CSharp/Nodes/ObjectDeclarations/CSInterfaceDeclaration.cs b/Runtime/Text/Parsing/ParserLibrary/CSharp/Nodes/ObjectDeclarations/CSInterfaceDeclaration.cs new file mode 100644 index 0000000..7af53d9 --- /dev/null +++ b/Runtime/Text/Parsing/ParserLibrary/CSharp/Nodes/ObjectDeclarations/CSInterfaceDeclaration.cs @@ -0,0 +1,16 @@ +using System.Collections.Generic; + +namespace Rokojori; + +public class CSInterfaceDeclaration: CSObjectDeclaration, InterfaceDeclaration +{ + public string GetInterfaceName() + { + return objectName.match; + } + + public static ASTMatcherResolver Resolver() + { + return Resolver( "interface" ); + } +} \ No newline at end of file diff --git a/Runtime/Text/Parsing/ParserLibrary/CSharp/Nodes/ObjectDeclarations/CSInterfaceDeclaration.cs.uid b/Runtime/Text/Parsing/ParserLibrary/CSharp/Nodes/ObjectDeclarations/CSInterfaceDeclaration.cs.uid new file mode 100644 index 0000000..2727499 --- /dev/null +++ b/Runtime/Text/Parsing/ParserLibrary/CSharp/Nodes/ObjectDeclarations/CSInterfaceDeclaration.cs.uid @@ -0,0 +1 @@ +uid://bjr3hv63luv34 diff --git a/Runtime/Text/Parsing/ParserLibrary/CSharp/Nodes/ObjectDeclarations/CSObjectDeclaration.cs b/Runtime/Text/Parsing/ParserLibrary/CSharp/Nodes/ObjectDeclarations/CSObjectDeclaration.cs new file mode 100644 index 0000000..5426afd --- /dev/null +++ b/Runtime/Text/Parsing/ParserLibrary/CSharp/Nodes/ObjectDeclarations/CSObjectDeclaration.cs @@ -0,0 +1,170 @@ +using System.Collections.Generic; + +namespace Rokojori; + +public abstract class CSObjectDeclaration: ASTNode +{ + public List attributeBrackets = []; + public List modifiers = []; + public Token objectType; + public Token objectName; + + public CSObjectDeclarationTail objectTail; + + public Token blockStart; + public ASTNode objectBody; + public Token blockEnd; + + public override string ToString() + { + var modsInfo = ""; + + if ( modifiers.Count > 0 ) + { + modsInfo = modifiers.Map( m => m.match ).Join( " " ) + " "; + } + + List atts = []; + + for ( int i = 0; i < attributeBrackets.Count; i+= 2 ) + { + var attRange = GrabTokenRange( attributeBrackets[ i ], attributeBrackets[ i + 1 ], false ); + + if ( attRange == null ) + { + continue; + } + + atts.Add( attRange.Map( a => a.match ).Join( "" ) ); + } + + var attsInfo = ""; + + if ( atts.Count > 0 ) + { + attsInfo = atts.Join( " " ) + " "; + + } + + return GetType().Name + "{ " + attsInfo + modsInfo + objectType.match + " " + objectName.match + " {...} } "; + } + + protected static ASTMatcherResolver Resolver( string objectDeclartion ) where T:CSObjectDeclaration,new() + { + var lexer = new CSLexer(); + var objectMR = new ASTMatcherResolver(); + + var odPredicate = TokenPredicateData.Lexed( lexer, objectDeclartion ); + var objectMatcher = new TokenWordASTMatcher(); + objectMatcher.type = odPredicate.type; + objectMatcher.match = odPredicate.match; + + var blockMatcher = new BracketBlockMatcher(); + blockMatcher.blockStart = TokenPredicateData.Lexed( lexer, "{" ); + blockMatcher.blockEnd = TokenPredicateData.Lexed( lexer, "}" ); + blockMatcher.matchingAtStartIsMandatory = false; + + var combinedMatcher = new CombinedASTMatcher(); + combinedMatcher.matchers = [ objectMatcher, blockMatcher ]; + + objectMR.matcher = combinedMatcher; + + objectMR.initializer = ( t, matcher ) => + { + var parent = t.parent; + var parentIndex = parent.children.IndexOf( t ); + + // for ( int i = 0; i < parent.children.Count; i++ ) + // { + // RJLog.Log( i, parent.children[ i ].CombinedMatch(), parent.children[ i ].parent?.GetType().Name ); + // } + + var ma = CSModifierAttributesParser.ParseReverse( parent, parentIndex ); + + if ( ma.modifiers.Count > 0 ) + { + t.modifiers = ma.modifiers; + } + + if ( ma.attributeBrackets.Count > 0 ) + { + t.attributeBrackets = ma.attributeBrackets; + } + + if ( t.modifiers.Count > 0 || t.attributeBrackets.Count > 0 ) + { + if ( t.attributeBrackets.Count > 0 ) + { + // RJLog.Log( + // "Has Same parent:", t.parent == t.attributeBrackets[ 0 ], + // "Parent", t.parent?.GetType().Name, + // "Atts Type:", t.attributeBrackets[ 0 ].GetType().Name, + // "Atts Match:", t.attributeBrackets[ 0 ].CombinedMatch(), + // "Atts Parent", t.attributeBrackets[ 0 ].parent?.GetType().Name + // ); + + t.ExpandToPrevious( t.attributeBrackets[ 0 ] ); + } + else + { + t.ExpandToPrevious( t.modifiers[ 0 ] ); + } + } + + t.objectType = t.FindToken( odPredicate ); + t.objectName = t.FindToken( LexerMatcherLibrary.CwordMatcher, t.children.IndexOf( t.objectType ) + 1 ); + + + + t.blockEnd = t.ReverseFindToken( TokenPredicateData.Lexed( lexer, "}" ) ); + t.blockStart = t.ReverseFindBracketOpener( "{", "}", t.blockEnd.childIndex ); + + var afterName = t.NextNode( t.objectName.childIndex ); + + if ( afterName != t.blockStart ) + { + t.objectTail = t.MergeInner( t.objectName, t.blockStart ); + t.objectTail.Resolve(); + + } + + // RJLog.Log( "BLOCK:", t.blockStart, t.blockEnd ); + t.objectBody = t.MergeInner( t.blockStart, t.blockEnd ); + + + + // t.blockStart = t.FindToken( blockMatcher.blockStart, t.children.IndexOf( t.objectName ) + 1 ); + // t.blockEnd = t.ReverseFindToken( blockMatcher.blockEnd ); + + var root = t.GetParentWithType(); + + if ( root == null ) + { + return t.childIndex; + } + + if ( typeof( T ) == typeof( CSEnumDeclaration ) ) + { + t.objectBody.CreateSeperatedList( ",", + e => + { + e.Resolve(); + } + ); + } + else + { + var objectParser = new CSObjectParser( t.objectBody ); + objectParser.Process( root.parser ); + } + + + root.parsedNodes.Add( t ); + root.objectDefinitions.Add( t ); + + return t.childIndex; + }; + + return objectMR; + } +} \ No newline at end of file diff --git a/Runtime/Text/Parsing/ParserLibrary/CSharp/Nodes/ObjectDeclarations/CSObjectDeclaration.cs.uid b/Runtime/Text/Parsing/ParserLibrary/CSharp/Nodes/ObjectDeclarations/CSObjectDeclaration.cs.uid new file mode 100644 index 0000000..a8602e0 --- /dev/null +++ b/Runtime/Text/Parsing/ParserLibrary/CSharp/Nodes/ObjectDeclarations/CSObjectDeclaration.cs.uid @@ -0,0 +1 @@ +uid://dng66k350e8pr diff --git a/Runtime/Text/Parsing/ParserLibrary/CSharp/Nodes/ObjectDeclarations/CSObjectDeclarationTail.cs b/Runtime/Text/Parsing/ParserLibrary/CSharp/Nodes/ObjectDeclarations/CSObjectDeclarationTail.cs new file mode 100644 index 0000000..a2c265e --- /dev/null +++ b/Runtime/Text/Parsing/ParserLibrary/CSharp/Nodes/ObjectDeclarations/CSObjectDeclarationTail.cs @@ -0,0 +1,35 @@ +using System.Collections.Generic; + +namespace Rokojori; + +public class CSObjectDeclarationTail: ASTNode +{ + public ASTNodeList genericsDeclaration; + public ASTNodeList inheritanceDeclaration; + + + public void Resolve() + { + var genericsStart = FindToken( TokenPredicateData.Lexed( new CSLexer(), "<" ) ); + var colon = FindToken( TokenPredicateData.Lexed( new CSLexer(), ":" ) ); + + if ( genericsStart != null ) + { + var length = colon == null ? children.Count : colon.childIndex; + genericsDeclaration = MergeChildrenWith( 0, length ); + } + + if ( colon != null ) + { + var start = colon.childIndex + 1; + var length = ( children.Count - 1 ) - start; + inheritanceDeclaration = MergeChildrenWith( start, length ); + } + } + + public string GetExtendingObject() + { + return inheritanceDeclaration.FindToken( LexerMatcherLibrary.CwordMatcher ).match; + } + +} \ No newline at end of file diff --git a/Runtime/Text/Parsing/ParserLibrary/CSharp/Nodes/ObjectDeclarations/CSObjectDeclarationTail.cs.uid b/Runtime/Text/Parsing/ParserLibrary/CSharp/Nodes/ObjectDeclarations/CSObjectDeclarationTail.cs.uid new file mode 100644 index 0000000..82fa879 --- /dev/null +++ b/Runtime/Text/Parsing/ParserLibrary/CSharp/Nodes/ObjectDeclarations/CSObjectDeclarationTail.cs.uid @@ -0,0 +1 @@ +uid://b05a10eey26lx diff --git a/Runtime/Text/Parsing/ParserLibrary/CSharp/Nodes/ObjectDeclarations/CSObjectDependency.cs b/Runtime/Text/Parsing/ParserLibrary/CSharp/Nodes/ObjectDeclarations/CSObjectDependency.cs new file mode 100644 index 0000000..04cf4ca --- /dev/null +++ b/Runtime/Text/Parsing/ParserLibrary/CSharp/Nodes/ObjectDeclarations/CSObjectDependency.cs @@ -0,0 +1,10 @@ +using System.Collections.Generic; + +namespace Rokojori; + +public class CSObjectDependency +{ + public string name; + public List genericParameters; + public string ns; +} \ No newline at end of file diff --git a/Runtime/Text/Parsing/ParserLibrary/CSharp/Nodes/ObjectDeclarations/CSObjectDependency.cs.uid b/Runtime/Text/Parsing/ParserLibrary/CSharp/Nodes/ObjectDeclarations/CSObjectDependency.cs.uid new file mode 100644 index 0000000..7e0cced --- /dev/null +++ b/Runtime/Text/Parsing/ParserLibrary/CSharp/Nodes/ObjectDeclarations/CSObjectDependency.cs.uid @@ -0,0 +1 @@ +uid://dsip8ijfdo6hv diff --git a/Runtime/Text/Parsing/ParserLibrary/CSharp/Nodes/ObjectDeclarations/CSStructDeclaration.cs b/Runtime/Text/Parsing/ParserLibrary/CSharp/Nodes/ObjectDeclarations/CSStructDeclaration.cs new file mode 100644 index 0000000..416cfeb --- /dev/null +++ b/Runtime/Text/Parsing/ParserLibrary/CSharp/Nodes/ObjectDeclarations/CSStructDeclaration.cs @@ -0,0 +1,16 @@ +using System.Collections.Generic; + +namespace Rokojori; + +public class CSStructDeclaration: CSObjectDeclaration +{ + public string GetStructName() + { + return objectName.match; + } + + public static ASTMatcherResolver Resolver() + { + return Resolver( "struct" ); + } +} \ No newline at end of file diff --git a/Runtime/Text/Parsing/ParserLibrary/CSharp/Nodes/ObjectDeclarations/CSStructDeclaration.cs.uid b/Runtime/Text/Parsing/ParserLibrary/CSharp/Nodes/ObjectDeclarations/CSStructDeclaration.cs.uid new file mode 100644 index 0000000..c80ba6d --- /dev/null +++ b/Runtime/Text/Parsing/ParserLibrary/CSharp/Nodes/ObjectDeclarations/CSStructDeclaration.cs.uid @@ -0,0 +1 @@ +uid://byuxdfq3chm4h diff --git a/Runtime/Text/Parsing/ParserLibrary/CSharp/Nodes/SquareBlock.cs b/Runtime/Text/Parsing/ParserLibrary/CSharp/Nodes/SquareBlock.cs new file mode 100644 index 0000000..14ee2c7 --- /dev/null +++ b/Runtime/Text/Parsing/ParserLibrary/CSharp/Nodes/SquareBlock.cs @@ -0,0 +1,18 @@ +using System.Collections.Generic; + +namespace Rokojori; + + +public class SquareBlock:ASTNode +{ + public Token GetSquareStart() + { + return FindToken( LexerMatcherLibrary.BracketMatcher, "[" ); + } + + public Token GetSquareEnd() + { + return ReverseFindToken( TokenPredicateData.Create( LexerMatcherLibrary.BracketMatcher.type, "]" ) ); + } + +} \ No newline at end of file diff --git a/Runtime/Text/Parsing/ParserLibrary/CSharp/Nodes/SquareBlock.cs.uid b/Runtime/Text/Parsing/ParserLibrary/CSharp/Nodes/SquareBlock.cs.uid new file mode 100644 index 0000000..fe950ec --- /dev/null +++ b/Runtime/Text/Parsing/ParserLibrary/CSharp/Nodes/SquareBlock.cs.uid @@ -0,0 +1 @@ +uid://cw4ghe8ficgwj diff --git a/Runtime/Text/Parsing/ParserLibrary/CSharp/Parsers/CSMemberResolver.cs b/Runtime/Text/Parsing/ParserLibrary/CSharp/Parsers/CSMemberResolver.cs new file mode 100644 index 0000000..8bd00c3 --- /dev/null +++ b/Runtime/Text/Parsing/ParserLibrary/CSharp/Parsers/CSMemberResolver.cs @@ -0,0 +1,317 @@ +using System.Collections.Generic; + +namespace Rokojori; + +public class CSMemberResolver:ASTMatcherResolver +{ + public CSMemberResolver() + { + Initialize(); + } + + void Initialize() + { + var csLexer = new CSLexer(); + var triggerMatcher = new MultiTriggerASTMatcher(); + triggerMatcher.triggerPredicates = + [ + TokenPredicateData.Lexed( csLexer, "(" ), + TokenPredicateData.Lexed( csLexer, "{" ), + TokenPredicateData.Lexed( csLexer, "=>" ), + TokenPredicateData.Lexed( csLexer, "=" ), + TokenPredicateData.Lexed( csLexer, ";" ), + ]; + + triggerMatcher.blockPredicates = + [ + TokenPredicateData.Lexed( csLexer, "[" ), + TokenPredicateData.Lexed( csLexer, "]" ), + TokenPredicateData.Lexed( csLexer, "<" ), + TokenPredicateData.Lexed( csLexer, ">" ) + ]; + + triggerMatcher.matchSticky = true; + + matcher = triggerMatcher; + + } + + public override int Resolve( ASTMatchResult result, ASTMatcher matcher ) + { + var mc = ResolveDeclaration( result, matcher ); + + if ( mc == null ) + { + return -1; + } + + + var parent = result.parent; + + var memberStartIndex = FindMemberDefinitionStart( parent, mc.childIndex ); + + // RJLog.Log( "Found member:", mc.memberName, "start:", memberStartIndex, "name:", mc.childIndex ); + var atts = CSModifierAttributesParser.ParseForward( parent, memberStartIndex - 1 ); + + var isConstructor = IsConstructorMethod( parent, mc ); + + ASTNode earliestNode = null; + + if ( atts.attributeBrackets != null && atts.attributeBrackets.Count > 0 ) + { + earliestNode = atts.attributeBrackets[ 0 ]; + mc.attributeBrackets = atts.attributeBrackets; + } + + if ( atts.modifiers != null && atts.modifiers.Count > 0 ) + { + if ( earliestNode == null ) + { + earliestNode = atts.modifiers[ 0 ]; + } + + mc.modifiers = atts.modifiers; + } + + if ( ! isConstructor ) + { + var typeFirstIndex = atts.nextNode.childIndex; + var typeLastIndex = parent.PreviousIndex( mc.childIndex ); + var memberType = parent.MergeOuter( typeFirstIndex, typeLastIndex ); + mc.memberType = memberType; + + if ( earliestNode == null ) + { + earliestNode = memberType; + } + } + else + { + var mm = mc as CSMethodMemberDeclaration; + mm.isContructor = true; + } + + mc.ExpandToPrevious( earliestNode ); + + RJLog.Log( "Found member", mc.memberType?.GetTypeDefinition() ?? "(constructor)" , mc.memberName ); + + AddToRoot( mc ); + + return mc.childIndex; + + } + + bool IsConstructorMethod( ASTNode parent, CSMemberDeclaration md ) + { + if ( ! ( md is CSMethodMemberDeclaration ) ) + { + return false; + } + + var objectRoot = parent.walker.GetParentWithType( parent ) as CSObjectDeclaration; + + if ( objectRoot == null ) + { + return false; + } + + var me = md as CSMethodMemberDeclaration; + + return me.GetMemberName() == objectRoot.objectName.match; + + } + + + public CSMemberDeclaration ResolveDeclaration( ASTMatchResult result, ASTMatcher matcher ) + { + var token = result.resultStartToken; + + if ( token.match == "(" ) + { + return ResolveMethod( result, matcher ); + } + + if ( token.match == "{" ) + { + return ResolveProperty( result, matcher ); + } + + if ( token.match == "=" ) + { + return ResolveFieldOrProperty( result, matcher ); + } + + if ( token.match == "=>" ) + { + return ResolveFieldOrProperty( result, matcher ); + } + + if ( token.match == ";" ) + { + return ResolveField( result, matcher ); + } + + return null; + } + + + void AddToRoot( CSMemberDeclaration md ) + { + var root = md.GetParentWithType(); + + if ( root == null ) + { + return; + } + + root.parsedNodes.Add( md ); + root.allMemberDeclarations.Add( md ); + } + + int FindMemberDefinitionStart( ASTNode parent, int memberDeclarationIndex ) + { + for ( int i = memberDeclarationIndex - 1; i >= 0; i-- ) + { + var child = parent.children[ i ]; + + if ( child is CSMemberDeclaration || child is CSObjectDeclaration ) + { + return i + 1; + } + } + + return 0; + } + + CSMethodMemberDeclaration ResolveMethod( ASTMatchResult result, ASTMatcher matcher ) + { + var parent = result.parent; + var parametersStart = result.resultStartToken; + + var cwordPredicate = TokenPredicateData.Create( LexerMatcherLibrary.CFunctionMatcher.type ); + var startReverseOffsetIndex = parametersStart.reverseIndexOffset; + + var name = parent.ReverseFindToken( cwordPredicate, startReverseOffsetIndex ); + + + var parametersEnd = parent.FindBracketCloser( "(", ")", result.resultStart ); + + + + var blockStart = parent.FindToken( TokenPredicateData.Lexed( new CSLexer(), "{" ), parametersEnd.childIndex ); + + + var blockEnd = parent.FindBracketCloser( "{", "}", blockStart.childIndex ); + + var memberDeclaration = parent.MergeOuter( name, blockEnd ); + memberDeclaration.parametersStart = parametersStart; + memberDeclaration.parametersEnd = parametersEnd; + + var hasParameterTokens = memberDeclaration.NextNode( parametersStart.childIndex ) != parametersEnd; + + if ( hasParameterTokens ) + { + var parametersContent = memberDeclaration.MergeInner( parametersStart, parametersEnd ); + // RJLog.Log( "Parameters:", parametersContent.CombinedMatch() ); + + var info = new List(); + parametersContent.CreateSeperatedList( ",", + p => + { + p.ResolveNameAndType(); + info.Add( p.GetParameterName() + ": " + p.GetParameterType() ); + } + ); + + RJLog.Log( "[ Parameters for " + name.match + "() ]", info.Join( ", " ) ); + + + + + memberDeclaration.parametersContent = parametersContent; + } + else + { + RJLog.Log( "[ No parameters:", name.match + "() ]" ); + } + memberDeclaration.memberName = name; + + return memberDeclaration; + } + + + + CSPropertyDeclaration ResolveProperty( ASTMatchResult result, ASTMatcher matcher ) + { + var parent = result.parent; + var blockStart = result.resultStartToken; + + var cwordPredicate = TokenPredicateData.Create( LexerMatcherLibrary.CwordMatcher.type ); + var name = parent.ReverseFindToken( cwordPredicate, blockStart.reverseIndexOffset ); + var blockEnd = parent.FindBracketCloser( "{", "}", blockStart.childIndex ); + + var memberDeclaration = parent.MergeOuter( name, blockEnd ); + memberDeclaration.memberName = name; + + return memberDeclaration; + } + + CSMemberDeclaration ResolveFieldOrProperty( ASTMatchResult result, ASTMatcher matcher ) + { + var csLexer = new CSLexer(); + + var parent = result.parent; + var assigner = result.resultStartToken; + + var cwordPredicate = TokenPredicateData.Create( LexerMatcherLibrary.CwordMatcher.type ); + var name = parent.ReverseFindToken( cwordPredicate, assigner.reverseIndexOffset ); + var end = parent.FindTriggerToken( + assigner.childIndex, + [ TokenPredicateData.Lexed( csLexer, ";" ) ], + [ + TokenPredicateData.Lexed( csLexer, "(" ), + TokenPredicateData.Lexed( csLexer, ")" ), + TokenPredicateData.Lexed( csLexer, "{" ), + TokenPredicateData.Lexed( csLexer, "}" ), + + TokenPredicateData.Lexed( csLexer, "[" ), + TokenPredicateData.Lexed( csLexer, "]" ), + TokenPredicateData.Lexed( csLexer, "<" ), + TokenPredicateData.Lexed( csLexer, ">" ) + ] + ); + + var isField = assigner.match == "="; + + CSMemberDeclaration memberDeclaration; + + if ( isField ) + { + memberDeclaration = parent.MergeOuter( name, end ); + } + else + { + memberDeclaration = parent.MergeOuter( name, end ); + } + + memberDeclaration.memberName = name; + + return memberDeclaration; + } + + CSFieldDeclaration ResolveField( ASTMatchResult result, ASTMatcher matcher ) + { + var parent = result.parent; + var closer = result.resultStartToken; + + var cwordPredicate = TokenPredicateData.Create( LexerMatcherLibrary.CwordMatcher.type ); + var closerReverseOffsetIndex = closer.reverseIndexOffset; + var name = parent.ReverseFindToken( cwordPredicate, closerReverseOffsetIndex ); + var end = closer; + + var memberDeclaration = parent.MergeOuter( name, end ); + memberDeclaration.memberName = name; + return memberDeclaration; + + } +} \ No newline at end of file diff --git a/Runtime/Text/Parsing/ParserLibrary/CSharp/Parsers/CSMemberResolver.cs.uid b/Runtime/Text/Parsing/ParserLibrary/CSharp/Parsers/CSMemberResolver.cs.uid new file mode 100644 index 0000000..96b53b7 --- /dev/null +++ b/Runtime/Text/Parsing/ParserLibrary/CSharp/Parsers/CSMemberResolver.cs.uid @@ -0,0 +1 @@ +uid://cxgnt4inbrsd2 diff --git a/Runtime/Text/Parsing/ParserLibrary/CSharp/Parsers/CSModifierAttributesParser.cs b/Runtime/Text/Parsing/ParserLibrary/CSharp/Parsers/CSModifierAttributesParser.cs new file mode 100644 index 0000000..6be3562 --- /dev/null +++ b/Runtime/Text/Parsing/ParserLibrary/CSharp/Parsers/CSModifierAttributesParser.cs @@ -0,0 +1,215 @@ +using System.Collections.Generic; +using System.Text; + +namespace Rokojori; + + +public class CSModifierAttributesParser +{ + public static bool IsExported( List attPairs ) + { + return HasAttribute( "Export", attPairs ); + } + + public static bool HasAttribute( string name, List attPairs ) + { + if ( attPairs == null ) + { + return false; + } + + var atts = GetAttributes( attPairs ); + + return atts.IndexOf( name ) != -1; + } + + public static List GetAttributes( List attPairs ) + { + var atts = new List(); + + if ( attPairs == null ) + { + return atts; + } + + for ( int i = 0; i < attPairs.Count; i+= 2 ) + { + var s = attPairs[ i ]; + var e = attPairs[ i + 1 ]; + + var parent = s.parent; + + var tokens = parent.children.Range( s.childIndex + 1, e.childIndex - 1 ); + + // var att = tokens.Map( t => t.CombinedMatch() ).Join( "" ).Trim(); + // atts.Add( att ); + + var buffer = new ASTNodeList(); + buffer.children = tokens; + buffer.children.ForEach( c => c.parent = buffer ); + + buffer.CreateSeperatedList( "," , + ( n )=> + { + var att = n.CombinedMatch().Trim(); + atts.Add( att ); + // atts.Add( n.CombinedMatch().Trim() ); + } + ); + + tokens.ForEach( c => c.parent = parent ); + } + + return atts; + + } + + public class Data + { + public List attributeBrackets = []; + public List modifiers = []; + public ASTNode nextNode; + + public string GetAttributeValue( Token start, Token end ) + { + if ( start == null || end == null ) + { + return "Invalid: start == null: " + ( start == null ) + " end == null: " + ( end == null ); + } + + if ( start == end ) + { + return start.CombinedMatch(); + } + + var startIndex = start.childIndex; + var endIndex = end.childIndex; + + var sb = new StringBuilder(); + + sb.Append( "[" ); + + for ( int i = startIndex + 1; i < endIndex; i++ ) + { + + sb.Append( start.parent.children[ i ].CombinedMatch() ); + } + + sb.Append( "]" ); + + + return sb.ToString(); + } + + public string GetStringInfo() + { + var sb = new StringBuilder(); + + for ( int i = 0; i < attributeBrackets.Count; i+=2 ) + { + sb.Append( GetAttributeValue( attributeBrackets[ i ], attributeBrackets[ i + 1 ] ) ); + } + + modifiers.ForEach( + m => + { + sb.Append( " " ); + sb.Append( m.CombinedMatch() ); + } + ); + + return sb.ToString(); + } + } + + public static Data ParseReverse( ASTNode parent, int offset ) + { + var data = new Data(); + + var prevIndex = parent.PreviousIndex( offset ); + var prev = prevIndex == -1 ? null : parent.children[ prevIndex ]; + + while ( prev != null && prev.IsToken( LexerMatcherLibrary.CSAccessModifierMatcher ) ) + { + data.modifiers.Insert( 0, prev as Token ); + + prevIndex = parent.PreviousIndex( prevIndex ); + prev = prevIndex == -1 ? null : parent.children[ prevIndex ]; + } + + while ( prev != null && prev.IsToken( LexerMatcherLibrary.BracketMatcher, "]" ) ) + { + var bracketOpenerIndex = parent.ReverseFindBracketOpenerIndex( "[", "]", prevIndex ); + + if ( bracketOpenerIndex != -1 ) + { + data.attributeBrackets.Add( parent.children[ prevIndex ] as Token ); + data.attributeBrackets.Add( parent.children[ bracketOpenerIndex ] as Token ); + } + + prevIndex = parent.PreviousIndex( bracketOpenerIndex ); + prev = prevIndex == -1 ? null : parent.children[ prevIndex ]; + } + + if ( data.attributeBrackets.Count > 0 ) + { + data.attributeBrackets.Reverse(); + } + + return data; + } + + public static Data ParseForward( ASTNode parent, int offset ) + { + var data = new Data(); + + var nextIndex = parent.NextIndex( offset ); + var next = nextIndex == -1 ? null : parent.children[ nextIndex ]; + + while ( next != null && + ( + next.IsToken( LexerMatcherLibrary.BracketMatcher, "[" ) || + next is SquareBlock + ) + ) + { + var isSquareBlock = next is SquareBlock; + + var bracketCloserIndex = isSquareBlock ? nextIndex : parent.FindBracketCloserIndex( "[", "]", nextIndex ); + + if ( bracketCloserIndex != -1 ) + { + if ( isSquareBlock ) + { + var sb = next as SquareBlock; + data.attributeBrackets.Add( sb.GetSquareStart() ); + data.attributeBrackets.Add( sb.GetSquareEnd() ); + } + else + { + data.attributeBrackets.Add( parent.children[ nextIndex ] as Token ); + data.attributeBrackets.Add( parent.children[ bracketCloserIndex ] as Token ); + } + + } + + nextIndex = parent.NextIndex( bracketCloserIndex ); + next = nextIndex == -1 ? null : parent.children[ nextIndex ]; + + } + + while ( next != null && next.IsToken( LexerMatcherLibrary.CSAccessModifierMatcher ) ) + { + data.modifiers.Add( next as Token ); + + nextIndex = parent.NextIndex( nextIndex ); + next = nextIndex == -1 ? null : parent.children[ nextIndex ]; + } + + data.nextNode = next as Token; + + return data; + } + + +} \ No newline at end of file diff --git a/Runtime/Text/Parsing/ParserLibrary/CSharp/Parsers/CSModifierAttributesParser.cs.uid b/Runtime/Text/Parsing/ParserLibrary/CSharp/Parsers/CSModifierAttributesParser.cs.uid new file mode 100644 index 0000000..e0041b7 --- /dev/null +++ b/Runtime/Text/Parsing/ParserLibrary/CSharp/Parsers/CSModifierAttributesParser.cs.uid @@ -0,0 +1 @@ +uid://cocfup6k7r425 diff --git a/Runtime/Text/Parsing/ParserLibrary/CSharp/Parsers/CSObjectParser.cs b/Runtime/Text/Parsing/ParserLibrary/CSharp/Parsers/CSObjectParser.cs new file mode 100644 index 0000000..ec49e5f --- /dev/null +++ b/Runtime/Text/Parsing/ParserLibrary/CSharp/Parsers/CSObjectParser.cs @@ -0,0 +1,54 @@ +using System.Collections.Generic; + +namespace Rokojori; + + + +public class CSObjectParser:ASTParserPhase +{ + ASTNode objectRoot; + + public static ASTParser CreateParser( ASTNode root ) + { + var csLexer = new CSLexer(); + var blockResolver = new ASTMatcherResolver(); + var matcher = new BracketBlockMatcher(); + + matcher.blockStart = TokenPredicateData.Lexed( csLexer, "[" ); + matcher.blockEnd = TokenPredicateData.Lexed( csLexer, "]" ); + blockResolver.matcher = matcher; + blockResolver.initializer = ( sb, matcher ) => sb.childIndex; + + + List resolvers = + [ + CSClassDeclaration.Resolver(), + CSStructDeclaration.Resolver(), + CSEnumDeclaration.Resolver(), + CSInterfaceDeclaration.Resolver(), + + blockResolver, + + new CSMemberResolver() + ]; + + var astParser = new ASTParser(); + astParser.resolvers = resolvers; + astParser.root = root; + return astParser; + } + + public CSObjectParser( ASTNode root ):base( CreateParser( root ) ) + { + objectRoot = root; + + RJLog.Log( "Starting object parser", root ); + } + + public override ASTNode GetParsingRoot( Parser parser ) + { return objectRoot; } + + + + +} diff --git a/Runtime/Text/Parsing/ParserLibrary/CSharp/Parsers/CSObjectParser.cs.uid b/Runtime/Text/Parsing/ParserLibrary/CSharp/Parsers/CSObjectParser.cs.uid new file mode 100644 index 0000000..a9d5b85 --- /dev/null +++ b/Runtime/Text/Parsing/ParserLibrary/CSharp/Parsers/CSObjectParser.cs.uid @@ -0,0 +1 @@ +uid://uososvnyibqx diff --git a/Runtime/Text/Parsing/ParserLibrary/CSharp/Parsers/CSPreProcessor/CSPreProcessor.cs b/Runtime/Text/Parsing/ParserLibrary/CSharp/Parsers/CSPreProcessor/CSPreProcessor.cs new file mode 100644 index 0000000..888776f --- /dev/null +++ b/Runtime/Text/Parsing/ParserLibrary/CSharp/Parsers/CSPreProcessor/CSPreProcessor.cs @@ -0,0 +1,121 @@ +using System.Collections.Generic; +using System.Linq; + +namespace Rokojori; + +public class CSPreProcessor:ParserPhase +{ + public override void Process( Parser parser ) + { + var csParser = parser as CSParser; + var tokens = parser.root.children; + + var visible = true; + + var visibleEvents = new List(); + + var stack = new CSPreProcessorStack(); + + stack.defines.UnionWith( csParser.rootPhase.preProcessorContext.defines ); + + for ( int i = 0; i < tokens.Count; i++ ) + { + var tk = tokens[ i ]; + var match = tk.CombinedMatch(); + + if ( ! tk.IsToken( LexerMatcherLibrary.CInstructionMatcher ) ) + { + if ( visible ) + { + visibleEvents.Add( tk ); + } + else + { + RJLog.Log( "Removing:", tk ); + } + + continue; + } + + RJLog.Log( "Removing:", tk ); + + var type = GetPreProcessorType( match ); + + if ( type == 0 ) + { + continue; + } + + if ( IsDefinining( match ) ) + { + var defineType = match.StartsWith( "#define" ); + var value = match.Substring( match.IndexOf( " " ) ).Trim(); + + stack.ProcessDefine( value, defineType ); + } + else if ( IsConditional( match ) ) + { + if ( match.StartsWith( "#endif" ) ) + { + stack.CloseConditionalContext(); + } + else if ( match.StartsWith( "#else" ) ) + { + stack.SetElseBranch(); + } + else + { + if ( match.StartsWith( "#if" ) ) + { + stack.OpenConditionalContext(); + } + + var condition = match.Substring( match.IndexOf( " " ) ).Trim(); + var conditionActive = CSPreProcessorConditionalEvaluator.Evaluate( condition, stack.defines ); + + stack.SetConditionalContext( conditionActive ); + } + + visible = stack.GetVisibility(); + } + + + } + + parser.root.children.ForEach( c => c.parent = null ); + parser.root.children = visibleEvents; + parser.root.children.ForEach( c => c.parent = parser.root ); + + var infos = parser.root.children.Map( le => le + "" ); + RJLog.Log( "Filtered Events:", infos.Join( "\n" ) ); + } + + public int GetPreProcessorType( string match ) + { + if ( IsConditional( match ) ) + { + return 1; + } + + if ( IsDefinining( match ) ) + { + return 2; + } + + return 0; + } + + public bool IsConditional( string match ) + { + return match.StartsWithAny( "#if", "#elif", "#else", "#endif" ); + } + + public bool IsDefinining( string match ) + { + return match.StartsWithAny( "#define", "#undef" ); + } + + + + +} \ No newline at end of file diff --git a/Runtime/Text/Parsing/ParserLibrary/CSharp/Parsers/CSPreProcessor/CSPreProcessor.cs.uid b/Runtime/Text/Parsing/ParserLibrary/CSharp/Parsers/CSPreProcessor/CSPreProcessor.cs.uid new file mode 100644 index 0000000..6bdc277 --- /dev/null +++ b/Runtime/Text/Parsing/ParserLibrary/CSharp/Parsers/CSPreProcessor/CSPreProcessor.cs.uid @@ -0,0 +1 @@ +uid://s75c3k16outa diff --git a/Runtime/Text/Parsing/ParserLibrary/CSharp/Parsers/CSPreProcessor/CSPreProcessorConditionalEvaluator.cs b/Runtime/Text/Parsing/ParserLibrary/CSharp/Parsers/CSPreProcessor/CSPreProcessorConditionalEvaluator.cs new file mode 100644 index 0000000..b1de982 --- /dev/null +++ b/Runtime/Text/Parsing/ParserLibrary/CSharp/Parsers/CSPreProcessor/CSPreProcessorConditionalEvaluator.cs @@ -0,0 +1,291 @@ +using System; +using System.Collections.Generic; + +namespace Rokojori; + + +public class CSPreProcessorConditionalEvaluator:Parser +{ + public class Root:ASTNode,ASTFileRoot + { + public string path; + public string GetFilePath() + { + return path; + } + + public CSPreProcessorConditionalEvaluator evaluator; + + public Parser GetParser() + { + return evaluator; + } + + public string GetSource() + { + return evaluator.source; + } + + public TextLinesMapper GetTextLinesMapper() + { + return evaluator.linesMapper; + } + + } + + public HashSet defines = new HashSet(); + + public CSPreProcessorExpressionParser expressionParser = new CSPreProcessorExpressionParser(); + + public override ExpressionParser GetExpressionParser() + { + return expressionParser; + } + + public LexerPhase lexerPhase = new LexerPhase( new CSLexer() ); + + public TextLinesMapper linesMapper = new TextLinesMapper(); + + public CSPreProcessorConditionalEvaluator() + { + phases = [ + lexerPhase, + expressionParser + ]; + + var root = new Root(); + root.evaluator = this; + + this.root = root; + } + + public static bool Evaluate( string expression, HashSet defines ) + { + var evaluator = new CSPreProcessorConditionalEvaluator(); + evaluator.defines.UnionWith( defines ); + evaluator.Parse( expression ); + + var result = evaluator.Evaluate(); + + if ( result == -1 ) + { + RJLog.Error( "Result:", result, "Context:", evaluator.context.messages ); + var info = evaluator.root.CreateDebugTreeInfo(); + RJLog.Error( "\n" + info ); + + throw new Exception(); + } + + return result == 1; + } + + public ExpressionContext context; + + public int Evaluate() + { + var rootExpression = this.root.walker.FindAnyChild( this.root, c => c is OperatorExpression ); + var ev = new CSPPEvaluator(); + ev.defines = defines ?? ( new HashSet() ); + + context = ev.EvaluateExpression( rootExpression as OperatorExpression ); + var result = context.result; + + if ( result.hasError ) + { + RJLog.Error( result.messages ); + return -1; + } + + return (bool)result.value == true ? 1 : 0; + } + + protected class CSPPEvaluator:ExpressionEvaluator + { + public HashSet defines = new HashSet(); + + public class Result:ExpressionResult + { + public static Result As( bool value ) + { + var r = new Result(); + r.value = value; + return r; + } + + public static Result True() + { + return As( true ); + } + + public static Result False() + { + return As( false ); + } + + public static Result Error( string message, params ExpressionResult[] extendingResults ) + { + var r = new Result(); + + for ( int i = 0; i < extendingResults.Length; i++ ) + { + r.messages.AddRange( extendingResults[ i ].messages ); + } + + r.messages.Add( Message.Error( message ) ); + + + return r; + } + } + + protected override ExpressionContext _CreateContext() + { + return new ExpressionContext(); + } + + protected override ExpressionResult _Evaluate( ExpressionContext context, OperatorExpression expression ) + { + if ( expression == null ) + { + return Result.Error( "Null expression!" ); + } + + + context.messages.Add( Message.Info( expression.GetType().Name ) ); + + if ( expression is ConstantExpression ce ) + { + return _Eval( context, ce ); + } + else if ( expression is VariableExpression ve ) + { + return _Eval( context, ve ); + } + else if ( expression is BinaryExpression bi ) + { + return _Eval( context, bi ); + } + else if ( expression is UnaryExpression un ) + { + return _Eval( context, un ); + } + else if ( expression is GroupExpression gr ) + { + return _Eval( context, gr ); + } + + return Result.Error( "Unknown expression type: " + expression.GetType().Name ); + } + + protected ExpressionResult _Eval( ExpressionContext context, ConstantExpression expression ) + { + var constant = expression.GetConstantExpression(); + + if ( constant.IsToken( LexerMatcherLibrary.BoolMatcher, "true" ) ) + { + return Result.True(); + } + else if ( constant.IsToken( LexerMatcherLibrary.BoolMatcher, "false" ) ) + { + return Result.False(); + } + + return Result.Error( "Unexpected token:" + expression ); + + } + + protected ExpressionResult _Eval( ExpressionContext context, VariableExpression expression ) + { + var variableName = expression.GetExpression().CombinedMatch(); + return Result.As( defines.Contains( variableName ) ); + } + + protected ExpressionResult _Eval( ExpressionContext context, BinaryExpression expression ) + { + var left = expression.GetLeftExpression() as OperatorExpression; + var right = expression.GetRightExpression() as OperatorExpression; + + if ( left == null ) + { + RJLog.Log( "left is null:", expression.GetLeftExpression() ); + } + + if ( right == null ) + { + RJLog.Log( "right is null:", expression.GetLeftExpression() ); + } + + var op = expression.GetOperatorExpression().CombinedMatch(); + + var leftResult = _Evaluate( context, left ); + var rightResult = _Evaluate( context, right ); + + if ( leftResult.hasError || rightResult.hasError ) + { + return Result.Error( "Has error: " + leftResult + " " + rightResult, leftResult, rightResult ); + } + + + if ( op == "==" ) + { + return Result.As( leftResult.value == rightResult.value ); + } + + else if ( op == "!=" ) + { + return Result.As( leftResult.value != rightResult.value ); + } + + else if ( op == "&&" ) + { + return Result.As( (bool)leftResult.value && (bool)rightResult.value ); + } + + else if ( op == "||" ) + { + return Result.As( (bool)leftResult.value || (bool)rightResult.value ); + } + + return Result.Error( "Unknown operator: " + op ); + + } + + protected ExpressionResult _Eval( ExpressionContext context, UnaryExpression expression ) + { + var exp = expression.GetExpression() as OperatorExpression; + + if ( exp == null ) + { + RJLog.Log( "exp is null:", expression.GetExpression() ); + } + + var value = _Evaluate( context, exp ); + + if ( value.hasError ) + { + return Result.Error( "Has error:" + value, value ); + } + + return Result.As( ! ( (bool)value.value ) ); + } + + protected ExpressionResult _Eval( ExpressionContext context, GroupExpression expression ) + { + var gb = expression.GetGroupBody(); + + var exp = gb.walker.FindDirectChild( gb, c => c is OperatorExpression ) as OperatorExpression; + + var value = _Evaluate( context, exp ); + + if ( value.hasError ) + { + return Result.Error( "Has error:" + value, value ); + } + + return Result.As( (bool)value.value ); + } + + } + + +} \ No newline at end of file diff --git a/Runtime/Text/Parsing/ParserLibrary/CSharp/Parsers/CSPreProcessor/CSPreProcessorConditionalEvaluator.cs.uid b/Runtime/Text/Parsing/ParserLibrary/CSharp/Parsers/CSPreProcessor/CSPreProcessorConditionalEvaluator.cs.uid new file mode 100644 index 0000000..131da98 --- /dev/null +++ b/Runtime/Text/Parsing/ParserLibrary/CSharp/Parsers/CSPreProcessor/CSPreProcessorConditionalEvaluator.cs.uid @@ -0,0 +1 @@ +uid://bi7vo4gjed31l diff --git a/Runtime/Text/Parsing/ParserLibrary/CSharp/Parsers/CSPreProcessor/CSPreProcessorContext.cs b/Runtime/Text/Parsing/ParserLibrary/CSharp/Parsers/CSPreProcessor/CSPreProcessorContext.cs new file mode 100644 index 0000000..4a2fad0 --- /dev/null +++ b/Runtime/Text/Parsing/ParserLibrary/CSharp/Parsers/CSPreProcessor/CSPreProcessorContext.cs @@ -0,0 +1,8 @@ +using System.Collections.Generic; + +namespace Rokojori; + +public class CSPreProcessorContext +{ + public HashSet defines = new HashSet(); +} \ No newline at end of file diff --git a/Runtime/Text/Parsing/ParserLibrary/CSharp/Parsers/CSPreProcessor/CSPreProcessorContext.cs.uid b/Runtime/Text/Parsing/ParserLibrary/CSharp/Parsers/CSPreProcessor/CSPreProcessorContext.cs.uid new file mode 100644 index 0000000..51df0ec --- /dev/null +++ b/Runtime/Text/Parsing/ParserLibrary/CSharp/Parsers/CSPreProcessor/CSPreProcessorContext.cs.uid @@ -0,0 +1 @@ +uid://fmbkq7fn2mhf diff --git a/Runtime/Text/Parsing/ParserLibrary/CSharp/Parsers/CSPreProcessor/CSPreProcessorExpressionParser.cs b/Runtime/Text/Parsing/ParserLibrary/CSharp/Parsers/CSPreProcessor/CSPreProcessorExpressionParser.cs new file mode 100644 index 0000000..48b0449 --- /dev/null +++ b/Runtime/Text/Parsing/ParserLibrary/CSharp/Parsers/CSPreProcessor/CSPreProcessorExpressionParser.cs @@ -0,0 +1,67 @@ +using System.Collections.Generic; + +namespace Rokojori; + + +public class CSPreProcessorExpressionParser:ExpressionParser +{ + + public ConstantOperator boolConstantOperator; + + public GroupOperator groupOperator; + + public VariableOperator variableOperator; + + public BinaryOperator andOperator; + public BinaryOperator orOperator; + + public BinaryOperator equalsOperator; + public BinaryOperator notEqualsOperator; + + public UnaryOperator notOperator; + + public CSPreProcessorExpressionParser() + { + Initialize(); + } + + public void Initialize() + { + boolConstantOperator = new ConstantOperator( + TokenPredicateData.Create( LexerMatcherLibrary.BoolMatcher.type ) + ); + + groupOperator = new GroupOperator( "(", ")" ); + + variableOperator = new VariableOperator(); + + andOperator = new BinaryOperator( "&&" ); + orOperator = new BinaryOperator( "||" ); + + equalsOperator = new BinaryOperator( "==" ); + notEqualsOperator = new BinaryOperator( "!=" ); + + notOperator = new UnaryOperator( "!" ); + + + levels = []; + + AddPrecedenceLevel( boolConstantOperator ); + + AddPrecedenceLevel( groupOperator ); + + AddPrecedenceLevel( variableOperator ); + + AddPrecedenceLevel( notOperator ); + + AddPrecedenceLevel( equalsOperator, notEqualsOperator ); + + AddPrecedenceLevel( andOperator ); + + AddPrecedenceLevel( orOperator ); + + + } + + +} \ No newline at end of file diff --git a/Runtime/Text/Parsing/ParserLibrary/CSharp/Parsers/CSPreProcessor/CSPreProcessorExpressionParser.cs.uid b/Runtime/Text/Parsing/ParserLibrary/CSharp/Parsers/CSPreProcessor/CSPreProcessorExpressionParser.cs.uid new file mode 100644 index 0000000..5735328 --- /dev/null +++ b/Runtime/Text/Parsing/ParserLibrary/CSharp/Parsers/CSPreProcessor/CSPreProcessorExpressionParser.cs.uid @@ -0,0 +1 @@ +uid://bh4c4giiq32hk diff --git a/Runtime/Text/Parsing/ParserLibrary/CSharp/Parsers/CSPreProcessor/CSPreProcessorStack.cs b/Runtime/Text/Parsing/ParserLibrary/CSharp/Parsers/CSPreProcessor/CSPreProcessorStack.cs new file mode 100644 index 0000000..0a9e722 --- /dev/null +++ b/Runtime/Text/Parsing/ParserLibrary/CSharp/Parsers/CSPreProcessor/CSPreProcessorStack.cs @@ -0,0 +1,63 @@ +using System.Collections.Generic; +using System.Linq; + +namespace Rokojori; + +public class CSPreProcessorConditionalContext +{ + public bool lastWasTrue = false; +} + +public class CSPreProcessorStack +{ + public HashSet defines = new HashSet(); + public List conditionalContexts = []; + + public void Push( string value ) + { + defines.Add( value ); + } + + public void Pop( string value ) + { + defines.Remove( value ); + } + + public void ProcessDefine( string value, bool push ) + { + if ( push ) + { + Push( value ); + } + else + { + Pop( value ); + } + } + + public void OpenConditionalContext() + { + conditionalContexts.Add( new CSPreProcessorConditionalContext() ); + } + + public void CloseConditionalContext() + { + conditionalContexts.Pop(); + } + + public void SetConditionalContext( bool value ) + { + conditionalContexts.Last().lastWasTrue = value; + } + + public void SetElseBranch() + { + conditionalContexts.Last().lastWasTrue = ! conditionalContexts.Last().lastWasTrue; + } + + public bool GetVisibility() + { + return conditionalContexts.Count == 0 || conditionalContexts.Last().lastWasTrue; + } +} + \ No newline at end of file diff --git a/Runtime/Text/Parsing/ParserLibrary/CSharp/Parsers/CSPreProcessor/CSPreProcessorStack.cs.uid b/Runtime/Text/Parsing/ParserLibrary/CSharp/Parsers/CSPreProcessor/CSPreProcessorStack.cs.uid new file mode 100644 index 0000000..10c3b8d --- /dev/null +++ b/Runtime/Text/Parsing/ParserLibrary/CSharp/Parsers/CSPreProcessor/CSPreProcessorStack.cs.uid @@ -0,0 +1 @@ +uid://bfkjft2gy8yqy diff --git a/Runtime/Text/Parsing/ParserLibrary/CSharp/Parsers/CSRootFileParser.cs b/Runtime/Text/Parsing/ParserLibrary/CSharp/Parsers/CSRootFileParser.cs new file mode 100644 index 0000000..e5bab43 --- /dev/null +++ b/Runtime/Text/Parsing/ParserLibrary/CSharp/Parsers/CSRootFileParser.cs @@ -0,0 +1,37 @@ +using System.Collections.Generic; + +namespace Rokojori; + +public class CSRootFileParser:ASTParserPhase +{ + public CSPreProcessorContext preProcessorContext = new CSPreProcessorContext(); + + public static ASTParser CreateParser() + { + List resolvers = + [ + CSImportDeclaration.Resolver(), + CSNamespaceDeclaration.Resolver(), + + CSClassDeclaration.Resolver(), + CSStructDeclaration.Resolver(), + CSEnumDeclaration.Resolver(), + CSInterfaceDeclaration.Resolver() + ]; + + var astParser = new ASTParser(); + astParser.resolvers = resolvers; + + return astParser; + } + + public CSRootFileParser():base( CreateParser() ) + {} + + public override ASTNode GetParsingRoot( Parser p ) + { + return p.root; + } + + +} \ No newline at end of file diff --git a/Runtime/Text/Parsing/ParserLibrary/CSharp/Parsers/CSRootFileParser.cs.uid b/Runtime/Text/Parsing/ParserLibrary/CSharp/Parsers/CSRootFileParser.cs.uid new file mode 100644 index 0000000..dec278f --- /dev/null +++ b/Runtime/Text/Parsing/ParserLibrary/CSharp/Parsers/CSRootFileParser.cs.uid @@ -0,0 +1 @@ +uid://ciibe6tecx4h6 diff --git a/Runtime/Text/Text.cs b/Runtime/Text/Text.cs index c584cd3..1212e2a 100644 --- a/Runtime/Text/Text.cs +++ b/Runtime/Text/Text.cs @@ -1,6 +1,7 @@ using System.Collections; using System.Collections.Generic; +using System.Text; using System.Text.RegularExpressions; @@ -8,6 +9,23 @@ namespace Rokojori { public static class Text { + public static string Repeat( this string text, int times ) + { + if ( times <= 0 ) + { + return ""; + } + + var sb = new StringBuilder(); + + for ( int i = 0; i < times; i++ ) + { + sb.Append( text ); + } + + return sb.ToString(); + } + public static string GetInnerMatch( this string text, string start, string ending, int offset = 0) { var startIndex = text.IndexOf( start, offset ); @@ -133,6 +151,19 @@ namespace Rokojori return long.Parse( source ); } + public static bool StartsWithAny( this string source, params string[] starts ) + { + for ( int i = 0; i < starts.Length; i++ ) + { + if ( source.StartsWith( starts[ i ] ) ) + { + return true; + } + } + + return false; + } + public static string ReplaceStart( this string source, string start, string replacement = "" ) { if ( start == "" ) diff --git a/Runtime/Tools/Lists.cs b/Runtime/Tools/Lists.cs index 1a060e0..a59e3ad 100644 --- a/Runtime/Tools/Lists.cs +++ b/Runtime/Tools/Lists.cs @@ -502,6 +502,11 @@ namespace Rokojori return list == null ? 0 : list.Count; } + public static List Range( this List elements, int start, int end ) + { + return elements.Sub( start, end - start + 1 ); + } + public static List Sub( this List elements, int start, int length = 0 ) { var end = length == 0 ? elements.Count : ( start + length ); @@ -611,7 +616,12 @@ namespace Rokojori return PopLast( list ); } - public static T Shift( this List list ) + public static void Prepend( this List list, List other ) + { + list.InsertRange( 0, other ); + } + + public static T Shift( this List list ) { if ( list.Count == 0 ){ return default(T); } @@ -644,6 +654,16 @@ namespace Rokojori return GetLast( list ); } + public static T GetFirst( List list ) + { + return list.Count == 0 ? default(T) : list[ 0 ]; + } + + public static T First( this List list ) + { + return list.Count == 0 ? default(T) : list[ 0 ]; + } + public static T ReverseAt( this List list, int index ) { return list[ list.Count - 1 - index ]; diff --git a/Runtime/UI/Nodes/Image/UIImage.cs b/Runtime/UI/Nodes/Image/UIImage.cs index 3b08bf1..8a8b757 100644 --- a/Runtime/UI/Nodes/Image/UIImage.cs +++ b/Runtime/UI/Nodes/Image/UIImage.cs @@ -10,6 +10,14 @@ namespace Rokojori [GlobalClass,Icon("res://addons/rokojori_action_library/Icons/UIImage.svg")] public partial class UIImage:TextureRect, UIStylePropertyContainerNode, UIHolderControl, IAssemblyReload { + [Export] + public bool activateDebugging = false; + + public bool HasDebugFlag() + { + return activateDebugging; + } + protected UIImageType _imageType; [Export] public UIImageType imageType @@ -84,10 +92,27 @@ namespace Rokojori } } - string hoverID = IDGenerator.GenerateID(); + string hoverID = IDGenerator.GenerateID(); + UICursor appliedCursor = null; public override void _Ready() { + VisibilityChanged += ()=> + { + var visible = IsVisibleInTree(); + + if ( visible ) + { + onVisible?.Trigger(); + } + else + { + onInvisible?.Trigger(); + } + + onVisibilityChanged?.Trigger(); + }; + FocusEntered += ()=> { this.LogInfo( "Focused", setActiveWhenFocused.Length ); @@ -141,6 +166,15 @@ namespace Rokojori { AddUISelectorFlag( UISelectorFlag.Hover, hoverID ); this.SetDirty(); + + var currentHoverCursor = UIStyle.ResolveHoverCursor( this ); + + if ( currentHoverCursor != null ) + { + currentHoverCursor.ApplyCursor( this ); + appliedCursor = currentHoverCursor; + this.LogInfo( "Set Cursor on Hover:", appliedCursor ); + } }; @@ -148,12 +182,20 @@ namespace Rokojori { RemoveUISelectorFlag( UISelectorFlag.Hover, hoverID ); this.SetDirty(); + + if ( appliedCursor != null ) + { + this.LogInfo( "Reset Cursor on Exit"); + appliedCursor.ClearCursor( this ); + } }; UpdateImageType(); ComputeUIAncestorDepth(); } + + public override void _EnterTree() { UpdateImageType(); @@ -198,7 +240,10 @@ namespace Rokojori protected override void Dispose( bool disposing) { _selectorFlagReferenceCounter.Clear(); - } + } + + [Export] + public UISelectorFlag[] additionalSelectorFlags = []; MapList _selectorFlagReferenceCounter = new MapList(); @@ -225,6 +270,8 @@ namespace Rokojori var numFlagsBefore = _selectorFlags.Count; _selectorFlags = _selectorFlagReferenceCounter.Keys.ToList(); + + _selectorFlags.AddRange( additionalSelectorFlags ); var changed = numFlagsBefore != _selectorFlags.Count; @@ -333,6 +380,158 @@ namespace Rokojori shaderUIColor.color = color; } + + [ExportGroup("Actions")] + + [Export] + public Action onVisible; + + [Export] + public Action onInvisible; + + [Export] + public Action onVisibilityChanged; + + [ExportGroup( "Interactivity" )] + [Export] + public UICursor hoverCursor; + + public UICursor GetHoverCursor( UIStylePropertyContainer container ) + { + return hoverCursor; + } + + + [Export] + public Action onUIConfirm; + + + public enum ConfirmClick + { + Ignore, + MouseDown, + MouseRelease, + Focused_MouseDown, + Focused_MouseRelease + } + + [Export] + public ConfirmClick confirmClickMode = ConfirmClick.MouseDown; + + [Export] + public Action onFocusEntered; + + [Export] + public Action onFocusExited; + + [Export] + public Control[] setActiveWhenFocused = []; + + [Export] + public Control focusControl; + + [Export] + public bool handleMouseEvents = false; + + [Export] + public Action onLeftClick; + + [Export] + public Action onMiddleClick; + + [Export] + public Action onRightClick; + + public override void _GuiInput( InputEvent inputEvent ) + { + var ui = GetUI(); + + // this.LogInfo( "InputEvent", inputEvent, ui.settings.uiConfirm.IsDown( inputEvent ) ); + + if ( ui.settings.uiConfirm.IsDown( inputEvent ) ) + { + onUIConfirm?.Trigger(); + // GD.Print("ui_accept pressed while focused"); + // AcceptEvent(); // Optional: stop propagation + } + + if ( inputEvent is InputEventMouseButton lmb ) + { + if ( lmb.IsPressed() ) + { + AddUISelectorFlag( UISelectorFlag.Dragging ); + + if ( focusControl != null ) + { + focusControl.GrabFocus(); + } + } + + if ( lmb.IsReleased() ) + { + RemoveUISelectorFlag( UISelectorFlag.Dragging ); + } + + + if ( lmb.Pressed && lmb.ButtonIndex == MouseButton.Left ) + { + if ( ConfirmClick.MouseDown == confirmClickMode || ConfirmClick.Focused_MouseDown == confirmClickMode ) + { + if ( HasFocus() || ConfirmClick.MouseDown == confirmClickMode ) + { + onUIConfirm?.Trigger(); + } + } + } + else if ( + lmb.IsReleased() && lmb.ButtonIndex == MouseButton.Left && + _selectorFlags != null && _selectorFlags.Contains( UISelectorFlag.Hover ) + ) + { + if ( ConfirmClick.MouseRelease == confirmClickMode || ConfirmClick.Focused_MouseRelease == confirmClickMode ) + { + if ( HasFocus() || ConfirmClick.MouseRelease == confirmClickMode ) + { + onUIConfirm?.Trigger(); + } + } + } + } + + if ( ! handleMouseEvents ) + { + return; + } + + + if ( inputEvent is InputEventMouseButton mb ) + { + if ( mb.Pressed ) + { + this.LogInfo( "Clicked" ); + + if ( mb.ButtonIndex == MouseButton.Left ) + { + Action.Trigger( onLeftClick ); + } + + if ( mb.ButtonIndex == MouseButton.Middle ) + { + Action.Trigger( onMiddleClick ); + } + + if ( mb.ButtonIndex == MouseButton.Right ) + { + Action.Trigger( onRightClick ); + } + } + } + + } + + + [ExportCategory( "UIStyle" )] + [Export] public UIStyle parentStyle; @@ -475,24 +674,7 @@ namespace Rokojori } - [ExportGroup( "Interactivity" )] - [Export] - public UICursor hoverCursor; - - [Export] - public Action onFocusEntered; - - [Export] - public Action onFocusExited; - - [Export] - public Control[] setActiveWhenFocused = []; - - public UICursor GetHoverCursor( UIStylePropertyContainer container ) - { - return hoverCursor; - } - + [ExportGroup( "Sound" )] [Export] diff --git a/Runtime/UI/Nodes/Image/UIImageTypes/RoundedRectangleUIImageType.cs b/Runtime/UI/Nodes/Image/UIImageTypes/RoundedRectangleUIImageType.cs index 1ca2cfb..6ee55d3 100644 --- a/Runtime/UI/Nodes/Image/UIImageTypes/RoundedRectangleUIImageType.cs +++ b/Runtime/UI/Nodes/Image/UIImageTypes/RoundedRectangleUIImageType.cs @@ -123,6 +123,11 @@ namespace Rokojori return offset; } + if ( RoundedRectangleShader.strokeSize.propertyName == shaderPropertyName ) + { + return strokeSize; + } + return null; } diff --git a/Runtime/UI/Nodes/Sliders/ScrollSlider/UIScrollSlider.cs b/Runtime/UI/Nodes/Sliders/ScrollSlider/UIScrollSlider.cs index 135b978..b9e6e8e 100644 --- a/Runtime/UI/Nodes/Sliders/ScrollSlider/UIScrollSlider.cs +++ b/Runtime/UI/Nodes/Sliders/ScrollSlider/UIScrollSlider.cs @@ -26,6 +26,8 @@ public partial class UIScrollSlider:UISlider _onSliderChange.AddAction( ( pos ) => { SyncScroll(); } ); _hasEventListener = true; } + + UpdateVisibility(); } @@ -41,15 +43,67 @@ public partial class UIScrollSlider:UISlider } base._Process( delta ); + + UpdateVisibility(); + + } Vector2 _lastOffset = Vector2.Zero; + [Export] + public bool showInfo = false; + + [Export] + public bool automaticVisibility = true; + + void UpdateVisibility( bool force = false ) + { + if ( ! force && ! automaticVisibility ) + { + return; + } + + var viewSize = scrollContainer.Size; + var contentSize = scrollArea.Size; + + if ( showInfo ) + { + this.LogInfo( + "containerSize", viewSize, + "areaSize", contentSize + ); + } + + + if ( UISlider.Direction.Horizontal == direction ) + { + + if ( viewSize.X > contentSize.X ) + { + this.SetVisibility( false ); + return; + } + } + else if ( UISlider.Direction.Vertical == direction ) + { + if ( viewSize.Y > contentSize.Y ) + { + this.SetVisibility( false ); + return; + } + } + + this.SetVisibility( true ); + } + public void SyncScroll() { var containerSize = scrollContainer.Size; var areaSize = scrollArea.Size; + UpdateVisibility(); + var scroll = areaSize - containerSize; scroll = scroll.Max( Vector2.Zero ); diff --git a/Runtime/UI/Nodes/Sliders/UISlider.cs b/Runtime/UI/Nodes/Sliders/UISlider.cs index d8de45f..93fb9c4 100644 --- a/Runtime/UI/Nodes/Sliders/UISlider.cs +++ b/Runtime/UI/Nodes/Sliders/UISlider.cs @@ -94,6 +94,14 @@ public partial class UISlider:UIImage, UIFocusProcessor { base._Ready(); + VisibilityChanged += ()=> + { + if ( IsVisibleInTree() ) + { + SyncSliderValue(); + } + }; + if ( imageType == null ) { imageType = new SliderUIImageType(); @@ -117,7 +125,6 @@ public partial class UISlider:UIImage, UIFocusProcessor SyncSliderValue(); - AssignListener(); } @@ -133,47 +140,7 @@ public partial class UISlider:UIImage, UIFocusProcessor float lastUp = 0f; float lastDown = 0f; - public void OnFocusProcess( double delta ) - { - var settings = GetUI().settings; - - if ( settings == null ) - { - return; - } - - if ( Direction.Horizontal == direction ) - { - - var offset = 0; - - if ( settings.uiLeft.IsRepeatDown( ref lastLeft ) ) - { - offset --; - } - - if ( settings.uiRight.IsRepeatDown( ref lastRight ) ) - { - offset ++; - } - - if ( offset != 0 ) - { - var nextMainValue = MathX.Clamp01( mainValue + offset * offsetPerInput ); - nextValue = NormalizedToButtonPosition( GetNextSliderMainValue( nextMainValue ) ); - - if ( ! _updatingPosition ) - { - _updatingPosition = true; - GetUI().onProcess.AddAction( UpdatePosition ); - } - - } - } - - - // UpdatePosition( (float) delta ); - } + // public override void _GuiInput( InputEvent inputEvent ) // { @@ -384,6 +351,56 @@ public partial class UISlider:UIImage, UIFocusProcessor bool _listenerAssigned = false; + public void OnFocusProcess( double delta ) + { + var settings = GetUI().settings; + + if ( settings == null ) + { + return; + } + + if ( Direction.Horizontal == direction ) + { + + var offset = 0; + + if ( settings.uiLeft.IsRepeatDown( ref lastLeft ) ) + { + offset --; + } + + if ( settings.uiRight.IsRepeatDown( ref lastRight ) ) + { + offset ++; + } + + if ( offset != 0 ) + { + var nextMainValue = MathX.Clamp01( mainValue + offset * offsetPerInput ); + nextValue = NormalizedToButtonPosition( GetNextSliderMainValue( nextMainValue ) ); + // var dir = direction == Direction.Horizontal ? Vector2.Right : Vector2.Down; + // var cachedButtonPosition = NormalizedToButtonPosition( sliderValue ); + // var nextPosition = cachedButtonPosition + dir * offset * offsetPerInput ; + // nextValue = nextPosition.Clamp( buttonPositionMin, buttonPositionMax ); + + if ( ! _updatingPosition ) + { + if ( smoothing != null ) + { + smoothing?.SetCurrent( NormalizedToButtonPosition( sliderValue ) ); + } + _updatingPosition = true; + GetUI().onProcess.AddAction( UpdatePosition ); + } + + } + } + + + // UpdatePosition( (float) delta ); + } + void AssignListener() { if ( _listenerAssigned ) diff --git a/Runtime/UI/Nodes/UIInputInfo.cs b/Runtime/UI/Nodes/UIInputInfo.cs index f497cc1..c4a42da 100644 --- a/Runtime/UI/Nodes/UIInputInfo.cs +++ b/Runtime/UI/Nodes/UIInputInfo.cs @@ -44,7 +44,7 @@ namespace Rokojori UpdateInfo(); } - void UpdateInfo() + public void UpdateInfo() { Nodes.RemoveAndDeleteChildren( this ); @@ -84,7 +84,7 @@ namespace Rokojori localeText.locale = locale; localeText.font = iiLib.font; - localeText.fontSize = this.fontSize != null ? this.fontSize : iiLib.fontSize; + localeText.fontSize = this.fontSize ?? iiLib.fontSize; localeText.Uppercase = upperCase; localeText.marginLeft = UINumber.EM( 0.25f ); diff --git a/Runtime/UI/Nodes/UIRegion.cs b/Runtime/UI/Nodes/UIRegion.cs index 0eda2ed..a12e5d7 100644 --- a/Runtime/UI/Nodes/UIRegion.cs +++ b/Runtime/UI/Nodes/UIRegion.cs @@ -9,27 +9,202 @@ namespace Rokojori [GlobalClass,Icon("res://addons/rokojori_action_library/Icons/UIRegion.svg")] public partial class UIRegion : Control, UIStylePropertyContainerNode, UIHolderControl { + + [Export] + public bool activateDebugging = false; + + public bool HasDebugFlag() + { + return activateDebugging; + } [Export] - public UIStyle parentStyle; + public string currentSelectors = ""; - [ExportGroup( "Layout" )] + [ExportGroup("Actions")] + [Export] - public UILayout layout; + public Action onVisible; + + [Export] + public Action onInvisible; [Export] - public UINumber horizontalAlignment; + public Action onVisibilityChanged; + + [ExportGroup( "Interactivity" )] [Export] - public UINumber verticalAlignment; - [Export] - public UINumber verticalPlacement; + public UICursor hoverCursor; + + public UICursor GetHoverCursor( UIStylePropertyContainer container ) + { + return hoverCursor; + } + [Export] - public UINumber elementSpacing; + public Action onUIConfirm; + + + public enum ConfirmClick + { + Ignore, + MouseDown, + MouseRelease, + Focused_MouseDown, + Focused_MouseRelease + } + [Export] - public UINumber lineSpacing; + public ConfirmClick confirmClickMode = ConfirmClick.MouseDown; + + [Export] + public Action onFocusEntered; + + [Export] + public Action onFocusExited; + + [Export] + public Control[] setActiveWhenFocused = []; + + [Export] + public Control focusControl; + + [Export] + public bool handleMouseEvents = false; + + [Export] + public Action onLeftClick; + + [Export] + public Action onMiddleClick; + + [Export] + public Action onRightClick; + + public override void _GuiInput( InputEvent inputEvent ) + { + var ui = GetUI(); + + // this.LogInfo( "InputEvent", inputEvent, ui.settings.uiConfirm.IsDown( inputEvent ) ); + + if ( ui.settings.uiConfirm.IsDown( inputEvent ) ) + { + onUIConfirm?.Trigger(); + // GD.Print("ui_accept pressed while focused"); + // AcceptEvent(); // Optional: stop propagation + } + + if ( inputEvent is InputEventMouseButton lmb ) + { + if ( lmb.IsPressed() ) + { + AddUISelectorFlag( UISelectorFlag.Dragging ); + + if ( focusControl != null ) + { + focusControl.GrabFocus(); + } + } + + if ( lmb.IsReleased() ) + { + RemoveUISelectorFlag( UISelectorFlag.Dragging ); + } + + + if ( lmb.Pressed && lmb.ButtonIndex == MouseButton.Left ) + { + if ( ConfirmClick.MouseDown == confirmClickMode || ConfirmClick.Focused_MouseDown == confirmClickMode ) + { + if ( HasFocus() || ConfirmClick.MouseDown == confirmClickMode ) + { + onUIConfirm?.Trigger(); + } + } + } + else if ( + lmb.IsReleased() && lmb.ButtonIndex == MouseButton.Left && + _selectorFlags != null && _selectorFlags.Contains( UISelectorFlag.Hover ) + ) + { + if ( ConfirmClick.MouseRelease == confirmClickMode || ConfirmClick.Focused_MouseRelease == confirmClickMode ) + { + if ( HasFocus() || ConfirmClick.MouseRelease == confirmClickMode ) + { + onUIConfirm?.Trigger(); + } + } + } + } + + if ( ! handleMouseEvents ) + { + return; + } + + + if ( inputEvent is InputEventMouseButton mb ) + { + if ( mb.Pressed ) + { + this.LogInfo( "Clicked" ); + + if ( mb.ButtonIndex == MouseButton.Left ) + { + Action.Trigger( onLeftClick ); + } + + if ( mb.ButtonIndex == MouseButton.Middle ) + { + Action.Trigger( onMiddleClick ); + } + + if ( mb.ButtonIndex == MouseButton.Right ) + { + Action.Trigger( onRightClick ); + } + } + } + + } + + [ExportGroup( "Functions" )] + [Export] + public UI.FocusOrderType focusOrderType = UI.FocusOrderType.Vertical_List; + + [ExportToolButton( "Set Focus Connections" )] + public Callable setFocusConnectionButton => Callable.From( + ( ) => + { + UI.SetChildFocusOrder( this, focusOrderType, null, FocusModeEnum.Click ); + } + ); + + #if TOOLS + [ExportGroup("Editor SceneSetup")] + [Export] + public UISettings uiSettings; + + [Export] + public bool updateInEditor = false; + + [Export] + public float fontZoom = 1f; + + [Export] + public bool reassignUI; + [ExportGroup("Editor SceneSetup/Read Only")] + [Export] + public float computedFontSize = 0f; + + #endif + + [ExportCategory( "UIStyle" )] + + [ExportGroup( "Size & Margins" )] [Export] public UINumber width; @@ -64,6 +239,23 @@ namespace Rokojori [Export] public UINumber bottom; + + [ExportGroup( "Child Layout" )] + [Export] + public UILayout layout; + + [Export] + public UINumber horizontalAlignment; + [Export] + public UINumber verticalAlignment; + [Export] + public UINumber verticalPlacement; + + [Export] + public UINumber elementSpacing; + [Export] + public UINumber lineSpacing; + [ExportGroup( "Font" )] [Export] public Font font; @@ -93,15 +285,6 @@ namespace Rokojori [Export] public UIColor selfModulationColor; - // public List> GetActiveShaderUIColorTransitions() - // { - // return null; - // } - - // public List> GetActiveShaderUINumberTransitions() - // { - // return null; - // } [ExportGroup("Transitions")] [Export] @@ -169,32 +352,14 @@ namespace Rokojori } } - [Export] - public Action onFocusEntered; - [Export] - public Action onFocusExited; - - #if TOOLS - [ExportGroup("Editor SceneSetup")] - [Export] - public UISettings uiSettings; - - [Export] - public bool updateInEditor = false; - - [Export] - public float fontZoom = 1f; - + [ExportGroup( "" )] [Export] - public bool reassignUI; - [ExportGroup("Editor SceneSetup/Read Only")] - [Export] - public float computedFontSize = 0f; + public UIStyle parentStyle; + - #endif public UIStyle GetUIStyleParent() @@ -231,11 +396,6 @@ namespace Rokojori { return null; } - - public UICursor GetHoverCursor( UIStylePropertyContainer container ) - { - return null; - } public Font GetFont() { @@ -363,8 +523,26 @@ namespace Rokojori string hoverID = IDGenerator.GenerateID(); + UICursor appliedCursor = null; + public override void _Ready() { + VisibilityChanged += ()=> + { + var visible = IsVisibleInTree(); + + if ( visible ) + { + onVisible?.Trigger(); + } + else + { + onInvisible?.Trigger(); + } + + onVisibilityChanged?.Trigger(); + }; + FocusEntered += ()=> { AddUISelectorFlag( UISelectorFlag.Focus ); @@ -399,6 +577,15 @@ namespace Rokojori { AddUISelectorFlag( UISelectorFlag.Hover, hoverID ); this.SetDirty(); + + var currentHoverCursor = UIStyle.ResolveHoverCursor( this ); + + if ( currentHoverCursor != null ) + { + currentHoverCursor.ApplyCursor( this ); + appliedCursor = currentHoverCursor; + this.LogInfo( "Set Cursor on Hover:", appliedCursor ); + } }; @@ -406,6 +593,12 @@ namespace Rokojori { RemoveUISelectorFlag( UISelectorFlag.Hover, hoverID ); this.SetDirty(); + + if ( appliedCursor != null ) + { + this.LogInfo( "Reset Cursor on Exit"); + appliedCursor.ClearCursor( this ); + } }; } @@ -438,6 +631,9 @@ namespace Rokojori _uiAncestorDepth = -1; } + [Export] + public UISelectorFlag[] additionalSelectorFlags = []; + MapList _selectorFlagReferenceCounter = new MapList(); public void AddUISelectorFlag( UISelectorFlag flag, string reference = "" ) @@ -450,7 +646,7 @@ namespace Rokojori SetSelectorFlagReference( flag, reference, false ); } - protected override void Dispose( bool disposing) + protected override void Dispose( bool disposing ) { _selectorFlagReferenceCounter.Clear(); } @@ -468,22 +664,25 @@ namespace Rokojori var numFlagsBefore = _selectorFlags.Count; _selectorFlags = _selectorFlagReferenceCounter.Keys.ToList(); + _selectorFlags.AddRange( additionalSelectorFlags ); + var changed = numFlagsBefore != _selectorFlags.Count; UISelector.UpdateParentUISelectorFlags( this ); - this.LogInfo( - "flag:", flag, - "reference:", reference, - "enable:", enable, - "changed:", changed, - "numFlagsBefore:", numFlagsBefore, - "_selectorFlags:", _selectorFlags.Map( sf => sf.ResourcePath + " " + sf.ResourceName ).Join( ", " ) - ); + // this.LogInfo( + // "flag:", flag, + // "reference:", reference, + // "enable:", enable, + // "changed:", changed, + // "numFlagsBefore:", numFlagsBefore, + // "_selectorFlags:", _selectorFlags.Map( sf => sf.ResourcePath + " " + sf.ResourceName ).Join( ", " ) + // ); if ( changed ) { + currentSelectors = _selectorFlags.Map( sf => RegexUtility.TrimToLastPathFragment( sf.ResourcePath ) ).Join( ", " ); this.SetDirty(); } } diff --git a/Runtime/UI/Nodes/UIText.cs b/Runtime/UI/Nodes/UIText.cs index 2cac4fd..04b5329 100644 --- a/Runtime/UI/Nodes/UIText.cs +++ b/Runtime/UI/Nodes/UIText.cs @@ -10,6 +10,13 @@ namespace Rokojori [GlobalClass,Icon("res://addons/rokojori_action_library/Icons/UIText.svg")] public partial class UIText:Label,UIStylePropertyContainerNode, iLocalizable, UIHolderControl, IAssemblyReload { + [Export] + public bool activateDebugging = false; + + public bool HasDebugFlag() + { + return activateDebugging; + } LocalizedString _locale; @@ -59,6 +66,74 @@ namespace Rokojori [Export] public bool alwaysMinimumSize = true; + + [ExportGroup("Actions")] + + [Export] + public Action onVisible; + + [Export] + public Action onInvisible; + + [Export] + public Action onVisibilityChanged; + + [ExportGroup( "Interactivity" )] + + [Export] + public UICursor hoverCursor; + + public UICursor GetHoverCursor( UIStylePropertyContainer container ) + { + return hoverCursor; + } + + + [Export] + public Action onUIConfirm; + + + public enum ConfirmClick + { + Ignore, + MouseDown, + MouseRelease, + Focused_MouseDown, + Focused_MouseRelease + } + + [Export] + public ConfirmClick confirmClickMode = ConfirmClick.MouseDown; + + [Export] + public Action onFocusEntered; + + [Export] + public Action onFocusExited; + + [Export] + public Control[] setActiveWhenFocused = []; + + [Export] + public Control focusControl; + + [Export] + public bool handleMouseEvents = false; + + [Export] + public Action onLeftClick; + + [Export] + public Action onMiddleClick; + + [Export] + public Action onRightClick; + + + + + [ExportCategory( "UIStyle" )] + UIStyle _parentStyle; [Export] public UIStyle parentStyle @@ -68,6 +143,7 @@ namespace Rokojori } Font _font; + [ExportGroup( "Font" )] [Export] public Font font @@ -185,6 +261,22 @@ namespace Rokojori public override void _Ready() { + VisibilityChanged += ()=> + { + var visible = IsVisibleInTree(); + + if ( visible ) + { + onVisible?.Trigger(); + } + else + { + onInvisible?.Trigger(); + } + + onVisibilityChanged?.Trigger(); + }; + FocusEntered += ()=> { AddUISelectorFlag( UISelectorFlag.Focus ); @@ -240,8 +332,6 @@ namespace Rokojori currentHoverCursor.ApplyCursor( this ); appliedCursor = currentHoverCursor; this.LogInfo( "Set Cursor on Hover:", appliedCursor ); - // Input.SetDefaultCursorShape( hoverCursorShape ); - // MouseDefaultCursorShape = hoverCursorShape; } }; @@ -293,6 +383,9 @@ namespace Rokojori _selectorFlagReferenceCounter.Clear(); } + [Export] + public UISelectorFlag[] additionalSelectorFlags = []; + MapList _selectorFlagReferenceCounter = new MapList(); public void AddUISelectorFlag( UISelectorFlag flag, string reference = "" ) @@ -320,6 +413,7 @@ namespace Rokojori var numFlagsBefore = _selectorFlags.Count; _selectorFlags = _selectorFlagReferenceCounter.Keys.ToList(); + _selectorFlags.AddRange( additionalSelectorFlags ); var changed = numFlagsBefore != _selectorFlags.Count; @@ -357,6 +451,49 @@ namespace Rokojori // AcceptEvent(); // Optional: stop propagation } + if ( inputEvent is InputEventMouseButton lmb ) + { + if ( lmb.IsPressed() ) + { + AddUISelectorFlag( UISelectorFlag.Dragging ); + + if ( focusControl != null ) + { + focusControl.GrabFocus(); + } + } + + if ( lmb.IsReleased() ) + { + RemoveUISelectorFlag( UISelectorFlag.Dragging ); + } + + + if ( lmb.Pressed && lmb.ButtonIndex == MouseButton.Left ) + { + if ( ConfirmClick.MouseDown == confirmClickMode || ConfirmClick.Focused_MouseDown == confirmClickMode ) + { + if ( HasFocus() || ConfirmClick.MouseDown == confirmClickMode ) + { + onUIConfirm?.Trigger(); + } + } + } + else if ( + lmb.IsReleased() && lmb.ButtonIndex == MouseButton.Left && + _selectorFlags != null && _selectorFlags.Contains( UISelectorFlag.Hover ) + ) + { + if ( ConfirmClick.MouseRelease == confirmClickMode || ConfirmClick.Focused_MouseRelease == confirmClickMode ) + { + if ( HasFocus() || ConfirmClick.MouseRelease == confirmClickMode ) + { + onUIConfirm?.Trigger(); + } + } + } + } + if ( ! handleMouseEvents ) { return; @@ -447,41 +584,7 @@ namespace Rokojori } } - [ExportGroup( "Interactivity" )] - [Export] - public UICursor hoverCursor; - - public UICursor GetHoverCursor( UIStylePropertyContainer container ) - { - return hoverCursor; - } - - - [Export] - public Action onUIConfirm; - - [Export] - public Action onFocusEntered; - - [Export] - public Action onFocusExited; - - [Export] - public Control[] setActiveWhenFocused = []; - - [Export] - public bool handleMouseEvents = false; - - [Export] - public Action onLeftClick; - - [Export] - public Action onMiddleClick; - - [Export] - public Action onRightClick; - [ExportGroup( "Sound" )] [Export] public UISoundData onFocusSound; diff --git a/Runtime/UI/Presets/Rule Sets/Active-Hover-Idle.tres b/Runtime/UI/Presets/Rule Sets/Active-Hover-Idle.tres new file mode 100644 index 0000000..396b7a1 --- /dev/null +++ b/Runtime/UI/Presets/Rule Sets/Active-Hover-Idle.tres @@ -0,0 +1,11 @@ +[gd_resource type="Resource" script_class="UIRuleSet" load_steps=5 format=3 uid="uid://csu6y67o56730"] + +[ext_resource type="Resource" uid="uid://cxq4cfdnk7c25" path="res://addons/rokojori_action_library/Runtime/UI/Presets/Rules/Active Rule.tres" id="1_gtued"] +[ext_resource type="Script" uid="uid://cyr5imepel4p0" path="res://addons/rokojori_action_library/Runtime/UI/UIRuleSet.cs" id="1_srg4n"] +[ext_resource type="Resource" uid="uid://d15wkkwgtlh0n" path="res://addons/rokojori_action_library/Runtime/UI/Presets/Rules/Hover Rule.tres" id="2_gbvkv"] +[ext_resource type="Resource" uid="uid://30j7mqgncetr" path="res://addons/rokojori_action_library/Runtime/UI/Presets/Rules/Idle Rule.tres" id="3_0nafc"] + +[resource] +script = ExtResource("1_srg4n") +rules = [ExtResource("1_gtued"), ExtResource("2_gbvkv"), ExtResource("3_0nafc")] +metadata/_custom_type_script = "uid://cyr5imepel4p0" diff --git a/Runtime/UI/Presets/Rule Sets/Focus-Hover-Idle.tres b/Runtime/UI/Presets/Rule Sets/Focus-Hover-Idle.tres new file mode 100644 index 0000000..08de35d --- /dev/null +++ b/Runtime/UI/Presets/Rule Sets/Focus-Hover-Idle.tres @@ -0,0 +1,11 @@ +[gd_resource type="Resource" script_class="UIRuleSet" load_steps=5 format=3 uid="uid://43ns132td8o2"] + +[ext_resource type="Resource" uid="uid://cvc0wabrro18q" path="res://addons/rokojori_action_library/Runtime/UI/Presets/Rules/Focus Rule.tres" id="1_j2gkj"] +[ext_resource type="Resource" uid="uid://d15wkkwgtlh0n" path="res://addons/rokojori_action_library/Runtime/UI/Presets/Rules/Hover Rule.tres" id="2_vdm4c"] +[ext_resource type="Resource" uid="uid://30j7mqgncetr" path="res://addons/rokojori_action_library/Runtime/UI/Presets/Rules/Idle Rule.tres" id="3_h8s7b"] +[ext_resource type="Script" uid="uid://cyr5imepel4p0" path="res://addons/rokojori_action_library/Runtime/UI/UIRuleSet.cs" id="4_3aead"] + +[resource] +script = ExtResource("4_3aead") +rules = [ExtResource("1_j2gkj"), ExtResource("2_vdm4c"), ExtResource("3_h8s7b")] +metadata/_custom_type_script = "uid://cyr5imepel4p0" diff --git a/Runtime/UI/Presets/Rules/Active Rule.tres b/Runtime/UI/Presets/Rules/Active Rule.tres new file mode 100644 index 0000000..76ccaae --- /dev/null +++ b/Runtime/UI/Presets/Rules/Active Rule.tres @@ -0,0 +1,11 @@ +[gd_resource type="Resource" script_class="UIRule" load_steps=4 format=3 uid="uid://cxq4cfdnk7c25"] + +[ext_resource type="Script" uid="uid://8eihwfc2acp1" path="res://addons/rokojori_action_library/Runtime/UI/Styling/UIRule.cs" id="1_mfnwy"] +[ext_resource type="Resource" uid="uid://do3q5tipotyn3" path="res://addons/rokojori_action_library/Runtime/UI/Presets/Selectors/Active Selector.tres" id="2_rlfk3"] +[ext_resource type="Resource" uid="uid://brjq22uvnpxuv" path="res://addons/rokojori_action_library/Runtime/UI/Presets/Styles/Mod 100% Style.tres" id="3_ejfkw"] + +[resource] +script = ExtResource("1_mfnwy") +selector = ExtResource("2_rlfk3") +style = ExtResource("3_ejfkw") +metadata/_custom_type_script = "uid://bqypmtxqo5rnf" diff --git a/Runtime/UI/Presets/Rules/Focus Rule.tres b/Runtime/UI/Presets/Rules/Focus Rule.tres new file mode 100644 index 0000000..876b1e0 --- /dev/null +++ b/Runtime/UI/Presets/Rules/Focus Rule.tres @@ -0,0 +1,11 @@ +[gd_resource type="Resource" script_class="UIRule" load_steps=4 format=3 uid="uid://cvc0wabrro18q"] + +[ext_resource type="Script" uid="uid://8eihwfc2acp1" path="res://addons/rokojori_action_library/Runtime/UI/Styling/UIRule.cs" id="1_80s54"] +[ext_resource type="Resource" uid="uid://dgx4ue1pvvltj" path="res://addons/rokojori_action_library/Runtime/UI/Presets/Selectors/Focus Selector.tres" id="2_blydg"] +[ext_resource type="Resource" uid="uid://brjq22uvnpxuv" path="res://addons/rokojori_action_library/Runtime/UI/Presets/Styles/Mod 100% Style.tres" id="3_qrr7u"] + +[resource] +script = ExtResource("1_80s54") +selector = ExtResource("2_blydg") +style = ExtResource("3_qrr7u") +metadata/_custom_type_script = "uid://bqypmtxqo5rnf" diff --git a/Runtime/UI/Presets/Rules/Hover Rule.tres b/Runtime/UI/Presets/Rules/Hover Rule.tres new file mode 100644 index 0000000..8c4b17d --- /dev/null +++ b/Runtime/UI/Presets/Rules/Hover Rule.tres @@ -0,0 +1,11 @@ +[gd_resource type="Resource" script_class="UIRule" load_steps=4 format=3 uid="uid://d15wkkwgtlh0n"] + +[ext_resource type="Script" uid="uid://8eihwfc2acp1" path="res://addons/rokojori_action_library/Runtime/UI/Styling/UIRule.cs" id="1_405us"] +[ext_resource type="Resource" uid="uid://cfctpa7mv11nj" path="res://addons/rokojori_action_library/Runtime/UI/Presets/Selectors/Hover Selector.tres" id="2_o7p03"] +[ext_resource type="Resource" uid="uid://cy7m6e0be3mqw" path="res://addons/rokojori_action_library/Runtime/UI/Presets/Styles/Mod 80% Style.tres" id="3_35xig"] + +[resource] +script = ExtResource("1_405us") +selector = ExtResource("2_o7p03") +style = ExtResource("3_35xig") +metadata/_custom_type_script = "uid://bqypmtxqo5rnf" diff --git a/Runtime/UI/Presets/Rules/Idle Rule.tres b/Runtime/UI/Presets/Rules/Idle Rule.tres new file mode 100644 index 0000000..8cb3ba5 --- /dev/null +++ b/Runtime/UI/Presets/Rules/Idle Rule.tres @@ -0,0 +1,9 @@ +[gd_resource type="Resource" script_class="UIRule" load_steps=3 format=3 uid="uid://30j7mqgncetr"] + +[ext_resource type="Script" uid="uid://8eihwfc2acp1" path="res://addons/rokojori_action_library/Runtime/UI/Styling/UIRule.cs" id="1_r8ebf"] +[ext_resource type="Resource" uid="uid://buoilu1x43rnx" path="res://addons/rokojori_action_library/Runtime/UI/Presets/Styles/Mod 65% Style.tres" id="2_3o1e1"] + +[resource] +script = ExtResource("1_r8ebf") +style = ExtResource("2_3o1e1") +metadata/_custom_type_script = "uid://bqypmtxqo5rnf" diff --git a/Runtime/UI/UI-Selectors/Presets/Active Selector.tres b/Runtime/UI/Presets/Selectors/Active Selector.tres similarity index 100% rename from Runtime/UI/UI-Selectors/Presets/Active Selector.tres rename to Runtime/UI/Presets/Selectors/Active Selector.tres diff --git a/Runtime/UI/UI-Selectors/Presets/Focus Selector.tres b/Runtime/UI/Presets/Selectors/Focus Selector.tres similarity index 100% rename from Runtime/UI/UI-Selectors/Presets/Focus Selector.tres rename to Runtime/UI/Presets/Selectors/Focus Selector.tres diff --git a/Runtime/UI/UI-Selectors/Presets/Hover Selector.tres b/Runtime/UI/Presets/Selectors/Hover Selector.tres similarity index 100% rename from Runtime/UI/UI-Selectors/Presets/Hover Selector.tres rename to Runtime/UI/Presets/Selectors/Hover Selector.tres diff --git a/Runtime/UI/UI-Selectors/Presets/Mod 100% Style.tres b/Runtime/UI/Presets/Styles/Mod 100% Style.tres similarity index 86% rename from Runtime/UI/UI-Selectors/Presets/Mod 100% Style.tres rename to Runtime/UI/Presets/Styles/Mod 100% Style.tres index 012b433..f767662 100644 --- a/Runtime/UI/UI-Selectors/Presets/Mod 100% Style.tres +++ b/Runtime/UI/Presets/Styles/Mod 100% Style.tres @@ -1,13 +1,13 @@ [gd_resource type="Resource" script_class="UIStyle" load_steps=4 format=3 uid="uid://brjq22uvnpxuv"] -[ext_resource type="Script" uid="uid://drqb0pm5ub64g" path="res://addons/rokojori_action_library/Runtime/UI/Styling/UIColor.cs" id="1_bdlk7"] -[ext_resource type="Script" uid="uid://chmcc71dvu4vj" path="res://addons/rokojori_action_library/Runtime/UI/Styling/UIStyle.cs" id="2_p68sf"] +[ext_resource type="Script" uid="uid://drqb0pm5ub64g" path="res://addons/rokojori_action_library/Runtime/UI/Styling/UIColor.cs" id="1_4h2q2"] +[ext_resource type="Script" uid="uid://chmcc71dvu4vj" path="res://addons/rokojori_action_library/Runtime/UI/Styling/UIStyle.cs" id="2_uob0o"] [sub_resource type="Resource" id="Resource_7s7su"] -script = ExtResource("1_bdlk7") +script = ExtResource("1_4h2q2") metadata/_custom_type_script = "uid://drqb0pm5ub64g" [resource] -script = ExtResource("2_p68sf") +script = ExtResource("2_uob0o") modulationColor = SubResource("Resource_7s7su") metadata/_custom_type_script = "uid://chmcc71dvu4vj" diff --git a/Runtime/UI/Presets/Styles/Mod 65% Style.tres b/Runtime/UI/Presets/Styles/Mod 65% Style.tres new file mode 100644 index 0000000..fed827f --- /dev/null +++ b/Runtime/UI/Presets/Styles/Mod 65% Style.tres @@ -0,0 +1,14 @@ +[gd_resource type="Resource" script_class="UIStyle" load_steps=4 format=3 uid="uid://buoilu1x43rnx"] + +[ext_resource type="Script" uid="uid://drqb0pm5ub64g" path="res://addons/rokojori_action_library/Runtime/UI/Styling/UIColor.cs" id="1_26sog"] +[ext_resource type="Script" uid="uid://chmcc71dvu4vj" path="res://addons/rokojori_action_library/Runtime/UI/Styling/UIStyle.cs" id="2_tgj76"] + +[sub_resource type="Resource" id="Resource_nam1h"] +script = ExtResource("1_26sog") +color = Color(1, 1, 1, 0.7019608) +metadata/_custom_type_script = "uid://drqb0pm5ub64g" + +[resource] +script = ExtResource("2_tgj76") +modulationColor = SubResource("Resource_nam1h") +metadata/_custom_type_script = "uid://chmcc71dvu4vj" diff --git a/Runtime/UI/UI-Selectors/Presets/Mod 80% Style.tres b/Runtime/UI/Presets/Styles/Mod 80% Style.tres similarity index 86% rename from Runtime/UI/UI-Selectors/Presets/Mod 80% Style.tres rename to Runtime/UI/Presets/Styles/Mod 80% Style.tres index 0b03ac5..4824395 100644 --- a/Runtime/UI/UI-Selectors/Presets/Mod 80% Style.tres +++ b/Runtime/UI/Presets/Styles/Mod 80% Style.tres @@ -1,14 +1,14 @@ [gd_resource type="Resource" script_class="UIStyle" load_steps=4 format=3 uid="uid://cy7m6e0be3mqw"] -[ext_resource type="Script" uid="uid://drqb0pm5ub64g" path="res://addons/rokojori_action_library/Runtime/UI/Styling/UIColor.cs" id="1_5k4i7"] -[ext_resource type="Script" uid="uid://chmcc71dvu4vj" path="res://addons/rokojori_action_library/Runtime/UI/Styling/UIStyle.cs" id="2_qkfun"] +[ext_resource type="Script" uid="uid://drqb0pm5ub64g" path="res://addons/rokojori_action_library/Runtime/UI/Styling/UIColor.cs" id="1_0vahf"] +[ext_resource type="Script" uid="uid://chmcc71dvu4vj" path="res://addons/rokojori_action_library/Runtime/UI/Styling/UIStyle.cs" id="2_rh1lc"] [sub_resource type="Resource" id="Resource_wxaam"] -script = ExtResource("1_5k4i7") +script = ExtResource("1_0vahf") color = Color(1, 1, 1, 0.80784315) metadata/_custom_type_script = "uid://drqb0pm5ub64g" [resource] -script = ExtResource("2_qkfun") +script = ExtResource("2_rh1lc") modulationColor = SubResource("Resource_wxaam") metadata/_custom_type_script = "uid://chmcc71dvu4vj" diff --git a/Runtime/UI/Styling/UINumber.cs b/Runtime/UI/Styling/UINumber.cs index b748582..df371f6 100644 --- a/Runtime/UI/Styling/UINumber.cs +++ b/Runtime/UI/Styling/UINumber.cs @@ -690,7 +690,7 @@ namespace Rokojori return false; } - var lexer = new CSharpLexer(); + var lexer = new CSLexer(); var list = lexer.LexToList( expressionText ); diff --git a/Runtime/UI/Styling/UISelectorStyle.cs b/Runtime/UI/Styling/UIRule.cs similarity index 62% rename from Runtime/UI/Styling/UISelectorStyle.cs rename to Runtime/UI/Styling/UIRule.cs index 78f8ecc..e616db9 100644 --- a/Runtime/UI/Styling/UISelectorStyle.cs +++ b/Runtime/UI/Styling/UIRule.cs @@ -7,8 +7,8 @@ namespace Rokojori { [Tool] - [GlobalClass] - public partial class UISelectorStyle:Resource + [GlobalClass,Icon("res://addons/rokojori_action_library/Icons/UIRule.svg")] + public partial class UIRule:Resource { [Export] public UISelector selector; diff --git a/Runtime/UI/Styling/UIRule.cs.uid b/Runtime/UI/Styling/UIRule.cs.uid new file mode 100644 index 0000000..5342e39 --- /dev/null +++ b/Runtime/UI/Styling/UIRule.cs.uid @@ -0,0 +1 @@ +uid://8eihwfc2acp1 diff --git a/Runtime/UI/Styling/UISelector.cs b/Runtime/UI/Styling/UISelector.cs index c4803de..06423e5 100644 --- a/Runtime/UI/Styling/UISelector.cs +++ b/Runtime/UI/Styling/UISelector.cs @@ -8,7 +8,7 @@ namespace Rokojori { [Tool] - [GlobalClass] + [GlobalClass,Icon("res://addons/rokojori_action_library/Icons/UISelector.svg")] public partial class UISelector:Resource { public enum Value @@ -46,9 +46,25 @@ namespace Rokojori return true; } + var containsFlag = container.GetUISelectorFlags().Contains( flag ); + var needsFlag = ( Value.True == value ); + + // if ( container.HasDebugFlag() ) + // { + // this.LogInfo( + // "Checking for flag", + // "container:", container, + // "value:",value, + // "flag:", flag, + // "containsFlag:", containsFlag, + // "needsFlag:", needsFlag + // ); + // } + + if ( Value.True == value || Value.False == value ) { - return container.GetUISelectorFlags().Contains( flag ) == ( Value.True == value ); + return containsFlag == needsFlag; } // if ( Value.True_For_Any_Parent == value || Value.False_For_All_Parents == value ) @@ -63,39 +79,93 @@ namespace Rokojori public bool Selects( UIStylePropertyContainer container ) { + // if ( container.HasDebugFlag() ) + // { + // this.LogInfo( + + // "Context:", context, + + // "Hover:", hover, container.GetUISelectorFlags().Contains( UISelectorFlag.Hover ), + // "Dragging:", dragging, container.GetUISelectorFlags().Contains( UISelectorFlag.Dragging ), + // "Scrolling:", scrolling, container.GetUISelectorFlags().Contains( UISelectorFlag.Scrolling ), + // "Focus:", focus, container.GetUISelectorFlags().Contains( UISelectorFlag.Focus ), + // "Active:", active, container.GetUISelectorFlags().Contains( UISelectorFlag.Active ) + // ); + // } + if ( ! Matches( container, hover, UISelectorFlag.Hover ) ) { + // if ( container.HasDebugFlag() ) + // { + // this.LogInfo( context, "Hover not matching" ); + // } + return false; } if ( ! Matches( container, dragging, UISelectorFlag.Dragging ) ) { + // if ( container.HasDebugFlag() ) + // { + // this.LogInfo( context,"Dragging not matching" ); + // } return false; } if ( ! Matches( container, scrolling, UISelectorFlag.Scrolling ) ) { + // if ( container.HasDebugFlag() ) + // { + // this.LogInfo( context, "Scrolling not matching" ); + // } return false; } if ( ! Matches( container, focus, UISelectorFlag.Focus ) ) { + // if ( container.HasDebugFlag() ) + // { + // this.LogInfo( context, "Focus not matching" ); + // } return false; } + if ( ! Matches( container, active, UISelectorFlag.Active ) ) { + // if ( container.HasDebugFlag() ) + // { + // this.LogInfo( context, "Active not matching" ); + // } return false; } + if ( selectors == null || selectors.Length == 0 ) + { + // if ( container.HasDebugFlag() ) + // { + // this.LogInfo( context, "No selectors, everthing matched" ); + // } + return true; + } + foreach ( var entry in selectors ) { - if ( ! Matches( container, entry.value, entry.selectorFlag ) ) + if ( entry == null || ! Matches( container, entry.value, entry.selectorFlag ) ) { + // if ( container.HasDebugFlag() ) + // { + // this.LogInfo( context, "flag selector not matching", entry.value, entry.selectorFlag ); + // } + return false; } } + // if ( container.HasDebugFlag() ) + // { + // this.LogInfo( context, "Flag Selectors matched" ); + // } return true; } diff --git a/Runtime/UI/Styling/UISelectorStyle.cs.uid b/Runtime/UI/Styling/UISelectorStyle.cs.uid deleted file mode 100644 index 5b85974..0000000 --- a/Runtime/UI/Styling/UISelectorStyle.cs.uid +++ /dev/null @@ -1 +0,0 @@ -uid://bqypmtxqo5rnf diff --git a/Runtime/UI/Styling/UIStyle.cs b/Runtime/UI/Styling/UIStyle.cs index bf8e515..f32bb38 100644 --- a/Runtime/UI/Styling/UIStyle.cs +++ b/Runtime/UI/Styling/UIStyle.cs @@ -9,9 +9,17 @@ namespace Rokojori { [Tool] - [GlobalClass] + [GlobalClass,Icon("res://addons/rokojori_action_library/Icons/UIStyle.svg")] public partial class UIStyle:Resource, UIStylePropertyContainer { + [Export] + public bool activateDebugging = false; + + public bool HasDebugFlag() + { + return activateDebugging; + } + [ExportGroup( "Layout" )] [Export] public UILayout layout; @@ -201,11 +209,15 @@ namespace Rokojori public UICursor hoverCursor; - [ExportGroup( "Selectors & Parent " )] - + [ExportGroup( "Rules" )] [Export] - public UISelectorStyle[] selectorStyles = []; + public UIRuleSet[] ruleSets = []; + [Export] + public UIRule[] rules = []; + + + [ExportGroup( "Parent" )] [Export] public UIStyle parentStyle; @@ -216,16 +228,39 @@ namespace Rokojori public UICursor GetHoverCursor( UIStylePropertyContainer container ) { - for ( int i = 0; i < selectorStyles.Length; i++ ) + var uiCursor = GetHoverCursor( rules, container ); + + if ( uiCursor != null ) { - if ( selectorStyles[ i ] == null || selectorStyles[ i ].style == null ) + return uiCursor; + } + + for ( int j =0; j < ruleSets.Length; j++ ) + { + uiCursor = GetHoverCursor( ruleSets[ j ].rules, container ); + + if ( uiCursor != null ) + { + return uiCursor; + } + + } + + return hoverCursor; + } + + public UICursor GetHoverCursor( UIRule[] rules, UIStylePropertyContainer container ) + { + for ( int i = 0; i < rules.Length; i++ ) + { + if ( rules[ i ] == null || rules[ i ].style == null ) { continue; } - if ( selectorStyles[ i ].selector == null || selectorStyles[ i ].selector.Selects( container ) ) + if ( rules[ i ].selector == null || rules[ i ].selector.Selects( container ) ) { - var uiCursor = selectorStyles[ i ].style.GetHoverCursor( container ); + var uiCursor = rules[ i ].style.GetHoverCursor( container ); if ( uiCursor != null ) { @@ -234,7 +269,7 @@ namespace Rokojori } } - return hoverCursor; + return null; } @@ -296,16 +331,38 @@ namespace Rokojori public UINumber GetUIStyleNumberProperty( UIStyleNumberProperty property, string shaderPropertyName, UIStylePropertyContainer source ) { - for ( int i = 0; i < selectorStyles.Length; i++ ) + var uiNumber = GetUIStyleNumberProperty( rules, property, shaderPropertyName, source ); + + if ( uiNumber != null ) { - if ( selectorStyles[ i ] == null || selectorStyles[ i ].style == null ) + return uiNumber; + } + + for ( int i = 0; i < ruleSets.Length; i++ ) + { + uiNumber = GetUIStyleNumberProperty( ruleSets[ i ].rules, property, shaderPropertyName, source ); + + if ( uiNumber != null ) + { + return uiNumber; + } + } + + return GetUIStyleNumberProperty( property, shaderPropertyName ); + } + + public UINumber GetUIStyleNumberProperty( UIRule[] rules, UIStyleNumberProperty property, string shaderPropertyName, UIStylePropertyContainer source ) + { + for ( int i = 0; i < rules.Length; i++ ) + { + if ( rules[ i ] == null || rules[ i ].style == null ) { continue; } - if ( selectorStyles[ i ].selector == null || selectorStyles[ i ].selector.Selects( source ) ) + if ( rules[ i ].selector == null || rules[ i ].selector.Selects( source ) ) { - var selectedProperty = selectorStyles[ i ].style.GetUIStyleNumberProperty( property, shaderPropertyName ); + var selectedProperty = rules[ i ].style.GetUIStyleNumberProperty( property, shaderPropertyName ); if ( selectedProperty != null ) { @@ -314,7 +371,7 @@ namespace Rokojori } } - return GetUIStyleNumberProperty( property, shaderPropertyName ); + return null; } public UINumber GetUIStyleNumberProperty( UIStyleNumberProperty property, string shaderPropertyName ) @@ -445,17 +502,62 @@ namespace Rokojori public UIColor GetUIStyleColorProperty( UIStyleColorProperty property, string shaderPropertyName, UIStylePropertyContainer source ) { + var uiColor = UIColorFromRules( rules, property, shaderPropertyName, source ); - for ( int i = 0; i < selectorStyles.Length; i++ ) + if ( uiColor != null ) { - if ( selectorStyles[ i ] == null || selectorStyles[ i ].style == null ) + return uiColor; + } + + foreach ( var r in ruleSets ) + { + if ( r.rules == null ) { continue; } - if ( selectorStyles[ i ].selector == null || selectorStyles[ i ].selector.Selects( source ) ) + uiColor = UIColorFromRules( r.rules, property, shaderPropertyName, source ); + + if ( uiColor != null ) { - var selectedProperty = selectorStyles[ i ].style.GetUIStyleColorProperty( property, shaderPropertyName ); + return uiColor; + } + } + + + // for ( int i = 0; i < rules.Length; i++ ) + // { + // if ( rules[ i ] == null || rules[ i ].style == null ) + // { + // continue; + // } + + // if ( rules[ i ].selector == null || rules[ i ].selector.Selects( source, "color " + property ) ) + // { + // var selectedProperty = rules[ i ].style.GetUIStyleColorProperty( property, shaderPropertyName ); + + // if ( selectedProperty != null ) + // { + // return selectedProperty; + // } + // } + // } + + return GetUIStyleColorProperty( property, shaderPropertyName ); + } + + UIColor UIColorFromRules( UIRule[] rules, UIStyleColorProperty property, string shaderPropertyName, UIStylePropertyContainer source ) + { + for ( int i = 0; i < rules.Length; i++ ) + { + if ( rules[ i ] == null || rules[ i ].style == null ) + { + continue; + } + + if ( rules[ i ].selector == null || rules[ i ].selector.Selects( source ) ) + { + var selectedProperty = rules[ i ].style.GetUIStyleColorProperty( property, shaderPropertyName ); if ( selectedProperty != null ) { @@ -464,7 +566,7 @@ namespace Rokojori } } - return GetUIStyleColorProperty( property, shaderPropertyName ); + return null; } public UIColor GetUIStyleColorProperty( UIStyleColorProperty property, string shaderPropertyName ) diff --git a/Runtime/UI/Styling/UIStylePropertyContainer.cs b/Runtime/UI/Styling/UIStylePropertyContainer.cs index 53541b0..46425b5 100644 --- a/Runtime/UI/Styling/UIStylePropertyContainer.cs +++ b/Runtime/UI/Styling/UIStylePropertyContainer.cs @@ -7,6 +7,8 @@ namespace Rokojori { public interface UIStylePropertyContainer { + bool HasDebugFlag(); + UIStyle GetUIStyleParent(); void SetUIStyleParent( UIStyle uiStyle ); diff --git a/Runtime/UI/UI-Selectors/Presets/Active 100% Selector Style.tres b/Runtime/UI/UI-Selectors/Presets/Active 100% Selector Style.tres deleted file mode 100644 index 7152b35..0000000 --- a/Runtime/UI/UI-Selectors/Presets/Active 100% Selector Style.tres +++ /dev/null @@ -1,11 +0,0 @@ -[gd_resource type="Resource" script_class="UISelectorStyle" load_steps=4 format=3 uid="uid://cxq4cfdnk7c25"] - -[ext_resource type="Script" uid="uid://bqypmtxqo5rnf" path="res://addons/rokojori_action_library/Runtime/UI/Styling/UISelectorStyle.cs" id="1_ytj2f"] -[ext_resource type="Resource" uid="uid://do3q5tipotyn3" path="res://addons/rokojori_action_library/Runtime/UI/UI-Selectors/Presets/Active Selector.tres" id="2_r7shh"] -[ext_resource type="Resource" uid="uid://brjq22uvnpxuv" path="res://addons/rokojori_action_library/Runtime/UI/UI-Selectors/Presets/Mod 100% Style.tres" id="3_x1wpc"] - -[resource] -script = ExtResource("1_ytj2f") -selector = ExtResource("2_r7shh") -style = ExtResource("3_x1wpc") -metadata/_custom_type_script = "uid://bqypmtxqo5rnf" diff --git a/Runtime/UI/UI-Selectors/Presets/Focus 100% Selector Style.tres b/Runtime/UI/UI-Selectors/Presets/Focus 100% Selector Style.tres deleted file mode 100644 index 5b42c62..0000000 --- a/Runtime/UI/UI-Selectors/Presets/Focus 100% Selector Style.tres +++ /dev/null @@ -1,11 +0,0 @@ -[gd_resource type="Resource" script_class="UISelectorStyle" load_steps=4 format=3 uid="uid://cvc0wabrro18q"] - -[ext_resource type="Script" uid="uid://bqypmtxqo5rnf" path="res://addons/rokojori_action_library/Runtime/UI/Styling/UISelectorStyle.cs" id="1_2joc3"] -[ext_resource type="Resource" uid="uid://dgx4ue1pvvltj" path="res://addons/rokojori_action_library/Runtime/UI/UI-Selectors/Presets/Focus Selector.tres" id="2_351ev"] -[ext_resource type="Resource" uid="uid://brjq22uvnpxuv" path="res://addons/rokojori_action_library/Runtime/UI/UI-Selectors/Presets/Mod 100% Style.tres" id="3_46vc8"] - -[resource] -script = ExtResource("1_2joc3") -selector = ExtResource("2_351ev") -style = ExtResource("3_46vc8") -metadata/_custom_type_script = "uid://bqypmtxqo5rnf" diff --git a/Runtime/UI/UI-Selectors/Presets/Hover 80% Selector Style.tres b/Runtime/UI/UI-Selectors/Presets/Hover 80% Selector Style.tres deleted file mode 100644 index ba36786..0000000 --- a/Runtime/UI/UI-Selectors/Presets/Hover 80% Selector Style.tres +++ /dev/null @@ -1,11 +0,0 @@ -[gd_resource type="Resource" script_class="UISelectorStyle" load_steps=4 format=3 uid="uid://d15wkkwgtlh0n"] - -[ext_resource type="Script" uid="uid://bqypmtxqo5rnf" path="res://addons/rokojori_action_library/Runtime/UI/Styling/UISelectorStyle.cs" id="1_a0wuj"] -[ext_resource type="Resource" uid="uid://cfctpa7mv11nj" path="res://addons/rokojori_action_library/Runtime/UI/UI-Selectors/Presets/Hover Selector.tres" id="2_dm1hb"] -[ext_resource type="Resource" uid="uid://cy7m6e0be3mqw" path="res://addons/rokojori_action_library/Runtime/UI/UI-Selectors/Presets/Mod 80% Style.tres" id="3_e4mab"] - -[resource] -script = ExtResource("1_a0wuj") -selector = ExtResource("2_dm1hb") -style = ExtResource("3_e4mab") -metadata/_custom_type_script = "uid://bqypmtxqo5rnf" diff --git a/Runtime/UI/UI.cs b/Runtime/UI/UI.cs index ab3dad0..e24d927 100644 --- a/Runtime/UI/UI.cs +++ b/Runtime/UI/UI.cs @@ -137,6 +137,18 @@ namespace Rokojori [Export] public Vector2 uiSize = Vector2.Zero; + + [ExportGroup("Actions")] + + [Export] + public Action onVisible; + + [Export] + public Action onInvisible; + + [Export] + public Action onVisibilityChanged; + [ExportGroup("Functions")] [ExportToolButton( "Mouse:Stop => Pass")] @@ -429,6 +441,22 @@ namespace Rokojori } UpdateUIInputs(); + + VisibilityChanged += ()=> + { + var visible = IsVisibleInTree(); + + if ( visible ) + { + onVisible?.Trigger(); + } + else + { + onInvisible?.Trigger(); + } + + onVisibilityChanged?.Trigger(); + }; } void UpdateUIInputs() @@ -661,13 +689,54 @@ namespace Rokojori player.Playing = true; } - - // public void Focus( Control control ) - // { - // var focusParent = - // while ( control ) - // } + public enum FocusOrderType + { + Vertical_List, + Horizontal_List, + Vertical_List_Wrapped, + Horizontal_List_Wrapped + } + + public static void SetChildFocusOrder( Node node, FocusOrderType type, List controls = null, FocusModeEnum focuseMode = FocusModeEnum.All ) + { + controls = controls ?? node.GetDirectChildren(); + + if ( FocusOrderType.Vertical_List == type || + FocusOrderType.Horizontal_List == type || + FocusOrderType.Vertical_List_Wrapped == type || + FocusOrderType.Horizontal_List_Wrapped == type + ) + { + var isHorizontal = FocusOrderType.Horizontal_List == type || FocusOrderType.Horizontal_List_Wrapped == type; + var wrap = FocusOrderType.Vertical_List_Wrapped == type || FocusOrderType.Horizontal_List_Wrapped == type; + + + for ( int i = 0; i < controls.Count; i++ ) + { + controls[ i ].FocusMode = focuseMode; + + var previousIndex = wrap ? MathX.Repeat( i - 1, controls.Count ) : Mathf.Clamp( i - 1, 0, controls.Count - 1 ); + var nextIndex = wrap ? MathX.Repeat( i + 1, controls.Count ) : Mathf.Clamp( i + 1, 0, controls.Count - 1 ); + + if ( isHorizontal ) + { + controls[ i ].FocusNeighborLeft = controls[ i ].GetPathTo( controls[ previousIndex ] ); + controls[ i ].FocusNeighborRight = controls[ i ].GetPathTo( controls[ nextIndex ] ); + controls[ i ].FocusNeighborTop = controls[ i ].GetPathTo( controls[ i ] ); + controls[ i ].FocusNeighborBottom = controls[ i ].GetPathTo( controls[ i ] ); + } + else + { + controls[ i ].FocusNeighborTop = controls[ i ].GetPathTo( controls[ previousIndex ] ); + controls[ i ].FocusNeighborBottom = controls[ i ].GetPathTo( controls[ nextIndex ] ); + controls[ i ].FocusNeighborLeft = controls[ i ].GetPathTo( controls[ i ] ); + controls[ i ].FocusNeighborRight = controls[ i ].GetPathTo( controls[ i ] ); + } + } + } + + } } } \ No newline at end of file diff --git a/Runtime/UI/UIAppSettings/CategoryPages/MinimalisticCategoryPagesGenerator.cs b/Runtime/UI/UIAppSettings/CategoryPages/MinimalisticCategoryPagesGenerator.cs index 9f4a7f6..50ef9c9 100644 --- a/Runtime/UI/UIAppSettings/CategoryPages/MinimalisticCategoryPagesGenerator.cs +++ b/Runtime/UI/UIAppSettings/CategoryPages/MinimalisticCategoryPagesGenerator.cs @@ -66,10 +66,12 @@ public partial class MinimalisticCategoryPagesGenerator:UIAppSettingsCategoryPag var scrollArea = page.CreateChild( "Scroll Area" ); scrollArea.parentStyle = scrollAreaStyle; + var focusControls = new List(); + category.settings.ForEach( ( setting )=> { - + var name = "- " + setting.title.currentValue; UIAppSettingHandler handler = null; @@ -98,12 +100,23 @@ public partial class MinimalisticCategoryPagesGenerator:UIAppSettingsCategoryPag label.locale = setting.title; label.parentStyle = appSettingLabelStyle; + Control focusControl = null; if ( setting is NumberAppSetting ) { var numberHandler = (UINumberAppSettingHandler) handler; - var numberController = handler.CreateChild( appSettingNumberController, "Number Handler" ); + var numberController = handler.CreateChild( appSettingNumberController, name + " Number Handler" ); numberHandler.slider = numberController.Get(); - numberHandler.slider.setActiveWhenFocused = [ handler ]; + numberHandler.slider.setActiveWhenFocused = [ handler, handlerBG, label, labelRegion ]; + + var setFocusedAction = handler.CreateChild( "Set Focused UI Setting" ); + numberHandler.slider.onFocusEntered = setFocusedAction; + + setFocusedAction.uiAppSettings = uiAppSettings; + setFocusedAction.appSettingHandler = numberHandler; + + focusControl = numberHandler.slider; + // focusControls.Add( numberHandler.slider ); + // handler.focusControl = numberHandler.slider; } @@ -112,11 +125,50 @@ public partial class MinimalisticCategoryPagesGenerator:UIAppSettingsCategoryPag var listHandler = (UIListAppSettingHandler) handler; var listController = handler.CreateChild( appSettingNumberController, "List Handler" ); listHandler.list = listController.Get(); - listHandler.list.setActiveWhenFocused = [ handler ]; + listHandler.list.setActiveWhenFocused = [ handler, handlerBG, label, labelRegion ]; + + var setFocusedAction = listHandler.list.CreateChild( "Set Focused UI Setting" ); + listHandler.list.onFocusEntered = setFocusedAction; + + setFocusedAction.uiAppSettings = uiAppSettings; + setFocusedAction.appSettingHandler = listHandler; + + focusControl = listHandler.list; + // focusControls.Add( listHandler.list ); + // handler.focusControl = listHandler.list; } + + focusControls.Add( focusControl ); + + handler.ForEach( + ( c )=> + { + if ( c == focusControl ) + { + return; + } + + if ( c is UIRegion r ) + { + r.focusControl = focusControl; + } + + if ( c is UIImage i ) + { + i.focusControl = focusControl; + } + + if ( c is UIText t ) + { + t.focusControl = focusControl; + } + } + ); } ); + UI.SetChildFocusOrder( page, UI.FocusOrderType.Vertical_List, focusControls, Control.FocusModeEnum.Click ); + var slider = page.CreateChild( "Scroll Area Slider" ); slider.scrollArea = scrollArea; slider.scrollContainer = page; diff --git a/Runtime/UI/UIAppSettings/Handlers/Presets/List Controller.tscn b/Runtime/UI/UIAppSettings/Handlers/Presets/List Controller.tscn index caca557..5f72c01 100644 --- a/Runtime/UI/UIAppSettings/Handlers/Presets/List Controller.tscn +++ b/Runtime/UI/UIAppSettings/Handlers/Presets/List Controller.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=19 format=3 uid="uid://blvco0pityhm1"] +[gd_scene load_steps=18 format=3 uid="uid://blvco0pityhm1"] [ext_resource type="Script" uid="uid://c2hicupu28nbi" path="res://addons/rokojori_action_library/Runtime/UI/Nodes/UIRegion.cs" id="1_1w55f"] [ext_resource type="Script" uid="uid://cnkyynboxg1qg" path="res://addons/rokojori_action_library/Runtime/UI/Styling/UINumber.cs" id="2_xupgh"] @@ -7,7 +7,6 @@ [ext_resource type="Script" uid="uid://chmcc71dvu4vj" path="res://addons/rokojori_action_library/Runtime/UI/Styling/UIStyle.cs" id="5_v6jyw"] [ext_resource type="Script" uid="uid://b50yldymrhply" path="res://addons/rokojori_action_library/Runtime/UI/Nodes/Selections/ListSelection/ChangeUIListSelection.cs" id="6_28vtr"] [ext_resource type="Script" uid="uid://2ftd0bt6rrgo" path="res://addons/rokojori_action_library/Runtime/UI/Nodes/Selections/ListSelection/UIListSelection.cs" id="7_4f0b5"] -[ext_resource type="Script" uid="uid://b4yjsis2fh64c" path="res://addons/rokojori_action_library/Runtime/Actions/ActionList.cs" id="8_001d7"] [sub_resource type="Resource" id="Resource_7e4fb"] script = ExtResource("2_xupgh") @@ -15,7 +14,7 @@ value = 2.0 unit = "em" metadata/_custom_type_script = "uid://cnkyynboxg1qg" -[sub_resource type="LabelSettings" id="LabelSettings_qiba2"] +[sub_resource type="LabelSettings" id="LabelSettings_ksam2"] [sub_resource type="Resource" id="Resource_o8r6f"] script = ExtResource("4_nso1f") @@ -32,7 +31,7 @@ value = 25.0 unit = "em" metadata/_custom_type_script = "uid://cnkyynboxg1qg" -[sub_resource type="LabelSettings" id="LabelSettings_eoac7"] +[sub_resource type="LabelSettings" id="LabelSettings_001d7"] [sub_resource type="Resource" id="Resource_ewl2f"] script = ExtResource("4_nso1f") @@ -44,7 +43,7 @@ script = ExtResource("4_nso1f") en = "Other Value" metadata/_custom_type_script = "uid://bvj322mokkq63" -[sub_resource type="LabelSettings" id="LabelSettings_iajf2"] +[sub_resource type="LabelSettings" id="LabelSettings_qiba2"] [sub_resource type="Resource" id="Resource_jgo2j"] script = ExtResource("4_nso1f") @@ -79,11 +78,11 @@ offset_right = 17.02 offset_bottom = 17.0 pivot_offset = Vector2(5.5, 8.5) mouse_filter = 1 -label_settings = SubResource("LabelSettings_qiba2") +label_settings = SubResource("LabelSettings_ksam2") script = ExtResource("3_emuhf") locale = SubResource("Resource_o8r6f") -parentStyle = SubResource("Resource_4wsps") handleMouseEvents = true +parentStyle = SubResource("Resource_4wsps") [node name="ChangeUIListSelection" type="Node" parent="UIRegion2" node_paths=PackedStringArray("selection")] script = ExtResource("6_28vtr") @@ -109,13 +108,13 @@ offset_left = 97.48001 offset_right = 167.48001 offset_bottom = 17.0 pivot_offset = Vector2(35, 8.5) -label_settings = SubResource("LabelSettings_eoac7") +label_settings = SubResource("LabelSettings_001d7") script = ExtResource("7_4f0b5") values = [SubResource("Resource_ewl2f"), SubResource("Resource_swro7")] locale = SubResource("Resource_swro7") +onFocusEntered = NodePath("") +onFocusExited = NodePath("") parentStyle = SubResource("Resource_4wsps") -onFocusEntered = NodePath("../../On Focus Entered") -onFocusExited = NodePath("../../On Focus Exited") metadata/_custom_type_script = "uid://2ftd0bt6rrgo" [node name="UIRegion4" type="Control" parent="."] @@ -136,11 +135,11 @@ offset_right = 17.02 offset_bottom = 17.0 pivot_offset = Vector2(5.5, 8.5) mouse_filter = 1 -label_settings = SubResource("LabelSettings_iajf2") +label_settings = SubResource("LabelSettings_qiba2") script = ExtResource("3_emuhf") locale = SubResource("Resource_jgo2j") -parentStyle = SubResource("Resource_4wsps") handleMouseEvents = true +parentStyle = SubResource("Resource_4wsps") [node name="ChangeUIListSelection2" type="Node" parent="UIRegion4" node_paths=PackedStringArray("selection")] script = ExtResource("6_28vtr") @@ -148,11 +147,3 @@ selection = NodePath("../../UIRegion/UIListSelection") mode = 1 value = 1 metadata/_custom_type_script = "uid://b50yldymrhply" - -[node name="On Focus Entered" type="Node" parent="."] -script = ExtResource("8_001d7") -metadata/_custom_type_script = "uid://b4yjsis2fh64c" - -[node name="On Focus Exited" type="Node" parent="."] -script = ExtResource("8_001d7") -metadata/_custom_type_script = "uid://b4yjsis2fh64c" diff --git a/Runtime/UI/UIAppSettings/Handlers/Presets/Number Controller.tscn b/Runtime/UI/UIAppSettings/Handlers/Presets/Number Controller.tscn index 3b67bda..ab294fc 100644 --- a/Runtime/UI/UIAppSettings/Handlers/Presets/Number Controller.tscn +++ b/Runtime/UI/UIAppSettings/Handlers/Presets/Number Controller.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=39 format=3 uid="uid://58yaanrblnvj"] +[gd_scene load_steps=38 format=3 uid="uid://58yaanrblnvj"] [ext_resource type="Script" uid="uid://c2hicupu28nbi" path="res://addons/rokojori_action_library/Runtime/UI/Nodes/UIRegion.cs" id="1_ucjfr"] [ext_resource type="Script" uid="uid://1pymvcckklic" path="res://addons/rokojori_action_library/Runtime/UI/Shaders/Slider/SliderMaterial.cs" id="2_rckb5"] @@ -14,9 +14,8 @@ [ext_resource type="Script" uid="uid://bvj322mokkq63" path="res://addons/rokojori_action_library/Runtime/Localization/LocaleText.cs" id="11_dmue3"] [ext_resource type="Script" uid="uid://cdsqunj017b7y" path="res://addons/rokojori_action_library/Runtime/UI/Styling/UICursor.cs" id="11_gdfkg"] [ext_resource type="Script" uid="uid://chmcc71dvu4vj" path="res://addons/rokojori_action_library/Runtime/UI/Styling/UIStyle.cs" id="12_obxtq"] -[ext_resource type="Script" uid="uid://b4yjsis2fh64c" path="res://addons/rokojori_action_library/Runtime/Actions/ActionList.cs" id="15_v3vxy"] -[sub_resource type="ShaderMaterial" id="ShaderMaterial_op7xn"] +[sub_resource type="ShaderMaterial" id="ShaderMaterial_7abrn"] shader = ExtResource("3_ca53k") shader_parameter/opacity = 1.0 shader_parameter/blendLinear = false @@ -44,28 +43,29 @@ shader_parameter/sliderStrokeColor = Color(0, 0, 0, 1) shader_parameter/sliderStrokeSize = 2.0 script = ExtResource("2_rckb5") -[sub_resource type="Resource" id="Resource_ebf7l"] +[sub_resource type="Resource" id="Resource_vh1c2"] script = ExtResource("6_1gbfa") max = 100.0 metadata/_custom_type_script = "uid://bsonpc71ochpe" -[sub_resource type="Resource" id="Resource_gdfkg"] +[sub_resource type="Resource" id="Resource_v3vxy"] +resource_local_to_scene = true script = ExtResource("7_pjx5d") frames = 20.0 metadata/_custom_type_script = "uid://lhuuedx87rem" -[sub_resource type="Resource" id="Resource_pv02u"] +[sub_resource type="Resource" id="Resource_7e4fb"] script = ExtResource("7_sr7fn") value = 1.0 unit = "em" metadata/_custom_type_script = "uid://cnkyynboxg1qg" -[sub_resource type="Resource" id="Resource_412gp"] +[sub_resource type="Resource" id="Resource_o8r6f"] script = ExtResource("8_74lu0") color = Color(0.3090081, 0.3473884, 0.40495878, 1) metadata/_custom_type_script = "uid://drqb0pm5ub64g" -[sub_resource type="Resource" id="Resource_pp0bs"] +[sub_resource type="Resource" id="Resource_73e3n"] script = ExtResource("7_sr7fn") value = 0.334 unit = "em" @@ -75,25 +75,25 @@ metadata/_custom_type_script = "uid://cnkyynboxg1qg" script = ExtResource("8_74lu0") metadata/_custom_type_script = "uid://drqb0pm5ub64g" -[sub_resource type="Resource" id="Resource_ubijs"] +[sub_resource type="Resource" id="Resource_t0qj0"] script = ExtResource("7_sr7fn") value = 0.598 unit = "em" metadata/_custom_type_script = "uid://cnkyynboxg1qg" -[sub_resource type="Resource" id="Resource_dq7d0"] +[sub_resource type="Resource" id="Resource_tl71m"] script = ExtResource("7_sr7fn") value = 1.2525 unit = "em" metadata/_custom_type_script = "uid://cnkyynboxg1qg" -[sub_resource type="Resource" id="Resource_tdk3c"] +[sub_resource type="Resource" id="Resource_y37jp"] script = ExtResource("7_sr7fn") value = 0.6355 unit = "em" metadata/_custom_type_script = "uid://cnkyynboxg1qg" -[sub_resource type="Resource" id="Resource_p7jqt"] +[sub_resource type="Resource" id="Resource_7e1wh"] script = ExtResource("8_74lu0") color = Color(1, 1, 1, 0) metadata/_custom_type_script = "uid://drqb0pm5ub64g" @@ -103,64 +103,64 @@ script = ExtResource("8_74lu0") color = Color(1, 1, 1, 0) metadata/_custom_type_script = "uid://drqb0pm5ub64g" -[sub_resource type="Resource" id="Resource_q8n2a"] +[sub_resource type="Resource" id="Resource_n64ds"] script = ExtResource("7_sr7fn") unit = "em" metadata/_custom_type_script = "uid://cnkyynboxg1qg" -[sub_resource type="Resource" id="Resource_loqre"] +[sub_resource type="Resource" id="Resource_oxa7j"] script = ExtResource("9_jpqb0") -fillColor = SubResource("Resource_412gp") +fillColor = SubResource("Resource_o8r6f") strokeColor = SubResource("Resource_ioimv") -borderRadius = SubResource("Resource_pv02u") -strokeSize = SubResource("Resource_q8n2a") -sliderSizeX = SubResource("Resource_dq7d0") -sliderSizeY = SubResource("Resource_tdk3c") -sliderSizeMarginX = SubResource("Resource_ubijs") -sliderBorderRadius = SubResource("Resource_pp0bs") +borderRadius = SubResource("Resource_7e4fb") +strokeSize = SubResource("Resource_n64ds") +sliderSizeX = SubResource("Resource_tl71m") +sliderSizeY = SubResource("Resource_y37jp") +sliderSizeMarginX = SubResource("Resource_t0qj0") +sliderBorderRadius = SubResource("Resource_73e3n") sliderFillColor = SubResource("Resource_t2h31") -sliderStrokeColor = SubResource("Resource_p7jqt") - -[sub_resource type="Resource" id="Resource_jhmds"] -script = ExtResource("7_sr7fn") -value = 20.0 -unit = "em" -metadata/_custom_type_script = "uid://cnkyynboxg1qg" - -[sub_resource type="Resource" id="Resource_mseeg"] -script = ExtResource("7_sr7fn") -value = 1.0 -unit = "em" -metadata/_custom_type_script = "uid://cnkyynboxg1qg" +sliderStrokeColor = SubResource("Resource_7e1wh") [sub_resource type="Resource" id="Resource_44lr4"] script = ExtResource("11_gdfkg") metadata/_custom_type_script = "uid://cdsqunj017b7y" -[sub_resource type="Resource" id="Resource_drk6d"] +[sub_resource type="Resource" id="Resource_oluvp"] script = ExtResource("7_sr7fn") -value = 100.0 -unit = "%" +value = 20.0 +unit = "em" metadata/_custom_type_script = "uid://cnkyynboxg1qg" -[sub_resource type="Resource" id="Resource_jtfq4"] +[sub_resource type="Resource" id="Resource_vi7gu"] +script = ExtResource("7_sr7fn") +value = 1.0 +unit = "em" +metadata/_custom_type_script = "uid://cnkyynboxg1qg" + +[sub_resource type="Resource" id="Resource_5kble"] script = ExtResource("7_sr7fn") value = 10.0 unit = "em" metadata/_custom_type_script = "uid://cnkyynboxg1qg" -[sub_resource type="LabelSettings" id="LabelSettings_to3ck"] +[sub_resource type="Resource" id="Resource_swm2d"] +script = ExtResource("7_sr7fn") +value = 100.0 +unit = "%" +metadata/_custom_type_script = "uid://cnkyynboxg1qg" + +[sub_resource type="LabelSettings" id="LabelSettings_gdfkg"] [sub_resource type="Resource" id="Resource_r7l7h"] script = ExtResource("11_dmue3") en = "Test" metadata/_custom_type_script = "uid://bvj322mokkq63" -[sub_resource type="Resource" id="Resource_4wsps"] +[sub_resource type="Resource" id="Resource_8imgn"] script = ExtResource("12_obxtq") metadata/_custom_type_script = "uid://chmcc71dvu4vj" -[sub_resource type="Resource" id="Resource_mk81p"] +[sub_resource type="Resource" id="Resource_4mpx2"] script = ExtResource("7_sr7fn") value = 10.0 unit = "vw" @@ -178,27 +178,28 @@ script = ExtResource("1_ucjfr") metadata/_custom_type_script = "uid://c2hicupu28nbi" [node name="UIValueSlider" type="TextureRect" parent="." node_paths=PackedStringArray("valueText", "onFocusEntered", "onFocusExited")] -material = SubResource("ShaderMaterial_op7xn") +material = SubResource("ShaderMaterial_7abrn") layout_mode = 0 offset_top = 2.7399998 offset_right = 230.40001 offset_bottom = 14.26 pivot_offset = Vector2(115.200005, 5.76) -focus_mode = 2 +focus_mode = 1 +mouse_default_cursor_shape = 10 texture = ExtResource("4_vb488") expand_mode = 1 script = ExtResource("5_p2b8g") valueText = NodePath("../UIRegion2/Value") -mode = SubResource("Resource_ebf7l") +mode = SubResource("Resource_vh1c2") direction = 1 -smoothing = SubResource("Resource_gdfkg") +smoothing = SubResource("Resource_v3vxy") sliderValue = Vector2(0.5, 0.5) -imageType = SubResource("Resource_loqre") -width = SubResource("Resource_jhmds") -height = SubResource("Resource_mseeg") +imageType = SubResource("Resource_oxa7j") hoverCursor = SubResource("Resource_44lr4") -onFocusEntered = NodePath("../On Focus Entered") -onFocusExited = NodePath("../On Focus Exited") +onFocusEntered = NodePath("") +onFocusExited = NodePath("") +width = SubResource("Resource_oluvp") +height = SubResource("Resource_vi7gu") metadata/_custom_type_script = "uid://cqi3jitprf7o0" [node name="UIRegion2" type="Control" parent="."] @@ -209,8 +210,8 @@ offset_bottom = 17.0 pivot_offset = Vector2(40.32, 8.5) mouse_filter = 1 script = ExtResource("1_ucjfr") -horizontalAlignment = SubResource("Resource_drk6d") -width = SubResource("Resource_jtfq4") +width = SubResource("Resource_5kble") +horizontalAlignment = SubResource("Resource_swm2d") metadata/_custom_type_script = "uid://c2hicupu28nbi" [node name="Value" type="Label" parent="UIRegion2"] @@ -219,17 +220,8 @@ offset_left = 55.64 offset_right = 80.64 offset_bottom = 17.0 pivot_offset = Vector2(12.5, 8.5) -text = "Test" -label_settings = SubResource("LabelSettings_to3ck") +label_settings = SubResource("LabelSettings_gdfkg") script = ExtResource("10_58ifk") locale = SubResource("Resource_r7l7h") -parentStyle = SubResource("Resource_4wsps") -width = SubResource("Resource_mk81p") - -[node name="On Focus Entered" type="Node" parent="."] -script = ExtResource("15_v3vxy") -metadata/_custom_type_script = "uid://b4yjsis2fh64c" - -[node name="On Focus Exited" type="Node" parent="."] -script = ExtResource("15_v3vxy") -metadata/_custom_type_script = "uid://b4yjsis2fh64c" +parentStyle = SubResource("Resource_8imgn") +width = SubResource("Resource_4mpx2") diff --git a/Runtime/UI/UIAppSettings/Headers/MinimalisticHeaderGenerator.cs b/Runtime/UI/UIAppSettings/Headers/MinimalisticHeaderGenerator.cs index 2cca47d..0b18571 100644 --- a/Runtime/UI/UIAppSettings/Headers/MinimalisticHeaderGenerator.cs +++ b/Runtime/UI/UIAppSettings/Headers/MinimalisticHeaderGenerator.cs @@ -9,8 +9,7 @@ namespace Rokojori; [Tool] [GlobalClass] public partial class MinimalisticHeaderGenerator:UIAppSettingsHeaderGenerator -{ - +{ [Export] public UIStyle headerStyle; @@ -36,6 +35,33 @@ public partial class MinimalisticHeaderGenerator:UIAppSettingsHeaderGenerator [Export] public UIStyle categoryLabelStyle; + [Export] + public UIStyle footerStyle; + + [Export] + public UIStyle footerBackgroundStyle; + + [Export] + public UIImageType footerBackgroundImageType; + + [Export] + public UIStyle footerSeperatorStyle; + + [Export] + public bool showSettingsInfo = true; + + [Export] + public SensorIcon[] confirmIcons; + + [Export] + public LocalizedString confirmLocale; + + [Export] + public SensorIcon[] cancelIcons; + + [Export] + public LocalizedString cancelLocale; + public override UIAppSettingsHeader GenerateHeader( UIAppSettings uiAppSettings, AppSettings appSettings ) { @@ -79,6 +105,7 @@ public partial class MinimalisticHeaderGenerator:UIAppSettingsHeaderGenerator selector.uiStylable = categoryRegion; selector.uiAppSettings = uiAppSettings; selector.category = category; + selector.triggerMode = Action.ActionTriggerMode.Always; label.handleMouseEvents = true; label.onLeftClick = selector; @@ -94,6 +121,47 @@ public partial class MinimalisticHeaderGenerator:UIAppSettingsHeaderGenerator rightInfo.inputIcons = [ rightIcon ]; rightInfo.deviceFilter = new LastActiveDeviceFilter(); + var footer = uiAppSettings.CreateChild( "Footer"); + footer.parentStyle = footerStyle; + + ignores.Add( footer ); + + var footerBackground = footer.CreateChild( "Footer Background" ); + footerBackground.parentStyle = footerBackgroundStyle; + footerBackground.imageType = footerBackgroundImageType; + footerBackground.Texture = UI.whiteTexture.Get(); + + if ( showSettingsInfo ) + { + var uiSettings = uiAppSettings.GetUI().settings; + var settingsInfo = footer.CreateChild( "Settings Input "); + settingsInfo.inputIcons = [ + SensorIcon.Create( uiSettings.uiLeft ), + SensorIcon.Create( uiSettings.uiRight ) + ]; + + settingsInfo.locale = LocaleText.Create( "Change setting" ); + settingsInfo.deviceFilter = new LastActiveDeviceFilter(); + header.settingsInputInfo = settingsInfo; + + var separatorSettings = footer.CreateChild( "Separator (Settings and Confirm)" ); + separatorSettings.parentStyle = footerSeperatorStyle; + + } + + var confirmInfo = footer.CreateChild( "Confirm Input "); + confirmInfo.inputIcons = confirmIcons; + confirmInfo.locale = confirmLocale; + confirmInfo.deviceFilter = new LastActiveDeviceFilter(); + + var confirmSettings = footer.CreateChild( "Separator (Confirm and Cancel)" ); + confirmSettings.parentStyle = footerSeperatorStyle; + + var cancelInfo = footer.CreateChild( "Cancel Input "); + cancelInfo.inputIcons = cancelIcons; + cancelInfo.locale = cancelLocale; + cancelInfo.deviceFilter = new LastActiveDeviceFilter(); + return header; } diff --git a/Runtime/UI/UIAppSettings/Headers/SetFocusedUIAppSettings.cs b/Runtime/UI/UIAppSettings/Headers/SetFocusedUIAppSettings.cs new file mode 100644 index 0000000..58b2372 --- /dev/null +++ b/Runtime/UI/UIAppSettings/Headers/SetFocusedUIAppSettings.cs @@ -0,0 +1,39 @@ + +using Godot; +using Rokojori; +using System.Collections.Generic; +using System.Linq; + +namespace Rokojori; + +[Tool] +[GlobalClass] +public partial class SetFocusedUIAppSettings:Action +{ + [Export] + public UIAppSettings uiAppSettings; + + [Export] + public UIAppSettingHandler appSettingHandler; + + protected override void _OnTrigger() + { + if ( uiAppSettings == null || appSettingHandler == null ) + { + return; + } + + var header = uiAppSettings.header; + + if ( header.settingsInputInfo == null || + appSettingHandler.appSetting == null || + appSettingHandler.appSetting.title == null + ) + { + return; + } + + header.settingsInputInfo.locale = appSettingHandler.appSetting.title; + header.settingsInputInfo.UpdateInfo(); + } +} diff --git a/Runtime/UI/UIAppSettings/Headers/SetFocusedUIAppSettings.cs.uid b/Runtime/UI/UIAppSettings/Headers/SetFocusedUIAppSettings.cs.uid new file mode 100644 index 0000000..9d8d886 --- /dev/null +++ b/Runtime/UI/UIAppSettings/Headers/SetFocusedUIAppSettings.cs.uid @@ -0,0 +1 @@ +uid://bd0j3solon12a diff --git a/Runtime/UI/UIAppSettings/Headers/UIAppSettingsHeader.cs b/Runtime/UI/UIAppSettings/Headers/UIAppSettingsHeader.cs index ca632ca..68c5251 100644 --- a/Runtime/UI/UIAppSettings/Headers/UIAppSettingsHeader.cs +++ b/Runtime/UI/UIAppSettings/Headers/UIAppSettingsHeader.cs @@ -12,4 +12,7 @@ public partial class UIAppSettingsHeader:UIRegion { [Export] public SelectSettingsPage[] pageSelectors = []; + + [Export] + public UIInputInfo settingsInputInfo; } diff --git a/Runtime/UI/UIAppSettings/SetUIAppSettingsReady.cs b/Runtime/UI/UIAppSettings/SetUIAppSettingsReady.cs index 3b0da67..b16efb6 100644 --- a/Runtime/UI/UIAppSettings/SetUIAppSettingsReady.cs +++ b/Runtime/UI/UIAppSettings/SetUIAppSettingsReady.cs @@ -22,5 +22,6 @@ public partial class SetUIAppSettingsReady : Action } uiAppSettings.onReady = newReadyAction; + uiAppSettings.SelectFirstPage(); } } diff --git a/Runtime/UI/UIAppSettings/UIAppSettings.cs b/Runtime/UI/UIAppSettings/UIAppSettings.cs index 091ff1c..1e15f48 100644 --- a/Runtime/UI/UIAppSettings/UIAppSettings.cs +++ b/Runtime/UI/UIAppSettings/UIAppSettings.cs @@ -63,6 +63,26 @@ public partial class UIAppSettings:UIRegion ProcessMainInputs(); } + public void SelectFirstPage() + { + if ( header == null ) + { + this.LogInfo( "No header" ); + return; + } + + + var selector = header.Get(); + + if ( selector == null ) + { + this.LogInfo( "No SelectSettingsPage in header found" ); + return; + } + + selector.Trigger(); + } + void ProcessMenuInputs() { if ( MenuChangeMode.None == menuChangeMode ) diff --git a/Runtime/UI/UIRuleSet.cs b/Runtime/UI/UIRuleSet.cs new file mode 100644 index 0000000..9d73249 --- /dev/null +++ b/Runtime/UI/UIRuleSet.cs @@ -0,0 +1,16 @@ + +using Godot; +using Rokojori; +using System.Collections.Generic; + +namespace Rokojori +{ + + [Tool] + [GlobalClass,Icon("res://addons/rokojori_action_library/Icons/UIRuleSet.svg")] + public partial class UIRuleSet:Resource + { + [Export] + public UIRule[] rules = []; + } +} \ No newline at end of file diff --git a/Runtime/UI/UIRuleSet.cs.uid b/Runtime/UI/UIRuleSet.cs.uid new file mode 100644 index 0000000..58af4d9 --- /dev/null +++ b/Runtime/UI/UIRuleSet.cs.uid @@ -0,0 +1 @@ +uid://cyr5imepel4p0 diff --git a/Runtime/VFX/LineVFX/LineMaterial/CustomLineMaterialPreset.cs b/Runtime/VFX/LineVFX/LineMaterial/CustomLineMaterialPreset.cs index 24d39c6..a56e45c 100644 --- a/Runtime/VFX/LineVFX/LineMaterial/CustomLineMaterialPreset.cs +++ b/Runtime/VFX/LineVFX/LineMaterial/CustomLineMaterialPreset.cs @@ -6,6 +6,9 @@ namespace Rokojori; [Tool,GlobalClass] public partial class CustomLineMaterialPreset:LineMaterialPreset { + [Export( PropertyHint.Range, "0.001,128")] + public float lodBias = 1; + [Export] public Material material; @@ -17,7 +20,12 @@ public partial class CustomLineMaterialPreset:LineMaterialPreset public override void CreateMaterial( LineVFX lineVFX, MeshInstance3D mi ) { - mi.SetSurfaceOverrideMaterial( 0, material ); + for ( int i = 0; i < mi.GetSurfaceOverrideMaterialCount(); i++ ) + { + mi.SetSurfaceOverrideMaterial( i, material ); + } + + mi.LodBias = lodBias; mi.CastShadow = shadows; } @@ -32,4 +40,9 @@ public partial class CustomLineMaterialPreset:LineMaterialPreset shaderSetup.end.Set( mi, data ); } } + + public override void SetLineLength( LineVFX lineVFX, MeshInstance3D mi, float length ) + { + shaderSetup.lineLength.SetInstance( mi, length ); + } } diff --git a/Runtime/VFX/LineVFX/LineMaterial/LineMaterialPreset.cs b/Runtime/VFX/LineVFX/LineMaterial/LineMaterialPreset.cs index cefde77..cef0883 100644 --- a/Runtime/VFX/LineVFX/LineMaterial/LineMaterialPreset.cs +++ b/Runtime/VFX/LineVFX/LineMaterial/LineMaterialPreset.cs @@ -8,4 +8,5 @@ public abstract partial class LineMaterialPreset:Resource { public abstract void CreateMaterial( LineVFX lineVFX, MeshInstance3D mi ); public abstract void SetPointData( LineVFX lineVFX, MeshInstance3D mi, LinePointData data, bool start ); + public abstract void SetLineLength( LineVFX lineVFX, MeshInstance3D mi, float length ); } diff --git a/Runtime/VFX/LineVFX/LineMaterial/LineVFXShaderSetup.cs b/Runtime/VFX/LineVFX/LineMaterial/LineVFXShaderSetup.cs index 92dfb1a..c4d3c6d 100644 --- a/Runtime/VFX/LineVFX/LineMaterial/LineVFXShaderSetup.cs +++ b/Runtime/VFX/LineVFX/LineMaterial/LineVFXShaderSetup.cs @@ -13,6 +13,9 @@ public partial class LineVFXShaderSetup:Resource [Export] public LineVFXShaderPointProperties end; + [Export] + public FloatPropertyName lineLength; + } \ No newline at end of file diff --git a/Runtime/VFX/LineVFX/LineMaterial/Shaders/PBR/LineVFX-PBR.gdshader b/Runtime/VFX/LineVFX/LineMaterial/Shaders/PBR/LineVFX-PBR.gdshader new file mode 100644 index 0000000..5e9b03f --- /dev/null +++ b/Runtime/VFX/LineVFX/LineMaterial/Shaders/PBR/LineVFX-PBR.gdshader @@ -0,0 +1,60 @@ +shader_type spatial; +render_mode blend_mix, depth_draw_opaque, cull_back, diffuse_burley, specular_schlick_ggx; + +#include "res://addons/rokojori_action_library/Runtime/Shading/Library/LineVFX/LineVFX-Includes.gdshaderinc" + +uniform sampler2D albedoTexture : source_color, filter_linear_mipmap, repeat_enable; +uniform vec4 albedo : source_color; + +uniform sampler2D occlusionTexture : hint_roughness_r, filter_linear_mipmap, repeat_enable; +uniform float occlusion : hint_range(0.0, 1.0); + +uniform sampler2D roughnessTexture : hint_roughness_r, filter_linear_mipmap, repeat_enable; +uniform float roughness : hint_range(0.0, 1.0); + +uniform sampler2D metallicTexture : hint_default_white, filter_linear_mipmap, repeat_enable; +uniform float metallic : hint_range(0.0, 1.0, 0.01); +uniform float specular : hint_range(0.0, 1.0, 0.01); + + +uniform sampler2D normalTexture : hint_roughness_normal, filter_linear_mipmap, repeat_enable; +uniform float normalScale : hint_range(-16.0, 16.0); + +uniform vec2 uvScale; +uniform vec2 uvOffset; + +#include "res://addons/rokojori_action_library/Runtime/Shading/Library/LineVFX/LineVFX-Variables.gdshaderinc" + +void vertex() +{ + t = VERTEX.z; + normalizedDistance = mix( startNormalizedDistance, endNormalizedDistance, t ); + VERTEX.z = 0.0; + + VERTEX *= scaling; + + UV = UV * uvScale + uvOffset; + + #include "res://addons/rokojori_action_library/Runtime/Shading/Library/LineVFX/LineVFX-ApplyModelViewMatrix.gdshaderinc" + +} + +void fragment() +{ + vec4 sampledAlbedo = texture( albedoTexture, UV ); + ALBEDO = sampledAlbedo.rgb * albedo.rgb; + + float sampledOcclusion = texture( occlusionTexture, UV ).r; + AO = mix( 1.0, sampledOcclusion, occlusion ); + + float sampledRoughness = texture( roughnessTexture, UV ).g; + ROUGHNESS = sampledRoughness * roughness; + + + float sampledMetallic = texture( metallicTexture, UV ).b; + METALLIC = sampledMetallic * metallic; + SPECULAR = specular; + + NORMAL_MAP = texture( normalTexture, UV ).rgb; + NORMAL_MAP_DEPTH = normalScale; +} \ No newline at end of file diff --git a/Runtime/VFX/LineVFX/LineMaterial/Shaders/PBR/LineVFX-PBR.gdshader.uid b/Runtime/VFX/LineVFX/LineMaterial/Shaders/PBR/LineVFX-PBR.gdshader.uid new file mode 100644 index 0000000..ac19770 --- /dev/null +++ b/Runtime/VFX/LineVFX/LineMaterial/Shaders/PBR/LineVFX-PBR.gdshader.uid @@ -0,0 +1 @@ +uid://by77we1xqapem diff --git a/Runtime/VFX/LineVFX/LineMeshGenerator/RandomLineMeshEntry.cs b/Runtime/VFX/LineVFX/LineMeshGenerator/RandomLineMeshEntry.cs new file mode 100644 index 0000000..d6e4886 --- /dev/null +++ b/Runtime/VFX/LineVFX/LineMeshGenerator/RandomLineMeshEntry.cs @@ -0,0 +1,16 @@ +using Godot; +using System.Collections.Generic; + +namespace Rokojori; + +[Tool,GlobalClass] +public partial class RandomLineMeshEntry:Resource +{ + [Export] + public Mesh mesh; + + [Export] + public float probability = 1f; + + +} \ No newline at end of file diff --git a/Runtime/VFX/LineVFX/LineMeshGenerator/RandomLineMeshEntry.cs.uid b/Runtime/VFX/LineVFX/LineMeshGenerator/RandomLineMeshEntry.cs.uid new file mode 100644 index 0000000..1ba5649 --- /dev/null +++ b/Runtime/VFX/LineVFX/LineMeshGenerator/RandomLineMeshEntry.cs.uid @@ -0,0 +1 @@ +uid://dkyyo6mocdwd7 diff --git a/Runtime/VFX/LineVFX/LineMeshGenerator/RandomLineMeshGenerator.cs b/Runtime/VFX/LineVFX/LineMeshGenerator/RandomLineMeshGenerator.cs new file mode 100644 index 0000000..0597200 --- /dev/null +++ b/Runtime/VFX/LineVFX/LineMeshGenerator/RandomLineMeshGenerator.cs @@ -0,0 +1,19 @@ +using Godot; +using System.Collections.Generic; +using System.Linq; + +namespace Rokojori; + +[Tool,GlobalClass] +public partial class RandomLineMeshGenerator:LineMeshGenerator +{ + [Export] + public RandomLineMeshEntry[] entries = []; + + public override Mesh GetMesh( LineVFX lineVFX, MeshInstance3D mi ) + { + var entry = GodotRandom.Get().FromWeightedElements( entries, e => e.probability ); + return entry.mesh; + } + +} \ No newline at end of file diff --git a/Runtime/VFX/LineVFX/LineMeshGenerator/RandomLineMeshGenerator.cs.uid b/Runtime/VFX/LineVFX/LineMeshGenerator/RandomLineMeshGenerator.cs.uid new file mode 100644 index 0000000..1257aad --- /dev/null +++ b/Runtime/VFX/LineVFX/LineMeshGenerator/RandomLineMeshGenerator.cs.uid @@ -0,0 +1 @@ +uid://4wenko3thpc1 diff --git a/Runtime/VFX/LineVFX/LinePoint/AutoLine/AutoLinePointList.cs b/Runtime/VFX/LineVFX/LinePoint/AutoLine/AutoLinePointList.cs index 0945d4d..90289ec 100644 --- a/Runtime/VFX/LineVFX/LinePoint/AutoLine/AutoLinePointList.cs +++ b/Runtime/VFX/LineVFX/LinePoint/AutoLine/AutoLinePointList.cs @@ -3,14 +3,17 @@ using System.Collections.Generic; namespace Rokojori; + [Tool] [GlobalClass ] public abstract partial class AutoLinePointList:LinePointDataGenerator { + [Export] + public bool computeUp = true; [Export] - public Vector3 up = Vector3.Up; + public SplineUpGeneratorStrategy upGeneratorStrategy; [Export( PropertyHint.Range, "0,1")] public float symmetricTangents = 0; @@ -30,6 +33,9 @@ public abstract partial class AutoLinePointList:LinePointDataGenerator [Export] public float changeTreshold = 0.000001f; + [Export] + public float currentLineLength = 0; + List _cachedPoints = []; protected abstract void _UpdatePoints( LineVFX lineVFX, double delta ); @@ -99,11 +105,34 @@ public abstract partial class AutoLinePointList:LinePointDataGenerator } + data.lineLength = length; + + currentLineLength = length; + for ( int i = 1; i < data.points.Length; i++ ) { data.points[ i ].normalizedDistance /= length; } + var strategy = upGeneratorStrategy ?? WorldUp_SplineUpGen.instance; + + var currentIndex = 0; + + System.Func getPosition = ( offset ) => + { + return data.points[ currentIndex - offset ].position; + }; + + System.Func getForward = ( offset ) => + { + return data.points[ currentIndex - offset ].forward; + }; + + System.Func getUp = ( offset ) => + { + return data.points[ currentIndex - offset ].up; + }; + for ( int i = 0; i < data.points.Length && data.points.Length > 1 ; i++ ) { if ( i == data.points.Length - 1 ) @@ -136,8 +165,12 @@ public abstract partial class AutoLinePointList:LinePointDataGenerator data.points[ i ].forward = ( before + after ) * 0.5f; } - - data.points[ i ].up = up; + + if ( computeUp ) + { + currentIndex = i; + data.points[ i ].up = strategy.ComputeUp( i, getPosition, getForward, getUp ); + } } _symmetricTangents = symmetricTangents; diff --git a/Runtime/VFX/LineVFX/LinePoint/AutoLine/AutoLineVFXData.cs b/Runtime/VFX/LineVFX/LinePoint/AutoLine/AutoLineVFXData.cs index 4a7b15b..34d4940 100644 --- a/Runtime/VFX/LineVFX/LinePoint/AutoLine/AutoLineVFXData.cs +++ b/Runtime/VFX/LineVFX/LinePoint/AutoLine/AutoLineVFXData.cs @@ -9,6 +9,11 @@ public class AutoLineVFXData:LineVFXData public List pointsCacheList = []; public int customUpdateID = -1; + public float lineLength = 0f; + public override float GetLineLength() + { + return lineLength; + } public override int GetUpdateID(){ return customUpdateID; } public override IEnumerable GetPointData(){ return points; } diff --git a/Runtime/VFX/LineVFX/LinePoint/CustomLine/CustomLinePointList.cs b/Runtime/VFX/LineVFX/LinePoint/CustomLine/CustomLinePointList.cs index 4902317..0f277bc 100644 --- a/Runtime/VFX/LineVFX/LinePoint/CustomLine/CustomLinePointList.cs +++ b/Runtime/VFX/LineVFX/LinePoint/CustomLine/CustomLinePointList.cs @@ -26,6 +26,8 @@ public partial class CustomLinePointList:LinePointDataGenerator cd.points = points; cd.customUpdateID = customUpdateID; + + cd.lineLength = Math3D.ComputeLineDistance( points, p => p.position ); } } diff --git a/Runtime/VFX/LineVFX/LinePoint/CustomLine/CustomLineVFXData.cs b/Runtime/VFX/LineVFX/LinePoint/CustomLine/CustomLineVFXData.cs index 74a9e7d..d9bd2e5 100644 --- a/Runtime/VFX/LineVFX/LinePoint/CustomLine/CustomLineVFXData.cs +++ b/Runtime/VFX/LineVFX/LinePoint/CustomLine/CustomLineVFXData.cs @@ -9,6 +9,13 @@ public class CustomLineVFXData:LineVFXData public int customUpdateID = -1; + public float lineLength = 0f; + public override float GetLineLength() + { + return lineLength; + } + + public override int GetUpdateID(){ return customUpdateID; } public override IEnumerable GetPointData(){ return points; } public override int GetNumSegments() diff --git a/Runtime/VFX/LineVFX/LinePoint/FollowAutoLine/FollowAutoLine.cs b/Runtime/VFX/LineVFX/LinePoint/FollowAutoLine/FollowAutoLine.cs index 89899c1..daf0817 100644 --- a/Runtime/VFX/LineVFX/LinePoint/FollowAutoLine/FollowAutoLine.cs +++ b/Runtime/VFX/LineVFX/LinePoint/FollowAutoLine/FollowAutoLine.cs @@ -30,12 +30,14 @@ public partial class FollowAutoLine:AutoLinePointList var newPosition = lineVFX.followSource.GlobalPosition; + var newUp = lineVFX.followSource.GlobalUp(); var needsNewPoint = NotEnoughPoints( points ) || Moved( newPosition, points ); if ( ! needsNewPoint ) { points[ points.Length -1 ].position = newPosition + Vector3.One * 0.00001f; + points[ points.Length -1 ].up = newUp; return; } @@ -44,7 +46,9 @@ public partial class FollowAutoLine:AutoLinePointList var p1 = new AutoLinePointData(); var p2 = new AutoLinePointData(); p1.position = newPosition; + p1.up = newUp; p2.position = newPosition + Vector3.One * 0.00001f; + p2.up = newUp; data.points = [ p1, p2 ]; @@ -53,12 +57,14 @@ public partial class FollowAutoLine:AutoLinePointList var p = new AutoLinePointData(); p.position = newPosition; + p.up = newUp; var pos2 = points[ points.Length - 2 ].position; var dir = newPosition - pos2; points[ points.Length - 1 ].position = pos2 + dir.Normalized() * distanceTreshold; + points[ points.Length - 1 ].up = newUp; if ( points.Length == maxPoints ) { diff --git a/Runtime/VFX/LineVFX/LinePoint/LineVFXPointData.cs b/Runtime/VFX/LineVFX/LinePoint/LineVFXPointData.cs index 04295de..5fe6da9 100644 --- a/Runtime/VFX/LineVFX/LinePoint/LineVFXPointData.cs +++ b/Runtime/VFX/LineVFX/LinePoint/LineVFXPointData.cs @@ -15,6 +15,8 @@ public abstract class LineVFXData } public abstract Vector3 GetPositionAt( int index ); + + public abstract float GetLineLength(); public Vector3 LerpPositionAt( float normalizedIndex ) { if ( GetNumPoints() == 0 ) diff --git a/Runtime/VFX/LineVFX/LineVFX.cs b/Runtime/VFX/LineVFX/LineVFX.cs index f1334d0..b9b8bb7 100644 --- a/Runtime/VFX/LineVFX/LineVFX.cs +++ b/Runtime/VFX/LineVFX/LineVFX.cs @@ -132,6 +132,7 @@ public partial class LineVFX:Node3D preset.materialPreset.SetPointData( this, mi, start, true ); preset.materialPreset.SetPointData( this, mi, end, false ); + preset.materialPreset.SetLineLength( this, mi, _data.GetLineLength() ); // AssignPointData( mi, start, startPositionName, startForwardName, startUpName ); // AssignPointData( mi, end, endPositionName, endForwardName, endUpName ); diff --git a/Tools/FFmpeg/FFmpeg.cs b/Tools/FFmpeg/FFmpeg.cs new file mode 100644 index 0000000..6da025c --- /dev/null +++ b/Tools/FFmpeg/FFmpeg.cs @@ -0,0 +1,129 @@ +#if TOOLS +using Godot; +using Rokojori; +using System.Diagnostics; +using System.Collections.Generic; +using System.Threading.Tasks; +using System; + +namespace Rokojori.Tools; + + +public class FFmpegResponse +{ + public int exitCode; + public string rawResponse; +} + +public class FFmpeg +{ + public static async Task Run( List arguments, string workingDirectory = null, string ffmpegPath = "ffmpeg" ) + { + var response = new FFmpegResponse(); + + var joinedArgs = arguments.Join( " "); + + RJLog.Log( "FFmpeg at", ffmpegPath, ">>", joinedArgs ); + + var process = new Process + { + StartInfo = new ProcessStartInfo + { + FileName = ffmpegPath, + Arguments = joinedArgs, + RedirectStandardOutput = true, + RedirectStandardError = true, + UseShellExecute = false, + CreateNoWindow = true + } + + }; + + if ( workingDirectory != null ) + { + process.StartInfo.WorkingDirectory = workingDirectory; + } + + process.Start(); + + var outputResult = new List(); + var errorResult = new List(); + + process.OutputDataReceived += (sender, e) => + { + if ( e.Data == null ) + { + return; + } + + RJLog.Log( e.Data ); + outputResult.Add( e.Data ); + }; + + process.ErrorDataReceived += (sender, e) => + { + if ( e.Data == null ) + { + return; + } + + RJLog.Error( e.Data ); + errorResult.Add( e.Data ); + }; + + process.BeginOutputReadLine(); + process.BeginErrorReadLine(); + + + await process.WaitForExitAsync(); + + + response.exitCode = process.ExitCode; + + if ( process.ExitCode == 0 ) + { + response.rawResponse = outputResult.Join( "" ); + } + else + { + response.rawResponse = errorResult.Join( "" ); + } + + return response; + } + + public static Task Convert_MP4_to_OGV( + string path, string ffmpegPath = "ffmpeg", + FFmpegQuality videoQuality = FFmpegQuality._8_Good, + FFmpegQuality audioQuality = FFmpegQuality._8_Good, + int keyFrames = 64, + int w = -1, int h = -1 + ) + { + // ffmpeg -i input.mp4 -vf "scale=-1:720" -q:v 6 -q:a 6 -g:v 64 output.ogv + + var args = new List(); + + args.Add( "-i " + path ); + + if ( ! ( w == -1 && h == -1 ) ) + { + args.Add( "-vf " + "\"scale=" + w + ":" + h + "\"" ); + } + + args.Add( "-q:v " + FFmpegQualityTool.ToInt( videoQuality ) ); + args.Add( "-q:a " + FFmpegQualityTool.ToInt( audioQuality ) ); + args.Add( "-g:v " + keyFrames ); + + var filePath = FilePath.Absolute( path ); + var outputPath = filePath.WithExtension( ".ogv" ); + args.Add( outputPath.absolutePath ); + + + return Run( args, null, ffmpegPath ); + } +} + + + +#endif \ No newline at end of file diff --git a/Tools/FFmpeg/FFmpeg.cs.uid b/Tools/FFmpeg/FFmpeg.cs.uid new file mode 100644 index 0000000..78296df --- /dev/null +++ b/Tools/FFmpeg/FFmpeg.cs.uid @@ -0,0 +1 @@ +uid://qsaa07g58o5t diff --git a/Tools/FFmpeg/FFmpegQuality.cs b/Tools/FFmpeg/FFmpegQuality.cs new file mode 100644 index 0000000..8d92c9e --- /dev/null +++ b/Tools/FFmpeg/FFmpegQuality.cs @@ -0,0 +1,37 @@ +#if TOOLS +using Godot; +using Rokojori; +using System.Diagnostics; +using System.Collections.Generic; +using System.Threading.Tasks; +using System; + +namespace Rokojori.Tools; + + + +public enum FFmpegQuality +{ + _1_Worst, + _2, + _3_Not_Good, + _4, + _5, + _6_Average, + _7, + _8_Good, + _9, + _10_Best +} + +public static class FFmpegQualityTool +{ + public static int ToInt( FFmpegQuality fFmpegQuality ) + { + return (int) fFmpegQuality + 1; + } +} + + + +#endif \ No newline at end of file diff --git a/Tools/FFmpeg/FFmpegQuality.cs.uid b/Tools/FFmpeg/FFmpegQuality.cs.uid new file mode 100644 index 0000000..149cf91 --- /dev/null +++ b/Tools/FFmpeg/FFmpegQuality.cs.uid @@ -0,0 +1 @@ +uid://dmkdmxwvbmx1e diff --git a/Tools/FFmpeg/FFmpegTool.cs b/Tools/FFmpeg/FFmpegTool.cs new file mode 100644 index 0000000..af7bd99 --- /dev/null +++ b/Tools/FFmpeg/FFmpegTool.cs @@ -0,0 +1,86 @@ +#if TOOLS +using Godot; +using Rokojori; +using System.Diagnostics; +using System.Collections.Generic; +using System.Threading.Tasks; +using System; + +namespace Rokojori.Tools; + +[Tool] +[GlobalClass] +public partial class FFmpegTool:Node +{ + [ExportToolButton("Download FFmpeg")] + public Callable downloadButton => Callable.From( + ()=> + { + var downloadPath = "https://ffmpeg.org/download.html"; + OS.ShellOpen( downloadPath ); + } + ); + + [Export( PropertyHint.GlobalFile, "exe" ) ] + public string ffmpegPath = ""; + + [Export] + public string result = ""; + + [ExportGroup("Convert MP4 to OGV")] + + [Export( PropertyHint.GlobalFile, "mp4" ) ] + public string mp4Path; + + [Export] + public FFmpegQuality videoQuality = FFmpegQuality._8_Good; + + [Export] + public FFmpegQuality audioQuality = FFmpegQuality._8_Good; + + [Export] + public int keyFrames = 64; + + [ExportToolButton("Convert")] + public Callable convert_MP4_to_OGV_Button => Callable.From( + ()=> + { + result = "Converting"; + Convert(); + } + ); + + async Task Convert() + { + var response = await FFmpeg.Convert_MP4_to_OGV( + mp4Path, ffmpegPath, + videoQuality, audioQuality, keyFrames + ); + + result = response.exitCode + ">> " + response.rawResponse; + } + + + // [ExportGroup("Show Video Info")] + + // [Export( PropertyHint.GlobalFile, "mp4" ) ] + // public string videoPath; + + // [ExportToolButton("Convert")] + // public Callable showVideoInfoButton => Callable.From( + // ()=> + // { + // ShowInfo(); + // } + // ); + + // async Task ShowInfo() + // { + // var response = await FFmpeg.Convert_MP4_to_OGV( mp4Path, ffmpegPath ); + + // result = response.exitCode + ">> " + response.rawResponse; + // } + +} + +#endif \ No newline at end of file diff --git a/Tools/FFmpeg/FFmpegTool.cs.uid b/Tools/FFmpeg/FFmpegTool.cs.uid new file mode 100644 index 0000000..7c09ba8 --- /dev/null +++ b/Tools/FFmpeg/FFmpegTool.cs.uid @@ -0,0 +1 @@ +uid://c1kb735pjfrf8 diff --git a/Tools/docs/ClassDocEditing/ClassDocParser.cs b/Tools/docs/ClassDocEditing/ClassDocParser.cs index e7dcd5e..304dbae 100644 --- a/Tools/docs/ClassDocEditing/ClassDocParser.cs +++ b/Tools/docs/ClassDocEditing/ClassDocParser.cs @@ -117,7 +117,7 @@ namespace Rokojori.DocGenerator } ); - var innerObjects = CSharpLexer.GetAllObjectDefinitions( innerTokens.events ); + var innerObjects = CSLexer.GetAllObjectDefinitions( innerTokens.events ); var objectRanges = innerObjects.Map( ( io )=> diff --git a/Tools/docs/CreateDoc.cs b/Tools/docs/CreateDoc.cs index 4d83eab..2dd3ad4 100644 --- a/Tools/docs/CreateDoc.cs +++ b/Tools/docs/CreateDoc.cs @@ -140,8 +140,8 @@ namespace Rokojori.DocGenerator var editor = new ClassDocEditor(); var source = found[ 0 ].LoadUTF8(); - editor.originalTokens = LexerList.Create( CSharpLexer.Lex( source ), LexerMatcherLibrary.Ignore ); - var objects = CSharpLexer.GetAllObjectDefinitions( editor.originalTokens.events ); + editor.originalTokens = LexerList.Create( CSLexer.Lex( source ), LexerMatcherLibrary.Ignore ); + var objects = CSLexer.GetAllObjectDefinitions( editor.originalTokens.events ); var classObject = objects.Find( obj => obj.type.Is( LexerMatcherLibrary.ClassMatcher ) ); editor.source = source; diff --git a/Tools/docs/DocComments.cs b/Tools/docs/DocComments.cs index 5362e08..13caf2f 100644 --- a/Tools/docs/DocComments.cs +++ b/Tools/docs/DocComments.cs @@ -32,7 +32,7 @@ namespace Rokojori.DocGenerator public void Grab( string data ) { - var lexEvents = CSharpLexer.Lex( data ); + var lexEvents = CSLexer.Lex( data ); //RJLog.Log( "Num lex events:", lexEvents.Count ); lexEvents.ForEach( diff --git a/Tools/docs/DocGenerator.cs b/Tools/docs/DocGenerator.cs index a25f54b..ec8cadd 100644 --- a/Tools/docs/DocGenerator.cs +++ b/Tools/docs/DocGenerator.cs @@ -119,7 +119,7 @@ namespace Rokojori.DocGenerator if ( cf.fileExtension == ".cs" ) { var fileContent = FilesSync.LoadUTF8( cf.fullPath ); - var definitions = CSharpLexer.GetAllObjectDefinitions( fileContent ); + var definitions = CSLexer.GetAllObjectDefinitions( fileContent ); // RJLog.Log( cf.fileName, ">>", definitions.Join( "," ) );