v0.2 update

This commit is contained in:
Josef 2025-10-24 13:38:51 +02:00
parent d2ac6aced9
commit 3d008531fd
277 changed files with 5620 additions and 1325 deletions

210
Icons/Collidable.svg Normal file
View File

@ -0,0 +1,210 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
height="16"
viewBox="0 0 16 16"
width="16"
version="1.1"
id="svg4"
sodipodi:docname="Collidable.svg"
inkscape:version="1.2.2 (732a01da63, 2022-12-09)"
xml:space="preserve"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"><defs
id="defs8"><linearGradient
inkscape:collect="never"
id="linearGradient19861"><stop
style="stop-color:#a7ceef;stop-opacity:1;"
offset="0"
id="stop19857" /><stop
style="stop-color:#609acd;stop-opacity:1;"
offset="1"
id="stop19859" /></linearGradient><linearGradient
inkscape:collect="never"
id="linearGradient19830"><stop
style="stop-color:#1969cc;stop-opacity:1;"
offset="0"
id="stop19826" /><stop
style="stop-color:#237be5;stop-opacity:1;"
offset="1"
id="stop19828" /></linearGradient><linearGradient
inkscape:collect="never"
id="linearGradient95490"><stop
style="stop-color:#66a3e2;stop-opacity:1;"
offset="0"
id="stop95486" /><stop
style="stop-color:#66a3e2;stop-opacity:0;"
offset="1"
id="stop95488" /></linearGradient><linearGradient
inkscape:collect="never"
id="linearGradient91391"><stop
style="stop-color:#90c3ed;stop-opacity:1;"
offset="0"
id="stop91387" /><stop
style="stop-color:#1969cc;stop-opacity:1;"
offset="1"
id="stop91389" /></linearGradient><linearGradient
inkscape:collect="never"
id="linearGradient10929"><stop
style="stop-color:#1d52db;stop-opacity:1;"
offset="0"
id="stop10925" /><stop
style="stop-color:#152ebe;stop-opacity:1;"
offset="1"
id="stop10927" /></linearGradient><linearGradient
inkscape:collect="never"
id="linearGradient10150"><stop
style="stop-color:#000000;stop-opacity:1;"
offset="0"
id="stop10146" /><stop
style="stop-color:#000000;stop-opacity:1;"
offset="1"
id="stop10148" /></linearGradient><linearGradient
inkscape:collect="never"
id="linearGradient2791"><stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop2787" /><stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0.14208783"
id="stop2795" /><stop
style="stop-color:#d1d1d1;stop-opacity:1;"
offset="1"
id="stop2789" /></linearGradient><linearGradient
inkscape:collect="never"
id="linearGradient2770"><stop
style="stop-color:#cbe6ef;stop-opacity:1;"
offset="0"
id="stop2766" /><stop
style="stop-color:#5a87eb;stop-opacity:1;"
offset="0.17897609"
id="stop2774" /><stop
style="stop-color:#1b47d2;stop-opacity:1;"
offset="1"
id="stop2768" /></linearGradient><linearGradient
inkscape:collect="never"
id="linearGradient2638"><stop
style="stop-color:#5d7dc1;stop-opacity:1;"
offset="0"
id="stop2634" /><stop
style="stop-color:#5769b2;stop-opacity:1;"
offset="1"
id="stop2636" /></linearGradient><linearGradient
inkscape:collect="never"
xlink:href="#linearGradient2638"
id="linearGradient2640"
x1="5.5241203"
y1="10.765742"
x2="13.133284"
y2="9.9986429"
gradientUnits="userSpaceOnUse" /><radialGradient
inkscape:collect="never"
xlink:href="#linearGradient2770"
id="radialGradient2772"
cx="6.0584679"
cy="3.4481783"
fx="6.0584679"
fy="3.4481783"
r="6.1221313"
gradientTransform="matrix(5.0826908,0,0,3.6467239,-6.1662076,-17.350757)"
gradientUnits="userSpaceOnUse" /><radialGradient
inkscape:collect="never"
xlink:href="#linearGradient2791"
id="radialGradient2793"
cx="8.2773142"
cy="-0.40066716"
fx="8.2773142"
fy="-0.40066716"
r="3.5763378"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1.3511087,0.88894441,-1.2043804,1.1301171,16.062243,-9.6517622)" /><linearGradient
inkscape:collect="never"
xlink:href="#linearGradient10150"
id="linearGradient10152"
x1="9.9135351"
y1="9.4398756"
x2="13.804861"
y2="14.243992"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1.0751754,0,0,1.2252487,20.002377,-7.9560723)" /><linearGradient
inkscape:collect="never"
xlink:href="#linearGradient10929"
id="linearGradient10931"
x1="9.6400452"
y1="10.368964"
x2="13.999562"
y2="9.1402229"
gradientUnits="userSpaceOnUse" /><linearGradient
inkscape:collect="never"
xlink:href="#linearGradient10929"
id="linearGradient21854"
gradientUnits="userSpaceOnUse"
x1="9.6400452"
y1="10.368964"
x2="13.999562"
y2="9.1402229" /><linearGradient
inkscape:collect="never"
xlink:href="#linearGradient91391"
id="linearGradient91393"
x1="8.9645748"
y1="8.594615"
x2="11.664056"
y2="18.916397"
gradientUnits="userSpaceOnUse" /><linearGradient
xlink:href="#linearGradient91391"
id="linearGradient95492"
x1="23.753363"
y1="53.728447"
x2="4.2730064"
y2="5.2054238"
gradientUnits="userSpaceOnUse" /><linearGradient
inkscape:collect="never"
xlink:href="#linearGradient19830"
id="linearGradient19832"
x1="5.7427268"
y1="-0.24260253"
x2="9.9340897"
y2="16.282267"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1.1102298,0,0,1.1102298,-0.9806513,-1.3439792)" /><linearGradient
inkscape:collect="never"
xlink:href="#linearGradient19861"
id="linearGradient19863"
x1="9.7719393"
y1="0.063413613"
x2="14.320319"
y2="16.945301"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1.1102298,0,0,1.1102298,-0.9806513,-1.3439792)" /></defs><sodipodi:namedview
id="namedview6"
pagecolor="#505050"
bordercolor="#eeeeee"
borderopacity="1"
inkscape:showpageshadow="0"
inkscape:pageopacity="0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#505050"
showgrid="false"
inkscape:zoom="10.363534"
inkscape:cx="4.9693473"
inkscape:cy="9.8422025"
inkscape:window-width="1920"
inkscape:window-height="1017"
inkscape:window-x="-8"
inkscape:window-y="-8"
inkscape:window-maximized="1"
inkscape:current-layer="g84165" /><g
id="g560"
transform="translate(0.08802232,0.240022)"><g
id="g2600"
transform="translate(-0.10534391,-0.05878716)"><g
id="g10886"
transform="matrix(0.94595208,0,0,0.94595208,0.43331955,0.43182955)"><g
id="g84165"
transform="translate(0,-0.15300804)"><path
id="path16907"
style="color:#000000;fill:url(#linearGradient19863);fill-opacity:1;stroke:url(#linearGradient19832);stroke-width:1.64313;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke fill markers"
d="m 8.1730505,1.3905012 c -0.1232363,-0.00123 -0.2454498,0.022464 -0.3592888,0.06968 l -5.8436272,1.243978 c -0.3522014,0.144687 -0.577778,0.4925955 -0.566152,0.8731805 l 0.2286381,7.2946493 c 0.010129,0.314385 0.1812183,0.601467 0.4529216,0.759951 l 5.5831295,3.248841 c 0.3026238,0.175479 0.6788703,0.162797 0.9689909,-0.03266 l 5.1628714,-3.462237 c 0.252739,-0.169412 0.404583,-0.453506 0.405014,-0.757773 l 0.0043,-7.105206 C 14.209636,3.160464 13.995223,2.8324176 13.66335,2.6867392 L 8.5301618,1.4688914 C 8.4176206,1.4189721 8.2961528,1.3923084 8.1730505,1.3905012 Z M 8.120637,2.7254708 11.341059,3.5001203 8.1144118,4.4182759 4.7697509,3.5542065 Z M 3.2766388,5.0188499 7.0191256,6.3758553 6.9653369,12.359228 3.4421295,10.308014 Z m 9.1041592,0.041373 -0.0023,5.0801241 -3.1856931,2.136134 0.053789,-5.9267558 z"
sodipodi:nodetypes="ccccccccccccccccccccccccccccc" /></g></g></g></g></svg>

After

Width:  |  Height:  |  Size: 8.3 KiB

View File

@ -0,0 +1,43 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://dg7on2hj1wbey"
path="res://.godot/imported/Collidable.svg-8482075c469ae7f520a2601ba58d7e98.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://addons/rokojori_action_library/Icons/Collidable.svg"
dest_files=["res://.godot/imported/Collidable.svg-8482075c469ae7f520a2601ba58d7e98.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

213
Icons/Collider.svg Normal file
View File

@ -0,0 +1,213 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
height="16"
viewBox="0 0 16 16"
width="16"
version="1.1"
id="svg4"
sodipodi:docname="Collider.svg"
inkscape:version="1.2.2 (732a01da63, 2022-12-09)"
xml:space="preserve"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"><defs
id="defs8"><linearGradient
inkscape:collect="never"
id="linearGradient95490"><stop
style="stop-color:#66a3e2;stop-opacity:1;"
offset="0"
id="stop95486" /><stop
style="stop-color:#66a3e2;stop-opacity:0;"
offset="1"
id="stop95488" /></linearGradient><linearGradient
inkscape:collect="never"
id="linearGradient91391"><stop
style="stop-color:#90c3ed;stop-opacity:1;"
offset="0"
id="stop91387" /><stop
style="stop-color:#1969cc;stop-opacity:1;"
offset="1"
id="stop91389" /></linearGradient><linearGradient
inkscape:collect="never"
id="linearGradient10929"><stop
style="stop-color:#1d52db;stop-opacity:1;"
offset="0"
id="stop10925" /><stop
style="stop-color:#152ebe;stop-opacity:1;"
offset="1"
id="stop10927" /></linearGradient><linearGradient
inkscape:collect="never"
id="linearGradient10150"><stop
style="stop-color:#000000;stop-opacity:1;"
offset="0"
id="stop10146" /><stop
style="stop-color:#000000;stop-opacity:1;"
offset="1"
id="stop10148" /></linearGradient><linearGradient
inkscape:collect="never"
id="linearGradient2791"><stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop2787" /><stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0.14208783"
id="stop2795" /><stop
style="stop-color:#d1d1d1;stop-opacity:1;"
offset="1"
id="stop2789" /></linearGradient><linearGradient
inkscape:collect="never"
id="linearGradient2770"><stop
style="stop-color:#cbe6ef;stop-opacity:1;"
offset="0"
id="stop2766" /><stop
style="stop-color:#5a87eb;stop-opacity:1;"
offset="0.17897609"
id="stop2774" /><stop
style="stop-color:#1b47d2;stop-opacity:1;"
offset="1"
id="stop2768" /></linearGradient><linearGradient
inkscape:collect="never"
id="linearGradient2638"><stop
style="stop-color:#5d7dc1;stop-opacity:1;"
offset="0"
id="stop2634" /><stop
style="stop-color:#5769b2;stop-opacity:1;"
offset="1"
id="stop2636" /></linearGradient><linearGradient
inkscape:collect="never"
xlink:href="#linearGradient2638"
id="linearGradient2640"
x1="5.5241203"
y1="10.765742"
x2="13.133284"
y2="9.9986429"
gradientUnits="userSpaceOnUse" /><radialGradient
inkscape:collect="never"
xlink:href="#linearGradient2770"
id="radialGradient2772"
cx="6.0584679"
cy="3.4481783"
fx="6.0584679"
fy="3.4481783"
r="6.1221313"
gradientTransform="matrix(5.0826908,0,0,3.6467239,-6.1662076,-17.350757)"
gradientUnits="userSpaceOnUse" /><radialGradient
inkscape:collect="never"
xlink:href="#linearGradient2791"
id="radialGradient2793"
cx="8.2773142"
cy="-0.40066716"
fx="8.2773142"
fy="-0.40066716"
r="3.5763378"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1.3511087,0.88894441,-1.2043804,1.1301171,16.062243,-9.6517622)" /><linearGradient
inkscape:collect="never"
xlink:href="#linearGradient10150"
id="linearGradient10152"
x1="9.9135351"
y1="9.4398756"
x2="13.804861"
y2="14.243992"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1.0751754,0,0,1.2252487,20.002377,-7.9560723)" /><linearGradient
inkscape:collect="never"
xlink:href="#linearGradient10929"
id="linearGradient10931"
x1="9.6400452"
y1="10.368964"
x2="13.999562"
y2="9.1402229"
gradientUnits="userSpaceOnUse" /><linearGradient
inkscape:collect="never"
xlink:href="#linearGradient10929"
id="linearGradient21854"
gradientUnits="userSpaceOnUse"
x1="9.6400452"
y1="10.368964"
x2="13.999562"
y2="9.1402229" /><linearGradient
inkscape:collect="never"
xlink:href="#linearGradient91391"
id="linearGradient91393"
x1="8.9645748"
y1="8.594615"
x2="11.664056"
y2="18.916397"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.96377216,0,0,0.96377216,0.26239556,0.1404646)" /><linearGradient
xlink:href="#linearGradient91391"
id="linearGradient95492"
x1="23.753363"
y1="53.728447"
x2="4.2730064"
y2="5.2054238"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.96377216,0,0,0.96377216,0.26239556,0.1404646)" /><linearGradient
xlink:href="#linearGradient19861"
id="linearGradient19863"
x1="9.7719393"
y1="0.063413613"
x2="14.320319"
y2="16.945301"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1.0137275,0,0,1.0137275,-0.0416865,-0.2688203)" /><linearGradient
id="linearGradient19861"><stop
style="stop-color:#a7ceef;stop-opacity:1;"
offset="0"
id="stop19857" /><stop
style="stop-color:#609acd;stop-opacity:1;"
offset="1"
id="stop19859" /></linearGradient><linearGradient
xlink:href="#linearGradient19830"
id="linearGradient19832"
x1="5.7427268"
y1="-0.24260253"
x2="9.9340897"
y2="16.282267"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1.0137275,0,0,1.0137275,-0.14987951,-0.48520634)" /><linearGradient
id="linearGradient19830"><stop
style="stop-color:#1969cc;stop-opacity:1;"
offset="0"
id="stop19826" /><stop
style="stop-color:#237be5;stop-opacity:1;"
offset="1"
id="stop19828" /></linearGradient></defs><sodipodi:namedview
id="namedview6"
pagecolor="#505050"
bordercolor="#eeeeee"
borderopacity="1"
inkscape:showpageshadow="0"
inkscape:pageopacity="0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#505050"
showgrid="false"
inkscape:zoom="5.1817672"
inkscape:cx="-5.6930384"
inkscape:cy="11.772046"
inkscape:window-width="1920"
inkscape:window-height="1017"
inkscape:window-x="-8"
inkscape:window-y="-8"
inkscape:window-maximized="1"
inkscape:current-layer="g84165" /><g
id="g560"
transform="translate(0.08802232,0.240022)"><g
id="g2600"
transform="translate(-0.10534391,-0.05878716)"><g
id="g10886"
transform="matrix(0.94595208,0,0,0.94595208,0.43331955,0.43182955)"><g
id="g84165"
transform="translate(0,-0.15300804)"><circle
style="opacity:1;fill:#1b6acd;stroke:none;stroke-width:1.01304;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:0.569672;paint-order:stroke markers fill;fill-opacity:1"
id="path6905"
cx="8.0173216"
cy="7.9620037"
r="8.2843113" /><path
id="path16907"
style="color:#000000;fill:url(#linearGradient19863);fill-opacity:1;stroke:none;stroke-width:1.50031;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke fill markers"
d="M 8.3163653,2.2279763 C 8.2038411,2.2268532 8.092251,2.2484877 7.988307,2.2915996 L 2.6526132,3.4274498 C 2.3310259,3.5595606 2.1250563,3.8772281 2.1356717,4.2247322 l 0.2087655,6.6605918 c 0.00925,0.287058 0.1654663,0.549187 0.4135526,0.693895 l 5.0978386,2.966449 c 0.2763187,0.160226 0.6198619,0.148646 0.8847653,-0.02982 l 4.7141083,-2.906284 c 0.230771,-0.154687 0.369416,-0.414087 0.36981,-0.691907 l 0.0804,-6.870134 C 13.904749,3.7165857 13.708973,3.4170529 13.405946,3.2840372 L 8.6424368,2.2995527 C 8.539678,2.2539727 8.4287681,2.2296264 8.3163653,2.2279763 Z M 8.2685109,3.4469089 11.285514,4.0267185 8.262827,4.9925741 5.2088873,4.20361 Z M 3.8455582,5.5409456 7.2627443,6.7799983 7.2136298,12.24329 3.9966627,10.37037 Z m 8.3893198,-0.089733 -0.0786,5.0210744 -2.9087891,1.695446 0.049114,-5.4115965 z"
sodipodi:nodetypes="ccccccccccccccccccccccccccccc" /></g></g></g></g></svg>

After

Width:  |  Height:  |  Size: 8.6 KiB

43
Icons/Collider.svg.import Normal file
View File

@ -0,0 +1,43 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://xsgi8ucjgdbg"
path="res://.godot/imported/Collider.svg-8f5313483cb1b4b6e56ac5d4f044ae74.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://addons/rokojori_action_library/Icons/Collider.svg"
dest_files=["res://.godot/imported/Collider.svg-8f5313483cb1b4b6e56ac5d4f044ae74.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

60
Icons/GDScriptAction.svg Normal file
View File

@ -0,0 +1,60 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
height="16"
viewBox="0 0 16 16"
width="16"
version="1.1"
id="svg4"
sodipodi:docname="GDScriptAction.svg"
inkscape:version="1.2.2 (732a01da63, 2022-12-09)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<defs
id="defs8" />
<sodipodi:namedview
id="namedview6"
pagecolor="#505050"
bordercolor="#eeeeee"
borderopacity="1"
inkscape:showpageshadow="0"
inkscape:pageopacity="0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#505050"
showgrid="false"
inkscape:zoom="16"
inkscape:cx="19.59375"
inkscape:cy="5.125"
inkscape:window-width="1920"
inkscape:window-height="1017"
inkscape:window-x="-8"
inkscape:window-y="-8"
inkscape:window-maximized="1"
inkscape:current-layer="svg4" />
<path
id="path1741"
style="fill:#f7b200;fill-opacity:1;stroke:none;stroke-width:0.534077;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1;paint-order:fill markers stroke"
inkscape:transform-center-y="-0.68247574"
d="M 8,0.93468771 5.4928705,4.6302281 1.2031246,5.8742369 3.9413341,9.4012453 3.7988638,13.864735 8,12.349685 12.201136,13.864735 12.058666,9.4012453 14.796875,5.8742369 10.507129,4.6302281 Z M 8.2137054,4.9290682 c 0.4239975,0 0.8065835,0.041512 1.1484495,0.1233584 0.3425058,0.082089 0.578204,0.1926273 0.7054021,0.3318515 0.0059,0.048284 0.0087,0.1383351 0.0087,0.2710411 0,0.1337522 -0.04491,0.3238646 -0.1355203,0.5698811 C 9.8496947,6.4699292 9.746622,6.6531166 9.6314549,6.7742321 9.5164587,6.8956754 9.4326074,6.9549262 9.3812632,6.9549262 c -0.051585,0 -0.1059396,-0.021325 -0.1633195,-0.06776 C 9.1600756,6.8420127 9.0472101,6.7943823 8.8774049,6.742958 8.7076783,6.6910512 8.5433606,6.6647728 8.3857087,6.6647728 c -0.3752295,0 -0.6794175,0.1210509 -0.9121573,0.3631255 -0.2332233,0.242345 -0.3509634,0.6182626 -0.3509634,1.1276002 0,0.5082627 0.1199882,0.8932548 0.3596506,1.1571366 0.2391293,0.2635632 0.5149343,0.3961372 0.8270226,0.3961372 0.3116901,0 0.467372,-0.07864 0.467372,-0.236292 l 0.00695,-0.4256738 H 8.2206552 V 8.0912131 c 0,0 0.5585403,-0.1013832 1.0476778,-0.093822 0.4891082,0.00837 0.926057,0.083238 0.926057,0.2484543 L 10.1579,11.090039 c -0.1213,0.08466 -0.3647304,0.166925 -0.7314637,0.248454 -0.366364,0.08185 -0.7855063,0.123358 -1.2579083,0.123358 -0.8784476,0 -1.5869534,-0.283786 -2.1266296,-0.853084 C 5.5031827,10.039406 5.2339882,9.2025489 5.2339882,8.0999002 5.2339882,7.16076 5.4972359,6.3976773 6.024524,5.8099511 6.5514072,5.2224886 7.2806803,4.9290677 8.2137019,4.9290682 Z" />
<path
style="fill:none;stroke:#f7b200;stroke-width:0.979;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;paint-order:stroke fill markers"
d="M 0.64081552,2.8726213 V 0.66291261 H 2.7400388"
id="path46127" />
<path
style="fill:none;stroke:#f7b200;stroke-width:0.979;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;paint-order:stroke fill markers"
d="M 15.379573,2.7842329 V 0.57452426 H 13.28035"
id="path46129" />
<g
id="g46137"
transform="matrix(1,0,0,-1,0,16.042485)">
<path
style="fill:none;stroke:#f7b200;stroke-width:0.979;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;paint-order:stroke fill markers"
d="M 0.64081552,2.8726213 V 0.66291261 H 2.7400388"
id="path46131" />
<path
style="fill:none;stroke:#f7b200;stroke-width:0.979;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;paint-order:stroke fill markers"
d="M 15.379573,2.7842329 V 0.57452426 H 13.28035"
id="path46133" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 3.8 KiB

View File

@ -0,0 +1,43 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://dw1dtygiamsdq"
path="res://.godot/imported/GDScriptAction.svg-5229bd85d169d26c8b21208a93a35aae.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://addons/rokojori_action_library/Icons/GDScriptAction.svg"
dest_files=["res://.godot/imported/GDScriptAction.svg-5229bd85d169d26c8b21208a93a35aae.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

View File

@ -0,0 +1,65 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
height="16"
viewBox="0 0 16 16"
width="16"
version="1.1"
id="svg4"
sodipodi:docname="GDScriptSequenceAction.svg"
inkscape:version="1.2.2 (732a01da63, 2022-12-09)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<defs
id="defs8" />
<sodipodi:namedview
id="namedview6"
pagecolor="#505050"
bordercolor="#eeeeee"
borderopacity="1"
inkscape:showpageshadow="0"
inkscape:pageopacity="0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#505050"
showgrid="false"
inkscape:zoom="22.627417"
inkscape:cx="6.1650873"
inkscape:cy="6.3197669"
inkscape:window-width="1920"
inkscape:window-height="1017"
inkscape:window-x="-8"
inkscape:window-y="-8"
inkscape:window-maximized="1"
inkscape:current-layer="svg4" />
<path
id="path1741"
style="fill:none;fill-opacity:1;stroke:#f7b200;stroke-width:0.94549;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1;paint-order:fill markers stroke"
inkscape:transform-center-y="-0.64527415"
d="M 8,1.1041732 5.6288873,4.5980559 1.5736197,5.7743789 4.1626384,9.107602 4.0278321,13.329069 8,11.89606 11.972168,13.329069 11.837362,9.107602 14.42638,5.7743789 10.371112,4.5980559 Z" />
<path
style="fill:none;stroke:#f7b200;stroke-width:0.979;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;paint-order:stroke fill markers"
d="M 0.64081552,2.8726213 V 0.66291261 H 2.7400388"
id="path46127" />
<path
style="fill:none;stroke:#f7b200;stroke-width:0.979;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;paint-order:stroke fill markers"
d="M 15.379573,2.7842329 V 0.57452426 H 13.28035"
id="path46129" />
<g
id="g46137"
transform="matrix(1,0,0,-1,0,16.042485)">
<path
style="fill:none;stroke:#f7b200;stroke-width:0.979;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;paint-order:stroke fill markers"
d="M 0.64081552,2.8726213 V 0.66291261 H 2.7400388"
id="path46131" />
<path
style="fill:none;stroke:#f7b200;stroke-width:0.979;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;paint-order:stroke fill markers"
d="M 15.379573,2.7842329 V 0.57452426 H 13.28035"
id="path46133" />
</g>
<path
id="path348"
style="fill:#f7b200;fill-opacity:1;stroke:none;stroke-width:0.467468;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1;paint-order:fill markers stroke"
inkscape:transform-center-y="-0.59735854"
d="M 8.1561373,4.9694219 C 7.3394817,4.9694215 6.7026274,5.226228 6.241458,5.7404222 5.7799323,6.2548473 5.5490959,6.9219865 5.5490959,7.7439974 c 0,0.9651266 0.2345108,1.6984029 0.7060383,2.1967526 0.4723678,0.498294 1.0927957,0.745357 1.8616836,0.745358 0.4134832,-1e-6 0.7802701,-0.03606 1.1009402,-0.107701 0.3209957,-0.07136 0.5349041,-0.14301 0.6410758,-0.217111 l 0.032482,-2.4890835 c 0,-0.1446107 -0.3839214,-0.2097848 -0.8120289,-0.217111 -0.428131,-0.00662 -0.9163108,0.082058 -0.9163108,0.082058 v 0.8359627 h 0.4923461 l -0.00513,0.3726786 c 0,0.1379897 -0.1374735,0.2068538 -0.4102884,0.2068538 -0.273165,0 -0.5138282,-0.1163441 -0.7231335,-0.3470357 C 7.3069982,8.5746482 7.2022165,8.2384462 7.2022165,7.7935739 c 0,-0.4458132 0.1018705,-0.7759916 0.3060064,-0.9881113 0.2037131,-0.2118832 0.4699214,-0.3179735 0.7983534,-0.3179735 0.1379882,0 0.2822435,0.022948 0.4308025,0.068381 0.1486272,0.045011 0.2485161,0.086983 0.2991687,0.1265056 0.050224,0.040644 0.096744,0.059833 0.1418911,0.059833 0.044941,0 0.1181666,-0.05269 0.2188205,-0.1589867 C 9.4980627,6.4772127 9.5893896,6.3170497 9.6690753,6.1028434 9.7483846,5.88751 9.7870335,5.7224394 9.7870335,5.6053687 c 0,-0.116155 -0.00166,-0.1953633 -0.00683,-0.2376254 C 9.6688626,5.2458835 9.4611328,5.1489735 9.1613435,5.0771226 8.8621143,5.0054841 8.5272533,4.9694219 8.1561373,4.9694219 Z" />
</svg>

After

Width:  |  Height:  |  Size: 4.1 KiB

View File

@ -0,0 +1,43 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://ktq8w2ep7qtj"
path="res://.godot/imported/GDScriptSequenceAction.svg-871462890bc760a2e2f4ebebacc73b30.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://addons/rokojori_action_library/Icons/GDScriptSequenceAction.svg"
dest_files=["res://.godot/imported/GDScriptSequenceAction.svg-871462890bc760a2e2f4ebebacc73b30.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

40
Icons/RJ_Action.svg Normal file
View File

@ -0,0 +1,40 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
height="16"
viewBox="0 0 16 16"
width="16"
version="1.1"
id="svg4"
sodipodi:docname="RJ_Action.svg"
inkscape:version="1.2.2 (732a01da63, 2022-12-09)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<defs
id="defs8" />
<sodipodi:namedview
id="namedview6"
pagecolor="#505050"
bordercolor="#eeeeee"
borderopacity="1"
inkscape:showpageshadow="0"
inkscape:pageopacity="0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#505050"
showgrid="false"
inkscape:zoom="45.254834"
inkscape:cx="10.131514"
inkscape:cy="8.905126"
inkscape:window-width="1920"
inkscape:window-height="1017"
inkscape:window-x="-8"
inkscape:window-y="-8"
inkscape:window-maximized="1"
inkscape:current-layer="svg4" />
<path
id="path1741"
style="opacity:1;fill:#f7b200;fill-opacity:1;stroke:none;stroke-width:0.600376;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1;paint-order:fill markers stroke"
inkscape:transform-center-y="-0.7671971"
d="M 8,0.13580032 5.1816407,4.2900974 0.35937464,5.6885349 3.4374998,9.6533786 3.2773435,14.670957 8,12.967832 12.722656,14.670957 12.5625,9.6533786 15.640625,5.6885349 10.818359,4.2900974 Z M 8.2402344,4.6260349 c 0.4766316,0 0.9067111,0.046665 1.2910156,0.1386719 0.3850238,0.092278 0.649981,0.2165397 0.792969,0.3730468 0.0066,0.054278 0.0098,0.1555077 0.0098,0.3046876 0,0.1503559 -0.05047,0.3640685 -0.152343,0.640625 -0.102325,0.275109 -0.218193,0.4810368 -0.3476566,0.6171875 -0.1292717,0.1365189 -0.2235321,0.2031249 -0.28125,0.2031249 -0.057989,0 -0.1190909,-0.023972 -0.1835938,-0.076172 C 9.3040888,6.7764484 9.1772126,6.7229054 8.9863282,6.6650974 8.7955319,6.6067464 8.6108163,6.5772068 8.4335937,6.5772068 c -0.4218096,0 -0.7637589,0.1360779 -1.0253905,0.4082031 C 7.146028,7.2578391 7.0136719,7.6804224 7.0136719,8.252988 c 0,0.5713575 0.1348832,1.0041417 0.4042968,1.3007813 0.2688143,0.2962807 0.5788573,0.4453125 0.9296875,0.4453125 0.3503827,0 0.5253907,-0.088402 0.5253907,-0.265625 l 0.00781,-0.4785157 h -0.63281 V 8.1807224 c 0,0 0.6278763,-0.1139687 1.1777344,-0.1054687 0.549825,0.00941 1.0410157,0.093572 1.0410157,0.2792968 l -0.04102,3.1972655 c -0.136358,0.09517 -0.410007,0.187647 -0.8222653,0.279297 -0.4118438,0.09201 -0.8830176,0.138672 -1.4140626,0.138672 -0.9874962,0 -1.7839544,-0.319015 -2.3906253,-0.958984 C 5.193237,10.37076 4.8906252,9.4300173 4.8906252,8.190488 4.8906252,7.1347648 5.186552,6.2769546 5.7792965,5.6162693 6.3715863,4.9558804 7.1913899,4.6260349 8.2402344,4.6260349 Z" />
</svg>

After

Width:  |  Height:  |  Size: 2.8 KiB

View File

@ -0,0 +1,43 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://bc02q72sijom4"
path="res://.godot/imported/RJ_Action.svg-e2ec937a63457fcfbd6e5b3d52f60bb6.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://addons/rokojori_action_library/Icons/RJ_Action.svg"
dest_files=["res://.godot/imported/RJ_Action.svg-e2ec937a63457fcfbd6e5b3d52f60bb6.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

View File

@ -0,0 +1,45 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
height="16"
viewBox="0 0 16 16"
width="16"
version="1.1"
id="svg4"
sodipodi:docname="RJ_SequenceAction.svg"
inkscape:version="1.2.2 (732a01da63, 2022-12-09)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<defs
id="defs8" />
<sodipodi:namedview
id="namedview6"
pagecolor="#505050"
bordercolor="#eeeeee"
borderopacity="1"
inkscape:showpageshadow="0"
inkscape:pageopacity="0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#505050"
showgrid="false"
inkscape:zoom="16"
inkscape:cx="12.03125"
inkscape:cy="3.5"
inkscape:window-width="1920"
inkscape:window-height="1017"
inkscape:window-x="-8"
inkscape:window-y="-8"
inkscape:window-maximized="1"
inkscape:current-layer="svg4" />
<path
id="path1741-9"
style="fill:none;fill-opacity:1;stroke:#f7b200;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1;paint-order:fill markers stroke"
inkscape:transform-center-y="-0.68247574"
d="M 8,0.93554688 5.4921875,4.6308594 1.203125,5.875 3.9414062,9.4003906 3.7988281,13.865234 8,12.349609 12.201172,13.865234 12.058594,9.4003906 14.796875,5.875 10.507812,4.6308594 Z" />
<path
id="path348"
style="fill:#f7b200;fill-opacity:1;stroke:none;stroke-width:0.467468;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1;paint-order:fill markers stroke"
inkscape:transform-center-y="-0.59735854"
d="M 8.1561373,5.2345869 C 7.3394817,5.2345865 6.7026274,5.491393 6.241458,6.0055872 5.7799323,6.5200123 5.5490959,7.1871515 5.5490959,8.0091624 c 0,0.9651266 0.2345108,1.6984029 0.7060383,2.1967526 0.4723678,0.498294 1.0927957,0.745357 1.8616836,0.745358 0.4134832,-1e-6 0.7802701,-0.03606 1.1009402,-0.107701 0.3209957,-0.07136 0.5349041,-0.14301 0.6410758,-0.217111 l 0.032482,-2.4890835 c 0,-0.1446107 -0.3839214,-0.2097848 -0.8120289,-0.217111 -0.428131,-0.00662 -0.9163108,0.082058 -0.9163108,0.082058 v 0.8359627 h 0.4923461 l -0.00513,0.3726786 c 0,0.1379897 -0.1374735,0.2068538 -0.4102884,0.2068538 -0.273165,0 -0.5138282,-0.1163441 -0.7231335,-0.3470357 C 7.3069982,8.8398132 7.2022165,8.5036112 7.2022165,8.0587389 c 0,-0.4458132 0.1018705,-0.7759916 0.3060064,-0.9881113 0.2037131,-0.2118832 0.4699214,-0.3179735 0.7983534,-0.3179735 0.1379882,0 0.2822435,0.022948 0.4308025,0.068381 0.1486272,0.045011 0.2485161,0.086983 0.2991687,0.1265056 0.050224,0.040644 0.096744,0.059833 0.1418911,0.059833 0.044941,0 0.1181666,-0.05269 0.2188205,-0.1589867 C 9.4980627,6.7423777 9.5893896,6.5822147 9.6690753,6.3680084 9.7483846,6.152675 9.7870335,5.9876044 9.7870335,5.8705337 c 0,-0.116155 -0.00166,-0.1953633 -0.00683,-0.2376254 C 9.6688626,5.5110485 9.4611328,5.4141385 9.1613435,5.3422876 8.8621143,5.2706491 8.5272533,5.2345869 8.1561373,5.2345869 Z" />
</svg>

After

Width:  |  Height:  |  Size: 3.0 KiB

View File

@ -0,0 +1,43 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://didqgj0wwsx4l"
path="res://.godot/imported/RJ_SequenceAction.svg-1ef2c9c94a8c9f5c9dcc7af742ad00d8.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://addons/rokojori_action_library/Icons/RJ_SequenceAction.svg"
dest_files=["res://.godot/imported/RJ_SequenceAction.svg-1ef2c9c94a8c9f5c9dcc7af742ad00d8.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

View File

@ -150,9 +150,9 @@
inkscape:pagecheckerboard="0" inkscape:pagecheckerboard="0"
inkscape:deskcolor="#505050" inkscape:deskcolor="#505050"
showgrid="false" showgrid="false"
inkscape:zoom="22.627417" inkscape:zoom="2"
inkscape:cx="1.4584077" inkscape:cx="-101.25"
inkscape:cy="13.34664" inkscape:cy="-9.5"
inkscape:window-width="1920" inkscape:window-width="1920"
inkscape:window-height="1017" inkscape:window-height="1017"
inkscape:window-x="-8" inkscape:window-x="-8"

Before

Width:  |  Height:  |  Size: 7.3 KiB

After

Width:  |  Height:  |  Size: 7.3 KiB

198
Icons/WindManager.svg Normal file
View File

@ -0,0 +1,198 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
height="16"
viewBox="0 0 16 16"
width="16"
version="1.1"
id="svg4"
sodipodi:docname="RenderingManager.svg"
inkscape:version="1.2.2 (732a01da63, 2022-12-09)"
xml:space="preserve"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"><defs
id="defs8"><linearGradient
inkscape:collect="never"
id="linearGradient7321"><stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop7317" /><stop
style="stop-color:#ffffff;stop-opacity:0;"
offset="1"
id="stop7319" /></linearGradient><linearGradient
inkscape:collect="never"
id="linearGradient2490"><stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop2480" /><stop
style="stop-color:#f0ece9;stop-opacity:0.15384616;"
offset="0.16326228"
id="stop2482" /><stop
style="stop-color:#9f9492;stop-opacity:0;"
offset="0.34845719"
id="stop2484" /><stop
style="stop-color:#322834;stop-opacity:0.66666675;"
offset="0.75751561"
id="stop2486" /><stop
style="stop-color:#020203;stop-opacity:1;"
offset="1"
id="stop2488" /></linearGradient><linearGradient
inkscape:collect="never"
id="linearGradient1031"><stop
style="stop-color:#000000;stop-opacity:1;"
offset="0"
id="stop1027" /><stop
style="stop-color:#000000;stop-opacity:0;"
offset="1"
id="stop1029" /></linearGradient><linearGradient
inkscape:collect="never"
id="linearGradient33765"><stop
style="stop-color:#bfe4e4;stop-opacity:1;"
offset="0"
id="stop33761" /><stop
style="stop-color:#d0dde1;stop-opacity:1;"
offset="0.19335938"
id="stop2420" /><stop
style="stop-color:#3e8ef3;stop-opacity:1;"
offset="0.41559249"
id="stop16949" /><stop
style="stop-color:#26254e;stop-opacity:1;"
offset="0.80959076"
id="stop16951" /><stop
style="stop-color:#482f55;stop-opacity:1;"
offset="1"
id="stop33763" /></linearGradient><linearGradient
id="linearGradient3074"><stop
style="stop-color:#e26708;stop-opacity:1;"
offset="0"
id="stop3070" /><stop
style="stop-color:#bb3c00;stop-opacity:1;"
offset="1"
id="stop3072" /></linearGradient><radialGradient
xlink:href="#linearGradient45008"
id="radialGradient3076"
cx="30.688875"
cy="30.069115"
fx="30.688875"
fy="30.069115"
r="14.05412"
gradientUnits="userSpaceOnUse" /><linearGradient
xlink:href="#linearGradient45008"
id="linearGradient45010"
x1="-31.87768"
y1="22.065159"
x2="-31.87768"
y2="48.78738"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(101.16951,-6.5921995)" /><linearGradient
id="linearGradient45008"><stop
style="stop-color:#e14500;stop-opacity:1;"
offset="0"
id="stop45004" /><stop
style="stop-color:#e17900;stop-opacity:1;"
offset="0.59811592"
id="stop45012" /><stop
style="stop-color:#e19c00;stop-opacity:1;"
offset="1"
id="stop45006" /></linearGradient><linearGradient
xlink:href="#linearGradient45008"
id="linearGradient46715"
x1="31.917692"
y1="47.524929"
x2="31.917692"
y2="22.632998"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(1.7923447e-6)" /><radialGradient
inkscape:collect="never"
xlink:href="#linearGradient33765"
id="radialGradient33767"
cx="28.252495"
cy="28.914215"
fx="28.252495"
fy="28.914215"
r="14.43763"
gradientTransform="matrix(2.0592515,0,0,2.0182304,-29.633594,-30.690448)"
gradientUnits="userSpaceOnUse" /><linearGradient
inkscape:collect="never"
xlink:href="#linearGradient1031"
id="linearGradient1033"
x1="2.5040113"
y1="4.3790028"
x2="9.6209886"
y2="4.3790028"
gradientUnits="userSpaceOnUse" /><radialGradient
inkscape:collect="never"
xlink:href="#linearGradient2490"
id="radialGradient2424"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(2.0705199,0,0,2.0292743,-29.931333,-31.016489)"
cx="27.740032"
cy="29.716822"
fx="27.740032"
fy="29.716822"
r="14.43763" /><linearGradient
inkscape:collect="never"
xlink:href="#linearGradient7321"
id="linearGradient7323"
x1="1.9025939"
y1="4.2053886"
x2="10.222406"
y2="4.2053886"
gradientUnits="userSpaceOnUse" /></defs><sodipodi:namedview
id="namedview6"
pagecolor="#505050"
bordercolor="#eeeeee"
borderopacity="1"
inkscape:showpageshadow="0"
inkscape:pageopacity="0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#505050"
showgrid="false"
inkscape:zoom="5.6568543"
inkscape:cx="-22.715805"
inkscape:cy="-9.8994949"
inkscape:window-width="1920"
inkscape:window-height="1017"
inkscape:window-x="-8"
inkscape:window-y="-8"
inkscape:window-maximized="1"
inkscape:current-layer="g33736" /><g
id="g2210"
transform="matrix(0.54328517,0,0,0.54328517,-9.4489315,-11.300948)"><g
id="g33736"><rect
style="fill:url(#radialGradient33767);fill-opacity:1;stroke:none;stroke-width:1.91428;stroke-linecap:round;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;paint-order:markers stroke fill"
id="rect18059"
width="28.875259"
height="28.300053"
x="17.679815"
y="21.376339"
ry="4.4076433" /><rect
style="display:inline;opacity:0.56871;fill:#618c85;fill-opacity:1;stroke:none;stroke-width:1.91428;stroke-linecap:round;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;paint-order:markers stroke fill"
id="rect5113"
width="28.875259"
height="28.300053"
x="17.679815"
y="21.347578"
ry="4.4076433" /><path
id="path2626"
style="opacity:1;fill:#ffffff;stroke-width:4.26607;stroke-linecap:round;paint-order:markers stroke fill"
inkscape:transform-center-x="-0.080997432"
inkscape:transform-center-y="1.2381837"
d="m 23.964403,24.682689 -0.897572,3.09672 6.933428,0.223474 -6.732076,0.515973 0.01041,0.04165 0.982458,2.048234 7.811737,0.07073 -7.018642,1.461205 3.283937,3.157812 0.632203,12.006936 5.303176,-4.543863 2.32028,-5.061601 -5.205466,0.814123 5.503068,-1.856547 2.097834,-3.53146 -4.222442,0.28206 6.02966,-2.764195 0.483778,-6.395539 z"
sodipodi:nodetypes="ccccccccccccccccccc" /><g
id="g2642"
transform="matrix(1.0851915,0,0,1.0851915,25.209605,-13.00707)" /><path
id="path1984"
style="opacity:0.150106;fill:#ffffff;stroke-width:4.84538;stroke-linecap:round;paint-order:markers stroke fill"
inkscape:transform-center-x="-0.10448909"
inkscape:transform-center-y="1.2381837"
d="m 21.626779,24.682689 -1.157893,3.09672 8.944313,0.223474 -8.684563,0.515973 0.01343,0.04165 1.267398,2.048234 10.077355,0.07073 -9.054241,1.461205 4.236369,3.157812 0.815559,12.006936 6.841243,-4.543863 2.993224,-5.061601 -6.715193,0.814123 7.099108,-1.856547 2.706263,-3.53146 -5.447066,0.28206 7.778427,-2.764195 0.624087,-6.395539 z"
sodipodi:nodetypes="ccccccccccccccccccc" /><path
id="path1986"
style="opacity:0.150106;fill:#ffffff;stroke-width:4.55667;stroke-linecap:round;paint-order:markers stroke fill"
inkscape:transform-center-x="-0.092409416"
inkscape:transform-center-y="1.2381837"
d="m 22.828924,24.682689 -1.02402,3.09672 7.910196,0.223474 -7.680478,0.515973 0.01188,0.04165 1.120865,2.048234 8.91224,0.07073 -8.007415,1.461205 3.746572,3.157812 0.721266,12.006936 6.050278,-4.543863 2.647156,-5.061601 -5.938802,0.814123 6.27833,-1.856547 2.393372,-3.53146 -4.817292,0.28206 6.879108,-2.764195 0.551932,-6.395539 z"
sodipodi:nodetypes="ccccccccccccccccccc" /></g></g></svg>

After

Width:  |  Height:  |  Size: 8.4 KiB

View File

@ -0,0 +1,43 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://cxmpmvdminoh8"
path="res://.godot/imported/WindManager.svg-af882a5a9dd0c369531b565ccd6be2fe.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://addons/rokojori_action_library/Icons/WindManager.svg"
dest_files=["res://.godot/imported/WindManager.svg-af882a5a9dd0c369531b565ccd6be2fe.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

View File

@ -31,6 +31,12 @@ namespace Rokojori
static readonly string RokojoriSettingsPath = "res://.rokojori/settings"; static readonly string RokojoriSettingsPath = "res://.rokojori/settings";
static readonly string RokojoriCachePath = "res://.rokojori/cache"; static readonly string RokojoriCachePath = "res://.rokojori/cache";
// static RokojoriPlugin _instance;
// public static RokojoriPlugin Get()
// {
// return _instance;
// }
public override void _EnablePlugin() public override void _EnablePlugin()
{ {
this.LogInfo(); this.LogInfo();
@ -99,6 +105,8 @@ namespace Rokojori
public override void _EnterTree() public override void _EnterTree()
{ {
// _instance = this;
EnsureHiddenProjectPath( RokojoriProjectInternalPath ); EnsureHiddenProjectPath( RokojoriProjectInternalPath );
EnsureHiddenProjectPath( RokojoriSettingsPath ); EnsureHiddenProjectPath( RokojoriSettingsPath );
EnsureHiddenProjectPath( RokojoriCachePath ); EnsureHiddenProjectPath( RokojoriCachePath );

View File

@ -26,6 +26,23 @@ namespace Rokojori
NetworkNodeSlot _dataSlot = new NetworkNodeSlot(); NetworkNodeSlot _dataSlot = new NetworkNodeSlot();
NetworkNodeSlot _seedAndDataSlot = 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<NetworkNodeMember> CreateNetworkNodeMembers() protected override List<NetworkNodeMember> CreateNetworkNodeMembers()
{ {
return new List<NetworkNodeMember>() return new List<NetworkNodeMember>()
@ -83,7 +100,7 @@ namespace Rokojori
BitView _sendingNetworkData; BitView _sendingNetworkData;
BitView _receivedNetworkData; BitView _receivedNetworkData;
protected bool isNetworkedTrigger => _isNetworkedTrigger; public bool isNetworkedTrigger => _isNetworkedTrigger;
static readonly int maxNetworkSeed = Mathf.RoundToInt( Mathf.Pow( 2, 30 ) ); static readonly int maxNetworkSeed = Mathf.RoundToInt( Mathf.Pow( 2, 30 ) );
@ -137,7 +154,7 @@ namespace Rokojori
action.Trigger(); action.Trigger();
} }
public static void TriggerAll( Action[] actions, Node target, bool triggerDirectChildren ) public static void TriggerAll( Action[] actions, Node target, bool triggerDirectChildren, Action caller = null )
{ {
if ( actions != null ) if ( actions != null )
{ {
@ -152,7 +169,7 @@ namespace Rokojori
return; return;
} }
Nodes.ForEachDirectChild<Action>( target, a => Action.Trigger( a ) ); Nodes.ForEachDirectChild<Action>( target, ( a ) => Trigger( a ) );
} }
public static void TriggerAll( Action action, Node target, bool triggerDirectChildren ) public static void TriggerAll( Action action, Node target, bool triggerDirectChildren )
@ -168,7 +185,7 @@ namespace Rokojori
return; return;
} }
Nodes.ForEachDirectChild<Action>( target, a => Action.Trigger( a ) ); Nodes.ForEachDirectChild<Action>( target, ( a ) => Trigger( a ) );
} }
} }

View File

@ -12,6 +12,7 @@ namespace Rokojori
[ExportGroup("Condition")] [ExportGroup("Condition")]
[Export] [Export]
public Condition condition; public Condition condition;
[Export] [Export]
public SceneCondition sceneCondition; public SceneCondition sceneCondition;
@ -24,7 +25,7 @@ namespace Rokojori
protected override void _OnTrigger() protected override void _OnTrigger()
{ {
var conditionActive = Condition.Evaluate( condition ) && SceneCondition.Evaluate( sceneCondition ); var conditionActive = Condition.Evaluate( condition ) || SceneCondition.Evaluate( sceneCondition );
// this.LogInfo( "Condition is", conditionActive ); // this.LogInfo( "Condition is", conditionActive );

View File

@ -16,6 +16,19 @@ namespace Rokojori
public Duration coolDownDuration; public Duration coolDownDuration;
bool _isCoolingDown = false; bool _isCoolingDown = false;
int _coolDownID = -1;
public void ResetCoolDown()
{
if ( _coolDownID == -1 )
{
return;
}
_isCoolingDown = false;
_coolDownID = -1;
}
protected override void _OnTrigger() protected override void _OnTrigger()
{ {
if ( _isCoolingDown ) if ( _isCoolingDown )
@ -28,10 +41,21 @@ namespace Rokojori
if ( coolDownDuration != null ) if ( coolDownDuration != null )
{ {
TimeLineManager.ScheduleEventIn( var te = TimeLineManager.ScheduleEventIn(
coolDownDuration.timeLine, coolDownDuration.GetDurationInSeconds(), coolDownDuration.timeLine, coolDownDuration.GetDurationInSeconds(),
ev => _isCoolingDown = false ev =>
{
if ( _coolDownID != ev.id )
{
return;
}
_isCoolingDown = false;
}
); );
_coolDownID = te.id;
} }
} }

View File

@ -0,0 +1,20 @@
using Godot;
using System.Collections.Generic;
namespace Rokojori
{
[Tool]
[GlobalClass, Icon("res://addons/rokojori_action_library/Icons/ConditionalAction.svg")]
public partial class ResetCoolDown : Action
{
[Export]
public CoolDown coolDown;
protected override void _OnTrigger()
{
coolDown.ResetCoolDown();
}
}
}

View File

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

View File

@ -0,0 +1,60 @@
using Godot;
using System.Collections.Generic;
namespace Rokojori
{
[Tool]
[GlobalClass, Icon("res://addons/rokojori_action_library/Icons/GDScriptAction.svg")]
public partial class GDScriptAction : Action
{
public static string onTriggerFunctionName = "_onTrigger";
public static string rjAction_className = "RJ_Action";
public static bool IsRJAction( Node n )
{
var extractedClass = GDScriptNames.ExtractClassName( n );
if ( extractedClass == null )
{
return false;
}
return GDScriptNames.IsOrExtendsFrom( n, rjAction_className );
}
public static void TriggerRJAction( Node n, Action caller )
{
n.Call( onTriggerFunctionName, caller );
}
protected override void _OnTrigger()
{
var firstChild = GetChild( 0 );
if ( firstChild == null || ! IsRJAction( firstChild ) )
{
return;
}
TriggerRJAction( firstChild, this );
}
public async void WrapRJAction( Node rjAction )
{
await this.RequestNextFrame();
if ( rjAction == null || rjAction.GetParent() == null )
{
return;
}
this.LogInfo( "Wrapping:", rjAction );
this.Wrap( rjAction );
this.Name = rjAction.Name + " Wrapper" ;
}
}
}

View File

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

View File

@ -0,0 +1,59 @@
using Godot;
using System.Collections.Generic;
namespace Rokojori
{
[Tool]
[GlobalClass, Icon("res://addons/rokojori_action_library/Icons/GDScriptSequenceAction.svg")]
public partial class GDScriptSequenceAction : SequenceAction
{
public static string rjSequenceAction_className = "RJ_SequenceAction";
public static bool IsRJSequenceAction( Node n )
{
var extractedClass = GDScriptNames.ExtractClassName( n );
if ( extractedClass == null )
{
return false;
}
return GDScriptNames.IsOrExtendsFrom( n, rjSequenceAction_className );
}
public static void TriggerRJ_SequenceAction( Node n, Action caller )
{
n.Call( GDScriptAction.onTriggerFunctionName, caller );
}
protected override void _OnTrigger()
{
var firstChild = GetChild( 0 );
if ( firstChild == null || ! IsRJSequenceAction( firstChild ) )
{
return;
}
TriggerRJ_SequenceAction( firstChild, this );
}
public async void WrapRJSequenceAction( Node rjSequenceAction )
{
await this.RequestNextFrame();
if ( rjSequenceAction == null || rjSequenceAction.GetParent() == null )
{
return;
}
this.LogInfo( "Wrapping:", rjSequenceAction );
this.Wrap( rjSequenceAction );
this.Name = rjSequenceAction.Name + " Wrapper" ;
}
}
}

View File

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

View File

@ -13,8 +13,12 @@ namespace Rokojori
[Export] [Export]
public Node[] disable = new Node[ 0 ]; public Node[] disable = new Node[ 0 ];
protected override void _OnTrigger() protected override void _OnTrigger()
{
CallDeferred( "SetStates" );
}
void SetStates()
{ {
Arrays.ForEach( enable, n => NodeState.Enable( n ) ); Arrays.ForEach( enable, n => NodeState.Enable( n ) );
Arrays.ForEach( disable, n => NodeState.Disable( n ) ); Arrays.ForEach( disable, n => NodeState.Disable( n ) );

View File

@ -14,6 +14,11 @@ namespace Rokojori
public NodeStateConfiguration configuration; public NodeStateConfiguration configuration;
protected override void _OnTrigger() protected override void _OnTrigger()
{
CallDeferred( "SetNodeState" );
}
void SetNodeState()
{ {
NodeState.Configure( target, configuration ); NodeState.Configure( target, configuration );
} }

View File

@ -43,7 +43,7 @@ namespace Rokojori
// this.LogInfo( "Moving:", direction ); // this.LogInfo( "Moving:", direction );
target.LookAt( goal.GlobalPosition ); target.LookAt( goal.GlobalPosition );
var nextRotation = target.GetGlobalQuaternion(); var nextRotation = target.GlobalQuaternion();
var rotation = Smoothing.Apply( rotationSmoothing, nextRotation, (float) delta ); var rotation = Smoothing.Apply( rotationSmoothing, nextRotation, (float) delta );
target.SetGlobalQuaternion( rotation ); target.SetGlobalQuaternion( rotation );
} }

View File

@ -11,7 +11,7 @@ namespace Rokojori
public AudioStreamPlayer3D player; public AudioStreamPlayer3D player;
[Export] [Export]
public SelectorFlag overdrivePreventionFlag; public AudioFlag overdrivePreventionFlag;
[Export] [Export]
@ -103,7 +103,7 @@ namespace Rokojori
player.Play( offset ); player.Play( offset );
this.LogInfo( "Play sound", offset, HierarchyName.Of( player ) ); // this.LogInfo( "Play sound", offset, HierarchyName.Of( player ) );
if ( overdrivePreventionFlag != null ) if ( overdrivePreventionFlag != null )
{ {

View File

@ -0,0 +1,72 @@
using Godot;
namespace Rokojori
{
[GlobalClass, Tool ]
public partial class SetTransform : Action
{
[Export]
public Node3D target;
public enum IgnoreGlobalLocal
{
Ignore, Global, Local
}
[ExportGroup( "Position" ) ]
[Export]
public IgnoreGlobalLocal positionMode = IgnoreGlobalLocal.Ignore;
[Export]
public Vector3 position = Vector3.Zero;
[ExportGroup( "Rotation" ) ]
[Export]
public IgnoreGlobalLocal rotationMode = IgnoreGlobalLocal.Ignore;
[Export]
public Vector3 rotation = Vector3.Zero;
public enum IgnoreLocal
{
Ignore, Local
}
[ExportGroup( "Scale" ) ]
[Export]
public IgnoreLocal scaleMode = IgnoreLocal.Ignore;
[Export]
public Vector3 scale = Vector3.One;
protected override void _OnTrigger()
{
if ( target == null )
{
return;
}
if ( positionMode != IgnoreGlobalLocal.Ignore )
{
target.SetLocalOrGlobalPosition( position, positionMode == IgnoreGlobalLocal.Global );
}
if ( rotationMode != IgnoreGlobalLocal.Ignore )
{
target.SetLocalOrGlobalRotation( rotation, rotationMode == IgnoreGlobalLocal.Global );
}
if ( scaleMode != IgnoreLocal.Ignore )
{
target.Scale = scale;
}
}
}
}

View File

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

View File

@ -1,6 +1,6 @@
using Godot; using Godot;
using System.Collections.Generic; using System.Threading.Tasks;
namespace Rokojori namespace Rokojori
{ {
@ -13,17 +13,31 @@ namespace Rokojori
[Export] [Export]
public bool queue = true; public bool queue = true;
protected override void _OnTrigger() protected override void _OnTrigger()
{ {
if ( target == null ) if ( target == null || Engine.IsEditorHint() )
{ {
return; return;
} }
// this.LogInfo( "Remove", HierarchyName.Of( target ) ); if ( ! IsInstanceValid( this ) || ! IsInstanceValid( target ) )
{
return;
}
CallDeferred( "SelfDestroy" );
}
void SelfDestroy()
{
if ( ! IsInstanceValid( target ) )
{
return;
}
target.SelfDestroy( queue ); target.SelfDestroy( queue );
} }
} }
} }

View File

@ -20,9 +20,16 @@ namespace Rokojori
public TimeLine timeLine; public TimeLine timeLine;
bool stopSignal = false;
public void Stop()
{
stopSignal = true;
}
protected override void _OnTrigger() protected override void _OnTrigger()
{ {
var id = DispatchStart(); var id = DispatchStart();
if ( ! ( action is SequenceAction ) ) if ( ! ( action is SequenceAction ) )
@ -62,6 +69,8 @@ namespace Rokojori
var finished = ( maxNumRepeats > 0 && executed >= maxNumRepeats ) || var finished = ( maxNumRepeats > 0 && executed >= maxNumRepeats ) ||
( tl != null && tl.position >= endTime ); ( tl != null && tl.position >= endTime );
finished = stopSignal || finished;
if ( finished ) if ( finished )
{ {
DispatchEnd( id ); DispatchEnd( id );

View File

@ -0,0 +1,18 @@
using Godot;
using System.Collections.Generic;
namespace Rokojori
{
[Tool][GlobalClass, Icon("res://addons/rokojori_action_library/Icons/Parallel.svg") ]
public partial class StopRepeatSequence : Action
{
[Export]
public RepeatSequence repeatSequence;
protected override void _OnTrigger()
{
repeatSequence.Stop();
}
}
}

View File

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

View File

@ -73,7 +73,8 @@ namespace Rokojori
{ {
DispatchEnd( sequenceID ); DispatchEnd( sequenceID );
} }
} },
this
); );
} }

View File

@ -3,6 +3,7 @@ using System.Collections.Generic;
using System.Text.RegularExpressions; using System.Text.RegularExpressions;
using System.Text; using System.Text;
using Godot; using Godot;
using System.Linq;
namespace Rokojori namespace Rokojori
{ {
@ -64,6 +65,15 @@ namespace Rokojori
OmniLight3D light = null; OmniLight3D light = null;
// [Export]
// public Node3D debugProcessIndicator;
// [Export]
// public Vector3 debugProcessIndicatorFull = new Vector3( 5, 0, 0 );
// [Export]
// public StandardMaterial3D debugMaterial;
public override string[] _GetConfigurationWarnings() public override string[] _GetConfigurationWarnings()
{ {
var warnigns = new List<string>(); var warnigns = new List<string>();
@ -186,6 +196,10 @@ namespace Rokojori
_materials = new List<Material>(); _materials = new List<Material>();
if ( Engine.IsEditorHint() )
{
_allTargets = null;
}
Arrays.ForEach( allTargets, Arrays.ForEach( allTargets,
t => t =>
@ -203,22 +217,31 @@ namespace Rokojori
var end = start + duration; var end = start + duration;
animationID = TimeLineManager.ScheduleSpanIn( timeline, 0, duration, animationID = TimeLineManager.ScheduleSpanIn( timeline, 0, duration,
( TimeLineSpan span, TimeLineSpanUpdateType type )=> ( TimeLineSpan span, TimeLineSpanUpdateType type )=>
{ {
// debugProcessIndicator.Position = debugProcessIndicatorFull * span.phase;
if ( animationID != span.id ) if ( animationID != span.id )
{ {
return; return;
} }
// debugProcessIndicator.Position = debugProcessIndicatorFull * span.phase;
var phase = span.phase; var phase = span.phase;
var value = flashCurve.Sample( phase ); var value = flashCurve.Sample( phase );
var phaseColor = color; var phaseColor = color;
phaseColor.A = value * initialAlpha; phaseColor.A = value * initialAlpha;
// debugMaterial.AlbedoColor = phaseColor;
if ( light != null ) if ( light != null )
{ {
light.LightEnergy = value * flashEffect.lightFlashCurveScale; light.LightEnergy = value * flashEffect.lightFlashCurveScale;
@ -271,7 +294,9 @@ namespace Rokojori
DispatchEnd( actionID ); DispatchEnd( actionID );
} }
}
},
this
).id; ).id;
@ -298,7 +323,7 @@ namespace Rokojori
void RemoveMaterials() void RemoveMaterials()
{ {
if ( _materials.Count != allTargets.Length ) if ( _materials == null || allTargets == null || _materials.Count != allTargets.Length )
{ {
return; return;
} }

View File

@ -8,9 +8,7 @@
[sub_resource type="Resource" id="Resource_54hj8"] [sub_resource type="Resource" id="Resource_54hj8"]
script = ExtResource("1_ejko8") script = ExtResource("1_ejko8")
color = Color(0.151445, 0.275065, 1, 1) color = Color(0.151445, 0.275065, 1, 1)
colorMultiply = 1.0
rgbMultiply = 3.0 rgbMultiply = 3.0
alphaMultiply = 1.0
[sub_resource type="Curve" id="Curve_tp3r5"] [sub_resource type="Curve" id="Curve_tp3r5"]
_data = [Vector2(0, 0), 0.0, -0.249925, 0, 0, Vector2(0.0955632, 0.982574), -2.27942, -2.27942, 0, 0, Vector2(0.238908, 0.442359), -1.89107, -1.89107, 0, 0, Vector2(0.982935, 0.00670242), -0.229111, 0.0, 0, 0] _data = [Vector2(0, 0), 0.0, -0.249925, 0, 0, Vector2(0.0955632, 0.982574), -2.27942, -2.27942, 0, 0, Vector2(0.238908, 0.442359), -1.89107, -1.89107, 0, 0, Vector2(0.982935, 0.00670242), -0.229111, 0.0, 0, 0]
@ -18,13 +16,7 @@ point_count = 4
[sub_resource type="Resource" id="Resource_pwp07"] [sub_resource type="Resource" id="Resource_pwp07"]
script = ExtResource("2_3i2og") script = ExtResource("2_3i2og")
duration = 1.0
durationRandomRange = 0.0
delay = 0.0
delayRandomRange = 0.0
curve = SubResource("Curve_tp3r5") curve = SubResource("Curve_tp3r5")
scaleY = 1.0
scaleRandomRange = 0.0
[resource] [resource]
script = ExtResource("3_65ipm") script = ExtResource("3_65ipm")

View File

@ -8,9 +8,7 @@
[sub_resource type="Resource" id="Resource_54hj8"] [sub_resource type="Resource" id="Resource_54hj8"]
script = ExtResource("1_yrhv1") script = ExtResource("1_yrhv1")
color = Color(0, 1, 0.306108, 1) color = Color(0, 1, 0.306108, 1)
colorMultiply = 1.0
rgbMultiply = 2.0 rgbMultiply = 2.0
alphaMultiply = 1.0
[sub_resource type="Curve" id="Curve_tp3r5"] [sub_resource type="Curve" id="Curve_tp3r5"]
_data = [Vector2(0, 0), 0.0, 0.441476, 0, 0, Vector2(0.0957096, 0.959975), -1.01521, -1.01521, 0, 0, Vector2(0.9967, 0.0283505), -0.240285, 0.0, 0, 0] _data = [Vector2(0, 0), 0.0, 0.441476, 0, 0, Vector2(0.0957096, 0.959975), -1.01521, -1.01521, 0, 0, Vector2(0.9967, 0.0283505), -0.240285, 0.0, 0, 0]
@ -19,12 +17,7 @@ point_count = 3
[sub_resource type="Resource" id="Resource_pwp07"] [sub_resource type="Resource" id="Resource_pwp07"]
script = ExtResource("2_cdv3p") script = ExtResource("2_cdv3p")
duration = 0.6 duration = 0.6
durationRandomRange = 0.0
delay = 0.0
delayRandomRange = 0.0
curve = SubResource("Curve_tp3r5") curve = SubResource("Curve_tp3r5")
scaleY = 1.0
scaleRandomRange = 0.0
[resource] [resource]
script = ExtResource("3_87ql1") script = ExtResource("3_87ql1")
@ -33,6 +26,5 @@ timeline = ExtResource("4_2na64")
color = SubResource("Resource_54hj8") color = SubResource("Resource_54hj8")
lightMode = 1 lightMode = 1
lightRange = 5.0 lightRange = 5.0
lightFlashCurveScale = 2.0
lightHasShadows = true lightHasShadows = true
materialMode = 2 materialMode = 2

View File

@ -7,10 +7,8 @@
[sub_resource type="Resource" id="Resource_54hj8"] [sub_resource type="Resource" id="Resource_54hj8"]
script = ExtResource("1_nmdum") script = ExtResource("1_nmdum")
color = Color(0.859799, 0.542989, 0.696896, 1) color = Color(0.86, 0.12426996, 0.1118, 0.5254902)
colorMultiply = 4.0 colorMultiply = 3.0
rgbMultiply = 1.0
alphaMultiply = 1.0
[sub_resource type="Curve" id="Curve_tp3r5"] [sub_resource type="Curve" id="Curve_tp3r5"]
_data = [Vector2(0, 1), 0.0, -1.0, 0, 1, Vector2(1, 0), -1.0, 0.0, 1, 0] _data = [Vector2(0, 1), 0.0, -1.0, 0, 1, Vector2(1, 0), -1.0, 0.0, 1, 0]
@ -18,21 +16,11 @@ point_count = 2
[sub_resource type="Resource" id="Resource_pwp07"] [sub_resource type="Resource" id="Resource_pwp07"]
script = ExtResource("2_0sgd7") script = ExtResource("2_0sgd7")
duration = 0.5 duration = 0.3
durationRandomRange = 0.0
delay = 0.0
delayRandomRange = 0.0
curve = SubResource("Curve_tp3r5") curve = SubResource("Curve_tp3r5")
scaleY = 1.0
scaleRandomRange = 0.0
[resource] [resource]
script = ExtResource("3_7qcuh") script = ExtResource("3_7qcuh")
flashCurve = SubResource("Resource_pwp07") flashCurve = SubResource("Resource_pwp07")
timeline = ExtResource("4_rkq1j") timeline = ExtResource("4_rkq1j")
color = SubResource("Resource_54hj8") color = SubResource("Resource_54hj8")
lightMode = 0
lightRange = 2.0
lightFlashCurveScale = 2.0
lightHasShadows = false
materialMode = 0

View File

@ -8,9 +8,7 @@
[sub_resource type="Resource" id="Resource_ny3sx"] [sub_resource type="Resource" id="Resource_ny3sx"]
script = ExtResource("1_pp4qy") script = ExtResource("1_pp4qy")
color = Color(1, 1, 1, 1) color = Color(1, 1, 1, 1)
colorMultiply = 1.0
rgbMultiply = 2.0 rgbMultiply = 2.0
alphaMultiply = 1.0
[sub_resource type="Curve" id="Curve_nqaq6"] [sub_resource type="Curve" id="Curve_nqaq6"]
_data = [Vector2(0, 1), 0.0, 0.0775112, 0, 0, Vector2(0.0779661, 0), 0.0, 0.0, 0, 0, Vector2(0.227119, 0), 0.113556, 0.113556, 0, 0, Vector2(0.244068, 0.913564), 0.0, 0.0, 0, 0, Vector2(0.308475, 0), 0.0, 0.0, 0, 0, Vector2(0.505085, 0), 0.0, 0.0, 0, 0, Vector2(0.518644, 0.697473), 0.0, 0.0, 0, 0, Vector2(0.60339, 0), 0.0, 0.0, 0, 0, Vector2(0.742794, 0), 0.0, 0.0, 0, 0, Vector2(0.749153, 0.438165), 0.0, 0.0, 0, 0, Vector2(0.80678, 0), 0.0, 0.0, 0, 0, Vector2(1, 0), 0.0442571, 0.0, 0, 0] _data = [Vector2(0, 1), 0.0, 0.0775112, 0, 0, Vector2(0.0779661, 0), 0.0, 0.0, 0, 0, Vector2(0.227119, 0), 0.113556, 0.113556, 0, 0, Vector2(0.244068, 0.913564), 0.0, 0.0, 0, 0, Vector2(0.308475, 0), 0.0, 0.0, 0, 0, Vector2(0.505085, 0), 0.0, 0.0, 0, 0, Vector2(0.518644, 0.697473), 0.0, 0.0, 0, 0, Vector2(0.60339, 0), 0.0, 0.0, 0, 0, Vector2(0.742794, 0), 0.0, 0.0, 0, 0, Vector2(0.749153, 0.438165), 0.0, 0.0, 0, 0, Vector2(0.80678, 0), 0.0, 0.0, 0, 0, Vector2(1, 0), 0.0442571, 0.0, 0, 0]
@ -19,20 +17,10 @@ point_count = 12
[sub_resource type="Resource" id="Resource_pwp07"] [sub_resource type="Resource" id="Resource_pwp07"]
script = ExtResource("2_f6f0o") script = ExtResource("2_f6f0o")
duration = 0.7 duration = 0.7
durationRandomRange = 0.0
delay = 0.0
delayRandomRange = 0.0
curve = SubResource("Curve_nqaq6") curve = SubResource("Curve_nqaq6")
scaleY = 1.0
scaleRandomRange = 0.0
[resource] [resource]
script = ExtResource("3_dq1j1") script = ExtResource("3_dq1j1")
flashCurve = SubResource("Resource_pwp07") flashCurve = SubResource("Resource_pwp07")
timeline = ExtResource("4_d6hj6") timeline = ExtResource("4_d6hj6")
color = SubResource("Resource_ny3sx") color = SubResource("Resource_ny3sx")
lightMode = 0
lightRange = 2.0
lightFlashCurveScale = 2.0
lightHasShadows = false
materialMode = 0

View File

@ -7,9 +7,6 @@
[sub_resource type="Resource" id="Resource_27v41"] [sub_resource type="Resource" id="Resource_27v41"]
script = ExtResource("1_sk831") script = ExtResource("1_sk831")
color = Color(1, 1, 1, 1) color = Color(1, 1, 1, 1)
colorMultiply = 1.0
rgbMultiply = 1.0
alphaMultiply = 1.0
[sub_resource type="Curve" id="Curve_idts4"] [sub_resource type="Curve" id="Curve_idts4"]
_data = [Vector2(0, 0), 0.0, 1.0, 0, 1, Vector2(1, 1), 1.0, 0.0, 1, 0] _data = [Vector2(0, 0), 0.0, 1.0, 0, 1, Vector2(1, 1), 1.0, 0.0, 1, 0]
@ -29,7 +26,4 @@ outCurve = SubResource("Curve_q8jgr")
color = SubResource("Resource_27v41") color = SubResource("Resource_27v41")
opacityModulationStrength = 0.75 opacityModulationStrength = 0.75
opacityModulationDuration = 1.0 opacityModulationDuration = 1.0
opacityModulationTransition = 1.0
outlineMaterialMode = 0
overlayOpacity = 0.1 overlayOpacity = 0.1
overlayMaterialMode = 0

View File

@ -27,7 +27,7 @@ namespace Rokojori
} }
var tl = TimeLineManager.Ensure( timeline ); var tl = TimeLineManager.Ensure( timeline );
var rotation = target.GetGlobalQuaternion() * Quaternion.FromEuler( eulerRotation * (float)tl.delta ); var rotation = target.GlobalQuaternion() * Quaternion.FromEuler( eulerRotation * (float)tl.delta );
target.SetGlobalQuaternion( rotation ); target.SetGlobalQuaternion( rotation );
} }
} }

View File

@ -2,7 +2,7 @@
[ext_resource type="Script" uid="uid://bec6skfqkb2ci" path="res://addons/rokojori_action_library/Runtime/Animation/Shake/ShakeEffect.cs" id="1_68es8"] [ext_resource type="Script" uid="uid://bec6skfqkb2ci" path="res://addons/rokojori_action_library/Runtime/Animation/Shake/ShakeEffect.cs" id="1_68es8"]
[ext_resource type="Script" uid="uid://c5tm02yj1bhhx" path="res://addons/rokojori_action_library/Runtime/Animation/AnimationCurve.cs" id="2_wfmv2"] [ext_resource type="Script" uid="uid://c5tm02yj1bhhx" path="res://addons/rokojori_action_library/Runtime/Animation/AnimationCurve.cs" id="2_wfmv2"]
[ext_resource type="Resource" uid="uid://h6oi6vkj4c2m" path="res://addons/rokojori_action_library/Runtime/Time/TimeLines/RealTime.tres" id="3_h08aw"] [ext_resource type="Resource" uid="uid://ch5nsa6yafs5l" path="res://addons/rokojori_action_library/Runtime/Time/TimeLines/GameTime.tres" id="3_udbmo"]
[sub_resource type="Curve" id="Curve_j2uji"] [sub_resource type="Curve" id="Curve_j2uji"]
_data = [Vector2(0, 1), 0.0, 0.0355988, 0, 0, Vector2(1, 0), -0.101636, 0.0, 0, 0] _data = [Vector2(0, 1), 0.0, 0.0355988, 0, 0, Vector2(1, 0), -0.101636, 0.0, 0, 0]
@ -11,12 +11,7 @@ point_count = 2
[sub_resource type="Resource" id="Resource_jwnpm"] [sub_resource type="Resource" id="Resource_jwnpm"]
script = ExtResource("2_wfmv2") script = ExtResource("2_wfmv2")
duration = 0.4 duration = 0.4
durationRandomRange = 0.0
delay = 0.0
delayRandomRange = 0.0
curve = SubResource("Curve_j2uji") curve = SubResource("Curve_j2uji")
scaleY = 1.0
scaleRandomRange = 0.0
[sub_resource type="Curve" id="Curve_b6b7u"] [sub_resource type="Curve" id="Curve_b6b7u"]
_data = [Vector2(0, 0.368339), 0.0, 3.25035, 0, 0, Vector2(0.264591, 0.73511), 0.0, 0.0, 0, 0, Vector2(1, 0.266458), -0.637268, 0.0, 1, 0] _data = [Vector2(0, 0.368339), 0.0, 3.25035, 0, 0, Vector2(0.264591, 0.73511), 0.0, 0.0, 0, 0, Vector2(1, 0.266458), -0.637268, 0.0, 1, 0]
@ -25,24 +20,17 @@ point_count = 3
[sub_resource type="Resource" id="Resource_1s2e6"] [sub_resource type="Resource" id="Resource_1s2e6"]
script = ExtResource("2_wfmv2") script = ExtResource("2_wfmv2")
duration = 0.5 duration = 0.5
durationRandomRange = 0.0
delay = 0.0
delayRandomRange = 0.0
curve = SubResource("Curve_b6b7u") curve = SubResource("Curve_b6b7u")
scaleY = 30.0 scaleY = 30.0
scaleRandomRange = 0.0
[resource] [resource]
script = ExtResource("1_68es8") script = ExtResource("1_68es8")
shakeAmountCurve = SubResource("Resource_jwnpm") shakeAmountCurve = SubResource("Resource_jwnpm")
shakeChangeFPSCurve = SubResource("Resource_1s2e6") shakeChangeFPSCurve = SubResource("Resource_1s2e6")
timeline = ExtResource("3_h08aw") timeline = ExtResource("3_udbmo")
smooth = true
smoothingStrength = 0.325 smoothingStrength = 0.325
positionShake = Vector3(0.075, 0, 0.075) positionShake = Vector3(0.075, 0, 0.075)
globalPosition = false globalPosition = false
repeatAndFlipFirstPosition = true
rotationShake = Vector3(1, 1, 20) rotationShake = Vector3(1, 1, 20)
globalRotation = false globalRotation = false
scaleShake = Vector3(0.25, 0.25, 0.05) scaleShake = Vector3(0.25, 0.25, 0.05)
scaleShakeIsRelative = true

View File

@ -179,7 +179,8 @@ namespace Rokojori
} }
lastKeyFrame = keyFrame; lastKeyFrame = keyFrame;
} },
this
).id; ).id;
} }

View File

@ -101,7 +101,8 @@ namespace Rokojori
DispatchEnd( actionID ); DispatchEnd( actionID );
_running = false; _running = false;
} }
} },
this
); );

View File

@ -38,7 +38,7 @@ namespace Rokojori
public Vector2 scaleCenter = new Vector2( 0.5f, 0.5f ); public Vector2 scaleCenter = new Vector2( 0.5f, 0.5f );
public static readonly Texture2DPropertyName _wipeTextureProperty = Texture2DPropertyName.Create( "wipeTexture" ); public static readonly Sampler2DPropertyName _wipeTextureProperty = Sampler2DPropertyName.Create( "wipeTexture" );
public static readonly Vector2PropertyName _outputViewSizeProperty = Vector2PropertyName.Create( "outputViewSize" ); public static readonly Vector2PropertyName _outputViewSizeProperty = Vector2PropertyName.Create( "outputViewSize" );
public static readonly Vector2PropertyName _wipeTextureSizeProperty = Vector2PropertyName.Create( "wipeTextureSize" ); public static readonly Vector2PropertyName _wipeTextureSizeProperty = Vector2PropertyName.Create( "wipeTextureSize" );
public static readonly Vector2PropertyName _uvRotationCenterProperty = Vector2PropertyName.Create( "uvRotationCenter" ); public static readonly Vector2PropertyName _uvRotationCenterProperty = Vector2PropertyName.Create( "uvRotationCenter" );

View File

@ -0,0 +1,12 @@
using Godot;
using System.Collections.Generic;
using System.Text;
namespace Rokojori
{
[GlobalClass,Tool, Icon("res://addons/rokojori_action_library/Icons/SelecorFlag.svg") ]
public partial class AudioFlag:SelectorFlag
{
}
}

View File

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

View File

@ -8,11 +8,11 @@ namespace Rokojori
public partial class AudioManager:Node public partial class AudioManager:Node
{ {
[Export] [Export]
public AudioManagerData data; public AudioManagerData data = new AudioManagerData();
Dictionary<SelectorFlag,float> _lastPlayTime = new Dictionary<SelectorFlag, float>(); Dictionary<AudioFlag,float> _lastPlayTime = new Dictionary<AudioFlag, float>();
public float GetLastPlayed( SelectorFlag selectorFlag ) public float GetLastPlayed( AudioFlag selectorFlag )
{ {
if ( ! _lastPlayTime.ContainsKey( selectorFlag ) ) if ( ! _lastPlayTime.ContainsKey( selectorFlag ) )
{ {
@ -22,12 +22,12 @@ namespace Rokojori
return _lastPlayTime[ selectorFlag ]; return _lastPlayTime[ selectorFlag ];
} }
public void RecordSoundPlaying( SelectorFlag selectorFlag ) public void RecordSoundPlaying( AudioFlag selectorFlag )
{ {
_lastPlayTime[ selectorFlag ] = TimeLine.osTime; _lastPlayTime[ selectorFlag ] = TimeLine.osTime;
} }
public bool CanPlay( SelectorFlag selectorFlag, float blockDuration ) public bool CanPlay( AudioFlag selectorFlag, float blockDuration )
{ {
if ( ! _lastPlayTime.ContainsKey( selectorFlag ) ) if ( ! _lastPlayTime.ContainsKey( selectorFlag ) )
{ {

View File

@ -102,6 +102,12 @@ namespace Rokojori
if ( Sensors.IsDown( debugCameraToggle ) ) if ( Sensors.IsDown( debugCameraToggle ) )
{ {
debugCameraActive = ! debugCameraActive; debugCameraActive = ! debugCameraActive;
if ( debugCameraActive )
{
Input.MouseMode = Input.MouseModeEnum.Visible;
}
this.LogInfo( debugCameraActive ); this.LogInfo( debugCameraActive );
} }

View File

@ -49,9 +49,9 @@ namespace Rokojori
void Rotate( float delta ) void Rotate( float delta )
{ {
var currentRotation = Math3D.GetGlobalQuaternion( this ); var currentRotation = this.GlobalQuaternion();
LookAt( target.GlobalPosition, Vector3.Up, true ); LookAt( target.GlobalPosition, Vector3.Up, true );
var nextRotation = Math3D.GetGlobalQuaternion( this ); var nextRotation = this.GlobalQuaternion();
var smoothedRotation = smoother.SmoothWithCoefficient( currentRotation, nextRotation, rotationSmoothingCoefficient, delta ); var smoothedRotation = smoother.SmoothWithCoefficient( currentRotation, nextRotation, rotationSmoothingCoefficient, delta );

View File

@ -278,7 +278,7 @@ namespace Rokojori
smoothDistance = smoother.SmoothWithCoefficient( smoothDistance, distance, zoomSmoothingCoefficient, delta ); smoothDistance = smoother.SmoothWithCoefficient( smoothDistance, distance, zoomSmoothingCoefficient, delta );
GlobalRotation = new Vector3( Mathf.DegToRad( pitch ), Mathf.DegToRad( yaw ), 0 ); GlobalRotation = new Vector3( Mathf.DegToRad( pitch ), Mathf.DegToRad( yaw ), 0 );
var forward = Math3D.GetGlobalForward( this ) * smoothDistance; var forward = this.GlobalForward() * smoothDistance;
// this.LogInfo( forward, smoothDistance ); // this.LogInfo( forward, smoothDistance );
GlobalPosition = target + forward; GlobalPosition = target + forward;

View File

@ -16,225 +16,62 @@ namespace Rokojori
public Node3D target; public Node3D target;
[Export] [Export]
public Smoothing targetFollowSmoothing = new FrameSmoothing(); public float yaw;
[ExportGroup("Yaw")]
[Export] [Export]
public float yawSpeed; public float pitch;
[Export] [Export]
public Sensor yawPositiveAxis; public ThirdPersonCameraSettings settings;
[Export]
public Sensor yawNegativeAxis;
[Export]
public bool roundYaw = false;
[Export]
public int roundedYawResolution = 64;
[Export]
public float yaw = 0;
[Export]
public Smoothing yawSmoothing = new FrameSmoothing();
[Export]
public bool yawGoesBehindPlayer = false;
[Export]
public Smoothing yawToBehingSmoothing = new FrameSmoothing();
[Export]
public float yawBehindDelayDuration = 5;
[Export]
public float yawGoesBehindActivation = 0.1f;
[Export]
public float behindYaw = 0;
[Export]
public float currentYaw = 0;
[Export]
public float bcDelta = 0;
[ExportGroup("Pitch")]
[Export]
public float pitchSpeed;
[Export]
public Sensor pitchPositiveAxis;
[Export]
public Sensor pitchNegativeAxis;
[Export]
public bool pitchIsRelative = false;
[Export]
public float pitch = 0;
[Export]
public float minPitch = -10;
[Export]
public float maxPitch = 80;
public float normalizedPitch => MathX.NormalizeClamped( pitch, minPitch, maxPitch );
[Export]
public Smoothing pitchSmoothing = new FrameSmoothing();
[Export]
public bool pitchGoesBackToCenter = true;
[Export]
public Smoothing toCenterPitchSmoothing = new FrameSmoothing();
[Export]
public float centerPitchDelayDuration = 5;
[Export]
public float centerPitch = 30;
[Export]
public float centerPitchActivation = 0.1f;
[ExportGroup("Distance")]
[Export]
public Curve distanceForPitch = MathX.Curve( 1, 1 );
[Export]
public float distanceScale = 1;
[ExportGroup("Camera Offset")]
[Export]
public Vector3 offset;
float smoothedYaw = 0;
float smoothedPitch = 0;
float smoothedDistance = 0;
float _centerPitchActivation = 0;
float _yawBehindActivation = 0;
public override void _Process( double delta ) public override void _Process( double delta )
{ {
if ( Engine.IsEditorHint() )
{
return;
}
if ( target == null ) if ( target == null )
{ {
return; return;
} }
behindYaw = Math3D.GlobalYawDegrees( target.GlobalForward() * -1 );
behindYaw = MathX.NormalizeAngle( behindYaw );
currentYaw = MathX.NormalizeAngle( yaw ); var data = settings.GetActiveDeviceData();
bcDelta = MathX.NormalizeAngle( MathX.AngleDelta( behindYaw, currentYaw ) ); var targetPosition = Smoothing.Apply( settings.targetFollowSmoothing, target.GlobalPosition, (float) delta );
var targetPosition = Smoothing.Apply( targetFollowSmoothing, target.GlobalPosition, (float) delta );
var yawAxis = Sensors.PolarAxis( yawNegativeAxis, yawPositiveAxis ); var yawAxis = Sensors.PolarPowerAxis( data.yawNegativeAxis, data.yawPositiveAxis, 1f, data.yawDeadZone, data.yawPower );
var pitchAxis = Sensors.PolarAxis( pitchNegativeAxis, pitchPositiveAxis ); var pitchAxis = Sensors.PolarPowerAxis( data.pitchNegativeAxis, data.pitchPositiveAxis, 1f, data.pitchDeadZone, data.pitchPower );
// this.LogInfo( "YAW:", yawAxis, "PITCH:", pitchAxis );
yaw += yawAxis * settings.yawSpeed * data.yawSpeed * (float)delta;
yaw += yawAxis * yawSpeed * (float)delta; if ( data.pitchIsRelative )
if ( yawGoesBehindPlayer )
{ {
if ( Mathf.Abs( yawAxis ) < yawGoesBehindActivation ) pitch += pitchAxis * settings.relativePitchSpeed * data.relativePitchSpeed * (float)delta;
{ pitch = Mathf.Clamp( pitch, settings.minPitch, settings.maxPitch );
_yawBehindActivation += (float)delta;
if ( yawGoesBehindPlayer && _yawBehindActivation > yawBehindDelayDuration )
{
yaw = Smoothing.ApplyDegreesWith( yawToBehingSmoothing, yaw, behindYaw, (float) delta );
}
} }
else else
{ {
_yawBehindActivation = 0; pitch = Mathf.Remap( pitchAxis, -1, 1, settings.minPitch, settings.maxPitch );
} }
}
// yaw = MathX.Repeat( yaw, 360f );
if ( pitchIsRelative )
{
pitch += pitchAxis * pitchSpeed * (float)delta;
pitch = Mathf.Clamp( pitch, minPitch, maxPitch );
if ( Mathf.Abs( pitchAxis ) < centerPitchActivation )
{
_centerPitchActivation += (float)delta;
if ( _centerPitchActivation > centerPitchDelayDuration )
{
pitch = Smoothing.ApplyWith( toCenterPitchSmoothing, pitch, centerPitch, (float) delta );
}
}
else
{
_centerPitchActivation = 0;
}
}
else
{
pitch = Mathf.Remap( pitchAxis, -1, 1, minPitch, maxPitch );
}
// if ( Mathf.Abs( yaw - smoothedYaw ) > 180 )
// {
// if ( yaw > smoothedYaw )
// {
// smoothedYaw += 360;
// }
// else if ( yaw < smoothedYaw )
// {
// smoothedYaw -= 360;
// }
// }
var appliedYaw = yaw; var appliedYaw = yaw;
// if ( roundYaw ) var smoothedYaw = Smoothing.ApplyDegrees( settings.yawSmoothing, appliedYaw, (float) delta );
// {
// appliedYaw = MathX.SnapRounded( yaw, 360f/roundedYawResolution );
// }
smoothedYaw = Smoothing.ApplyDegrees( yawSmoothing, appliedYaw, (float) delta ); var smoothedPitch = Smoothing.Apply( settings.pitchSmoothing, pitch, (float) delta );
var distance = settings.distanceForPitch.Sample( MathX.NormalizeClamped( pitch, settings.minPitch, settings.maxPitch ) ) * settings.distanceScale;
smoothedPitch = Smoothing.Apply( pitchSmoothing, pitch, (float) delta );
// if ( pitchGoesBackToCenter )
// {
// pitch = toCenterPitchSmoothing.Smooth( centerPitch, (float) delta );
// }
// RJLog.Log( "Pitch", smoothedPitch );
// smoothedYaw = yaw;
// smoothedPitch = pitch;
var distance = distanceForPitch.Sample( MathX.NormalizeClamped( pitch, minPitch, maxPitch ) ) * distanceScale;
GlobalPosition = targetPosition + Math3D.YawPitchRotation( smoothedYaw, smoothedPitch ) * Vector3.Forward * distance; GlobalPosition = targetPosition + Math3D.YawPitchRotation( smoothedYaw, smoothedPitch ) * Vector3.Forward * distance;
LookAt( targetPosition, Vector3.Up, true ); LookAt( targetPosition, Vector3.Up, true );
GlobalPosition += this.GetOrientationBasedGlobalOffset( offset ); GlobalPosition += this.GetOrientationBasedGlobalOffset( settings.offset );
} }

View File

@ -0,0 +1,56 @@
using Godot;
using System.Collections.Generic;
namespace Rokojori
{
[Tool]
[GlobalClass,Icon("res://addons/rokojori_action_library/Icons/SensorGroup.svg")]
public partial class ThirdPersonCameraData: Resource
{
[Export]
public SensorDeviceSelector deviceSelector;
[ExportGroup("Yaw")]
[Export]
public float yawSpeed = 1.0f;
[Export]
public Sensor yawPositiveAxis;
[Export]
public Sensor yawNegativeAxis;
[Export]
public float yawDeadZone = 0.1f;
[Export]
public float yawPower = 1.5f;
[ExportGroup("Pitch")]
[Export]
public float relativePitchSpeed = 1.0f;
[Export]
public Sensor pitchPositiveAxis;
[Export]
public Sensor pitchNegativeAxis;
[Export]
public float pitchDeadZone = 0.1f;
[Export]
public float pitchPower = 1.5f;
[Export]
public bool pitchIsRelative = true;
}
}

View File

@ -0,0 +1 @@
uid://8b4s4nw4heif

View File

@ -0,0 +1,65 @@
using Godot;
using System.Collections.Generic;
namespace Rokojori
{
[Tool]
[GlobalClass,Icon("res://addons/rokojori_action_library/Icons/SensorGroup.svg")]
public partial class ThirdPersonCameraSettings: Resource
{
[Export]
public Smoothing targetFollowSmoothing = new FrameSmoothing();
[Export]
public Vector3 offset = Vector3.Zero;
[Export]
public Smoothing yawSmoothing = new FrameSmoothing();
[Export]
public Smoothing pitchSmoothing = new FrameSmoothing();
[Export]
public ThirdPersonCameraData[] deviceData = [];
[ExportGroup("Yaw")]
[Export]
public float yawSpeed = 1;
[ExportGroup("Pitch")]
[Export]
public float relativePitchSpeed = 1;
[Export]
public float minPitch = -10;
[Export]
public float maxPitch = 80;
[ExportGroup("Distance")]
[Export]
public Curve distanceForPitch = MathX.Curve( 1, 1 );
[Export]
public float distanceScale = 1;
public float GetNormalizedPitch( float pitch )
{
return MathX.Normalize( pitch, minPitch, maxPitch );
}
public ThirdPersonCameraData GetActiveDeviceData()
{
var sm = Unique<SensorManager>.Get();
var lastActive = sm.lastActiveDevice;
var lastActiveData = deviceData.FindNonNull( d => d.deviceSelector.Selects( lastActive ) );
return lastActiveData != null ? lastActiveData : deviceData[ 0 ];
}
}
}

View File

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

View File

@ -24,7 +24,7 @@ namespace Rokojori
{ {
if ( pitchMultiply != null && thirdPersonCamera != null ) if ( pitchMultiply != null && thirdPersonCamera != null )
{ {
var normalizedPitch = thirdPersonCamera.normalizedPitch; var normalizedPitch = thirdPersonCamera.settings.GetNormalizedPitch( thirdPersonCamera.pitch );
var sampledPitchMultiply = pitchMultiply.Sample( normalizedPitch ); var sampledPitchMultiply = pitchMultiply.Sample( normalizedPitch );
movingForward *= sampledPitchMultiply; movingForward *= sampledPitchMultiply;
} }

View File

@ -138,7 +138,7 @@ namespace Rokojori
_smoothDistance = Smoothing.Apply( zoomSmoothing, distance, delta ); _smoothDistance = Smoothing.Apply( zoomSmoothing, distance, delta );
GlobalRotation = new Vector3( Mathf.DegToRad( pitch ), Mathf.DegToRad( yaw ), 0 ); GlobalRotation = new Vector3( Mathf.DegToRad( pitch ), Mathf.DegToRad( yaw ), 0 );
var forward = Math3D.GetGlobalForward( this ) * _smoothDistance; var forward = this.GlobalForward() * _smoothDistance;
target -= moveDirection * delta; target -= moveDirection * delta;
GlobalPosition = target + forward; GlobalPosition = target + forward;
} }

View File

@ -62,7 +62,7 @@ namespace Rokojori
#endif #endif
d = camera.GlobalDistanceTo( n3 ); d = camera.DistanceTo( n3 );
} }
fd.SetCenterDistance( d ); fd.SetCenterDistance( d );

View File

@ -5,6 +5,16 @@ namespace Rokojori
{ {
public static class ColorX public static class ColorX
{ {
public static float r( this Vector4 rgba )
{
return rgba.X;
}
public static Vector3 rgb( this Vector4 rgba )
{
return new Vector3( rgba.X, rgba.Y, rgba.Z );
}
public static float GetChannel( this Color color, ColorChannelType colorChannelType ) public static float GetChannel( this Color color, ColorChannelType colorChannelType )
{ {
if ( ColorChannelType.Red == colorChannelType ) if ( ColorChannelType.Red == colorChannelType )
@ -244,53 +254,6 @@ namespace Rokojori
return new Color( vec.X, vec.Y, b, alpha); return new Color( vec.X, vec.Y, b, alpha);
} }
public enum EdgeMode
{
Clamp,
Repeat,
TransparentBlack,
}
public static Color GetPixel( this Image image, int x, int y, EdgeMode mode )
{
if ( x < 0 || y < 0 || x >= image.GetSize().X || y >= image.GetSize().Y )
{
if ( mode == EdgeMode.TransparentBlack )
{
return new Color( 0, 0, 0, 0 );
}
if ( mode == EdgeMode.Repeat )
{
x = MathX.Repeat( x, image.GetSize().X );
y = MathX.Repeat( y, image.GetSize().Y );
}
if ( mode == EdgeMode.Clamp )
{
x = Mathf.Clamp( x, 0, image.GetSize().X );
y = Mathf.Clamp( y, 0, image.GetSize().Y );
}
}
return image.GetPixel( x, y );
}
public static Color Sample( this Image image, Vector2 uv, EdgeMode mode )
{
var pixelUV = uv * image.GetSize();
var lowUV = pixelUV.FloorToInt().Max( 0 );
var highUV = ( lowUV + Vector2I.One ).Min( image.GetSize() - Vector2I.One );
var mix = pixelUV - lowUV;
var xTop = Lerp( image.GetPixel( lowUV.X, lowUV.Y, mode ), image.GetPixel( highUV.X, lowUV.Y, mode ), mix.X );
var xLow = Lerp( image.GetPixel( highUV.X, lowUV.Y, mode ), image.GetPixel( highUV.X, highUV.Y, mode ), mix.X );
return Lerp( xTop, xLow, mix.Y );
}
public static Color Blend( Color bottom, Color top ) public static Color Blend( Color bottom, Color top )
{ {

View File

@ -0,0 +1,19 @@
@tool
@icon("res://addons/rokojori_action_library/Icons/RJ_Action.svg")
@abstract class_name RJ_Action extends Node
@export_tool_button( "Create Wrapper" )
var createWrapperAction = _createWrapper;
func _createWrapper() -> void:
var wrapperClass = load( "res://addons/rokojori_action_library/Runtime/Actions/GDScriptAction.cs" );
var wrapper = wrapperClass.new();
wrapper.WrapRJAction( self );
##---
func _onTrigger( node:GDScriptAction ) -> void:
pass
##---

View File

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

View File

@ -0,0 +1,22 @@
@tool
@icon("res://addons/rokojori_action_library/Icons/RJ_SequenceAction.svg")
@abstract class_name RJ_SequenceAction extends Node
@export_tool_button( "Create Wrapper" )
var createWrapperAction = _createWrapper
func _createWrapper() -> void:
var wrapperClass = load( "res://addons/rokojori_action_library/Runtime/Actions/GDScriptSequenceAction.cs" )
var wrapper = wrapperClass.new();
wrapper.WrapRJSequenceAction( self );
## ---
func _onTrigger( node:GDScriptSequenceAction ) -> void:
pass
## ---

View File

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

View File

@ -7,6 +7,72 @@ namespace Rokojori
{ {
public static class GDScriptNames public static class GDScriptNames
{ {
public static bool IsOrExtendsFrom( Node node, string className )
{
if ( node == null )
{
return false;
}
if ( node.IsClass( className ) )
{
return true;
}
var script = (Script) node.GetScript();
while ( script != null )
{
if ( ExtractClassName( script ) == className )
{
return true;
}
script = script.GetBaseScript();
}
return false;
}
public static string ExtractClassName( Script script )
{
if ( script != null )
{
var className = script.GetClass();
if ( className != "GDScript" )
{
if ( className == "CSharpScript" )
{
return null;
}
return className;
}
var scriptPath = script.ResourcePath;
className = System.IO.Path.GetFileNameWithoutExtension( scriptPath );
return className;
}
return "GDScript";
}
public static string ExtractClassName( Node node )
{
if ( node == null )
{
return null;
}
var script = (Script) node.GetScript();
return ExtractClassName( script );
}
public static string ToCS( string gdScriptName ) public static string ToCS( string gdScriptName )
{ {
return gdScriptName.ToPascalCase(); return gdScriptName.ToPascalCase();

View File

@ -22,7 +22,7 @@ namespace Rokojori
} }
var sourceRotation = source.GetGlobalQuaternion(); var sourceRotation = source.GlobalQuaternion();
if ( rotation != sourceRotation ) if ( rotation != sourceRotation )
{ {

View File

@ -0,0 +1,15 @@
using Godot;
using System.Text;
using System.Collections.Generic;
using System.Linq;
namespace Rokojori
{
public static class BasisExtensions
{
public static bool IsValid( this Basis self )
{
return self.Row0.IsValid() && self.Row1.IsValid() && self.Row2.IsValid();
}
}
}

View File

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

View File

@ -0,0 +1,62 @@
using Godot;
namespace Rokojori
{
public static class ImageExtensions
{
public enum EdgeMode
{
Clamp,
Repeat,
TransparentBlack,
}
public static Color GetPixel( this Image image, int x, int y, EdgeMode mode )
{
if ( x < 0 || y < 0 || x >= image.GetSize().X || y >= image.GetSize().Y )
{
if ( mode == EdgeMode.TransparentBlack )
{
return new Color( 0, 0, 0, 0 );
}
if ( mode == EdgeMode.Repeat )
{
x = MathX.Repeat( x, image.GetSize().X );
y = MathX.Repeat( y, image.GetSize().Y );
}
if ( mode == EdgeMode.Clamp )
{
x = Mathf.Clamp( x, 0, image.GetSize().X );
y = Mathf.Clamp( y, 0, image.GetSize().Y );
}
}
return image.GetPixel( x, y );
}
public static Color SampleNearest( this Image image, Vector2 uv, EdgeMode mode = EdgeMode.Clamp )
{
var pixelUV = uv * image.GetSize();
var roundedPixelUV = pixelUV.RoundToInt();
return image.GetPixel( roundedPixelUV.X, roundedPixelUV.Y, mode );
}
public static Color SampleLinear( this Image image, Vector2 uv, EdgeMode mode = EdgeMode.Clamp )
{
var pixelUV = uv * image.GetSize();
var lowUV = pixelUV.FloorToInt().Max( 0 );
var highUV = ( lowUV + Vector2I.One ).Min( image.GetSize() - Vector2I.One );
var mix = pixelUV - lowUV;
var xTop = ColorX.Lerp( image.GetPixel( lowUV.X, lowUV.Y, mode ), image.GetPixel( highUV.X, lowUV.Y, mode ), mix.X );
var xLow = ColorX.Lerp( image.GetPixel( highUV.X, lowUV.Y, mode ), image.GetPixel( highUV.X, highUV.Y, mode ), mix.X );
return ColorX.Lerp( xTop, xLow, mix.Y );
}
}
}

View File

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

View File

@ -0,0 +1,310 @@
using Godot;
using System.Text;
using System.Collections.Generic;
using System.Linq;
namespace Rokojori
{
public static class Node3DExtensions
{
public static Vector3 ToLocalFromLocal( this Node3D self, Node3D from, Vector3 fromLocalPosition )
{
var world = from.ToGlobal( fromLocalPosition );
return self.ToLocal( world );
}
public static Vector3 ToLocalFromLocalDirection( this Node3D self, Node3D from, Vector3 fromLocalDirection )
{
var world = from.ToGlobalDirection( fromLocalDirection );
return self.ToLocalDirection( world );
}
public static Vector3 ToLocalDirection( this Node3D self, Vector3 globalDirection )
{
return self.GlobalTransform.Basis.Inverse() * globalDirection;
}
public static Vector3 ToGlobalDirection( this Node3D self, Vector3 localDirection )
{
return self.GlobalTransform.Basis * localDirection;
}
public static void LookTowards( this Node3D self, Vector3 direction )
{
self.LookAt( direction + self.GlobalPosition );
}
public static float DistanceTo( this Node3D self, Node3D other )
{
return self.DirectionTowards( other ).Length();
}
public static Vector3 DirectionTowards( this Node3D self, Node3D other )
{
return ( other.GlobalPosition - self.GlobalPosition );
}
public static Vector3 DirectionTowards( this Node3D self, Vector3 other )
{
return ( other - self.GlobalPosition );
}
public static bool IsInRange( this Node3D a, Node3D other, float distance )
{
return a.DistanceTo( other ) <= distance;
}
public static Vector3 GetLocalOrGlobalPosition( this Node3D node, bool global )
{
return global ? node.GlobalPosition : node.Position;
}
public static void SetLocalOrGlobalPosition( this Node3D node, Vector3 position, bool global )
{
if ( global )
{
node.GlobalPosition = position;
}
else
{
node.Position = position;
}
}
public static void SetLocalOrGlobalRotation( this Node3D node, Vector3 rotation, bool global )
{
if ( global )
{
node.GlobalRotation = rotation;
}
else
{
node.Rotation = rotation;
}
}
public static void SetGlobalPose( this Node3D node, Vector3 position, Quaternion rotation )
{
node.SetGlobalQuaternion( rotation );
node.GlobalPosition = position;
}
public static void SetGlobalPose( this Node3D node, Pose pose )
{
node.SetGlobalPose( pose.position, pose.rotation );
}
public static Pose GetGlobalPose( this Node3D node )
{
return Pose.From( node );
}
public static void CopyGlobalPoseFrom( this Node3D node, Node3D other )
{
node.SetGlobalPose( other.GetGlobalPose() );
}
public static void SetGlobalQuaternion( this Node3D node, Quaternion quaternion )
{
var localScale = node.Scale;
node.GlobalBasis = new Basis( quaternion );
node.Scale = localScale;
}
public static void SetLocalQuaternion( this Node3D node, Quaternion quaternion )
{
var localScale = node.Scale;
node.Basis = new Basis( quaternion );
node.Scale = localScale;
}
public static void LookTowards( this Node3D node, Vector3 forwardDirection, Vector3 upDirection, Quaternion rotation )
{
node.LookTowards( forwardDirection, upDirection );
node.SetGlobalQuaternion( node.GlobalQuaternion() * rotation );
}
public static void LookTowards( this Node3D node, Vector3 forward, Vector3 up, Vector3? up2 = null )
{
if ( forward == up )
{
up = up2 == null ? Vector3.Back : (Vector3)up2;
}
node.LookAt( forward + node.GlobalPosition, up );
}
public static Vector3 GetGlobalOffset( this Node3D node, Vector3 direction )
{
return direction.X * node.GlobalRight() +
direction.Y * node.GlobalUp() +
direction.Z * node.GlobalForward() ;
}
public static Vector3 GlobalForward( this Node3D node )
{
return -node.GlobalBasis.Z;
}
public static Vector3 GetPosition( this Node3D node, bool global = false )
{
return global ? node.GlobalPosition : node.Position;
}
public static Vector3 GlobalUp( this Node3D node )
{
return node.GlobalBasis.Y;
}
public static Vector3 GlobalRight( this Node3D node )
{
return node.GlobalBasis.X;
}
public static void SetGlobalX( this Node3D node, float x )
{
var gp = node.GlobalPosition;
gp.X = x;
node.GlobalPosition = gp;
}
public static void SetGlobalY( this Node3D node, float y )
{
var gp = node.GlobalPosition;
gp.Y = y;
node.GlobalPosition = gp;
}
public static void SetGlobalZ( this Node3D node, float z )
{
var gp = node.GlobalPosition;
gp.Z = z;
node.GlobalPosition = gp;
}
public static void SetLocalX( this Node3D node, float x )
{
var gp = node.Position;
gp.X = x;
node.Position = gp;
}
public static void SetLocalY( this Node3D node, float y )
{
var gp = node.Position;
gp.Y = y;
node.Position = gp;
}
public static void SetLocalZ( this Node3D node, float z )
{
var gp = node.Position;
gp.Z = z;
node.Position = gp;
}
public static Vector3 GetOrientationBasedGlobalOffset( this Node3D node, Vector3 offset )
{
return offset.X * node.GlobalRight() + offset.Y * node.GlobalUp() + offset.Z * node.GlobalForward();
}
public static Box3 GetWorldBox( this Node3D node, bool onlyVisible = true )
{
var aabb = GetWorldBounds( node, onlyVisible );
return aabb == null ? null : ( (Aabb)aabb).ToBox3();
}
public static Aabb? GetWorldBounds( this Node3D node, bool onlyVisible = true )
{
return node.GetWorldBoundsFrom( onlyVisible );
}
public static Aabb? GetWorldBoundsFrom( this Node3D node, bool onlyVisible = true )
{
Aabb? worldBounds = null;
Nodes.ForEach<VisualInstance3D>( node,
( vi )=>
{
if ( onlyVisible && ! vi.IsVisibleInTree() )
{
return;
}
var nBounds = vi.GetAabb();
nBounds.Size *= Math3D.GetGlobalUniScale( vi );
nBounds.Position += vi.GlobalPosition;
nBounds.End += vi.GlobalPosition;
worldBounds = worldBounds == null ? nBounds : ( ((Aabb)worldBounds).Merge( nBounds ) );
}
);
return worldBounds;
}
public static Quaternion GlobalQuaternion( this Node3D self )
{
return self.GlobalBasis.GetRotationQuaternion();
}
public static Quaternion GlobalYawQuaterntion( this Node3D self )
{
return Math3D.RotateY( self.GlobalYawRadians() + Mathf.Pi );
}
public static float GlobalYawDegrees( this Node3D node3D )
{
return Math3D.GlobalYawDegrees( node3D.GlobalForward() );
}
public static float GlobalYawRadians( this Node3D node3D )
{
return Math3D.GlobalYaw( node3D.GlobalForward() );
}
public static Vector2 GlobalXZ( this Node3D n )
{
var v = n.GlobalPosition;
return new Vector2( v.X, v.Z );
}
public static void SetGlobalXZ( this Node3D n, Vector2 xz )
{
var p = n.GlobalPosition;
p.X = xz.X;
p.Z = xz.Y;
n.GlobalPosition = p;
}
public static void SetGlobalYaw( this Node3D n, float yawRadians )
{
n.SetGlobalQuaternion( Math3D.RotateY( yawRadians ) );
}
public static void SetGlobalYawDegrees( this Node3D n, float yawDegrees )
{
n.SetGlobalQuaternion( Math3D.RotateY( yawDegrees * MathX.DegreesToRadians ) );
}
}
}

View File

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

View File

@ -0,0 +1,12 @@
using Godot;
using System.Text;
using System.Collections.Generic;
using System.Linq;
namespace Rokojori
{
public static class QuaternionExtensions
{
}
}

View File

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

View File

@ -0,0 +1,15 @@
using Godot;
using System.Text;
using System.Collections.Generic;
using System.Linq;
namespace Rokojori
{
public static class Transform3DExtensions
{
public static bool IsValid( this Transform3D self )
{
return self.Origin.IsValid() && self.Basis.IsValid();
}
}
}

View File

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

View File

@ -39,6 +39,14 @@ namespace Rokojori
var filesystem = EditorInterface.Singleton.GetResourceFilesystem(); var filesystem = EditorInterface.Singleton.GetResourceFilesystem();
filesystem.ReimportFiles( [ path ] ); filesystem.ReimportFiles( [ path ] );
filesystem.UpdateFile( path );
if ( path.ToLower().EndsWith( "gdshader" ) )
{
var shader = ResourceLoader.Load<Shader>( path, null, ResourceLoader.CacheMode.Ignore );
EditorInterface.Singleton.EditResource( shader );
}
#endif #endif
} }
} }

View File

@ -116,7 +116,7 @@ namespace Rokojori
public static void Configure( Node n, bool processEnabled, bool inputEnabled, bool physicsEnabled, bool signalsEnabled, public static void Configure( Node n, bool processEnabled, bool inputEnabled, bool physicsEnabled, bool signalsEnabled,
Node.ProcessModeEnum processMode, bool visible ) Node.ProcessModeEnum processMode, bool visible )
{ {
if ( n == null ) if ( n == null || ! Node.IsInstanceValid( n ) )
{ {
return; return;
} }

View File

@ -367,6 +367,22 @@ namespace Rokojori
return CreateChildIn<T>( parent, name ); return CreateChildIn<T>( parent, name );
} }
public static T CreateChild<T>( this Node parent, PackedScene scene, string name = null ) where T:Node,new()
{
var instance = scene.Instantiate<T>();
parent.AddChild( instance );
instance.Owner = parent.Owner;
if ( name != null )
{
instance.Name = name;
}
return instance;
}
public static T GetOrCreateChild<T>( this Node parent, string name = null ) where T:Node,new() public static T GetOrCreateChild<T>( this Node parent, string name = null ) where T:Node,new()
{ {
var child = Nodes.GetDirectChild<T>( parent ); var child = Nodes.GetDirectChild<T>( parent );
@ -387,7 +403,7 @@ namespace Rokojori
if ( rotation != null ) if ( rotation != null )
{ {
Math3D.SetLocalQuaternion( c, (Quaternion)rotation ); c.SetLocalQuaternion( (Quaternion)rotation );
} }
return c; return c;
@ -421,7 +437,7 @@ namespace Rokojori
if ( rotation != null ) if ( rotation != null )
{ {
Math3D.SetGlobalQuaternion( c, (Quaternion)rotation ); c.SetGlobalQuaternion( (Quaternion)rotation );
} }
return c; return c;
@ -435,7 +451,7 @@ namespace Rokojori
if ( rotation != null ) if ( rotation != null )
{ {
Math3D.SetGlobalQuaternion( c, (Quaternion)rotation ); c.SetGlobalQuaternion( (Quaternion)rotation );
} }
return c; return c;
@ -449,7 +465,7 @@ namespace Rokojori
if ( rotation != null ) if ( rotation != null )
{ {
Math3D.SetGlobalQuaternion( c, (Quaternion)rotation ); c.SetGlobalQuaternion( (Quaternion)rotation );
} }
return c; return c;
@ -677,6 +693,35 @@ namespace Rokojori
} }
} }
public static void CallInProcess( this Node node, System.Action action )
{
var tm = TimeLineManager.Get();
if ( ! tm.inProcess )
{
TimeLineManager.ScheduleCallback(
tm.realtimeTimeline,
( cb ) =>
{
try
{
action();
}
catch ( System.Exception e )
{
node.LogError( e );
}
cb.done = true;
}
);
}
else
{
action();
}
}
public static void SelfDestroy( this Node node, bool queue = true ) public static void SelfDestroy( this Node node, bool queue = true )
{ {
var parent = node.GetParent(); var parent = node.GetParent();
@ -773,6 +818,41 @@ namespace Rokojori
return list; return list;
} }
public static void AddChildAt( this Node parent, Node child, int index, bool setOwnership = true )
{
parent.AddChild( child );
parent.MoveChild( child, index );
if ( ! setOwnership )
{
return;
}
child.Owner = parent.Owner;
}
public static void AddSiblingBefore( this Node referenceSibling, Node siblingToInsert, bool includeInternal = false )
{
var parent = referenceSibling.GetParent();
var index = referenceSibling.GetIndex( includeInternal );
AddChildAt( parent, siblingToInsert, index );
}
public static void AddSiblingAfter( this Node referenceSibling, Node siblingToInsert, bool includeInternal = false )
{
var parent = referenceSibling.GetParent();
var index = referenceSibling.GetIndex( includeInternal );
AddChildAt( parent, siblingToInsert, index );
}
public static void Wrap( this Node reference, Node other )
{
other.AddSiblingBefore( reference );
other.RemoveFromParent();
reference.AddChild( other );
other.Owner = reference.Owner;
}
public static int NumDirectChildrenOf<T>( this Node parent ) where T:Node public static int NumDirectChildrenOf<T>( this Node parent ) where T:Node
{ {
@ -867,6 +947,28 @@ namespace Rokojori
} }
} }
public static void ForEachDirectChild( this Node parent, Predicate<Node> selector, Action<Node> action )
{
if ( parent == null || action == null )
{
return;
}
var numChildren = parent.GetChildCount();
for ( int i = 0; i < numChildren; i++ )
{
var node = parent.GetChild( i );
if ( ! selector( node ) )
{
continue;
}
action( node );
}
}
public static List<U> MapDirectChildren<T,U>( Node parent, System.Func<T,U> mapper ) where T:Node public static List<U> MapDirectChildren<T,U>( Node parent, System.Func<T,U> mapper ) where T:Node
{ {
var list = new List<U>(); var list = new List<U>();

View File

@ -56,25 +56,38 @@ namespace Rokojori
ProcessActions( (float) delta ); ProcessActions( (float) delta );
} }
// positionSmoother.CopyPosition( graphics, body, rotationSmoothingDuration, delta );
// rotationSmoother.CopyRotation( graphics, body, positionSmoothingDuration, delta );
graphics.GlobalPosition = Smoothing.Apply( positionSmoothing, body.GlobalPosition, this.delta ); graphics.GlobalPosition = Smoothing.Apply( positionSmoothing, body.GlobalPosition, this.delta );
graphics.SetGlobalQuaternion( Smoothing.Apply( rotationSmoothing, body.GetGlobalQuaternion(), this.delta ) ); graphics.SetGlobalQuaternion( Smoothing.Apply( rotationSmoothing, body.GlobalQuaternion(), this.delta ) );
if ( body.IsOnFloor() ) if ( body.IsOnFloor() )
{ {
lastGroundedHeight = graphics.GlobalPosition.Y; lastGroundedHeight = graphics.GlobalPosition.Y;
} }
var grounedPosition = graphics.GlobalPosition;
grounedPosition.Y = lastGroundedHeight; AssignGroundedTransform();
groundedTransform.GlobalPosition = grounedPosition;
groundedTransform.SetGlobalQuaternion( graphics.GetGlobalQuaternion() );
// Pose.CopyTo( body, graphics ); // Pose.CopyTo( body, graphics );
} }
void AssignGroundedTransform()
{
if ( groundedTransform == null )
{
return;
}
var groundedPosition = graphics.GlobalPosition;
groundedPosition.Y = lastGroundedHeight;
groundedTransform.GlobalPosition = groundedPosition;
groundedTransform.SetGlobalQuaternion( graphics.GlobalQuaternion() );
}
public override void _PhysicsProcess( double delta ) public override void _PhysicsProcess( double delta )
{ {
if ( CharacterUpdateMode.Physics_Process == characterUpdateMode ) if ( CharacterUpdateMode.Physics_Process == characterUpdateMode )
@ -100,6 +113,8 @@ namespace Rokojori
return; return;
} }
c.SetCharacterController( this );
Action.Trigger( c ); Action.Trigger( c );
} }
); );

View File

@ -12,8 +12,8 @@ namespace Rokojori
[Export] [Export]
public bool enabled = true; public bool enabled = true;
[Export] CharacterController _controller;
public CharacterController controller; public CharacterController controller => _controller;
[Export] [Export]
public Condition condition; public Condition condition;
@ -21,29 +21,41 @@ namespace Rokojori
[Export] [Export]
public SceneCondition sceneCondition; public SceneCondition sceneCondition;
public void SetCharacterController( CharacterController cc )
{
_controller = cc;
}
public CharacterBody3D body => controller.body; public CharacterBody3D body => controller.body;
public void AddVelocity( Vector3 velocity ) public void AddVelocity( Vector3 velocity, float delta = -1 )
{ {
body.Velocity += velocity * controller.delta; delta = delta < 0 ? controller.delta : delta;
body.Velocity += velocity * delta;
} }
public void SetVelocity( Vector3 velocity ) public void SetScaledVelocity( float scale )
{ {
body.Velocity = velocity * controller.delta; body.Velocity *= scale;
} }
public void Velocity( Vector3 velocity, bool replace ) public void SetVelocity( Vector3 velocity, float delta = -1 )
{
delta = delta < 0 ? controller.delta : delta;
body.Velocity = velocity * delta;
}
public void Velocity( Vector3 velocity, bool replace, float delta = -1 )
{ {
if ( replace ) if ( replace )
{ {
SetVelocity( velocity ); SetVelocity( velocity, delta );
} }
else else
{ {
AddVelocity( velocity ); AddVelocity( velocity, delta );
} }
} }

View File

@ -32,7 +32,10 @@ namespace Rokojori
[ExportGroup("Movement")] [ExportGroup("Movement")]
[Export] [Export]
public float moveSpeed; public float moveSpeed = 10f;
[Export]
public float minSpeed = 0f;
[Export] [Export]
public CharacterMovementType controllerMovementType; public CharacterMovementType controllerMovementType;
@ -43,6 +46,9 @@ namespace Rokojori
[Export] [Export]
public CharacterMovementType currentMovementType; public CharacterMovementType currentMovementType;
[Export]
public CharacterMovementType[] deviceMovementTypes = [];
[Export] [Export]
public Smoothing onFloorMovementSmoothing = new FrameSmoothing(); public Smoothing onFloorMovementSmoothing = new FrameSmoothing();
@ -81,6 +87,13 @@ namespace Rokojori
protected CharacterMovementData characterMovementData = new CharacterMovementData(); protected CharacterMovementData characterMovementData = new CharacterMovementData();
[Export]
public bool lookAlwaysForward = false;
[Export]
public Smoothing lookAlwaysForwardSmoothing;
Vector3 _smoothedMovement;
public Vector3 smoothedMovement => _smoothedMovement;
protected override void _OnTrigger() protected override void _OnTrigger()
{ {
@ -89,8 +102,19 @@ namespace Rokojori
characterMovementData.Reset( this ); characterMovementData.Reset( this );
var sm = Unique<SensorManager>.Get();
if ( sm == null )
{
return;
}
var activeDevice = sm.lastActiveDevice;
currentMovementType = deviceMovementTypes.FindNonNull( d => d.deviceSelector.Selects( activeDevice ) );
if ( currentMovementType == null ) if ( currentMovementType == null )
{ {
// this.LogInfo( "No device found:", activeDevice == null ? "null" : activeDevice.GetType().Name );
return; return;
} }
@ -109,6 +133,9 @@ namespace Rokojori
if ( adjustRotation ) if ( adjustRotation )
{ {
var nextRotation = Math3D.LookRotation( characterMovementData.forwardDirection ); var nextRotation = Math3D.LookRotation( characterMovementData.forwardDirection );
var speed = MathX.Clamp01( characterMovementData.movement.Length() / moveSpeed ); var speed = MathX.Clamp01( characterMovementData.movement.Length() / moveSpeed );
if ( speed > 0 ) if ( speed > 0 )
@ -127,21 +154,29 @@ namespace Rokojori
rotation = rotationSmoothing.Smooth( nextRotation, controller.delta ); rotation = rotationSmoothing.Smooth( nextRotation, controller.delta );
body.SetGlobalQuaternion( rotation ); body.SetGlobalQuaternion( rotation );
} }
} }
var smoothedMovement = Vector3.Zero; if ( lookAlwaysForward )
{
var nextRotation = directionSource.GlobalYawQuaterntion();
body.SetGlobalQuaternion( Smoothing.Apply( lookAlwaysForwardSmoothing, nextRotation, controller.delta ) );
}
// var smoothedMovement = Vector3.Zero;
if ( onFloor ) if ( onFloor )
{ {
smoothedMovement = onFloorMovementSmoothing.Smooth( characterMovementData.movement, controller.delta ); _smoothedMovement = onFloorMovementSmoothing.Smooth( characterMovementData.movement, controller.delta );
} }
else else
{ {
smoothedMovement = inAirMovementSmoothing.Smooth( characterMovementData.movement, controller.delta ); _smoothedMovement = inAirMovementSmoothing.Smooth( characterMovementData.movement, controller.delta );
} }
var wasMoving = _moving; var wasMoving = _moving;
_moving = smoothedMovement.Length() > movingSpeedTreshold; _moving = _smoothedMovement.Length() > movingSpeedTreshold;
if ( wasMoving != _moving ) if ( wasMoving != _moving )
{ {
@ -155,7 +190,7 @@ namespace Rokojori
} }
} }
Velocity( smoothedMovement, onFloor ); Velocity( _smoothedMovement, onFloor );
} }
} }

View File

@ -7,8 +7,11 @@ namespace Rokojori
{ {
[Tool] [Tool]
[GlobalClass] [GlobalClass]
public partial class CharacterMovementType:Resource public abstract partial class CharacterMovementType:Resource
{ {
[Export]
public DefaultSensorDeviceSelector deviceSelector;
public virtual void ProcessMovement( CharacterMovementData characterMovementData ) public virtual void ProcessMovement( CharacterMovementData characterMovementData )
{ {

View File

@ -0,0 +1,20 @@
using Godot;
using System.Collections;
using System.Collections.Generic;
using Godot.Collections;
namespace Rokojori
{
[Tool]
[GlobalClass, Icon("res://addons/rokojori_action_library/Icons/CCMoveAndSlide.svg")]
public partial class ProcessVelocity:CharacterControllerAction
{
[Export]
public float velocityScale = 0.1f;
protected override void _OnTrigger()
{
SetScaledVelocity( velocityScale );
}
}
}

View File

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

View File

@ -0,0 +1,96 @@
using Godot;
using System.Collections;
using System.Collections.Generic;
using Godot.Collections;
namespace Rokojori
{
public enum CollisionPhase
{
Entered,
Inside,
Exit
}
[Tool]
[GlobalClass,Icon("res://addons/rokojori_action_library/Icons/Collidable.svg")]
public partial class Collidable:Node3D
{
[Export]
public CollisionFlag[] collisionTypes;
[Export]
public Action onEntered;
[Export]
public Node3D onEnteredColliderPose;
[Export]
public Action onInside;
[Export]
public Node3D onInsideColliderPose;
[Export]
public Action onExit;
[Export]
public Node3D onExitColliderPose;
public bool IsCollidingWith( Collider collider )
{
if ( ( collisionTypes == null || collisionTypes.Length == 0 ) && collider.collisionType == null )
{
return true;
}
if ( collisionTypes == null )
{
return false;
}
return collisionTypes.IndexOf( collider.collisionType ) != -1;
}
public void Collide( Collider collider, CollisionPhase phase )
{
_Collide( collider, phase );
if ( phase == CollisionPhase.Entered )
{
if ( onEnteredColliderPose != null )
{
onEnteredColliderPose.CopyGlobalPoseFrom( collider.area );
}
Action.Trigger( collider.onEntered );
Action.Trigger( onEntered );
}
else if ( phase == CollisionPhase.Inside )
{
if ( onInsideColliderPose != null )
{
onInsideColliderPose.CopyGlobalPoseFrom( collider.area );
}
Action.Trigger( collider.onInside );
Action.Trigger( onInside );
}
else if ( phase == CollisionPhase.Exit )
{
if ( onExitColliderPose != null )
{
onExitColliderPose.CopyGlobalPoseFrom( collider.area );
}
Action.Trigger( collider.onExit );
Action.Trigger( onExit );
}
}
protected virtual void _Collide( Collider collider, CollisionPhase phase )
{
}
}
}

View File

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

View File

@ -0,0 +1,121 @@
using Godot;
using System.Collections;
using System.Collections.Generic;
namespace Rokojori
{
[Tool]
[GlobalClass,Icon("res://addons/rokojori_action_library/Icons/Collider.svg")]
public partial class Collider:Node, iNodeState
{
[Export]
public Area3D area;
[Export]
public CollisionFlag collisionType;
[Export]
public Action onEntered;
[Export]
public Action onInside;
[Export]
public Action onExit;
Dictionary<Collidable,System.Action> _inside = new Dictionary<Collidable,System.Action>();
public void OnNodeStateChanged()
{
if ( ! IsProcessing() || ! IsPhysicsProcessing() || Node.ProcessModeEnum.Disabled == this.ProcessMode )
{
// this.LogInfo( "Clearing nodes" );
_inside.Clear();
}
}
public override void _Ready()
{
if ( area == null )
{
return;
}
area.AreaEntered += TriggerOnEnter;
area.BodyEntered += TriggerOnEnter;
area.AreaExited += TriggerOnExited;
area.BodyExited += TriggerOnExited;
}
void TriggerOnEnter( Node n )
{
if ( ! Math3D.IsValid( area.GlobalPosition ) )
{
return;
}
var collidable = n.Get<Collidable>();
if ( collidable == null || ! collidable.IsCollidingWith( this ) )
{
return;
}
collidable.Collide( this, CollisionPhase.Entered );
if ( onInside == null )
{
return;
}
var tm = Unique<TimeLineManager>.Get();
if ( tm == null )
{
return;
}
var callback = ()=>
{
collidable.Collide( this, CollisionPhase.Inside );
};
_inside[ collidable ] = callback;
tm.AddProcessCallback( callback );
}
void TriggerOnExited( Node n )
{
var collidable = n.Get<Collidable>();
if ( collidable == null || ! collidable.IsCollidingWith( this ) )
{
return;
}
collidable.Collide( this, CollisionPhase.Exit );
if ( ! _inside.ContainsKey( collidable ) )
{
return;
}
var tm = Unique<TimeLineManager>.Get();
var callback = _inside[ collidable ];
_inside.Remove( collidable );
if ( tm == null )
{
return;
}
tm.RemoveProcessCallback( callback );
}
}
}

View File

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

View File

@ -0,0 +1,15 @@
using Godot;
using System.Collections;
using System.Collections.Generic;
using Godot.Collections;
using System.Drawing;
namespace Rokojori
{
[Tool]
[GlobalClass,Icon("res://addons/rokojori_action_library/Icons/SelectorFlag.svg")]
public partial class CollisionFlag:SelectorFlag
{
}
}

View File

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

View File

@ -87,7 +87,7 @@ namespace Rokojori
grabbable.SetGrabber( this ); grabbable.SetGrabber( this );
_callback = TimeLineManager.ScheduleCallback(timeLine, _callback = TimeLineManager.ScheduleCallback(timeLine,
( cb )=> (System.Action<TimeLineCallback>)(( cb )=>
{ {
if ( cb != _callback) if ( cb != _callback)
{ {
@ -95,9 +95,9 @@ namespace Rokojori
} }
positionSmoothing.SetCurrent(grabbable.grabTarget.GlobalPosition ); positionSmoothing.SetCurrent(grabbable.grabTarget.GlobalPosition );
rotationSmoothing.SetCurrent( grabbable.grabTarget.GetGlobalQuaternion() ); rotationSmoothing.SetCurrent(Node3DExtensions.GlobalQuaternion(grabbable.grabTarget));
UpdateGrabbable(); UpdateGrabbable();
} })
); );
Action.Trigger( onGrab ); Action.Trigger( onGrab );
@ -121,7 +121,7 @@ namespace Rokojori
{ {
// this.LogInfo( "Grabbing", HierarchyName.Of( grabbable ) ); // this.LogInfo( "Grabbing", HierarchyName.Of( grabbable ) );
grabbable.grabTarget.GlobalPosition = Smoothing.Apply( positionSmoothing, grabOffset.GlobalPosition, timeLine.delta ); grabbable.grabTarget.GlobalPosition = Smoothing.Apply( positionSmoothing, grabOffset.GlobalPosition, timeLine.delta );
grabbable.grabTarget.SetGlobalQuaternion( Smoothing.Apply( rotationSmoothing, grabOffset.GetGlobalQuaternion(), timeLine.delta ) ); grabbable.grabTarget.SetGlobalQuaternion( Smoothing.Apply( rotationSmoothing, grabOffset.GlobalQuaternion(), timeLine.delta ) );
grabbable.rigidBody3D.LinearVelocity = Vector3.Zero; grabbable.rigidBody3D.LinearVelocity = Vector3.Zero;
grabbable.rigidBody3D.AngularVelocity = Vector3.Zero; grabbable.rigidBody3D.AngularVelocity = Vector3.Zero;
} }

View File

@ -132,7 +132,7 @@ namespace Rokojori
var excludes = new Array<Rid>(); var excludes = new Array<Rid>();
var from = GlobalPosition; var from = GlobalPosition;
var to = from + Math3D.GetGlobalForward( this ) * rayLength; var to = from + this.GlobalForward() * rayLength;
this.to = to; this.to = to;

View File

@ -2,6 +2,7 @@ using Godot;
using System.Collections; using System.Collections;
using System.Collections.Generic; using System.Collections.Generic;
using Godot.Collections; using Godot.Collections;
using System.Drawing;
namespace Rokojori namespace Rokojori
{ {
@ -19,6 +20,10 @@ namespace Rokojori
[Export] [Export]
public Pointable pointable; public Pointable pointable;
public readonly EventSlot<Pointable> onPointerChange = new EventSlot<Pointable>();
[Export] [Export]
public bool printPointables = false; public bool printPointables = false;
@ -56,6 +61,8 @@ namespace Rokojori
Highlight( HighlightActionType.Start, pointable ); Highlight( HighlightActionType.Start, pointable );
} }
onPointerChange.DispatchEvent( currentPointable );
if ( printPointables ) if ( printPointables )
{ {
this.LogInfo( pointable ); this.LogInfo( pointable );

View File

@ -91,7 +91,7 @@ namespace Rokojori.PointClouds
} }
sampler.materials = Materials.GetAll<Material>( mesh ); sampler.materials = Materials.GetAll<Material>( mesh );
sampler.albedoTexture = sampler.materials.Map( m => Texture2DPropertyName.albedoTexture ); sampler.albedoTexture = sampler.materials.Map( m => Sampler2DPropertyName.albedoTexture );
sampler.albedo = sampler.materials.Map( m => ColorPropertyName.albedo ); ; sampler.albedo = sampler.materials.Map( m => ColorPropertyName.albedo ); ;
var cloud = await sampler.SampleFromMesh( sampleMode, (ArrayMesh) mesh.Mesh, this ); var cloud = await sampler.SampleFromMesh( sampleMode, (ArrayMesh) mesh.Mesh, this );

View File

@ -7,7 +7,7 @@ using System.Threading.Tasks;
namespace Rokojori.PointClouds namespace Rokojori.PointClouds
{ {
public class PointCloudOcTree:OcTree<Point> public class PointCloudOcTree:OcTree<Point,Null>
{ {
List<Vector3> compressedNormals = new List<Vector3>() List<Vector3> compressedNormals = new List<Vector3>()
{ {

View File

@ -19,7 +19,7 @@ namespace Rokojori.PointClouds
} }
public List<Material> materials; public List<Material> materials;
public List<Texture2DPropertyName> albedoTexture; public List<Sampler2DPropertyName> albedoTexture;
public List<ColorPropertyName> albedo; public List<ColorPropertyName> albedo;
public float densityResolution = 0.2f; public float densityResolution = 0.2f;
@ -286,7 +286,7 @@ namespace Rokojori.PointClouds
if ( image != null ) if ( image != null )
{ {
color = image.Sample( uv, ColorX.EdgeMode.Repeat ); color = image.SampleLinear( uv, ImageExtensions.EdgeMode.Repeat );
} }
@ -360,7 +360,7 @@ namespace Rokojori.PointClouds
if ( image != null ) if ( image != null )
{ {
color = image.Sample( uv, ColorX.EdgeMode.Repeat ); color = image.SampleLinear( uv, ImageExtensions.EdgeMode.Repeat );
} }

View File

@ -138,6 +138,13 @@ namespace Rokojori
GD.PrintRich( trace ); GD.PrintRich( trace );
} }
static void GDLogMessage( string message, string trace )
{
trace = "[color=#888888] " + trace + "[/color]" ;
GD.PrintRich("\n[b]" + message );
GD.PrintRich( trace );
}
static void LogMessageWithFullTrace( string message ) static void LogMessageWithFullTrace( string message )
{ {
var trace = GetFullTrace(); var trace = GetFullTrace();
@ -225,6 +232,16 @@ namespace Rokojori
LogMessage( "[color=#55ffaa]" + HierarchyName.Of( resource ) + "[/color]\n" + GetLogString( objects ), 4 ); LogMessage( "[color=#55ffaa]" + HierarchyName.Of( resource ) + "[/color]\n" + GetLogString( objects ), 4 );
} }
public static void GDLog( string trace, Node node, params object[] objects)
{
GDLogMessage( "[color=#55aaff]" + HierarchyName.Of( node ) + "[/color]\n" + GetLogString( objects ), trace );
}
public static void GDLog( string trace, Resource resource, params object[] objects)
{
GDLogMessage( "[color=#55ffaa]" + HierarchyName.Of( resource ) + "[/color]\n" + GetLogString( objects ), trace );
}
public static void Error( params object[] objects) public static void Error( params object[] objects)
{ {
LogErrorMessage( GetLogString( objects ) ); LogErrorMessage( GetLogString( objects ) );

Some files were not shown because too many files have changed in this diff Show More