diff --git a/RokojoriPlugin.cs b/RokojoriPlugin.cs index e5efc72..20c49c4 100644 --- a/RokojoriPlugin.cs +++ b/RokojoriPlugin.cs @@ -81,6 +81,11 @@ namespace Rokojori } } + static void EnsureCachedProjectPath( string cachePath ) + { + + } + public override void _DisablePlugin() { diff --git a/Runtime/Colors/ColorChannelType.cs.uid b/Runtime/Colors/ColorChannelType.cs.uid new file mode 100644 index 0000000..0a21723 --- /dev/null +++ b/Runtime/Colors/ColorChannelType.cs.uid @@ -0,0 +1 @@ +uid://mlwd123bf2ba diff --git a/Runtime/Colors/HSLColor.cs b/Runtime/Colors/HSLColor.cs index 4811a0d..0fa9198 100644 --- a/Runtime/Colors/HSLColor.cs +++ b/Runtime/Colors/HSLColor.cs @@ -79,6 +79,15 @@ namespace Rokojori a = temp.a; } + public void ClampToLimits() + { + h = MathX.EnsureValidFloat( h ); + h = MathX.Repeat( h, 360 ); + s = MathX.Clamp01( s ); + l = MathX.Clamp01( l ); + a = MathX.Clamp01( a ); + } + public static HSLColor FromRGBA( Color c ) { float h = 0; @@ -101,7 +110,8 @@ namespace Rokojori { float delta = cmax - cmin; - s = ( l <= .5f ) ? ( delta / ( cmax + cmin ) ) : ( delta / ( 2f - ( cmax + cmin ) ) ); + s = ( l <= 0.5f ) ? ( delta / ( cmax + cmin ) ) : + ( delta / ( 2f - ( cmax + cmin ) ) ); h = 0; @@ -146,7 +156,12 @@ namespace Rokojori public static float BlendHueInRGB( HSLColor x, HSLColor y, float weight ) { - return HSLColor.FromRGBA( ColorX.Lerp( x.ToRGBA(), y.ToRGBA(), weight ) ).h; + var rgbLerped = ColorX.Lerp( x.ToRGBA(), y.ToRGBA(), weight ); + rgbLerped = rgbLerped.Clamp(); + + var hsl = HSLColor.FromRGBA( rgbLerped ); + + return MathX.EnsureValidFloat( hsl.h ); } public static HSLColor LerpWithHueInRGB( HSLColor x, HSLColor y, Vector4 v ) @@ -170,17 +185,19 @@ namespace Rokojori } - public Color ToRGBA( ) + public Color ToRGBA() { - float r, g, b, a; - a = this.a; + var r = 0f; + var g = 0f; + var b = 0f; - float m1, m2; + var m1 = 0f; + var m2 = 0f; - m2 = ( l <= .5f ) ? ( l * ( 1f + s ) ) : ( l + s - l * s ); + m2 = ( l <= 0.5f ) ? ( l * ( 1f + s ) ) : ( l + s - l * s ); m1 = 2f * l - m2; - if ( s == 0f ) + if ( s <= 0f ) { r = g = b = l; } @@ -196,7 +213,6 @@ namespace Rokojori static float Value( float n1, float n2, float hue ) { - hue = MathX.Repeat( hue, 360f ); if ( hue < 60f ) diff --git a/Runtime/Math/MathX.cs b/Runtime/Math/MathX.cs index 3c82e0e..55fb200 100644 --- a/Runtime/Math/MathX.cs +++ b/Runtime/Math/MathX.cs @@ -216,10 +216,30 @@ namespace Rokojori static float CustomModulo( float a, float n ) { return a - Mathf.Floor( a / n ) * n; + } + + public static bool IsInvalidFloat( float value ) + { + return float.IsNaN( value ) || float.IsInfinity( value ); } - public static float Clamp01( float value ) + public static float EnsureValidFloat( float value, float invalidValue = 0f ) { + if ( float.IsNaN( value ) || float.IsInfinity( value ) ) + { + return invalidValue; + } + + return value; + } + + public static float Clamp01( float value, float invalidValue = 0f ) + { + if ( float.IsNaN( value ) || float.IsInfinity( value ) ) + { + return invalidValue; + } + return Mathf.Clamp( value, 0, 1 ); } diff --git a/Runtime/Networking/Nodes/NetworkNode.cs b/Runtime/Networking/Nodes/NetworkNode.cs index 33ed92e..aafadd1 100644 --- a/Runtime/Networking/Nodes/NetworkNode.cs +++ b/Runtime/Networking/Nodes/NetworkNode.cs @@ -1,10 +1,11 @@ using Godot; - +using Rokojori.Tools; using System.Collections.Generic; namespace Rokojori -{ - +{ + [Tool] + [GlobalClass] public partial class NetworkNode : Node, INetworkNode { [ExportGroup("Network Settings")] @@ -20,6 +21,19 @@ namespace Rokojori protected List _networkNodeMembers = null; protected NetworkNodeSlot _networkNodeSlot = new NetworkNodeSlot(); + #if TOOLS + + [ExportGroup("Help")] + [ExportToolButton( "Open Online Docs")] + public Callable openOnlineDocsButton => Callable.From( + ()=> + { + OnlineDocs.Open( GetType() ); + } + ); + + #endif + public virtual List GetNetworkNodeMembers() { if ( _networkNodeMembers != null ) diff --git a/Runtime/Procedural/Textures/ColorCorrectionStack/ColorAdjustments.cs b/Runtime/Procedural/Textures/ColorCorrectionStack/ColorAdjustments.cs index d211358..d15ea69 100644 --- a/Runtime/Procedural/Textures/ColorCorrectionStack/ColorAdjustments.cs +++ b/Runtime/Procedural/Textures/ColorCorrectionStack/ColorAdjustments.cs @@ -30,9 +30,19 @@ namespace Rokojori [Export(PropertyHint.Range, "-100,100 suffix:%")] public float gamma = 0; + [Export] + public Gradient gradient; + + [Export(PropertyHint.Range, "0,100 suffix:%")] + public float gradientStrength = 50f; + + [Export(PropertyHint.Range, "-1,1")] + public float gradientLumaType = 0f; + protected override Color _Modify( Color sourceColor ) { var hslColor = HSLColor.FromRGBA( sourceColor ); + var luminance = hslColor.l; hslColor.h = MathX.Repeat( hslColor.h + hue, 360 ); hslColor.s = MathX.Clamp01( hslColor.s + saturation/100f ); @@ -50,8 +60,33 @@ namespace Rokojori hslColor.l = ( hslColor.l - 0.5f ) * Mathf.Pow( 2, contrast/100f ) + 0.5f; hslColor.l = MathX.Clamp01( hslColor.l + brightness/100f ); + hslColor.ClampToLimits(); var rgb = hslColor.ToRGBA(); + rgb = rgb.Gamma( Mathf.Pow( 2.2f, gamma/100f ) ); + rgb = rgb.Clamp(); + + + if ( gradient != null ) + { + var hsl2 = HSLColor.FromRGBA( rgb ); + var currentLuminance = hsl2.l; + + var lumaLookUp = Mathf.Lerp( currentLuminance, luminance, gradientLumaType * 0.5f + 0.5f ); + var sampledGradient = gradient.Sample( lumaLookUp ); + var gradientColorHSL = HSLColor.FromRGBA( sampledGradient ); + + var weigths = new Vector4( 1f * gradientColorHSL.s, 0.2f, 0.1f, 1f ) ; + weigths = weigths * ( gradientStrength / 100f ) * sampledGradient.A; + // weigths.W = 1f; + + var combined = HSLColor.LerpWithHueInRGB( hsl2, gradientColorHSL, weigths ); + + combined.ClampToLimits(); + + rgb = combined.ToRGBA(); + rgb = rgb.Clamp(); + } return rgb; diff --git a/Runtime/Procedural/Textures/ColorCorrectionStack/_XX_ColorCorrectionModifier.cs b/Runtime/Procedural/Textures/ColorCorrectionStack/_XX_ColorCorrectionModifier.cs index 0e64f71..3e4c0ba 100644 --- a/Runtime/Procedural/Textures/ColorCorrectionStack/_XX_ColorCorrectionModifier.cs +++ b/Runtime/Procedural/Textures/ColorCorrectionStack/_XX_ColorCorrectionModifier.cs @@ -15,8 +15,16 @@ namespace Rokojori [Export(PropertyHint.Range, "0,100 suffix:%")] public float amount = 100; + [Export] + public bool enabled = true; + public Color Apply( Color color ) { + if ( ! enabled ) + { + return color; + } + var modified = _Modify( color ); return ColorX.Lerp( color, modified, amount / 100f ); diff --git a/Runtime/Procedural/Textures/Images.cs.uid b/Runtime/Procedural/Textures/Images.cs.uid new file mode 100644 index 0000000..46c75c9 --- /dev/null +++ b/Runtime/Procedural/Textures/Images.cs.uid @@ -0,0 +1 @@ +uid://cxrrn0fyf3k2d diff --git a/Runtime/Text/Text.cs.uid b/Runtime/Text/Text.cs.uid new file mode 100644 index 0000000..9c73004 --- /dev/null +++ b/Runtime/Text/Text.cs.uid @@ -0,0 +1 @@ +uid://clb5lj3q5t5yu diff --git a/Runtime/VirtualCameras/MouseEditorCamera/Inputs/Sensors/Move Back.tres b/Runtime/VirtualCameras/MouseEditorCamera/Inputs/Sensors/Move Back.tres index d739e03..9fdc9c6 100644 --- a/Runtime/VirtualCameras/MouseEditorCamera/Inputs/Sensors/Move Back.tres +++ b/Runtime/VirtualCameras/MouseEditorCamera/Inputs/Sensors/Move Back.tres @@ -14,10 +14,6 @@ altHold = 2 shiftHold = 2 modifiersMode = 0 continous = false -_value = 0.0 -_wasActive = false -_active = false -_activeTreshold = 0.5 [sub_resource type="Resource" id="Resource_75e6s"] script = ExtResource("1_ikub8") @@ -27,29 +23,17 @@ numVisible = 0 inputIcons = [] useInputIconsFromSensors = true continous = false -_value = 0.0 -_wasActive = false -_active = false -_activeTreshold = 0.5 [sub_resource type="Resource" id="Resource_gmj7t"] script = ExtResource("3_1wc0w") axis = 1 type = 0 continous = false -_value = 0.0 -_wasActive = false -_active = false -_activeTreshold = 0.5 [sub_resource type="Resource" id="Resource_687xx"] script = ExtResource("4_wj7li") button = 12 continous = false -_value = 0.0 -_wasActive = false -_active = false -_activeTreshold = 0.5 [sub_resource type="Resource" id="Resource_unhue"] script = ExtResource("1_ikub8") @@ -59,10 +43,6 @@ numVisible = 1 inputIcons = [] useInputIconsFromSensors = true continous = false -_value = 0.0 -_wasActive = false -_active = false -_activeTreshold = 0.5 [resource] script = ExtResource("1_ikub8") @@ -72,7 +52,3 @@ numVisible = 0 inputIcons = [] useInputIconsFromSensors = true continous = false -_value = 0.0 -_wasActive = false -_active = false -_activeTreshold = 0.5 diff --git a/Runtime/VirtualCameras/MouseEditorCamera/Inputs/Sensors/Move Down.tres b/Runtime/VirtualCameras/MouseEditorCamera/Inputs/Sensors/Move Down.tres index 32e6829..bc17839 100644 --- a/Runtime/VirtualCameras/MouseEditorCamera/Inputs/Sensors/Move Down.tres +++ b/Runtime/VirtualCameras/MouseEditorCamera/Inputs/Sensors/Move Down.tres @@ -13,10 +13,6 @@ altHold = 2 shiftHold = 2 modifiersMode = 0 continous = false -_value = 0.0 -_wasActive = false -_active = false -_activeTreshold = 0.5 [sub_resource type="Resource" id="Resource_jvxvp"] script = ExtResource("1_e8w3r") @@ -26,19 +22,11 @@ numVisible = 0 inputIcons = [] useInputIconsFromSensors = true continous = false -_value = 0.0 -_wasActive = false -_active = false -_activeTreshold = 0.5 [sub_resource type="Resource" id="Resource_3ovg5"] script = ExtResource("3_pyik4") button = 10 continous = false -_value = 0.0 -_wasActive = false -_active = false -_activeTreshold = 0.5 [sub_resource type="Resource" id="Resource_yhdev"] script = ExtResource("1_e8w3r") @@ -48,10 +36,6 @@ numVisible = 0 inputIcons = [] useInputIconsFromSensors = true continous = false -_value = 0.0 -_wasActive = false -_active = false -_activeTreshold = 0.5 [resource] script = ExtResource("1_e8w3r") @@ -61,7 +45,3 @@ numVisible = 0 inputIcons = [] useInputIconsFromSensors = true continous = false -_value = 0.0 -_wasActive = false -_active = false -_activeTreshold = 0.5 diff --git a/Runtime/VirtualCameras/MouseEditorCamera/Inputs/Sensors/Move Forward.tres b/Runtime/VirtualCameras/MouseEditorCamera/Inputs/Sensors/Move Forward.tres index 3053b73..1176f22 100644 --- a/Runtime/VirtualCameras/MouseEditorCamera/Inputs/Sensors/Move Forward.tres +++ b/Runtime/VirtualCameras/MouseEditorCamera/Inputs/Sensors/Move Forward.tres @@ -14,10 +14,6 @@ altHold = 2 shiftHold = 2 modifiersMode = 0 continous = false -_value = 0.0 -_wasActive = false -_active = false -_activeTreshold = 0.5 [sub_resource type="Resource" id="Resource_nj1ud"] script = ExtResource("1_r4ul7") @@ -27,29 +23,17 @@ numVisible = 0 inputIcons = [] useInputIconsFromSensors = true continous = false -_value = 0.0 -_wasActive = false -_active = false -_activeTreshold = 0.5 [sub_resource type="Resource" id="Resource_mxixb"] script = ExtResource("3_nh2m3") axis = 1 type = 1 continous = false -_value = 0.0 -_wasActive = false -_active = false -_activeTreshold = 0.5 [sub_resource type="Resource" id="Resource_c1vyq"] script = ExtResource("3_dyhbp") button = 11 continous = false -_value = 0.0 -_wasActive = false -_active = false -_activeTreshold = 0.5 [sub_resource type="Resource" id="Resource_vhtjx"] script = ExtResource("1_r4ul7") @@ -59,10 +43,6 @@ numVisible = 1 inputIcons = [] useInputIconsFromSensors = true continous = false -_value = 0.0 -_wasActive = false -_active = false -_activeTreshold = 0.5 [resource] script = ExtResource("1_r4ul7") @@ -72,7 +52,3 @@ numVisible = 0 inputIcons = [] useInputIconsFromSensors = true continous = false -_value = 0.0 -_wasActive = false -_active = false -_activeTreshold = 0.5 diff --git a/Runtime/VirtualCameras/MouseEditorCamera/Inputs/Sensors/Move Left.tres b/Runtime/VirtualCameras/MouseEditorCamera/Inputs/Sensors/Move Left.tres index 08dcde1..64e3c30 100644 --- a/Runtime/VirtualCameras/MouseEditorCamera/Inputs/Sensors/Move Left.tres +++ b/Runtime/VirtualCameras/MouseEditorCamera/Inputs/Sensors/Move Left.tres @@ -14,10 +14,6 @@ altHold = 2 shiftHold = 2 modifiersMode = 0 continous = false -_value = 0.0 -_wasActive = false -_active = false -_activeTreshold = 0.5 [sub_resource type="Resource" id="Resource_qts7v"] script = ExtResource("1_w0cyl") @@ -27,29 +23,17 @@ numVisible = 0 inputIcons = [] useInputIconsFromSensors = true continous = false -_value = 0.0 -_wasActive = false -_active = false -_activeTreshold = 0.5 [sub_resource type="Resource" id="Resource_gmj7t"] script = ExtResource("3_ushvr") axis = 0 type = 1 continous = false -_value = 0.0 -_wasActive = false -_active = false -_activeTreshold = 0.5 [sub_resource type="Resource" id="Resource_687xx"] script = ExtResource("4_53tr6") button = 13 continous = false -_value = 0.0 -_wasActive = false -_active = false -_activeTreshold = 0.5 [sub_resource type="Resource" id="Resource_0hx40"] script = ExtResource("1_w0cyl") @@ -59,10 +43,6 @@ numVisible = 1 inputIcons = [] useInputIconsFromSensors = true continous = false -_value = 0.0 -_wasActive = false -_active = false -_activeTreshold = 0.5 [resource] script = ExtResource("1_w0cyl") @@ -72,7 +52,3 @@ numVisible = 0 inputIcons = [] useInputIconsFromSensors = true continous = false -_value = 0.0 -_wasActive = false -_active = false -_activeTreshold = 0.5 diff --git a/Runtime/VirtualCameras/MouseEditorCamera/Inputs/Sensors/Move Right.tres b/Runtime/VirtualCameras/MouseEditorCamera/Inputs/Sensors/Move Right.tres index 0a5579a..fa7bb58 100644 --- a/Runtime/VirtualCameras/MouseEditorCamera/Inputs/Sensors/Move Right.tres +++ b/Runtime/VirtualCameras/MouseEditorCamera/Inputs/Sensors/Move Right.tres @@ -14,10 +14,6 @@ altHold = 2 shiftHold = 2 modifiersMode = 0 continous = false -_value = 0.0 -_wasActive = false -_active = false -_activeTreshold = 0.5 [sub_resource type="Resource" id="Resource_d1suo"] script = ExtResource("1_vdwin") @@ -27,29 +23,17 @@ numVisible = 0 inputIcons = [] useInputIconsFromSensors = true continous = false -_value = 0.0 -_wasActive = false -_active = false -_activeTreshold = 0.5 [sub_resource type="Resource" id="Resource_c7ebh"] script = ExtResource("3_4antj") axis = 0 type = 0 continous = false -_value = 0.0 -_wasActive = false -_active = false -_activeTreshold = 0.5 [sub_resource type="Resource" id="Resource_md70b"] script = ExtResource("4_ucs5r") button = 14 continous = false -_value = 0.0 -_wasActive = false -_active = false -_activeTreshold = 0.5 [sub_resource type="Resource" id="Resource_fhaor"] script = ExtResource("1_vdwin") @@ -59,10 +43,6 @@ numVisible = 1 inputIcons = [] useInputIconsFromSensors = true continous = false -_value = 0.0 -_wasActive = false -_active = false -_activeTreshold = 0.5 [resource] script = ExtResource("1_vdwin") @@ -72,7 +52,3 @@ numVisible = 0 inputIcons = [] useInputIconsFromSensors = true continous = false -_value = 0.0 -_wasActive = false -_active = false -_activeTreshold = 0.5 diff --git a/Runtime/VirtualCameras/MouseEditorCamera/Inputs/Sensors/Move Upward.tres b/Runtime/VirtualCameras/MouseEditorCamera/Inputs/Sensors/Move Upward.tres index 739c4a6..bb9eefb 100644 --- a/Runtime/VirtualCameras/MouseEditorCamera/Inputs/Sensors/Move Upward.tres +++ b/Runtime/VirtualCameras/MouseEditorCamera/Inputs/Sensors/Move Upward.tres @@ -13,10 +13,6 @@ altHold = 2 shiftHold = 2 modifiersMode = 0 continous = false -_value = 0.0 -_wasActive = false -_active = false -_activeTreshold = 0.5 [sub_resource type="Resource" id="Resource_pqldp"] script = ExtResource("1_5263n") @@ -26,19 +22,11 @@ numVisible = 0 inputIcons = [] useInputIconsFromSensors = true continous = false -_value = 0.0 -_wasActive = false -_active = false -_activeTreshold = 0.5 [sub_resource type="Resource" id="Resource_ivi7v"] script = ExtResource("3_ejsq1") button = 9 continous = false -_value = 0.0 -_wasActive = false -_active = false -_activeTreshold = 0.5 [sub_resource type="Resource" id="Resource_0uxqa"] script = ExtResource("1_5263n") @@ -48,10 +36,6 @@ numVisible = 1 inputIcons = [] useInputIconsFromSensors = true continous = false -_value = 0.0 -_wasActive = false -_active = false -_activeTreshold = 0.5 [resource] script = ExtResource("1_5263n") @@ -61,7 +45,3 @@ numVisible = 0 inputIcons = [] useInputIconsFromSensors = true continous = false -_value = 0.0 -_wasActive = false -_active = false -_activeTreshold = 0.5 diff --git a/Runtime/VirtualCameras/MouseEditorCamera/Inputs/Sensors/Zoom In.tres b/Runtime/VirtualCameras/MouseEditorCamera/Inputs/Sensors/Zoom In.tres index 708d1ec..e337f8e 100644 --- a/Runtime/VirtualCameras/MouseEditorCamera/Inputs/Sensors/Zoom In.tres +++ b/Runtime/VirtualCameras/MouseEditorCamera/Inputs/Sensors/Zoom In.tres @@ -9,10 +9,6 @@ script = ExtResource("3_5t03r") axis = 5 type = 0 continous = false -_value = 0.0 -_wasActive = false -_active = false -_activeTreshold = 0.5 [resource] script = ExtResource("1_lnrk8") @@ -22,7 +18,3 @@ numVisible = 0 inputIcons = [] useInputIconsFromSensors = true continous = false -_value = 0.0 -_wasActive = false -_active = false -_activeTreshold = 0.5 diff --git a/Runtime/VirtualCameras/MouseEditorCamera/Inputs/Sensors/Zoom Out.tres b/Runtime/VirtualCameras/MouseEditorCamera/Inputs/Sensors/Zoom Out.tres index 8fe0bb2..ffe8ecf 100644 --- a/Runtime/VirtualCameras/MouseEditorCamera/Inputs/Sensors/Zoom Out.tres +++ b/Runtime/VirtualCameras/MouseEditorCamera/Inputs/Sensors/Zoom Out.tres @@ -9,10 +9,6 @@ script = ExtResource("3_pu70j") axis = 4 type = 0 continous = false -_value = 0.0 -_wasActive = false -_active = false -_activeTreshold = 0.5 [resource] script = ExtResource("1_w21si") @@ -22,7 +18,3 @@ numVisible = 0 inputIcons = [] useInputIconsFromSensors = true continous = false -_value = 0.0 -_wasActive = false -_active = false -_activeTreshold = 0.5 diff --git a/Tools/blender/Blender.cs.uid b/Tools/blender/Blender.cs.uid new file mode 100644 index 0000000..20d0521 --- /dev/null +++ b/Tools/blender/Blender.cs.uid @@ -0,0 +1 @@ +uid://bhs6rkhfbopbc diff --git a/Tools/blender/BlenderGLTFtoFBX.cs.uid b/Tools/blender/BlenderGLTFtoFBX.cs.uid new file mode 100644 index 0000000..4e21302 --- /dev/null +++ b/Tools/blender/BlenderGLTFtoFBX.cs.uid @@ -0,0 +1 @@ +uid://6qukkvril5b8 diff --git a/Tools/docs/ClassDocGenerator.cs b/Tools/docs/ClassDocGenerator.cs new file mode 100644 index 0000000..7068a1f --- /dev/null +++ b/Tools/docs/ClassDocGenerator.cs @@ -0,0 +1,185 @@ + +using Godot; + +using Rokojori; +using System.Collections.Generic; +using System; +using System.Reflection; +using System.Text.RegularExpressions; + +namespace Rokojori.DocGenerator +{ + public class ClassDocGenerator + { + ClassDocInfo info = new ClassDocInfo(); + + public string GetIcon( string classFile, string name, List baseTypes, List icons ) + { + var iconMatcher = new Regex( "Icon\\(\"res://addons/rokojori_action_library/Icons/(\\w+\\.svg)" ); + + var result = iconMatcher.Matches( classFile ); + + if ( result != null && result.Count == 1 ) + { + return result[ 0 ].Groups[ 1 ].Value; + } + + if ( icons.IndexOf( name + ".svg" ) != -1 ) + { + return name + ".svg"; + } + + foreach ( var bt in baseTypes ) + { + if ( icons.IndexOf( bt + ".svg" ) != -1 ) + { + return bt + ".svg"; + } + } + + return "CSharp.svg"; + } + + public ClassDocInfo Create( string filePath, Type type, List icons ) + { + var data = filePath == null ? "" : FilesSync.LoadUTF8( filePath ); + var comments = new DocComments(); + comments.Grab( data ); + + RJLog.Log( type.Name, "Comments:", comments.entries.Count ); + + info.name = type.Name; + info.csNameSpace = type.Namespace; + + info.doc = comments.FindDoc( "class", type.Name ); + + info.generics = Lists.Map( type.GenericTypeArguments, t => t + "" ); + + var allBindings = BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static | BindingFlags.DeclaredOnly; + var fields = Lists.ToList( type.GetFields( allBindings ) ); + fields = Lists.Filter( fields, f => ! f.IsPrivate ); + + var godotTypes = new List() + { + "Node", "Resource" + }; + + + + + var it = type.BaseType; + + while ( it != null ) + { + if ( godotTypes.IndexOf( it.Name) != -1 ) + { + if ( "Node" == it.Name ) + { + info.extendingClasses.AddRange( new string[]{ "Node", "Object" } ); + } + else if ( "Resource" == it.Name ) + { + info.extendingClasses.AddRange( new string[]{ "Resource", "RefCounted", "Object" } ); + } + + it = null; + } + else + { + info.extendingClasses.Add( it.Name ); + it = it.BaseType; + } + + + } + + info.icon = GetIcon( data, info.name, info.extendingClasses, icons ); + + fields.ForEach( + ( f )=> + { + var memberInfo = MemberInfo.CreateField(); + + memberInfo.name = f.Name; + memberInfo.csNameSpace = f.FieldType.Namespace; + memberInfo.dataType = f.FieldType.Name; + memberInfo.generics = Lists.Map( f.FieldType.GetGenericArguments(), t => t + "" ); + memberInfo.doc = comments.FindDoc( "field", f.Name ); + + if ( f.IsStatic ) + { + memberInfo.modifiers.Add( "static" ); + } + + memberInfo.modifiers.Add( f.IsPublic ? "public" : "protected" ); + + info.memberInfos.Add( memberInfo ); + + } + ); + + + var methods = Lists.ToList( type.GetMethods( allBindings ) ); + methods = Lists.Filter( methods, m => ! m.IsPrivate ); + + var godotInternalMethods = new List() + { + "GetGodotMethodList", + "InvokeGodotClassMethod", + "HasGodotClassMethod", + "SetGodotClassPropertyValue", + "GetGodotClassPropertyValue", + "GetGodotPropertyList", + "GetGodotPropertyDefaultValues", + "SaveGodotObjectData", + "RestoreGodotObjectData" + }; + + methods.ForEach( + m => + { + if ( godotInternalMethods.IndexOf( m.Name ) != -1 ) + { + return; + } + + var memberInfo = MemberInfo.CreateMethod(); + + memberInfo.name = m.Name; + memberInfo.dataType = m.ReturnType.Name; + memberInfo.csNameSpace = m.ReturnType.Namespace; + memberInfo.generics = Lists.Map( m.GetGenericArguments(), t => t + "" ); + memberInfo.doc = comments.FindDoc( "method", m.Name ); + + if ( m.IsStatic ) + { + memberInfo.modifiers.Add( "static" ); + } + + memberInfo.modifiers.Add( m.IsPublic ? "public" : "protected" ); + + var parameters = Lists.ToList( m.GetParameters() ); + parameters.ForEach( + ( p )=> + { + var parameterType = new ParameterType(); + parameterType.name = p.Name; + parameterType.type = p.ParameterType.Name; + parameterType.csNameSpace = p.ParameterType.Namespace; + parameterType.generics = Lists.Map( p.ParameterType.GenericTypeArguments, t => t + "" ); + + memberInfo.parameters.Add( parameterType ); + + } + ); + + info.memberInfos.Add( memberInfo ); + } + ); + + + + return info; + } + } +} \ No newline at end of file diff --git a/Tools/docs/ClassDocInfo.cs b/Tools/docs/ClassDocInfo.cs new file mode 100644 index 0000000..d1e12bc --- /dev/null +++ b/Tools/docs/ClassDocInfo.cs @@ -0,0 +1,58 @@ + +using System.Collections.Generic; + + +namespace Rokojori.DocGenerator +{ + public class ParameterType + { + public string name; + public string type; + public string csNameSpace; + public List generics; + } + + public class MemberInfo + { + public string doc; + public string memberType; + public string name; + public string dataType; + public string csNameSpace; + + public List modifiers = new List(); + public List generics; + public List parameters = new List(); + + public static readonly string Field = "Field"; + public static readonly string Method = "Method"; + + public static MemberInfo Create( string memberType ) + { + var m = new MemberInfo(); + m.memberType = memberType; + return m; + } + + public static MemberInfo CreateField() + { + return MemberInfo.Create( MemberInfo.Field ); + } + + public static MemberInfo CreateMethod() + { + return MemberInfo.Create( MemberInfo.Method ); + } + } + + public class ClassDocInfo + { + public string csNameSpace = ""; + public string name =""; + public string doc; + public string icon; + public List generics = new List(); + public List extendingClasses = new List(); + public List memberInfos = new List(); + } +} \ No newline at end of file diff --git a/Tools/docs/CreateDoc.cs b/Tools/docs/CreateDoc.cs new file mode 100644 index 0000000..387433e --- /dev/null +++ b/Tools/docs/CreateDoc.cs @@ -0,0 +1,59 @@ + +using Godot; + +using System.Collections.Generic; + +namespace Rokojori.DocGenerator +{ + public class SomeArrayClass + { + public int index = 2; + public string value = "Hello World"; + } + + public class SomeClass + { + public float x = 0; + public float GetX() + { + return x * 2; + } + + public List values = new List(); + + } + + [GlobalClass][Tool] + public partial class CreateDoc : Node + { + [Export] + public string outputPath ="res://addons/rokojori_action_library/Tools/docs/output"; + + [ExportToolButton( "Create")] + public Callable createButton => Callable.From( ()=>{ Generate(); } ); + + void Test() + { + var obj = new SomeClass(); + var sa = new SomeArrayClass(); + var sb = new SomeArrayClass(); + sb.value = "Huhu"; + obj.values.Add( sa ); + obj.values.Add( sb ); + + var testJSON = JSON.StringifyObject( obj ); + RJLog.Log( testJSON ); + } + + void Generate() + { + var absoluteLibraryPath = ProjectSettings.GlobalizePath( "res://addons/rokojori_action_library/Runtime" ); + var absoluteIconPath = ProjectSettings.GlobalizePath( "res://addons/rokojori_action_library/Icons" ); + var absoluteOutputPath = ProjectSettings.GlobalizePath( outputPath ); + + var generator = new DocGenerator(); + var icons = Lists.Map( FilesSync.GetFiles( absoluteIconPath, ( fp => fp.fileExtension == ".svg" ) ), fp => fp.fullFileName ); + generator.Generate( absoluteLibraryPath, absoluteOutputPath, icons ); + } + } +} \ No newline at end of file diff --git a/Tools/docs/CreateDoc.cs.uid b/Tools/docs/CreateDoc.cs.uid new file mode 100644 index 0000000..5904f9c --- /dev/null +++ b/Tools/docs/CreateDoc.cs.uid @@ -0,0 +1 @@ +uid://bx30sgaoxsav5 diff --git a/Tools/docs/DocComments.cs b/Tools/docs/DocComments.cs new file mode 100644 index 0000000..c83af7c --- /dev/null +++ b/Tools/docs/DocComments.cs @@ -0,0 +1,86 @@ + +using Godot; + +using System.Collections.Generic; +using System.Text.RegularExpressions; + +namespace Rokojori.DocGenerator +{ + public class DocCommentEntry + { + public string type; + public string name; + public string doc; + } + + public class DocComments + { + public Regex commentStartOld = new Regex( "\\/\\*\\*\\s*<\\s*summary\\s+for\\s*=\\s*\"\\s*(\\w+)\\s+(\\w+)\\s*\"" ); + public Regex commentStart = + + RegexBuilder.Create() + [ "/**" ]._[ "<" ]._[ "summary" ].__[ "for" ]._[ "=" ]._[ "\"" ]._.Word.__.Word._[ "\"" ] + .ToRegex(); + + + public string classInfo = "class"; + public string fieldInfo = "field"; + public string methodInfo = "method"; + public List entries = new List(); + + + + public void Grab( string data ) + { + var lexEvents = CSharpLexer.Lex( data ); + + //RJLog.Log( "Num lex events:", lexEvents.Count ); + lexEvents.ForEach( + ( le )=> + { + if ( ! LexerMatcherLibrary.MultiLineCommentMatcher.Matches( le ) ) + { + return; + } + + var match = le.match; + + + if ( ! commentStart.IsMatch( match ) ) + { + Regex isStartPartially = new Regex( "/\\*\\*\\s*<\\s*summary\\s*" ); + + //RJLog.Log( "Not doc Comment:", isStartPartially.IsMatch( match ), match ); + return; + } + + var result = commentStart.Matches( match ); + + var type = result[ 0 ].Groups[ 1 ].Value; + var name = result[ 0 ].Groups[ 2 ].Value; + + var bodyStart = match.IndexOf( ">" ) + 1; + var bodyEnd = match.LastIndexOf( "<" ); + var body = match.Substring( bodyStart, bodyEnd - bodyStart ); + + var entry = new DocCommentEntry(); + entry.name = name; + entry.type = type; + entry.doc = body; + + entries.Add( entry ); + + RJLog.Log( "Doc Comment:", entry.type, entry.name, ">>\n", entry.doc ); + + } + ); + } + + public string FindDoc( string type, string name ) + { + var e= entries.Find( e => e.type == type && e.name == name ); + + return e == null ? null : e.doc; + } + } +} \ No newline at end of file diff --git a/Tools/docs/DocGenerator.cs b/Tools/docs/DocGenerator.cs new file mode 100644 index 0000000..9bf6b0c --- /dev/null +++ b/Tools/docs/DocGenerator.cs @@ -0,0 +1,111 @@ + +using Godot; + +using Rokojori; +using System.Collections.Generic; +using System; + +namespace Rokojori.DocGenerator +{ + public class ClassTypeEntry + { + public Type type; + public string path; + } + + public class DocGenerator + { + string path = ""; + string outputPath = ""; + List icons = new List(); + + public List classFiles = new List(); + public List classTypes = new List(); + + + public void Generate( string path, string outputPath, List icons ) + { + this.path = path; + this.outputPath = outputPath; + this.icons = icons; + + GetFiles(); + CreateTypesFromFiles(); + IncludeDefaultTypes(); + GenerateDocsFromTypes(); + } + + void GetFiles() + { + classFiles = FilesSync.GetFiles( path, f => f.fileExtension == ".cs", true ); + } + + void IncludeDefaultTypes() + { + var defaultTypes = new List() + { + typeof( NetworkNode ), + typeof( Action ), + typeof( Sensor ), + typeof( Selector ) + }; + + defaultTypes.ForEach( + ( dt )=> + { + var entry = new ClassTypeEntry(); + entry.type = dt; + entry.path = null; + + classTypes.Add( entry); + } + ); + + + } + + void CreateTypesFromFiles() + { + var genericType = new EventSlot().GetType(); + var namespaceLabel = "Rokojori"; + var assembly = genericType.Assembly; + + classFiles.ForEach( + ( cf )=> + { + var name = cf.fileName; + var type = ReflectionHelper.GetTypeByName( namespaceLabel + "." + name ); + + if ( type == null ) + { + type = ReflectionHelper.GetTypeByNameFromAssembly( name, assembly ); + } + + if ( type != null ) + { + var entry = new ClassTypeEntry(); + entry.type = type; + entry.path = cf.fullPath; + + classTypes.Add( entry); + } + + } + ); + } + + void GenerateDocsFromTypes() + { + classTypes.ForEach( + ( c )=> + { + var cdg = new ClassDocGenerator(); + var cinfo = cdg.Create( c.path, c.type, icons ); + + var outputPath = FilePath.Join( this.outputPath, cinfo.name + ".json" ); + FilesSync.SaveJSON( outputPath, cinfo ); + } + ); + } + } +} \ No newline at end of file diff --git a/Tools/docs/OnlineDocs.cs b/Tools/docs/OnlineDocs.cs new file mode 100644 index 0000000..5177616 --- /dev/null +++ b/Tools/docs/OnlineDocs.cs @@ -0,0 +1,22 @@ +#if TOOLS +using Godot; +using Rokojori; +using System.Diagnostics; +using System.Collections.Generic; +using System.Threading.Tasks; + +namespace Rokojori.Tools +{ + public class OnlineDocs + { + static string docsPath = "https://rokojori.com/en/labs/godot/docs/4.3/"; + public static void Open( System.Type type ) + { + var name = type.Name + "-class"; + var path = docsPath + name; + OS.ShellOpen( path ); + } + } +} + +#endif \ No newline at end of file diff --git a/Tools/docs/OnlineDocs.cs.uid b/Tools/docs/OnlineDocs.cs.uid new file mode 100644 index 0000000..0e5af45 --- /dev/null +++ b/Tools/docs/OnlineDocs.cs.uid @@ -0,0 +1 @@ +uid://bb1yh8iwo8vde diff --git a/plugin.cfg b/plugin.cfg index e97c26c..2ea7c58 100644 --- a/plugin.cfg +++ b/plugin.cfg @@ -1,7 +1,7 @@ [plugin] name="Rokojori Action Library" -description="Rokojori plugin for the library" +description="Library for actions, assets and effects" author="Rokojori" -version="1.0" +version="0.1" script="RokojoriPlugin.cs"