State machine animation node

This commit is contained in:
Juan Linietsky 2018-06-25 16:21:57 -03:00
parent c45a8a574a
commit 4f5a7ebaec
30 changed files with 3660 additions and 13 deletions

View file

@ -214,6 +214,50 @@ struct PtrToArg<const T *> {
} \
}
#define MAKE_VECARG_ALT(m_type, m_type_alt) \
template <> \
struct PtrToArg<Vector<m_type_alt> > { \
_FORCE_INLINE_ static Vector<m_type_alt> convert(const void *p_ptr) { \
const PoolVector<m_type> *dvs = reinterpret_cast<const PoolVector<m_type> *>(p_ptr); \
Vector<m_type_alt> ret; \
int len = dvs->size(); \
ret.resize(len); \
{ \
PoolVector<m_type>::Read r = dvs->read(); \
for (int i = 0; i < len; i++) { \
ret[i] = r[i]; \
} \
} \
return ret; \
} \
_FORCE_INLINE_ static void encode(Vector<m_type_alt> p_vec, void *p_ptr) { \
PoolVector<m_type> *dv = reinterpret_cast<PoolVector<m_type> *>(p_ptr); \
int len = p_vec.size(); \
dv->resize(len); \
{ \
PoolVector<m_type>::Write w = dv->write(); \
for (int i = 0; i < len; i++) { \
w[i] = p_vec[i]; \
} \
} \
} \
}; \
template <> \
struct PtrToArg<const Vector<m_type_alt> &> { \
_FORCE_INLINE_ static Vector<m_type_alt> convert(const void *p_ptr) { \
const PoolVector<m_type> *dvs = reinterpret_cast<const PoolVector<m_type> *>(p_ptr); \
Vector<m_type_alt> ret; \
int len = dvs->size(); \
ret.resize(len); \
{ \
PoolVector<m_type>::Read r = dvs->read(); \
for (int i = 0; i < len; i++) { \
ret[i] = r[i]; \
} \
} \
return ret; \
} \
}
MAKE_VECARG(String);
MAKE_VECARG(uint8_t);
MAKE_VECARG(int);
@ -221,6 +265,7 @@ MAKE_VECARG(float);
MAKE_VECARG(Vector2);
MAKE_VECARG(Vector3);
MAKE_VECARG(Color);
MAKE_VECARG_ALT(String, StringName);
//for stuff that gets converted to Array vectors
#define MAKE_VECARR(m_type) \

View file

@ -194,6 +194,7 @@ MAKE_TEMPLATE_TYPE_INFO(Vector, Color, Variant::POOL_COLOR_ARRAY)
MAKE_TEMPLATE_TYPE_INFO(Vector, Variant, Variant::ARRAY)
MAKE_TEMPLATE_TYPE_INFO(Vector, RID, Variant::ARRAY)
MAKE_TEMPLATE_TYPE_INFO(Vector, Plane, Variant::ARRAY)
MAKE_TEMPLATE_TYPE_INFO(Vector, StringName, Variant::POOL_STRING_ARRAY)
MAKE_TEMPLATE_TYPE_INFO(PoolVector, Plane, Variant::ARRAY)
MAKE_TEMPLATE_TYPE_INFO(PoolVector, Face3, Variant::POOL_VECTOR3_ARRAY)

View file

@ -2012,6 +2012,19 @@ Variant::operator Vector<String>() const {
}
return to;
}
Variant::operator Vector<StringName>() const {
PoolVector<String> from = operator PoolVector<String>();
Vector<StringName> to;
int len = from.size();
to.resize(len);
for (int i = 0; i < len; i++) {
to[i] = from[i];
}
return to;
}
Variant::operator Vector<Vector3>() const {
PoolVector<Vector3> from = operator PoolVector<Vector3>();
@ -2444,6 +2457,17 @@ Variant::Variant(const Vector<String> &p_array) {
*this = v;
}
Variant::Variant(const Vector<StringName> &p_array) {
type = NIL;
PoolVector<String> v;
int len = p_array.size();
v.resize(len);
for (int i = 0; i < len; i++)
v.set(i, p_array[i]);
*this = v;
}
Variant::Variant(const Vector<Vector3> &p_array) {
type = NIL;

View file

@ -216,6 +216,7 @@ public:
operator Vector<int>() const;
operator Vector<real_t>() const;
operator Vector<String>() const;
operator Vector<StringName>() const;
operator Vector<Vector3>() const;
operator Vector<Color>() const;
operator Vector<RID>() const;
@ -280,6 +281,7 @@ public:
Variant(const Vector<int> &p_int_array);
Variant(const Vector<real_t> &p_real_array);
Variant(const Vector<String> &p_string_array);
Variant(const Vector<StringName> &p_string_array);
Variant(const Vector<Vector3> &p_vector3_array);
Variant(const Vector<Color> &p_color_array);
Variant(const Vector<Plane> &p_array); // helper

View file

@ -69,6 +69,7 @@
#include "editor/plugins/animation_blend_space_editor.h"
#include "editor/plugins/animation_blend_tree_editor_plugin.h"
#include "editor/plugins/animation_player_editor_plugin.h"
#include "editor/plugins/animation_state_machine_editor.h"
#include "editor/plugins/animation_tree_editor_plugin.h"
#include "editor/plugins/asset_library_editor_plugin.h"
#include "editor/plugins/baked_lightmap_editor_plugin.h"
@ -5401,6 +5402,7 @@ EditorNode::EditorNode() {
//add_editor_plugin(memnew(ShaderGraphEditorPlugin(this)));
add_editor_plugin(memnew(AnimationNodeBlendTreeEditorPlugin(this)));
add_editor_plugin(memnew(AnimationNodeBlendSpaceEditorPlugin(this)));
add_editor_plugin(memnew(AnimationNodeStateMachineEditorPlugin(this)));
add_editor_plugin(memnew(CameraEditorPlugin(this)));
add_editor_plugin(memnew(ThemeEditorPlugin(this)));

View file

@ -0,0 +1,68 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="16"
height="16"
version="1.1"
viewBox="0 0 16 16"
id="svg6"
sodipodi:docname="icon_auto_end.svg"
inkscape:version="0.92.3 (2405546, 2018-03-11)">
<metadata
id="metadata12">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<defs
id="defs10" />
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1273"
inkscape:window-height="766"
id="namedview8"
showgrid="false"
inkscape:zoom="41.7193"
inkscape:cx="12.08616"
inkscape:cy="6.9898672"
inkscape:window-x="539"
inkscape:window-y="208"
inkscape:window-maximized="0"
inkscape:current-layer="svg6" />
<path
inkscape:connector-curvature="0"
id="path2"
style="color:#000000;text-indent:0;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;text-transform:none;white-space:normal;isolation:auto;mix-blend-mode:normal;solid-color:#000000;fill:#e0e0e0;fill-rule:evenodd;color-rendering:auto;image-rendering:auto;shape-rendering:auto"
d="m 13.999798,14 c 0.552262,-5.5e-5 0.999945,-0.447738 1,-1 V 3 c -5.5e-5,-0.5522619 -0.447738,-0.9999448 -1,-1 H 5.9997976 C 5.6959349,1.9998247 5.4084731,2.1378063 5.2185476,2.375 l -4,5 c -0.29139692,0.3649711 -0.29139692,0.8830289 0,1.248 l 4,5 c 0.189538,0.237924 0.4770584,0.376652 0.78125,0.37695 h 8.0000004 z m -1,-2 H 6.4802976 l -3.1992,-4 3.1992,-4 H 12.999798 Z M 6.9997976,10 V 6 l -2,2 z"
sodipodi:nodetypes="cccccccccccccccccccccc" />
<g
aria-label="E"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:40px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';letter-spacing:0px;word-spacing:0px;fill:#e0e0e0;fill-opacity:1;stroke:none"
id="text829"
transform="matrix(0.20475474,0,0,0.20475474,4.7903856,12.365563)">
<path
d="M 15.129502,-36.414393 H 35.422471 V -30.7308 H 22.649034 v 5.429688 h 12.011718 v 5.683594 H 22.649034 v 6.679687 h 13.203125 v 5.6835938 H 15.129502 Z"
style="fill:#e0e0e0;fill-opacity:1"
id="path831"
inkscape:connector-curvature="0" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.9 KiB

View file

@ -0,0 +1,85 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="16"
height="16"
version="1.1"
viewBox="0 0 16 16"
id="svg8"
sodipodi:docname="icon_play_travel.svg"
inkscape:version="0.92.3 (2405546, 2018-03-11)">
<metadata
id="metadata14">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<defs
id="defs12" />
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1446"
inkscape:window-height="646"
id="namedview10"
showgrid="false"
inkscape:zoom="14.75"
inkscape:cx="8.2818541"
inkscape:cy="5.7694884"
inkscape:window-x="67"
inkscape:window-y="27"
inkscape:window-maximized="0"
inkscape:current-layer="svg8" />
<g
transform="matrix(0.59321602,0,0,0.59321602,-1.2203136,-611.14809)"
id="g6">
<g
id="g4">
<path
d="m 4.9883,1039.4 c -0.5469,0.01 -0.98717,0.4511 -0.98828,0.998 v 8 c 1.163e-4,0.7986 0.89011,1.275 1.5547,0.8321 l 6,-4 c 0.59362,-0.3959 0.59362,-1.2682 0,-1.6641 l -6,-4 c -0.1678,-0.1111 -0.3652,-0.1689 -0.56641,-0.166 z"
dominant-baseline="auto"
style="color:#000000;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;text-transform:none;text-orientation:mixed;dominant-baseline:auto;white-space:normal;shape-padding:0;isolation:auto;mix-blend-mode:normal;solid-color:#000000;fill:#e0e0e0;fill-rule:evenodd;color-rendering:auto;image-rendering:auto;shape-rendering:auto"
id="path2"
inkscape:connector-curvature="0" />
</g>
</g>
<g
transform="matrix(0.59321602,0,0,0.59321602,7.5254716,-610.94451)"
id="g6-3">
<g
id="g4-6">
<path
d="m 4.9883,1039.4 c -0.5469,0.01 -0.98717,0.4511 -0.98828,0.998 v 8 c 1.163e-4,0.7986 0.89011,1.275 1.5547,0.8321 l 6,-4 c 0.59362,-0.3959 0.59362,-1.2682 0,-1.6641 l -6,-4 c -0.1678,-0.1111 -0.3652,-0.1689 -0.56641,-0.166 z"
dominant-baseline="auto"
style="color:#000000;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;text-transform:none;text-orientation:mixed;dominant-baseline:auto;white-space:normal;shape-padding:0;isolation:auto;mix-blend-mode:normal;solid-color:#000000;fill:#e0e0e0;fill-rule:evenodd;color-rendering:auto;image-rendering:auto;shape-rendering:auto"
id="path2-7"
inkscape:connector-curvature="0" />
</g>
</g>
<rect
style="fill:#e0e0e0;fill-opacity:1"
id="rect842"
width="9.5593224"
height="0.54237264"
x="3.0058463"
y="8.1280737"
ry="0.27118632" />
</svg>

After

Width:  |  Height:  |  Size: 3.7 KiB

View file

@ -0,0 +1,80 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="16"
height="16"
version="1.1"
viewBox="0 0 16 16"
id="svg8"
sodipodi:docname="icon_tool_add_node.svg"
inkscape:version="0.92.3 (2405546, 2018-03-11)">
<metadata
id="metadata14">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<defs
id="defs12" />
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1516"
inkscape:window-height="747"
id="namedview10"
showgrid="false"
inkscape:zoom="14.75"
inkscape:cx="8"
inkscape:cy="8"
inkscape:window-x="67"
inkscape:window-y="27"
inkscape:window-maximized="0"
inkscape:current-layer="g4" />
<g
transform="translate(0 -1036.4)"
id="g6">
<g
transform="translate(-26.001 -9.8683)"
id="g4">
<path
style="fill:#e0e0e0;fill-opacity:1"
d="m 27.917081,1047.5557 c -0.422624,0 -0.763672,0.3411 -0.763672,0.7637 v 11.8301 c 0,0.4226 0.341048,0.7637 0.763672,0.7637 h 12.507813 c 0.422624,0 0.761719,-0.3411 0.761719,-0.7637 v -11.8301 c 0,-0.4226 -0.339095,-0.7637 -0.761719,-0.7637 z m 1.898438,1.6954 h 8.642578 c 0.422624,0 0.763672,0.341 0.763672,0.7636 v 8.5078 c 0,0.4227 -0.341048,0.7618 -0.763672,0.7618 h -8.642578 c -0.422625,0 -0.763672,-0.3391 -0.763672,-0.7618 v -8.5078 c 0,-0.4226 0.341047,-0.7636 0.763672,-0.7636 z"
id="rect821"
inkscape:connector-curvature="0" />
<rect
style="fill:#e0e0e0;fill-opacity:1"
id="rect826"
width="7.7966104"
height="2.3728814"
x="30.20439"
y="1052.9802"
ry="0.76286" />
<rect
style="fill:#e0e0e0;fill-opacity:1;stroke-width:0.88253576"
id="rect828"
width="2.3728814"
height="7.5254235"
x="32.916256"
y="1050.3361"
ry="0.72997814" />
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.6 KiB

View file

@ -0,0 +1,72 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="16"
height="16"
version="1.1"
viewBox="0 0 16 16"
id="svg8"
sodipodi:docname="icon_tool_connect.svg"
inkscape:version="0.92.3 (2405546, 2018-03-11)">
<metadata
id="metadata14">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<defs
id="defs12" />
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1516"
inkscape:window-height="747"
id="namedview10"
showgrid="false"
inkscape:zoom="3.6875"
inkscape:cx="8.5909556"
inkscape:cy="7.8012075"
inkscape:window-x="67"
inkscape:window-y="27"
inkscape:window-maximized="0"
inkscape:current-layer="g4" />
<g
transform="translate(0 -1036.4)"
id="g6">
<g
transform="translate(-26.001 -9.8683)"
id="g4">
<rect
style="fill:#e0e0e0;fill-opacity:1"
id="rect849"
width="14.305085"
height="2.1694915"
x="26.766621"
y="1053.1389"
ry="0.76286" />
<path
style="fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:1.16725671px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 30.596131,1046.927 v 14.8861 l 8.228847,-7.5722 z"
id="path853"
inkscape:connector-curvature="0" />
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.1 KiB

View file

@ -0,0 +1,72 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="16"
height="16"
version="1.1"
viewBox="0 0 16 16"
id="svg8"
sodipodi:docname="icon_transition_end.svg"
inkscape:version="0.92.3 (2405546, 2018-03-11)">
<metadata
id="metadata14">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<defs
id="defs12" />
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1403"
inkscape:window-height="782"
id="namedview10"
showgrid="false"
inkscape:zoom="20.85965"
inkscape:cx="10.204146"
inkscape:cy="5.3391396"
inkscape:window-x="67"
inkscape:window-y="27"
inkscape:window-maximized="0"
inkscape:current-layer="svg8" />
<g
transform="translate(-2,-1036.4)"
id="g6">
<g
id="g4">
<path
d="m 4.9883,1039.4 c -0.5469,0.01 -0.98717,0.4511 -0.98828,0.998 v 8 c 1.163e-4,0.7986 0.89011,1.275 1.5547,0.8321 l 6,-4 c 0.59362,-0.3959 0.59362,-1.2682 0,-1.6641 l -6,-4 c -0.1678,-0.1111 -0.3652,-0.1689 -0.56641,-0.166 z"
dominant-baseline="auto"
style="color:#000000;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east_asian:normal;font-feature-settings:normal;text-indent:0;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;text-transform:none;text-orientation:mixed;dominant-baseline:auto;white-space:normal;shape-padding:0;isolation:auto;mix-blend-mode:normal;solid-color:#000000;fill:#e0e0e0;fill-rule:evenodd;color-rendering:auto;image-rendering:auto;shape-rendering:auto"
id="path2"
inkscape:connector-curvature="0" />
</g>
</g>
<rect
style="fill:#e0e0e0;fill-opacity:1"
id="rect862"
width="3.0681243"
height="10.067283"
x="11.16989"
y="3.0084109"
ry="0.76286" />
</svg>

After

Width:  |  Height:  |  Size: 2.7 KiB

View file

@ -0,0 +1,74 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="16"
height="16"
version="1.1"
viewBox="0 0 16 16"
id="svg8"
sodipodi:docname="icon_transition_automatic.svg"
inkscape:version="0.92.3 (2405546, 2018-03-11)">
<metadata
id="metadata14">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
<defs
id="defs12" />
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1403"
inkscape:window-height="782"
id="namedview10"
showgrid="false"
inkscape:zoom="20.85965"
inkscape:cx="0.56831798"
inkscape:cy="5.1473818"
inkscape:window-x="67"
inkscape:window-y="27"
inkscape:window-maximized="0"
inkscape:current-layer="svg8" />
<g
transform="translate(-2,-1036.4)"
id="g6"
style="fill:#77ce57;fill-opacity:1">
<g
id="g4"
style="fill:#77ce57;fill-opacity:1">
<path
d="m 4.9883,1039.4 c -0.5469,0.01 -0.98717,0.4511 -0.98828,0.998 v 8 c 1.163e-4,0.7986 0.89011,1.275 1.5547,0.8321 l 6,-4 c 0.59362,-0.3959 0.59362,-1.2682 0,-1.6641 l -6,-4 c -0.1678,-0.1111 -0.3652,-0.1689 -0.56641,-0.166 z"
dominant-baseline="auto"
style="color:#000000;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east_asian:normal;font-feature-settings:normal;text-indent:0;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;text-transform:none;text-orientation:mixed;dominant-baseline:auto;white-space:normal;shape-padding:0;isolation:auto;mix-blend-mode:normal;solid-color:#000000;fill:#77ce57;fill-rule:evenodd;color-rendering:auto;image-rendering:auto;shape-rendering:auto;fill-opacity:1"
id="path2"
inkscape:connector-curvature="0" />
</g>
</g>
<rect
style="fill:#77ce57;fill-opacity:1"
id="rect862"
width="3.0681243"
height="10.067283"
x="11.16989"
y="3.0084109"
ry="0.76286" />
</svg>

After

Width:  |  Height:  |  Size: 2.7 KiB

View file

@ -0,0 +1,74 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="20"
height="20"
version="1.1"
viewBox="0 0 20 20"
id="svg8"
sodipodi:docname="icon_transition_automatic_big.svg"
inkscape:version="0.92.3 (2405546, 2018-03-11)">
<metadata
id="metadata14">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<defs
id="defs12" />
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1403"
inkscape:window-height="782"
id="namedview10"
showgrid="false"
inkscape:zoom="14.75"
inkscape:cx="0.3064671"
inkscape:cy="14.348448"
inkscape:window-x="67"
inkscape:window-y="27"
inkscape:window-maximized="0"
inkscape:current-layer="svg8" />
<g
transform="matrix(1.4099529,0,0,1.4099529,-4.1975887,-1462.5094)"
id="g6"
style="fill:#77ce57;fill-opacity:1;stroke:#41562e;stroke-opacity:1">
<g
id="g4"
style="fill:#77ce57;fill-opacity:1;stroke:#41562e;stroke-opacity:1">
<path
d="m 4.9883,1039.4 c -0.5469,0.01 -0.98717,0.4511 -0.98828,0.998 v 8 c 1.163e-4,0.7986 0.89011,1.275 1.5547,0.8321 l 6,-4 c 0.59362,-0.3959 0.59362,-1.2682 0,-1.6641 l -6,-4 c -0.1678,-0.1111 -0.3652,-0.1689 -0.56641,-0.166 z"
dominant-baseline="auto"
style="color:#000000;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;text-transform:none;text-orientation:mixed;dominant-baseline:auto;white-space:normal;shape-padding:0;isolation:auto;mix-blend-mode:normal;solid-color:#000000;fill:#77ce57;fill-opacity:1;fill-rule:evenodd;stroke:#41562e;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto"
id="path2"
inkscape:connector-curvature="0" />
</g>
</g>
<rect
style="fill:#77ce57;fill-opacity:1;stroke:#41562e;stroke-width:1.409953;stroke-opacity:1"
id="rect862"
width="4.3259106"
height="14.194397"
x="14.371336"
y="3.0076122"
ry="1.0755967" />
</svg>

After

Width:  |  Height:  |  Size: 2.9 KiB

View file

@ -0,0 +1,74 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="20"
height="20"
version="1.1"
viewBox="0 0 20 20"
id="svg8"
sodipodi:docname="icon_transition_end_big.svg"
inkscape:version="0.92.3 (2405546, 2018-03-11)">
<metadata
id="metadata14">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<defs
id="defs12" />
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1403"
inkscape:window-height="782"
id="namedview10"
showgrid="false"
inkscape:zoom="14.75"
inkscape:cx="-1.1122019"
inkscape:cy="10.839132"
inkscape:window-x="517"
inkscape:window-y="261"
inkscape:window-maximized="0"
inkscape:current-layer="svg8" />
<g
transform="matrix(1.4203458,0,0,1.4203458,-4.29479,-1473.1325)"
id="g6"
style="stroke:#424242;stroke-width:0.99994373;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1">
<g
id="g4"
style="stroke:#424242;stroke-width:0.99994373;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1">
<path
d="m 4.9883,1039.4 c -0.5469,0.01 -0.98717,0.4511 -0.98828,0.998 v 8 c 1.163e-4,0.7986 0.89011,1.275 1.5547,0.8321 l 6,-4 c 0.59362,-0.3959 0.59362,-1.2682 0,-1.6641 l -6,-4 c -0.1678,-0.1111 -0.3652,-0.1689 -0.56641,-0.166 z"
dominant-baseline="auto"
style="color:#000000;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;text-transform:none;text-orientation:mixed;dominant-baseline:auto;white-space:normal;shape-padding:0;isolation:auto;mix-blend-mode:normal;solid-color:#000000;fill:#e0e0e0;fill-rule:evenodd;stroke:#424242;stroke-width:0.99994373;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto"
id="path2"
inkscape:connector-curvature="0" />
</g>
</g>
<rect
style="fill:#e0e0e0;fill-opacity:1;stroke:#424242;stroke-width:1.42026603;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="rect862"
width="4.3577976"
height="14.299023"
x="14.411009"
y="3.1868868"
ry="1.0835251" />
</svg>

After

Width:  |  Height:  |  Size: 3.1 KiB

View file

@ -0,0 +1,64 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="16"
height="16"
version="1.1"
viewBox="0 0 16 16"
id="svg8"
sodipodi:docname="icon_transition_immediate.svg"
inkscape:version="0.92.3 (2405546, 2018-03-11)">
<metadata
id="metadata14">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
<defs
id="defs12" />
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1403"
inkscape:window-height="782"
id="namedview10"
showgrid="false"
inkscape:zoom="20.85965"
inkscape:cx="4.0199579"
inkscape:cy="5.3391396"
inkscape:window-x="67"
inkscape:window-y="27"
inkscape:window-maximized="0"
inkscape:current-layer="g4" />
<g
transform="translate(-2,-1036.4)"
id="g6">
<g
id="g4">
<path
d="m 4.9883,1039.4 c -0.5469,0.01 -0.98717,0.4511 -0.98828,0.998 v 8 c 1.163e-4,0.7986 0.89011,1.275 1.5547,0.8321 l 6,-4 c 0.59362,-0.3959 0.59362,-1.2682 0,-1.6641 l -6,-4 c -0.1678,-0.1111 -0.3652,-0.1689 -0.56641,-0.166 z"
dominant-baseline="auto"
style="color:#000000;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east_asian:normal;font-feature-settings:normal;text-indent:0;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;text-transform:none;text-orientation:mixed;dominant-baseline:auto;white-space:normal;shape-padding:0;isolation:auto;mix-blend-mode:normal;solid-color:#000000;fill:#e0e0e0;fill-rule:evenodd;color-rendering:auto;image-rendering:auto;shape-rendering:auto;fill-opacity:1"
id="path2"
inkscape:connector-curvature="0" />
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.5 KiB

View file

@ -0,0 +1,64 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="16"
height="16"
version="1.1"
viewBox="0 0 16 16"
id="svg8"
sodipodi:docname="icon_transition_immediate_auto.svg"
inkscape:version="0.92.3 (2405546, 2018-03-11)">
<metadata
id="metadata14">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<defs
id="defs12" />
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1403"
inkscape:window-height="782"
id="namedview10"
showgrid="false"
inkscape:zoom="20.85965"
inkscape:cx="-9.2592678"
inkscape:cy="5.3391396"
inkscape:window-x="67"
inkscape:window-y="27"
inkscape:window-maximized="0"
inkscape:current-layer="g4" />
<g
transform="translate(-2,-1036.4)"
id="g6">
<g
id="g4">
<path
d="m 4.9883,1039.4 c -0.5469,0.01 -0.98717,0.4511 -0.98828,0.998 v 8 c 1.163e-4,0.7986 0.89011,1.275 1.5547,0.8321 l 6,-4 c 0.59362,-0.3959 0.59362,-1.2682 0,-1.6641 l -6,-4 c -0.1678,-0.1111 -0.3652,-0.1689 -0.56641,-0.166 z"
dominant-baseline="auto"
style="color:#000000;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east_asian:normal;font-feature-settings:normal;text-indent:0;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;text-transform:none;text-orientation:mixed;dominant-baseline:auto;white-space:normal;shape-padding:0;isolation:auto;mix-blend-mode:normal;solid-color:#000000;fill:#77ce57;fill-rule:evenodd;color-rendering:auto;image-rendering:auto;shape-rendering:auto;fill-opacity:1"
id="path2"
inkscape:connector-curvature="0" />
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.5 KiB

View file

@ -0,0 +1,66 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="20"
height="20"
version="1.1"
viewBox="0 0 20 20"
id="svg8"
sodipodi:docname="icon_transition_immediate_auto_big.svg"
inkscape:version="0.92.3 (2405546, 2018-03-11)">
<metadata
id="metadata14">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<defs
id="defs12" />
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1403"
inkscape:window-height="782"
id="namedview10"
showgrid="false"
inkscape:zoom="20.85965"
inkscape:cx="11.321237"
inkscape:cy="3.5752171"
inkscape:window-x="517"
inkscape:window-y="261"
inkscape:window-maximized="0"
inkscape:current-layer="g4" />
<g
transform="matrix(1.571031,0,0,1.571031,-2.7257681,-1630.6239)"
id="g6"
style="stroke:#404040;stroke-opacity:1">
<g
id="g4"
style="stroke:#404040;stroke-opacity:1">
<path
d="m 4.9883,1039.4 c -0.5469,0.01 -0.98717,0.4511 -0.98828,0.998 v 8 c 1.163e-4,0.7986 0.89011,1.275 1.5547,0.8321 l 6,-4 c 0.59362,-0.3959 0.59362,-1.2682 0,-1.6641 l -6,-4 c -0.1678,-0.1111 -0.3652,-0.1689 -0.56641,-0.166 z"
dominant-baseline="auto"
style="color:#000000;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;text-transform:none;text-orientation:mixed;dominant-baseline:auto;white-space:normal;shape-padding:0;isolation:auto;mix-blend-mode:normal;solid-color:#000000;fill:#77ce57;fill-rule:evenodd;stroke:#41562e;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;fill-opacity:1"
id="path2"
inkscape:connector-curvature="0" />
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.6 KiB

View file

@ -0,0 +1,66 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="20"
height="20"
version="1.1"
viewBox="0 0 20 20"
id="svg8"
sodipodi:docname="icon_transition_immediate_big.svg"
inkscape:version="0.92.3 (2405546, 2018-03-11)">
<metadata
id="metadata14">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
<defs
id="defs12" />
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1403"
inkscape:window-height="782"
id="namedview10"
showgrid="false"
inkscape:zoom="20.85965"
inkscape:cx="0.19928629"
inkscape:cy="4.534006"
inkscape:window-x="517"
inkscape:window-y="261"
inkscape:window-maximized="0"
inkscape:current-layer="g4" />
<g
transform="matrix(1.571031,0,0,1.571031,-2.7257681,-1630.6239)"
id="g6"
style="stroke:#404040;stroke-opacity:1">
<g
id="g4"
style="stroke:#404040;stroke-opacity:1">
<path
d="m 4.9883,1039.4 c -0.5469,0.01 -0.98717,0.4511 -0.98828,0.998 v 8 c 1.163e-4,0.7986 0.89011,1.275 1.5547,0.8321 l 6,-4 c 0.59362,-0.3959 0.59362,-1.2682 0,-1.6641 l -6,-4 c -0.1678,-0.1111 -0.3652,-0.1689 -0.56641,-0.166 z"
dominant-baseline="auto"
style="color:#000000;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;text-transform:none;text-orientation:mixed;dominant-baseline:auto;white-space:normal;shape-padding:0;isolation:auto;mix-blend-mode:normal;solid-color:#000000;fill:#e0e0e0;fill-rule:evenodd;stroke:#404040;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;fill-opacity:1"
id="path2"
inkscape:connector-curvature="0" />
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.6 KiB

View file

@ -0,0 +1,72 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="16"
height="16"
version="1.1"
viewBox="0 0 16 16"
id="svg8"
sodipodi:docname="icon_transition_sync.svg"
inkscape:version="0.92.3 (2405546, 2018-03-11)">
<metadata
id="metadata14">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<defs
id="defs12" />
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1403"
inkscape:window-height="782"
id="namedview10"
showgrid="false"
inkscape:zoom="20.85965"
inkscape:cx="10.204146"
inkscape:cy="5.3391396"
inkscape:window-x="67"
inkscape:window-y="27"
inkscape:window-maximized="0"
inkscape:current-layer="svg8" />
<g
transform="translate(2.5542471,-1036.4)"
id="g6">
<g
id="g4">
<path
d="m 4.9883,1039.4 c -0.5469,0.01 -0.98717,0.4511 -0.98828,0.998 v 8 c 1.163e-4,0.7986 0.89011,1.275 1.5547,0.8321 l 6,-4 c 0.59362,-0.3959 0.59362,-1.2682 0,-1.6641 l -6,-4 c -0.1678,-0.1111 -0.3652,-0.1689 -0.56641,-0.166 z"
dominant-baseline="auto"
style="color:#000000;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;text-transform:none;text-orientation:mixed;dominant-baseline:auto;white-space:normal;shape-padding:0;isolation:auto;mix-blend-mode:normal;solid-color:#000000;fill:#e0e0e0;fill-rule:evenodd;color-rendering:auto;image-rendering:auto;shape-rendering:auto"
id="path2"
inkscape:connector-curvature="0" />
</g>
</g>
<rect
style="fill:#e0e0e0;fill-opacity:1"
id="rect862"
width="3.0681243"
height="10.067283"
x="1.9655174"
y="3.0084109"
ry="0.76286" />
</svg>

After

Width:  |  Height:  |  Size: 2.6 KiB

View file

@ -0,0 +1,74 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="16"
height="16"
version="1.1"
viewBox="0 0 16 16"
id="svg8"
sodipodi:docname="icon_transition_sync_auto.svg"
inkscape:version="0.92.3 (2405546, 2018-03-11)">
<metadata
id="metadata14">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<defs
id="defs12" />
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1403"
inkscape:window-height="782"
id="namedview10"
showgrid="false"
inkscape:zoom="20.85965"
inkscape:cx="0.56831798"
inkscape:cy="5.1473818"
inkscape:window-x="67"
inkscape:window-y="27"
inkscape:window-maximized="0"
inkscape:current-layer="svg8" />
<g
transform="translate(3.0815809,-1036.4)"
id="g6"
style="fill:#77ce57;fill-opacity:1">
<g
id="g4"
style="fill:#77ce57;fill-opacity:1">
<path
d="m 4.9883,1039.4 c -0.5469,0.01 -0.98717,0.4511 -0.98828,0.998 v 8 c 1.163e-4,0.7986 0.89011,1.275 1.5547,0.8321 l 6,-4 c 0.59362,-0.3959 0.59362,-1.2682 0,-1.6641 l -6,-4 c -0.1678,-0.1111 -0.3652,-0.1689 -0.56641,-0.166 z"
dominant-baseline="auto"
style="color:#000000;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;text-transform:none;text-orientation:mixed;dominant-baseline:auto;white-space:normal;shape-padding:0;isolation:auto;mix-blend-mode:normal;solid-color:#000000;fill:#77ce57;fill-opacity:1;fill-rule:evenodd;color-rendering:auto;image-rendering:auto;shape-rendering:auto"
id="path2"
inkscape:connector-curvature="0" />
</g>
</g>
<rect
style="fill:#77ce57;fill-opacity:1"
id="rect862"
width="3.0681243"
height="10.067283"
x="1.9655174"
y="3.0084109"
ry="0.76286" />
</svg>

After

Width:  |  Height:  |  Size: 2.7 KiB

View file

@ -0,0 +1,74 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="20"
height="20"
version="1.1"
viewBox="0 0 20 20"
id="svg8"
sodipodi:docname="icon_transition_sync_auto_big.svg"
inkscape:version="0.92.3 (2405546, 2018-03-11)">
<metadata
id="metadata14">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<defs
id="defs12" />
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1403"
inkscape:window-height="782"
id="namedview10"
showgrid="false"
inkscape:zoom="14.75"
inkscape:cx="0.3064671"
inkscape:cy="14.348448"
inkscape:window-x="67"
inkscape:window-y="27"
inkscape:window-maximized="0"
inkscape:current-layer="svg8" />
<g
transform="matrix(1.4099529,0,0,1.4099529,2.1752927,-1462.5094)"
id="g6"
style="fill:#77ce57;fill-opacity:1;stroke:#41562e;stroke-opacity:1">
<g
id="g4"
style="fill:#77ce57;fill-opacity:1;stroke:#41562e;stroke-opacity:1">
<path
d="m 4.9883,1039.4 c -0.5469,0.01 -0.98717,0.4511 -0.98828,0.998 v 8 c 1.163e-4,0.7986 0.89011,1.275 1.5547,0.8321 l 6,-4 c 0.59362,-0.3959 0.59362,-1.2682 0,-1.6641 l -6,-4 c -0.1678,-0.1111 -0.3652,-0.1689 -0.56641,-0.166 z"
dominant-baseline="auto"
style="color:#000000;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;text-transform:none;text-orientation:mixed;dominant-baseline:auto;white-space:normal;shape-padding:0;isolation:auto;mix-blend-mode:normal;solid-color:#000000;fill:#77ce57;fill-opacity:1;fill-rule:evenodd;stroke:#41562e;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto"
id="path2"
inkscape:connector-curvature="0" />
</g>
</g>
<rect
style="fill:#77ce57;fill-opacity:1;stroke:#41562e;stroke-width:1.409953;stroke-opacity:1"
id="rect862"
width="4.3259106"
height="14.194397"
x="1.6255733"
y="3.0076122"
ry="1.0755967" />
</svg>

After

Width:  |  Height:  |  Size: 2.9 KiB

View file

@ -0,0 +1,74 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="20"
height="20"
version="1.1"
viewBox="0 0 20 20"
id="svg8"
sodipodi:docname="icon_transition_sync_big.svg"
inkscape:version="0.92.3 (2405546, 2018-03-11)">
<metadata
id="metadata14">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<defs
id="defs12" />
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1403"
inkscape:window-height="782"
id="namedview10"
showgrid="false"
inkscape:zoom="14.75"
inkscape:cx="19.226781"
inkscape:cy="9.27981"
inkscape:window-x="302"
inkscape:window-y="226"
inkscape:window-maximized="0"
inkscape:current-layer="svg8" />
<g
transform="matrix(1.4203458,0,0,1.4203458,1.8747015,-1473.1325)"
id="g6"
style="stroke:#424242;stroke-width:0.99994373;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1">
<g
id="g4"
style="stroke:#424242;stroke-width:0.99994373;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1">
<path
d="m 4.9883,1039.4 c -0.5469,0.01 -0.98717,0.4511 -0.98828,0.998 v 8 c 1.163e-4,0.7986 0.89011,1.275 1.5547,0.8321 l 6,-4 c 0.59362,-0.3959 0.59362,-1.2682 0,-1.6641 l -6,-4 c -0.1678,-0.1111 -0.3652,-0.1689 -0.56641,-0.166 z"
dominant-baseline="auto"
style="color:#000000;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;text-transform:none;text-orientation:mixed;dominant-baseline:auto;white-space:normal;shape-padding:0;isolation:auto;mix-blend-mode:normal;solid-color:#000000;fill:#e0e0e0;fill-rule:evenodd;stroke:#424242;stroke-width:0.99994373;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto"
id="path2"
inkscape:connector-curvature="0" />
</g>
</g>
<rect
style="fill:#e0e0e0;fill-opacity:1;stroke:#424242;stroke-width:1.42026603;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="rect862"
width="4.3577976"
height="14.299023"
x="1.4618562"
y="3.1868868"
ry="1.0835251" />
</svg>

After

Width:  |  Height:  |  Size: 3.1 KiB

View file

@ -203,7 +203,7 @@ void AnimationNodeBlendSpaceEditor::_blend_space_gui_input(const Ref<InputEvent>
blend_pos *= (blend_space->get_max_space() - blend_space->get_min_space());
blend_pos += blend_space->get_min_space();
blend_space->set_blend_pos(blend_pos);
blend_space->set_blend_position(blend_pos);
blend_space_draw->update();
}
@ -237,7 +237,7 @@ void AnimationNodeBlendSpaceEditor::_blend_space_gui_input(const Ref<InputEvent>
blend_pos *= (blend_space->get_max_space() - blend_space->get_min_space());
blend_pos += blend_space->get_min_space();
blend_space->set_blend_pos(blend_pos);
blend_space->set_blend_position(blend_pos);
blend_space_draw->update();
}
}
@ -490,13 +490,13 @@ void AnimationNodeBlendSpaceEditor::_blend_space_draw() {
color.a *= 0.5;
}
Vector2 point = blend_space->get_blend_pos();
Vector2 point = blend_space->get_blend_position();
point = (point - blend_space->get_min_space()) / (blend_space->get_max_space() - blend_space->get_min_space());
point *= s;
point.y = s.height - point.y;
if (blend_space->get_triangle_count()) {
Vector2 closest = blend_space->get_closest_point(blend_space->get_blend_pos());
Vector2 closest = blend_space->get_closest_point(blend_space->get_blend_position());
closest = (closest - blend_space->get_min_space()) / (blend_space->get_max_space() - blend_space->get_min_space());
closest *= s;
closest.y = s.height - closest.y;

View file

@ -775,6 +775,7 @@ AnimationNodeBlendTreeEditor::AnimationNodeBlendTreeEditor() {
add_options.push_back(AddOption("Transition", "AnimationNodeTransition"));
add_options.push_back(AddOption("BlendTree", "AnimationNodeBlendTree"));
add_options.push_back(AddOption("BlendSpace", "AnimationNodeBlendSpace"));
add_options.push_back(AddOption("StateMachine", "AnimationNodeStateMachine"));
_update_options_menu();
error_panel = memnew(PanelContainer);

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,167 @@
#ifndef ANIMATION_STATE_MACHINE_EDITOR_H
#define ANIMATION_STATE_MACHINE_EDITOR_H
#include "editor/editor_node.h"
#include "editor/editor_plugin.h"
#include "editor/property_editor.h"
#include "scene/animation/animation_node_state_machine.h"
#include "scene/gui/button.h"
#include "scene/gui/graph_edit.h"
#include "scene/gui/popup.h"
#include "scene/gui/tree.h"
class AnimationNodeStateMachineEditor : public VBoxContainer {
GDCLASS(AnimationNodeStateMachineEditor, VBoxContainer);
Ref<AnimationNodeStateMachine> state_machine;
ToolButton *tool_select;
ToolButton *tool_create;
ToolButton *tool_connect;
LineEdit *name_edit;
HBoxContainer *tool_erase_hb;
ToolButton *tool_erase;
ToolButton *tool_autoplay;
ToolButton *tool_end;
OptionButton *transition_mode;
OptionButton *play_mode;
HBoxContainer *goto_parent_hbox;
ToolButton *goto_parent;
PanelContainer *panel;
StringName selected_node;
HScrollBar *h_scroll;
VScrollBar *v_scroll;
Control *state_machine_draw;
Control *state_machine_play_pos;
PanelContainer *error_panel;
Label *error_label;
bool updating;
UndoRedo *undo_redo;
static AnimationNodeStateMachineEditor *singleton;
void _state_machine_gui_input(const Ref<InputEvent> &p_event);
void _connection_draw(const Vector2 &p_from, const Vector2 &p_to, AnimationNodeStateMachineTransition::SwitchMode p_mode, bool p_enabled, bool p_selected, bool p_travel, bool p_auto_advance);
void _state_machine_draw();
void _state_machine_pos_draw();
void _update_graph();
PopupMenu *menu;
PopupMenu *animations_menu;
Vector<String> animations_to_add;
Vector2 add_node_pos;
bool dragging_selected_attempt;
bool dragging_selected;
Vector2 drag_from;
Vector2 drag_ofs;
StringName snap_x;
StringName snap_y;
bool connecting;
StringName connecting_from;
Vector2 connecting_to;
StringName connecting_to_node;
void _add_menu_type(int p_index);
void _add_animation_type(int p_index);
void _goto_parent();
void _removed_from_graph();
struct NodeRect {
StringName node_name;
Rect2 node;
Rect2 play;
Rect2 name;
Rect2 edit;
};
Vector<NodeRect> node_rects;
struct TransitionLine {
StringName from_node;
StringName to_node;
Vector2 from;
Vector2 to;
AnimationNodeStateMachineTransition::SwitchMode mode;
bool disabled;
bool auto_advance;
float width;
};
Vector<TransitionLine> transition_lines;
StringName selected_transition_from;
StringName selected_transition_to;
bool over_text;
StringName over_node;
int over_node_what;
String prev_name;
void _name_edited(const String &p_text);
void _open_editor(const String &p_name);
void _scroll_changed(double);
void _clip_src_line_to_rect(Vector2 &r_from, Vector2 &r_to, const Rect2 &p_rect);
void _clip_dst_line_to_rect(Vector2 &r_from, Vector2 &r_to, const Rect2 &p_rect);
void _erase_selected();
void _update_mode();
void _autoplay_selected();
void _end_selected();
bool last_active;
StringName last_blend_from_node;
StringName last_current_node;
Vector<StringName> last_travel_path;
float last_play_pos;
float error_time;
String error_text;
protected:
void _notification(int p_what);
static void _bind_methods();
public:
static AnimationNodeStateMachineEditor *get_singleton() { return singleton; }
void edit(AnimationNodeStateMachine *p_state_machine);
AnimationNodeStateMachineEditor();
};
class AnimationNodeStateMachineEditorPlugin : public EditorPlugin {
GDCLASS(AnimationNodeStateMachineEditorPlugin, EditorPlugin);
AnimationNodeStateMachineEditor *anim_tree_editor;
EditorNode *editor;
Button *button;
public:
virtual String get_name() const { return "StateMachine"; }
bool has_main_screen() const { return false; }
virtual void edit(Object *p_object);
virtual bool handles(Object *p_object) const;
virtual void make_visible(bool p_visible);
AnimationNodeStateMachineEditorPlugin(EditorNode *p_node);
~AnimationNodeStateMachineEditorPlugin();
};
#endif // ANIMATION_STATE_MACHINE_EDITOR_H

View file

@ -209,10 +209,10 @@ Vector2 AnimationNodeBlendSpace::get_snap() const {
return snap;
}
void AnimationNodeBlendSpace::set_blend_pos(const Vector2 &p_pos) {
void AnimationNodeBlendSpace::set_blend_position(const Vector2 &p_pos) {
blend_pos = p_pos;
}
Vector2 AnimationNodeBlendSpace::get_blend_pos() const {
Vector2 AnimationNodeBlendSpace::get_blend_position() const {
return blend_pos;
}
@ -503,8 +503,8 @@ void AnimationNodeBlendSpace::_bind_methods() {
ClassDB::bind_method(D_METHOD("set_snap", "snap"), &AnimationNodeBlendSpace::set_snap);
ClassDB::bind_method(D_METHOD("get_snap"), &AnimationNodeBlendSpace::get_snap);
ClassDB::bind_method(D_METHOD("set_blend_pos", "pos"), &AnimationNodeBlendSpace::set_blend_pos);
ClassDB::bind_method(D_METHOD("get_blend_pos"), &AnimationNodeBlendSpace::get_blend_pos);
ClassDB::bind_method(D_METHOD("set_blend_position", "pos"), &AnimationNodeBlendSpace::set_blend_position);
ClassDB::bind_method(D_METHOD("get_blend_position"), &AnimationNodeBlendSpace::get_blend_position);
ClassDB::bind_method(D_METHOD("set_x_label", "text"), &AnimationNodeBlendSpace::set_x_label);
ClassDB::bind_method(D_METHOD("get_x_label"), &AnimationNodeBlendSpace::get_x_label);
@ -532,7 +532,7 @@ void AnimationNodeBlendSpace::_bind_methods() {
ADD_PROPERTY(PropertyInfo(Variant::VECTOR2, "min_space", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NOEDITOR), "set_min_space", "get_min_space");
ADD_PROPERTY(PropertyInfo(Variant::VECTOR2, "max_space", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NOEDITOR), "set_max_space", "get_max_space");
ADD_PROPERTY(PropertyInfo(Variant::VECTOR2, "snap", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NOEDITOR), "set_snap", "get_snap");
ADD_PROPERTY(PropertyInfo(Variant::VECTOR2, "blend_pos", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NOEDITOR), "set_blend_pos", "get_blend_pos");
ADD_PROPERTY(PropertyInfo(Variant::VECTOR2, "blend_position", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NOEDITOR), "set_blend_position", "get_blend_position");
ADD_PROPERTY(PropertyInfo(Variant::STRING, "x_label", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NOEDITOR), "set_x_label", "get_x_label");
ADD_PROPERTY(PropertyInfo(Variant::STRING, "y_label", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NOEDITOR), "set_y_label", "get_y_label");
}

View file

@ -70,8 +70,8 @@ public:
void set_snap(const Vector2 &p_snap);
Vector2 get_snap() const;
void set_blend_pos(const Vector2 &p_pos);
Vector2 get_blend_pos() const;
void set_blend_position(const Vector2 &p_pos);
Vector2 get_blend_position() const;
void set_x_label(const String &p_label);
String get_x_label() const;
@ -79,8 +79,8 @@ public:
void set_y_label(const String &p_label);
String get_y_label() const;
float process(float p_time, bool p_seek);
String get_caption() const;
virtual float process(float p_time, bool p_seek);
virtual String get_caption() const;
Vector2 get_closest_point(const Vector2 &p_point);

View file

@ -0,0 +1,794 @@
#include "animation_node_state_machine.h"
/////////////////////////////////////////////////
void AnimationNodeStateMachineTransition::set_switch_mode(SwitchMode p_mode) {
switch_mode = p_mode;
}
AnimationNodeStateMachineTransition::SwitchMode AnimationNodeStateMachineTransition::get_switch_mode() const {
return switch_mode;
}
void AnimationNodeStateMachineTransition::set_auto_advance(bool p_enable) {
auto_advance = p_enable;
}
bool AnimationNodeStateMachineTransition::has_auto_advance() const {
return auto_advance;
}
void AnimationNodeStateMachineTransition::set_xfade_time(float p_xfade) {
ERR_FAIL_COND(p_xfade < 0);
xfade = p_xfade;
emit_changed();
}
float AnimationNodeStateMachineTransition::get_xfade_time() const {
return xfade;
}
void AnimationNodeStateMachineTransition::set_disabled(bool p_disabled) {
disabled = p_disabled;
emit_changed();
}
bool AnimationNodeStateMachineTransition::is_disabled() const {
return disabled;
}
void AnimationNodeStateMachineTransition::set_priority(int p_priority) {
priority = p_priority;
emit_changed();
}
int AnimationNodeStateMachineTransition::get_priority() const {
return priority;
}
void AnimationNodeStateMachineTransition::_bind_methods() {
ClassDB::bind_method(D_METHOD("set_switch_mode", "mode"), &AnimationNodeStateMachineTransition::set_switch_mode);
ClassDB::bind_method(D_METHOD("get_switch_mode"), &AnimationNodeStateMachineTransition::get_switch_mode);
ClassDB::bind_method(D_METHOD("set_auto_advance", "auto_advance"), &AnimationNodeStateMachineTransition::set_auto_advance);
ClassDB::bind_method(D_METHOD("has_auto_advance"), &AnimationNodeStateMachineTransition::has_auto_advance);
ClassDB::bind_method(D_METHOD("set_xfade_time", "secs"), &AnimationNodeStateMachineTransition::set_xfade_time);
ClassDB::bind_method(D_METHOD("get_xfade_time"), &AnimationNodeStateMachineTransition::get_xfade_time);
ClassDB::bind_method(D_METHOD("set_disabled", "disabled"), &AnimationNodeStateMachineTransition::set_disabled);
ClassDB::bind_method(D_METHOD("is_disabled"), &AnimationNodeStateMachineTransition::is_disabled);
ClassDB::bind_method(D_METHOD("set_priority", "priority"), &AnimationNodeStateMachineTransition::set_priority);
ClassDB::bind_method(D_METHOD("get_priority"), &AnimationNodeStateMachineTransition::get_priority);
ADD_PROPERTY(PropertyInfo(Variant::INT, "switch_mode", PROPERTY_HINT_ENUM, "Immediate,Sync,AtEnd"), "set_switch_mode", "get_switch_mode");
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "auto_advance"), "set_auto_advance", "has_auto_advance");
ADD_PROPERTY(PropertyInfo(Variant::REAL, "xfade_time", PROPERTY_HINT_RANGE, "0,240,0.01"), "set_xfade_time", "get_xfade_time");
ADD_PROPERTY(PropertyInfo(Variant::INT, "priority", PROPERTY_HINT_RANGE, "0,32,1"), "set_priority", "get_priority");
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "disabled"), "set_disabled", "is_disabled");
BIND_CONSTANT(SWITCH_MODE_IMMEDIATE);
BIND_CONSTANT(SWITCH_MODE_SYNC);
BIND_CONSTANT(SWITCH_MODE_AT_END);
}
AnimationNodeStateMachineTransition::AnimationNodeStateMachineTransition() {
switch_mode = SWITCH_MODE_IMMEDIATE;
auto_advance = false;
xfade = 0;
disabled = false;
priority = 1;
}
///////////////////////////////////////////////////////
void AnimationNodeStateMachine::add_node(const StringName &p_name, Ref<AnimationNode> p_node) {
ERR_FAIL_COND(states.has(p_name));
ERR_FAIL_COND(p_node.is_null());
ERR_FAIL_COND(p_node->get_parent().is_valid());
ERR_FAIL_COND(p_node->get_graph_player() != NULL);
ERR_FAIL_COND(String(p_name).find("/") != -1);
states[p_name] = p_node;
p_node->set_parent(this);
p_node->set_graph_player(get_graph_player());
emit_changed();
}
Ref<AnimationNode> AnimationNodeStateMachine::get_node(const StringName &p_name) const {
ERR_FAIL_COND_V(!states.has(p_name), Ref<AnimationNode>());
return states[p_name];
}
StringName AnimationNodeStateMachine::get_node_name(const Ref<AnimationNode> &p_node) const {
for (Map<StringName, Ref<AnimationRootNode> >::Element *E = states.front(); E; E = E->next()) {
if (E->get() == p_node) {
return E->key();
}
}
ERR_FAIL_V(StringName());
}
bool AnimationNodeStateMachine::has_node(const StringName &p_name) const {
return states.has(p_name);
}
void AnimationNodeStateMachine::remove_node(const StringName &p_name) {
ERR_FAIL_COND(!states.has(p_name));
{
//erase node connections
Ref<AnimationNode> node = states[p_name];
for (int i = 0; i < node->get_input_count(); i++) {
node->set_input_connection(i, StringName());
}
node->set_parent(NULL);
node->set_graph_player(NULL);
}
states.erase(p_name);
path.erase(p_name);
for (int i = 0; i < transitions.size(); i++) {
if (transitions[i].from == p_name || transitions[i].to == p_name) {
transitions.remove(i);
i--;
}
}
if (start_node == p_name) {
start_node = StringName();
}
if (end_node == p_name) {
end_node = StringName();
}
if (playing && current == p_name) {
stop();
}
emit_changed();
}
void AnimationNodeStateMachine::rename_node(const StringName &p_name, const StringName &p_new_name) {
ERR_FAIL_COND(!states.has(p_name));
ERR_FAIL_COND(states.has(p_new_name));
states[p_new_name] = states[p_name];
states.erase(p_name);
for (int i = 0; i < transitions.size(); i++) {
if (transitions[i].from == p_name) {
transitions[i].from = p_new_name;
}
if (transitions[i].to == p_name) {
transitions[i].to = p_new_name;
}
}
if (start_node == p_name) {
start_node = p_new_name;
}
if (end_node == p_name) {
end_node = p_new_name;
}
if (playing && current == p_name) {
current = p_new_name;
}
path.clear(); //clear path
}
void AnimationNodeStateMachine::get_node_list(List<StringName> *r_nodes) const {
List<StringName> nodes;
for (Map<StringName, Ref<AnimationRootNode> >::Element *E = states.front(); E; E = E->next()) {
nodes.push_back(E->key());
}
nodes.sort_custom<StringName::AlphCompare>();
for (List<StringName>::Element *E = nodes.front(); E; E = E->next()) {
r_nodes->push_back(E->get());
}
}
bool AnimationNodeStateMachine::has_transition(const StringName &p_from, const StringName &p_to) const {
for (int i = 0; i < transitions.size(); i++) {
if (transitions[i].from == p_from && transitions[i].to == p_to)
return true;
}
return false;
}
int AnimationNodeStateMachine::find_transition(const StringName &p_from, const StringName &p_to) const {
for (int i = 0; i < transitions.size(); i++) {
if (transitions[i].from == p_from && transitions[i].to == p_to)
return i;
}
return -1;
}
void AnimationNodeStateMachine::add_transition(const StringName &p_from, const StringName &p_to, const Ref<AnimationNodeStateMachineTransition> &p_transition) {
ERR_FAIL_COND(p_from == p_to);
ERR_FAIL_COND(!states.has(p_from));
ERR_FAIL_COND(!states.has(p_to));
ERR_FAIL_COND(p_transition.is_null());
for (int i = 0; i < transitions.size(); i++) {
ERR_FAIL_COND(transitions[i].from == p_from && transitions[i].to == p_to);
}
Transition tr;
tr.from = p_from;
tr.to = p_to;
tr.transition = p_transition;
transitions.push_back(tr);
}
Ref<AnimationNodeStateMachineTransition> AnimationNodeStateMachine::get_transition(int p_transition) const {
ERR_FAIL_INDEX_V(p_transition, transitions.size(), Ref<AnimationNodeStateMachineTransition>());
return transitions[p_transition].transition;
}
StringName AnimationNodeStateMachine::get_transition_from(int p_transition) const {
ERR_FAIL_INDEX_V(p_transition, transitions.size(), StringName());
return transitions[p_transition].from;
}
StringName AnimationNodeStateMachine::get_transition_to(int p_transition) const {
ERR_FAIL_INDEX_V(p_transition, transitions.size(), StringName());
return transitions[p_transition].to;
}
int AnimationNodeStateMachine::get_transition_count() const {
return transitions.size();
}
void AnimationNodeStateMachine::remove_transition(const StringName &p_from, const StringName &p_to) {
for (int i = 0; i < transitions.size(); i++) {
if (transitions[i].from == p_from && transitions[i].to == p_to) {
transitions.remove(i);
return;
}
}
if (playing) {
path.clear();
}
}
void AnimationNodeStateMachine::remove_transition_by_index(int p_transition) {
transitions.remove(p_transition);
if (playing) {
path.clear();
}
}
void AnimationNodeStateMachine::set_start_node(const StringName &p_node) {
ERR_FAIL_COND(p_node != StringName() && !states.has(p_node));
start_node = p_node;
}
String AnimationNodeStateMachine::get_start_node() const {
return start_node;
}
void AnimationNodeStateMachine::set_end_node(const StringName &p_node) {
ERR_FAIL_COND(p_node != StringName() && !states.has(p_node));
end_node = p_node;
}
String AnimationNodeStateMachine::get_end_node() const {
return end_node;
}
void AnimationNodeStateMachine::set_graph_offset(const Vector2 &p_offset) {
graph_offset = p_offset;
}
Vector2 AnimationNodeStateMachine::get_graph_offset() const {
return graph_offset;
}
float AnimationNodeStateMachine::process(float p_time, bool p_seek) {
//if not playing and it can restart, then restart
if (!playing) {
if (start_node) {
start(start_node);
} else {
return 0;
}
}
bool do_start = (p_seek && p_time == 0) || play_start || current == StringName();
if (do_start) {
if (start_node != StringName() && p_seek && p_time == 0) {
current = start_node;
}
len_current = blend_node(states[current], 0, true, 1.0, FILTER_IGNORE, false);
pos_current = 0;
loops_current = 0;
play_start = false;
}
float fade_blend = 1.0;
if (fading_from != StringName()) {
if (!p_seek) {
fading_pos += p_time;
}
fade_blend = MIN(1.0, fading_pos / fading_time);
if (fade_blend >= 1.0) {
fading_from = StringName();
}
}
float rem = blend_node(states[current], p_time, p_seek, fade_blend, FILTER_IGNORE, false);
if (fading_from != StringName()) {
blend_node(states[fading_from], p_time, p_seek, 1.0 - fade_blend, FILTER_IGNORE, false);
}
//guess playback position
if (rem > len_current) { // weird but ok
len_current = rem;
}
{ //advance and loop check
float next_pos = len_current - rem;
if (next_pos < pos_current) {
loops_current++;
}
pos_current = next_pos; //looped
}
//find next
StringName next;
float next_xfade = 0;
AnimationNodeStateMachineTransition::SwitchMode switch_mode = AnimationNodeStateMachineTransition::SWITCH_MODE_IMMEDIATE;
if (path.size()) {
for (int i = 0; i < transitions.size(); i++) {
if (transitions[i].from == current && transitions[i].to == path[0]) {
next_xfade = transitions[i].transition->get_xfade_time();
switch_mode = transitions[i].transition->get_switch_mode();
next = path[0];
}
}
} else {
float priority_best = 1e20;
int auto_advance_to = -1;
for (int i = 0; i < transitions.size(); i++) {
if (transitions[i].from == current && transitions[i].transition->has_auto_advance()) {
if (transitions[i].transition->get_priority() < priority_best) {
auto_advance_to = i;
}
}
}
if (auto_advance_to != -1) {
next = transitions[auto_advance_to].to;
next_xfade = transitions[auto_advance_to].transition->get_xfade_time();
switch_mode = transitions[auto_advance_to].transition->get_switch_mode();
}
}
//if next, see when to transition
if (next != StringName()) {
bool goto_next = false;
if (switch_mode == AnimationNodeStateMachineTransition::SWITCH_MODE_IMMEDIATE) {
goto_next = fading_from == StringName();
} else {
goto_next = next_xfade >= (len_current - pos_current) || loops_current > 0;
if (loops_current > 0) {
next_xfade = 0;
}
}
if (goto_next) { //loops should be used because fade time may be too small or zero and animation may have looped
if (next_xfade) {
//time to fade, baby
fading_from = current;
fading_time = next_xfade;
fading_pos = 0;
} else {
fading_from = StringName();
fading_pos = 0;
}
if (path.size()) { //if it came from path, remove path
path.remove(0);
}
current = next;
if (switch_mode == AnimationNodeStateMachineTransition::SWITCH_MODE_SYNC) {
len_current = blend_node(states[current], 0, true, 0, FILTER_IGNORE, false);
pos_current = MIN(pos_current, len_current);
blend_node(states[current], pos_current, true, 0, FILTER_IGNORE, false);
} else {
len_current = blend_node(states[current], 0, true, 0, FILTER_IGNORE, false);
pos_current = 0;
}
rem = len_current; //so it does not show 0 on transition
loops_current = 0;
}
}
//compute time left for transitions by using the end node
if (end_node != StringName() && end_node != current) {
rem = blend_node(states[end_node], 0, true, 0, FILTER_IGNORE, false);
}
if (get_parent().is_valid() && get_parent()->is_class("AnimationNodeStateMachine")) {
print_line("rem: " + rtos(rem));
}
return rem;
}
bool AnimationNodeStateMachine::travel(const StringName &p_state) {
ERR_FAIL_COND_V(!playing, false);
ERR_FAIL_COND_V(!states.has(p_state), false);
ERR_FAIL_COND_V(!states.has(current), false);
path.clear(); //a new one will be needed
if (current == p_state)
return true; //nothing to do
loops_current = 0; // reset loops, so fade does not happen immediately
Vector2 current_pos = states[current]->get_position();
Vector2 target_pos = states[p_state]->get_position();
Map<StringName, AStarCost> cost_map;
List<int> open_list;
//build open list
for (int i = 0; i < transitions.size(); i++) {
if (transitions[i].from == current) {
open_list.push_back(i);
float cost = states[transitions[i].to]->get_position().distance_to(current_pos);
cost *= transitions[i].transition->get_priority();
AStarCost ap;
ap.prev = current;
ap.distance = cost;
cost_map[transitions[i].to] = ap;
if (transitions[i].to == p_state) { //prematurely found it! :D
path.push_back(p_state);
return true;
}
}
}
//begin astar
bool found_route = false;
while (!found_route) {
if (open_list.size() == 0) {
return false; //no path found
}
//find the last cost transition
List<int>::Element *least_cost_transition = NULL;
float least_cost = 1e20;
for (List<int>::Element *E = open_list.front(); E; E = E->next()) {
float cost = cost_map[transitions[E->get()].to].distance;
cost += states[transitions[E->get()].to]->get_position().distance_to(target_pos);
if (cost < least_cost) {
least_cost_transition = E;
}
}
StringName transition_prev = transitions[least_cost_transition->get()].from;
StringName transition = transitions[least_cost_transition->get()].to;
for (int i = 0; i < transitions.size(); i++) {
if (transitions[i].from != transition || transitions[i].to == transition_prev) {
continue; //not interested on those
}
float distance = states[transitions[i].from]->get_position().distance_to(states[transitions[i].to]->get_position());
distance *= transitions[i].transition->get_priority();
distance += cost_map[transitions[i].from].distance;
if (cost_map.has(transitions[i].to)) {
//oh this was visited already, can we win the cost?
if (distance < cost_map[transitions[i].to].distance) {
cost_map[transitions[i].to].distance = distance;
cost_map[transitions[i].to].prev = transitions[i].from;
}
} else {
//add to open list
AStarCost ac;
ac.prev = transitions[i].from;
ac.distance = distance;
cost_map[transitions[i].to] = ac;
open_list.push_back(i);
if (transitions[i].to == p_state) {
found_route = true;
break;
}
}
}
if (found_route) {
break;
}
open_list.erase(least_cost_transition);
}
//make path
StringName at = p_state;
while (at != current) {
path.push_back(at);
at = cost_map[at].prev;
}
path.invert();
return true;
}
void AnimationNodeStateMachine::start(const StringName &p_state) {
ERR_FAIL_COND(!states.has(p_state));
path.clear();
current = p_state;
playing = true;
play_start = true;
}
void AnimationNodeStateMachine::stop() {
playing = false;
play_start = false;
current = StringName();
}
bool AnimationNodeStateMachine::is_playing() const {
return playing;
}
StringName AnimationNodeStateMachine::get_current_node() const {
if (!playing) {
return StringName();
}
return current;
}
StringName AnimationNodeStateMachine::get_blend_from_node() const {
if (!playing) {
return StringName();
}
return fading_from;
}
float AnimationNodeStateMachine::get_current_play_pos() const {
return pos_current;
}
float AnimationNodeStateMachine::get_current_length() const {
return len_current;
}
Vector<StringName> AnimationNodeStateMachine::get_travel_path() const {
return path;
}
String AnimationNodeStateMachine::get_caption() const {
return "StateMachine";
}
void AnimationNodeStateMachine::_notification(int p_what) {
}
void AnimationNodeStateMachine::set_graph_player(AnimationGraphPlayer *p_player) {
AnimationNode::set_graph_player(p_player);
for (Map<StringName, Ref<AnimationRootNode> >::Element *E = states.front(); E; E = E->next()) {
Ref<AnimationRootNode> node = E->get();
node->set_graph_player(p_player);
}
}
bool AnimationNodeStateMachine::_set(const StringName &p_name, const Variant &p_value) {
String name = p_name;
if (name.begins_with("states/")) {
String node_name = name.get_slicec('/', 1);
String what = name.get_slicec('/', 2);
if (what == "node") {
Ref<AnimationNode> anode = p_value;
if (anode.is_valid()) {
add_node(node_name, p_value);
}
return true;
}
if (what == "position") {
if (states.has(node_name)) {
states[node_name]->set_position(p_value);
}
return true;
}
} else if (name == "transitions") {
Array trans = p_value;
ERR_FAIL_COND_V(trans.size() % 3 != 0, false);
for (int i = 0; i < trans.size(); i += 3) {
add_transition(trans[i], trans[i + 1], trans[i + 2]);
}
return true;
} else if (name == "start_node") {
set_start_node(p_value);
return true;
} else if (name == "end_node") {
set_end_node(p_value);
return true;
} else if (name == "graph_offset") {
set_graph_offset(p_value);
return true;
}
return false;
}
bool AnimationNodeStateMachine::_get(const StringName &p_name, Variant &r_ret) const {
String name = p_name;
if (name.begins_with("states/")) {
String node_name = name.get_slicec('/', 1);
String what = name.get_slicec('/', 2);
if (what == "node") {
if (states.has(node_name)) {
r_ret = states[node_name];
return true;
}
}
if (what == "position") {
if (states.has(node_name)) {
r_ret = states[node_name]->get_position();
return true;
}
}
} else if (name == "transitions") {
Array trans;
trans.resize(transitions.size() * 3);
for (int i = 0; i < transitions.size(); i++) {
trans[i * 3 + 0] = transitions[i].from;
trans[i * 3 + 1] = transitions[i].to;
trans[i * 3 + 2] = transitions[i].transition;
}
r_ret = trans;
return true;
} else if (name == "start_node") {
r_ret = get_start_node();
return true;
} else if (name == "end_node") {
r_ret = get_end_node();
return true;
} else if (name == "graph_offset") {
r_ret = get_graph_offset();
return true;
}
return false;
}
void AnimationNodeStateMachine::_get_property_list(List<PropertyInfo> *p_list) const {
List<StringName> names;
for (Map<StringName, Ref<AnimationRootNode> >::Element *E = states.front(); E; E = E->next()) {
names.push_back(E->key());
}
names.sort_custom<StringName::AlphCompare>();
for (List<StringName>::Element *E = names.front(); E; E = E->next()) {
String name = E->get();
p_list->push_back(PropertyInfo(Variant::OBJECT, "states/" + name + "/node", PROPERTY_HINT_RESOURCE_TYPE, "AnimationNode", PROPERTY_USAGE_NOEDITOR | PROPERTY_USAGE_DO_NOT_SHARE_ON_DUPLICATE));
p_list->push_back(PropertyInfo(Variant::VECTOR2, "states/" + name + "/position", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NOEDITOR));
}
p_list->push_back(PropertyInfo(Variant::ARRAY, "transitions", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NOEDITOR));
p_list->push_back(PropertyInfo(Variant::STRING, "start_node", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NOEDITOR));
p_list->push_back(PropertyInfo(Variant::STRING, "end_node", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NOEDITOR));
p_list->push_back(PropertyInfo(Variant::VECTOR2, "graph_offset", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NOEDITOR));
}
void AnimationNodeStateMachine::_bind_methods() {
ClassDB::bind_method(D_METHOD("add_node", "name", "node"), &AnimationNodeStateMachine::add_node);
ClassDB::bind_method(D_METHOD("get_node", "name"), &AnimationNodeStateMachine::get_node);
ClassDB::bind_method(D_METHOD("remove_node", "name"), &AnimationNodeStateMachine::remove_node);
ClassDB::bind_method(D_METHOD("rename_node", "name", "new_name"), &AnimationNodeStateMachine::rename_node);
ClassDB::bind_method(D_METHOD("has_node", "name"), &AnimationNodeStateMachine::has_node);
ClassDB::bind_method(D_METHOD("get_node_name", "node"), &AnimationNodeStateMachine::get_node_name);
ClassDB::bind_method(D_METHOD("has_transition", "from", "to"), &AnimationNodeStateMachine::add_transition);
ClassDB::bind_method(D_METHOD("add_transition", "from", "to", "transition"), &AnimationNodeStateMachine::add_transition);
ClassDB::bind_method(D_METHOD("get_transition", "idx"), &AnimationNodeStateMachine::get_transition);
ClassDB::bind_method(D_METHOD("get_transition_from", "idx"), &AnimationNodeStateMachine::get_transition_from);
ClassDB::bind_method(D_METHOD("get_transition_to", "idx"), &AnimationNodeStateMachine::get_transition_to);
ClassDB::bind_method(D_METHOD("get_transition_count"), &AnimationNodeStateMachine::get_transition_count);
ClassDB::bind_method(D_METHOD("remove_transition_by_index", "idx"), &AnimationNodeStateMachine::remove_transition_by_index);
ClassDB::bind_method(D_METHOD("remove_transition", "from", "to"), &AnimationNodeStateMachine::remove_transition);
ClassDB::bind_method(D_METHOD("set_start_node", "name"), &AnimationNodeStateMachine::set_start_node);
ClassDB::bind_method(D_METHOD("get_start_node"), &AnimationNodeStateMachine::get_start_node);
ClassDB::bind_method(D_METHOD("set_end_node", "name"), &AnimationNodeStateMachine::set_end_node);
ClassDB::bind_method(D_METHOD("get_end_node"), &AnimationNodeStateMachine::get_end_node);
ClassDB::bind_method(D_METHOD("set_graph_offset", "name"), &AnimationNodeStateMachine::set_graph_offset);
ClassDB::bind_method(D_METHOD("get_graph_offset"), &AnimationNodeStateMachine::get_graph_offset);
ClassDB::bind_method(D_METHOD("travel", "to_node"), &AnimationNodeStateMachine::travel);
ClassDB::bind_method(D_METHOD("start", "node"), &AnimationNodeStateMachine::start);
ClassDB::bind_method(D_METHOD("stop"), &AnimationNodeStateMachine::stop);
ClassDB::bind_method(D_METHOD("is_playing"), &AnimationNodeStateMachine::is_playing);
ClassDB::bind_method(D_METHOD("get_current_node"), &AnimationNodeStateMachine::get_current_node);
ClassDB::bind_method(D_METHOD("get_travel_path"), &AnimationNodeStateMachine::get_travel_path);
}
AnimationNodeStateMachine::AnimationNodeStateMachine() {
play_start = false;
playing = false;
len_current = 0;
fading_time = 0;
}

View file

@ -0,0 +1,142 @@
#ifndef ANIMATION_NODE_STATE_MACHINE_H
#define ANIMATION_NODE_STATE_MACHINE_H
#include "scene/animation/animation_graph_player.h"
class AnimationNodeStateMachineTransition : public Resource {
GDCLASS(AnimationNodeStateMachineTransition, Resource)
public:
enum SwitchMode {
SWITCH_MODE_IMMEDIATE,
SWITCH_MODE_SYNC,
SWITCH_MODE_AT_END,
};
private:
SwitchMode switch_mode;
bool auto_advance;
float xfade;
bool disabled;
int priority;
protected:
static void _bind_methods();
public:
void set_switch_mode(SwitchMode p_mode);
SwitchMode get_switch_mode() const;
void set_auto_advance(bool p_enable);
bool has_auto_advance() const;
void set_xfade_time(float p_xfade);
float get_xfade_time() const;
void set_disabled(bool p_disabled);
bool is_disabled() const;
void set_priority(int p_priority);
int get_priority() const;
AnimationNodeStateMachineTransition();
};
VARIANT_ENUM_CAST(AnimationNodeStateMachineTransition::SwitchMode)
class AnimationNodeStateMachine : public AnimationRootNode {
GDCLASS(AnimationNodeStateMachine, AnimationRootNode);
private:
Map<StringName, Ref<AnimationRootNode> > states;
struct Transition {
StringName from;
StringName to;
Ref<AnimationNodeStateMachineTransition> transition;
};
struct AStarCost {
float distance;
StringName prev;
};
Vector<Transition> transitions;
float len_total;
float len_current;
float pos_current;
int loops_current;
bool play_start;
StringName start_node;
StringName end_node;
Vector2 graph_offset;
StringName current;
StringName fading_from;
float fading_time;
float fading_pos;
Vector<StringName> path;
bool playing;
protected:
void _notification(int p_what);
static void _bind_methods();
bool _set(const StringName &p_name, const Variant &p_value);
bool _get(const StringName &p_name, Variant &r_ret) const;
void _get_property_list(List<PropertyInfo> *p_list) const;
public:
void add_node(const StringName &p_name, Ref<AnimationNode> p_node);
Ref<AnimationNode> get_node(const StringName &p_name) const;
void remove_node(const StringName &p_name);
void rename_node(const StringName &p_name, const StringName &p_new_name);
bool has_node(const StringName &p_name) const;
StringName get_node_name(const Ref<AnimationNode> &p_node) const;
void get_node_list(List<StringName> *r_nodes) const;
bool has_transition(const StringName &p_from, const StringName &p_to) const;
int find_transition(const StringName &p_from, const StringName &p_to) const;
void add_transition(const StringName &p_from, const StringName &p_to, const Ref<AnimationNodeStateMachineTransition> &p_transition);
Ref<AnimationNodeStateMachineTransition> get_transition(int p_transition) const;
StringName get_transition_from(int p_transition) const;
StringName get_transition_to(int p_transition) const;
int get_transition_count() const;
void remove_transition_by_index(int p_transition);
void remove_transition(const StringName &p_from, const StringName &p_to);
void set_start_node(const StringName &p_node);
String get_start_node() const;
void set_end_node(const StringName &p_node);
String get_end_node() const;
void set_graph_offset(const Vector2 &p_offset);
Vector2 get_graph_offset() const;
virtual float process(float p_time, bool p_seek);
virtual String get_caption() const;
bool travel(const StringName &p_state);
void start(const StringName &p_state);
void stop();
bool is_playing() const;
StringName get_current_node() const;
StringName get_blend_from_node() const;
Vector<StringName> get_travel_path() const;
float get_current_play_pos() const;
float get_current_length() const;
virtual void set_graph_player(AnimationGraphPlayer *p_player);
AnimationNodeStateMachine();
};
#endif // ANIMATION_NODE_STATE_MACHINE_H

View file

@ -66,6 +66,7 @@
#include "scene/animation/animation_blend_space.h"
#include "scene/animation/animation_blend_tree.h"
#include "scene/animation/animation_graph_player.h"
#include "scene/animation/animation_node_state_machine.h"
#include "scene/animation/animation_player.h"
#include "scene/animation/animation_tree_player.h"
#include "scene/animation/tween.h"
@ -390,6 +391,8 @@ void register_scene_types() {
ClassDB::register_class<AnimationRootNode>();
ClassDB::register_class<AnimationNodeBlendTree>();
ClassDB::register_class<AnimationNodeBlendSpace>();
ClassDB::register_class<AnimationNodeStateMachine>();
ClassDB::register_class<AnimationNodeStateMachineTransition>();
ClassDB::register_class<AnimationNodeOutput>();
ClassDB::register_class<AnimationNodeOneShot>();
ClassDB::register_class<AnimationNodeAnimation>();