v0.5 Finish

This commit is contained in:
Josef 2026-02-13 22:28:41 +01:00
parent ebc2d0dcae
commit e27d2e9ef1
22 changed files with 358 additions and 5 deletions

View File

@ -5,6 +5,7 @@ using System.Collections.Generic;
using System.Globalization; using System.Globalization;
using System; using System;
using System.Data; using System.Data;
using Rokojori.Tools;
namespace Rokojori namespace Rokojori
{ {
@ -17,9 +18,9 @@ namespace Rokojori
#else #else
[Tool] [Tool]
public partial class RokojoriPlugin: EditorPlugin public partial class RokojoriPlugin: EditorPlugin
{ {
GizmoDrawerPlugin gizmoDrawerPlugin = new GizmoDrawerPlugin(); GizmoDrawerPlugin gizmoDrawerPlugin = new GizmoDrawerPlugin();
GodotEditorInspectorTools inspectorTools = new GodotEditorInspectorTools();
public static readonly string path = "res://addons/rokojori_action_library"; public static readonly string path = "res://addons/rokojori_action_library";
@ -123,6 +124,8 @@ namespace Rokojori
AddNode3DGizmoPlugin( gizmoDrawerPlugin ); AddNode3DGizmoPlugin( gizmoDrawerPlugin );
inspectorTools.rokojoriPlugin = this;
inspectorTools.AddPlugins();
// var pePackedScene = GD.Load<PackedScene>( ProblemsExplorerPath ); // var pePackedScene = GD.Load<PackedScene>( ProblemsExplorerPath );
// if ( pePackedScene != null ) // if ( pePackedScene != null )
@ -157,6 +160,9 @@ namespace Rokojori
} }
RemoveNode3DGizmoPlugin( gizmoDrawerPlugin ); RemoveNode3DGizmoPlugin( gizmoDrawerPlugin );
inspectorTools.rokojoriPlugin = this;
inspectorTools.RemovePlugins();
} }
bool wasDisposed = true; bool wasDisposed = true;

View File

@ -263,3 +263,14 @@ bool ditherDiscard( float ditherFadeValue, vec4 _FRAGCOORD )
vec3 magic = vec3( 0.06711056, 0.00583715, 52.9829189 ); vec3 magic = vec3( 0.06711056, 0.00583715, 52.9829189 );
return ditherFadeValue < 0.001 || ditherFadeValue < fract( magic.z * fract( dot( _FRAGCOORD.xy, magic.xy ) ) ); return ditherFadeValue < 0.001 || ditherFadeValue < fract( magic.z * fract( dot( _FRAGCOORD.xy, magic.xy ) ) );
} }
bool perlinDiscard( float ditherFadeValue, vec2 _FRAGCOORD, float fadeBlend )
{
float scale = mapClamped( ditherFadeValue, 1.0, 1.0 - fadeBlend, 0.0, 1.0 );
float offset = perlin( _FRAGCOORD ) * scale;
return ( ditherFadeValue + offset ) < 1.0;
}

View File

@ -6,6 +6,7 @@
#include "res://addons/rokojori_action_library/Runtime/Shading/Library/Noise.gdshaderinc" #include "res://addons/rokojori_action_library/Runtime/Shading/Library/Noise.gdshaderinc"
uniform vec4 albedo : source_color; uniform vec4 albedo : source_color;
uniform float multiplyAlbedoByAlpha:hint_range(0,1) = 0;
uniform float driver:hint_range(0,1) = 0; uniform float driver:hint_range(0,1) = 0;
@ -78,6 +79,11 @@ void fragment()
float noise2 = perlin3D( relativeWorldVertex * noiseScale2 + ( noiseScroll2 + noiseScrollFromScanDirection2 * normalizedScanDir )* TIME ); float noise2 = perlin3D( relativeWorldVertex * noiseScale2 + ( noiseScroll2 + noiseScrollFromScanDirection2 * normalizedScanDir )* TIME );
noise2 = mix( 1, noise2, noiseAmount2 ); noise2 = mix( 1, noise2, noiseAmount2 );
ALBEDO = albedo.rgb * scanColor.rgb; float alphaValue = clamp01( albedo.a * scanColor.a * noise * noise2 );
ALPHA = clamp01( albedo.a * scanColor.a * noise * noise2 );
float alphaMultiply = mix( 1.0, alphaValue, multiplyAlbedoByAlpha );
ALBEDO = albedo.rgb * scanColor.rgb * alphaMultiply;
ALPHA = alphaValue;
} }

View File

@ -0,0 +1,24 @@
[gd_resource type="VisualShader" load_steps=2 format=3 uid="uid://cfpq68lhdwdmq"]
[sub_resource type="VisualShaderNodeGlobalExpression" id="VisualShaderNodeGlobalExpression_gj0vb"]
size = Vector2(360, 160)
expression = "#include \"res://addons/rokojori_action_library/Runtime/Shading/Shaders/Effects/Scanner/ScannerBase.gdshaderinc\""
[resource]
code = "shader_type spatial;
render_mode blend_premul_alpha, depth_draw_never, depth_test_default, cull_back, diffuse_lambert, specular_schlick_ggx, unshaded;
// GlobalExpression:0
#include \"res://addons/rokojori_action_library/Runtime/Shading/Shaders/Effects/Scanner/ScannerBase.gdshaderinc\"
"
modes/blend = 4
modes/depth_draw = 2
flags/unshaded = true
nodes/vertex/2/node = SubResource("VisualShaderNodeGlobalExpression_gj0vb")
nodes/vertex/2/position = Vector2(-140, 60)
nodes/vertex/2/size = Vector2(360, 160)
nodes/vertex/2/input_ports = ""
nodes/vertex/2/output_ports = ""
nodes/vertex/2/expression = "#include \"res://addons/rokojori_action_library/Runtime/Shading/Shaders/Effects/Scanner/ScannerBase.gdshaderinc\""

View File

@ -10,6 +10,12 @@ namespace Rokojori
[Export] [Export]
public FlashPreset preset; public FlashPreset preset;
[Export, ReadOnly]
public string test = "3";
[Export, NamedArray ]
public FlareLayer[] layers = [];
[Export] [Export]
public Node[] targets; public Node[] targets;

View File

@ -48,6 +48,7 @@ gradient = SubResource("Gradient_ad8tv")
render_priority = 0 render_priority = 0
shader = ExtResource("4_gli2s") shader = ExtResource("4_gli2s")
shader_parameter/albedo = Color(4.2130003, 4.2130003, 4.2130003, 1) shader_parameter/albedo = Color(4.2130003, 4.2130003, 4.2130003, 1)
shader_parameter/multiplyAlbedoByAlpha = 0.0
shader_parameter/driver = 0.0 shader_parameter/driver = 0.0
shader_parameter/position = Vector3(0, 0, 0) shader_parameter/position = Vector3(0, 0, 0)
shader_parameter/direction = Vector3(0, 1, 0) shader_parameter/direction = Vector3(0, 1, 0)

View File

@ -44,6 +44,7 @@ use_hdr = true
render_priority = 0 render_priority = 0
shader = ExtResource("4_uu110") shader = ExtResource("4_uu110")
shader_parameter/albedo = Color(4.2130003, 4.2130003, 4.2130003, 1) shader_parameter/albedo = Color(4.2130003, 4.2130003, 4.2130003, 1)
shader_parameter/multiplyAlbedoByAlpha = 0.0
shader_parameter/driver = 0.0 shader_parameter/driver = 0.0
shader_parameter/position = Vector3(0, 0, 0) shader_parameter/position = Vector3(0, 0, 0)
shader_parameter/direction = Vector3(0, 1, 0) shader_parameter/direction = Vector3(0, 1, 0)

View File

@ -0,0 +1,7 @@
using System;
namespace Rokojori;
public class InfoAttribute : Attribute
{
}

View File

@ -0,0 +1 @@
uid://umduhx2b15in

View File

@ -0,0 +1,20 @@
using System;
using Godot;
namespace Rokojori.Tools;
#if TOOLS
public partial class InfoAttributeDrawer : GodotEditorAttributeDrawer<InfoAttribute>
{
protected override Control GetPropertyEditor(
Variant.Type type, string name, PropertyHint hintType, string hintString,
PropertyUsageFlags usageFlags, bool wide, object value
)
{
return new Label() { Text = $"{ value.ToString() ?? "" }" };
}
}
#endif

View File

@ -0,0 +1 @@
uid://cxgt07gnemhdw

View File

@ -0,0 +1,7 @@
using System;
namespace Rokojori;
public class NamedArrayAttribute : Attribute
{
}

View File

@ -0,0 +1 @@
uid://co7psqyxy1up7

View File

@ -0,0 +1,117 @@
using System;
using Godot;
using System.Collections.Generic;
namespace Rokojori.Tools;
#if TOOLS
[Tool]
public partial class NamedArrayEditor:EditorProperty
{
VBoxContainer _container;
List<object> _values = [];
bool _updating = false;
Type _arrayItemType;
public NamedArrayEditor( Type arrayItemType )
{
_container = new VBoxContainer();
_arrayItemType = arrayItemType;
AddChild( _container );
AddFocusable( _container );
}
public override void _UpdateProperty()
{
_container.DestroyChildren();
var value = GetEditedObject().Get( GetEditedProperty() ).AsGodotArray();
_updating = true;
for ( int i = 0; i < value.Count; i++ )
{
var hbox = new HBoxContainer();
var label = new Label();
label.Text = ( i + 1 ) + ":";
hbox.AddChild( label );
var item = value[ i ];
var editor = EditorInspector.InstantiatePropertyEditor(
(GodotObject) item, item.VariantType,
"", PropertyHint.None, "",
(uint) PropertyUsageFlags.Editor, false
);
editor.UpdateProperty();
hbox.AddChild( editor );
_container.AddChild( hbox );
}
var button = new Button();
button.Text = "+";
button.Pressed += ()=>
{
var array = GetEditedObject().Get( GetEditedProperty() ).AsGodotArray();
// array.Add( Variant.From<( null ) );
};
_container.AddChild( button );
_updating = false;
}
// Variant CreateDefaultValue( Type type )
// {
// if ( typeof( int ) == type )
// {
// return 0;
// }
// if ( typeof( float ) == type )
// {
// return 0f;
// }
// if ( typeof( bool ) == type )
// {
// return false;
// }
// if ( typeof( string ) == type )
// {
// return "";
// }
// }
}
public partial class NamedArrayAttributeDrawer : GodotEditorAttributeDrawer<NamedArrayAttribute>
{
protected override Control GetPropertyEditor(
Variant.Type type, string name, PropertyHint hintType, string hintString,
PropertyUsageFlags usageFlags, bool wide, object value
)
{
var itemType = ReflectionHelper.GetDataMemberInfo( godotObject, name ).GetType().GetElementType();
return new NamedArrayEditor( itemType );
// var typeName = value == null ? "null" : value.GetType().Name;
// return new Label() { Text = typeName };
}
}
#endif

View File

@ -0,0 +1,7 @@
using System;
namespace Rokojori;
public class ReadOnlyAttribute : Attribute
{
}

View File

@ -0,0 +1 @@
uid://e44nnts2vx27

View File

@ -0,0 +1,20 @@
using System;
using Godot;
namespace Rokojori.Tools;
#if TOOLS
public partial class ReadOnlyAttributeDrawer : GodotEditorAttributeDrawer<ReadOnlyAttribute>
{
protected override Control GetPropertyEditor(
Variant.Type type, string name, PropertyHint hintType, string hintString,
PropertyUsageFlags usageFlags, bool wide, object value
)
{
return new Label() { Text = $"{name}: { value.ToString() ?? "null" }" };
}
}
#endif

View File

@ -18,8 +18,14 @@ public abstract partial class GodotEditorAttributeDrawer<A> : GodotEditorInspect
if ( GetValueOfMemberWithAttribute( obj, name, typeof(A), out object value ) ) if ( GetValueOfMemberWithAttribute( obj, name, typeof(A), out object value ) )
{ {
var control = GetPropertyEditor( type, name, hintType, hintString, usageFlags, wide, value ); var editor = GetPropertyEditor( type, name, hintType, hintString, usageFlags, wide, value );
AddPropertyEditor( name, control );
if ( editor == null )
{
return base._ParseProperty( obj, type, name, hintType, hintString, usageFlags, wide );
}
AddPropertyEditor( name, editor );
return true; return true;
} }
@ -27,6 +33,7 @@ public abstract partial class GodotEditorAttributeDrawer<A> : GodotEditorInspect
return base._ParseProperty( obj, type, name, hintType, hintString, usageFlags, wide ); return base._ParseProperty( obj, type, name, hintType, hintString, usageFlags, wide );
} }
protected abstract Control GetPropertyEditor( protected abstract Control GetPropertyEditor(
Variant.Type type, string name, PropertyHint hintType, Variant.Type type, string name, PropertyHint hintType,
string hintString, PropertyUsageFlags usageFlags, bool wide, object value string hintString, PropertyUsageFlags usageFlags, bool wide, object value

View File

@ -0,0 +1,106 @@
using System;
using System.Collections;
using System.Collections.Generic;
using System.Reflection;
using Godot;
using System.Linq;
namespace Rokojori.Tools;
public class GodotEditorInspectorTools
{
List<EditorInspectorPlugin> registeredPlugins = [];
public RokojoriPlugin rokojoriPlugin;
public void AddPlugins()
{
registeredPlugins = new List<EditorInspectorPlugin>();
// var plugins = GetGodotEditorInspectorPluginsInAssembly();
List<EditorInspectorPlugin> plugins =
[
new InfoAttributeDrawer(),
new ReadOnlyAttributeDrawer(),
new NamedArrayAttributeDrawer()
];
plugins.ForEach(
p =>
{
try
{
rokojoriPlugin.AddInspectorPlugin( p );
RJLog.Log( $"Registered inspector for: {p.GetType().FullName}" );
}
catch ( Exception e )
{
RJLog.Error( $"Error adding inspector automatically: {p.GetType().Name}. Skipping. {e}");
return;
}
registeredPlugins.Add( p );
}
);
}
public void RemovePlugins()
{
registeredPlugins.ForEach( rokojoriPlugin.RemoveInspectorPlugin );
}
static bool IsSubclassOfGeneric( Type type, Type genericBaseType )
{
var it = type.BaseType;
while ( it != null )
{
if ( it.IsGenericType && it.GetGenericTypeDefinition() == genericBaseType )
{
return true;
}
it = it.BaseType;
}
return false;
}
List<EditorInspectorPlugin> GetGodotEditorInspectorPluginsInAssembly()
{
var results = new List<EditorInspectorPlugin>();
var baseType = typeof( GodotEditorInspector<> );
foreach ( var assembly in AppDomain.CurrentDomain.GetAssemblies() )
{
try
{
var types = assembly.GetTypes().Where( t => t.IsClass && ! t.IsAbstract && IsSubclassOfGeneric( t, baseType ) );
foreach ( var type in types )
{
try
{
if ( Activator.CreateInstance( type ) is EditorInspectorPlugin pluginInstance )
{
results.Add(pluginInstance);
}
}
catch ( Exception e )
{
RJLog.Error( $"Unable creating instance of type {type.Name}. {e.Message}" );
}
}
}
catch ( ReflectionTypeLoadException e )
{
RJLog.Error( $"Unable to load types from assembly: {assembly.FullName}. {e.Message} ");
}
}
return results;
}
}

View File

@ -0,0 +1 @@
uid://bfq4t4jyytoft