Okay cool thanks Ryusui & Mario.

Related Discussions
...
13 días más tarde

Hello guys, 🙂 I have a question:

What is the best way to detect when a specific animation has finished that has been playback twice in a queued animation?

Let me explain:

I'm doing a boxing game where the enemy do a combo punch: left punch, right punch, and again same animation left punch.

First I tried to use the signal completed animation to go back to idle(if the animation name is "left punch" go back to idle animation) but obviously because the first animation and the last are the same after playback the first animation it will go back to idle skipping the rest of the combo(right punch and left punch again).

The idea I've come up with is making two idle animations that are the same but with different names, one when the scene starts another one (that has been duplicated in Spine) with different name when the combo finish to go back to idle animation.

I tried using when animation is completed signal and using SpineTrackEntry get_current(track_id: int) something like this:

But it seems it doesn't work. Is there a way to detect when all the added animations has finished? Or detect when a specific animation has finished that has been playback twice in a queued animation?

I feel like you're leaning too heavily on the animation itself to time the mechanics.

Like...what I'd do is, I'd queue up the left jab, wait till it finishes, queue up the right jab, wait until that finishes, queue up the left jab again, wait for that to finish, and then set the idle animation. You could, alternately, use signals to determine which animations have finished, and detect whether all three animations have played that way, but I think my suggested method would be more straightforward to implement.

@maranpis AnimationState.get_current() will not return null if you loop the animation, as the track entry will remain on the track indefinitely until you queue a new animation or clear the track entry.

I have a todo list item that will allow setting a signal callback on individual track entries as returned by add_animation or set_animation. That way, you can add a signal callback to the track entry and know exactly when it has started/completed (a loop)/ended, and do whatever you need to do. You can already do this by setting a signal callback on the animation state itself, then checking the track entry that your signal callback is passed, e.g.
https://github.com/EsotericSoftware/spine-runtimes/blob/4.1/spine-godot/example/examples/02-animation-state-listeners/animation-state-listeners.gd#L15

You can simply query the animation name of the animation represented by the track entry:

func _animation_completed(sprite: SpineSprite, animation_state: SpineAnimationState, track_entry: SpineTrackEntry):
   print("Animation completed: " + track_entry.get_animation().get_name())
Ryusui escribió

I feel like you're leaning too heavily on the animation itself to time the mechanics.

Like...what I'd do is, I'd queue up the left jab, wait till it finishes, queue up the right jab, wait until that finishes, queue up the left jab again, wait for that to finish, and then set the idle animation. You could, alternately, use signals to determine which animations have finished, and detect whether all three animations have played that way, but I think my suggested method would be more straightforward to implement.

Hello Ryusui, thanks for your answer 🙂 . Considering that the animation goes like this (left_jab, right_jab_left_jab) I don't get how with signals I can differentiate the first left jab animation playback from the second jab animation playback. Could you explain it a little bit more, please?


Mario escribió

@[borrado] AnimationState.get_current() will not return null if you loop the animation, as the track entry will remain on the track indefinitely until you queue a new animation or clear the track entry.

Hello Mario and thanks for your answer. The final animation "idle" is the solution I have found to finish the combo and go back to idle animation. But before I just have the piece of code without the last animation:

Ebrius_Spine_animation.set_animation("ebrius_left_jab",false,0)
   Ebrius_Spine_animation.add_animation("ebrius_right_jab",fixed_delay,false,0)
   Ebrius_Spine_animation.add_animation("ebrius_left_jab",fixed_delay, false,0)

So I thought that when the last animation finishes, the AnimationState.get_current() in the func _animation_completed will give me null. Apparently, when the left jab animation finishes, it stays in the last frame of the animation, so I guess the track still has the animation and won't give null.

I might be misunderstanding how your game works but it feels like you're stuck on the idea of "the final left jab has to reset the animation." What's wrong with setting a count for the number of queued animations, decrementing it by one each time an animation in the sequence ends, and when it hits 0, returning to the idle state? You could configure this for any sequence of animations, without having to worry about which specific ones are queued. (And if anything interrupts the sequence - like the character getting hit mid-combo - you could set the count to 0 then!)

But yeah, to explain my original idea better, you could also set it so the animation_complete callback sets each subsequent animation in the sequence in turn, instead of queueing them all at once.

7 días más tarde
Ryusui escribió

I might be misunderstanding how your game works but it feels like you're stuck on the idea of "the final left jab has to reset the animation." What's wrong with setting a count for the number of queued animations, decrementing it by one each time an animation in the sequence ends, and when it hits 0, returning to the idle state? You could configure this for any sequence of animations, without having to worry about which specific ones are queued. (And if anything interrupts the sequence - like the character getting hit mid-combo - you could set the count to 0 then!).

That's a great idea! thanks for the suggestion 🙂

If you want the track to clear when it reaches the animation duration, you need to set TrackEntry trackEnd. However, you probably want to use an empty animation to transition to the setup pose rather than clearing the track.

You could use a listener on the TrackEntry for the last queued animation (eg the second left jab) to set to idle. I'm not sure spine-godot supports that yet, but it will.

Using the animation system for your game state isn't great. It would be much better to track what state your game is in separately, then set animations based on that. Separating animating from game state simplifies things and will help if you ever need to serialize the game state. You can Google for the "MVC design pattern". Super Spineboy uses it:
https://github.com/EsotericSoftware/spine-superspineboy/tree/master/src/com/esotericsoftware/spine/superspineboy

You can see how it works here:
https://github.com/EsotericSoftware/spine-superspineboy/blob/master/src/com/esotericsoftware/spine/superspineboy/CharacterView.java
The game state keeps track of what the player is doing, then this code checks if the corresponding animation is playing. If not, it plays it.

Nate escribió

If you want the track to clear when it reaches the animation duration, you need to set TrackEntry trackEnd. However, you probably want to use an empty animation to transition to the setup pose rather than clearing the track.

You could use a listener on the TrackEntry for the last queued animation (eg the second left jab) to set to idle. I'm not sure spine-godot supports that yet, but it will.

Using the animation system for your game state isn't great. It would be much better to track what state your game is in separately, then set animations based on that. Separating animating from game state simplifies things and will help if you ever need to serialize the game state. You can Google for the "MVC design pattern". Super Spineboy uses it:
https://github.com/EsotericSoftware/spine-superspineboy/tree/master/src/com/esotericsoftware/spine/superspineboy

You can see how it works here:
https://github.com/EsotericSoftware/spine-superspineboy/blob/master/src/com/esotericsoftware/spine/superspineboy/CharacterView.java
The game state keeps track of what the player is doing, then this code checks if the corresponding animation is playing. If not, it plays it.

Thanks, Nate! I'll keep that in mind for the animations. Now, I have a problem with the enemy's hook: I want the player to be able to dodge the hook by going under the glove like this:


I have no idea how I can change just the drawing order of the left arm because as you see if I change the entire skeleton's draw order the enemy torso overlaps the player's right glove. I've come up with 3 possible solutions:

1) Put the left arm on a different skeleton and copy the animations.

2) Maybe use the tracks, put the arm on track 1, and maybe you can change only the drawing order.

3) The easiest solution when the glove passes over the head is to make the player's head disappear, making the illusion that it has passed under it, and play then with the mesh tool to progressively make the face appear at the edge of the glove and the face.

Any ideas?

Have you considered adjusting the composition of the player and enemy sprites so you don't have to adjust the drawing order? Perhaps make the player dodge backwards instead of crouching, or crouch low enough that the punch looks like it's sailing over their head without overlapping. Alternately, move the sprites further apart so that the fist doesn't reach beyond the player's body, so that it makes sense that the fist never overlaps the player.

Ryusui escribió

Have you considered adjusting the composition of the player and enemy sprites so you don't have to adjust the drawing order? Perhaps make the player dodge backwards instead of crouching, or crouch low enough that the punch looks like it's sailing over their head without overlapping. Alternately, move the sprites further apart so that the fist doesn't reach beyond the player's body, so that it makes sense that the fist never overlaps the player.

Hi Ryusui, yes, I have tried it, I have to keep in mind that the player can either dodge the hit or then take damage and for that there will be a taking damage animation. I have tried different positions and this is the only one that works for all actions.

Would it be possible to get pre-built versions of the runtime with Godot 4 that line up with the alphas (or beta, which is due very soon)? I know neither Godot 4 nor Esoteric's support for it is stable yet, but a lot of folks are trying to get a jump on Godot 4 for various reasons (myself included) and would love to be able to use Spine without having to custom build everything all the time.

Really appreciate you all!

You can count out alpha builds, since they're still finalizing APIs and whatnot. Beta is possible, but still doubtful unless there's some huge demand for it.

You can fork the spine-runtimes repository on GitHub, enable Actions on your fork, then modify this file in your fork:

https://github.com/EsotericSoftware/spine-runtimes/blob/4.1/.github/workflows/spine-godot.yml#L16

Change the GODOT_TAG value from 3.5-stable to master and the GODOT_VERSION to whatever you like, e.g. 4.0.alpha. You can then manually trigger the Build and Publish Godot editor and templates workflow on GitHub. If the build succeeds, you can download the binaries from GitHub, like for this run:
https://github.com/EsotericSoftware/spine-runtimes/actions/runs/3043534000

We currently simply do not have the resources to support both pre-built 3.5 and 4.0 binaries. 4.0 is still in flux, even if the API is frozen, and has quite a few bugs. Before there's a stable release, we won't be able to suppor it I'm afraid.

Understood. I appreciate the suggestion of running it myself. I had been building locally but running in to errors, I'll give GH Actions a try.

Godot 4 won't be stable for the next 6 months at least. And while most things are locked in, there will still be some API changes so officially supporting early beta versions seems counter productive.

I'd rather see current Godot 3.5 issues resolved like this one: https://github.com/EsotericSoftware/spine-runtimes/issues/2119 and stuff like the .json conflict with Dialogic and similar plugins.

EDIT: And now that https://w4games.com/, a corporate entity founded by lead developers of Godot, exists, there should be no issues with representing interests of Spine in a commercial context. They're not FOSS purists and no one will get lynched by interacting with them via regular bug reporting and feature proposal channels.

8 días más tarde
Mario escribió

I've now "fixed" the .json issue. More infor here: https://github.com/EsotericSoftware/spine-runtimes/issues/2134

Blog post will also be up this week. TL;DR: backup your project, use the convert.py script to rewrite files, open project with Godot editor containing the latest spine-godot.

thanks a lot 🙂

un mes más tarde

Hi, I don't know why but when I run the convert.py script to rename the skeleton.json file it shows several errors. I also tried to use .skel file export with no success. Can somebody explain me what i'm doing wrong?

It looks like your skeleton.json is in use by another process. Maybe try closing Godot, then run the script.

11 días más tarde
5 días más tarde

Are there plans to release Mono builds? I tried compiling myself but haven't been successful.

We currently have no plan to do that I'm afraid. However, with Godot 4 getting more stable, and GDExtensions also getting stable, we might be able to switch the Godot Spine Runtimes from being an engine module to an extension. Then you should be able to use vanilla Godot with whatever language support you want and drop in our runtime. This will be a while tho, as GDExtensions isn't finalized yet.

23 días más tarde

Hello guys, ⁣ :grinteeth: I'm doing a boxing game in Godot with Spine and I don't know how to solve this problem. I'm now programming when the player gets hurt animation. The player has a tail attached to the head and when it dodges to the left or to the right the tail attachment changes. I created a get hurt animation that only changes the upper part of the player, and it works fine except the tail. You can watch it in the video.

Replied in the separate thread.

6 días más tarde

I have been experimenting with it more. Is there a way to import the SpineSprite in a 3D scene for a 2.5D set-up?

un mes más tarde

Will there ever be the possibility of swapping attachment images from disk like you can in the Unity mix and match example for runtime skin creation purposes? The docs mention attachment API is not exposed to GDScript - will this continue to be the case for future versions of the runtime and Godot engine?

The specific use cases I have in mind are mod support and also for performance reasons when a character can have hundreds of equipment items which would produce rather huge atlases with a significant memory footprint if loaded at once. It would be preferable to create a base Spine character with a template skin for each equipment type and then grab the images from disk later when necessary.

I sure would like to support that, but currently see no technical way to achieve it easily. The issue is that accessing files outside of the package Godot creates when you export, which is possible, but not in a way that'd make it easy to use for end users.

5 días más tarde

Hello ! 🙂

I downloaded the latest Godot editor provided by the spine-godot runtime documentation, but the performance is very bad ^^"
The editor runs at something like 10-20 fps, is not responsive, and is kind of unusable.
This is the editor version : "Godot Engine v3.5.stable.custom_build [991bb6ac7]"

Is it a known issue ? I can provide more information if that can help.
(I'm evaluating whether I'd prefer using Godot or Unity for a prototype of Spine integration)

5 días más tarde
midiphony-panda escribió

Hello ! 🙂

I downloaded the latest Godot editor provided by the spine-godot runtime documentation, but the performance is very bad ^^"
The editor runs at something like 10-20 fps, is not responsive, and is kind of unusable.
This is the editor version : "Godot Engine v3.5.stable.custom_build [991bb6ac7]"

Is it a known issue ? I can provide more information if that can help.
(I'm evaluating whether I'd prefer using Godot or Unity for a prototype of Spine integration)

Looks like it's been recently reported: https://github.com/EsotericSoftware/spine-runtimes/issues/2226

Sorry, been out sick and before I got sick, I had to change the build system so GitHub actions start working again. Sadly, I have not yet figured out what's causing this regression. I'll update the issue once I've figured it out.

18 días más tarde

I tried compiling Godot 3.5 branch mono editor by following the official compiling guidelines here.

But when trying to enable the Mono module per steps described in the link, the process fails due to presence of godot_spine module. Is the spine runtimes module fundamentally incompatible with the mono editor, or am I doing something wrong?

I can enable Mono module without godot_spine module present. Same issue when I attempt to "Generate the glue" per instructions.

I'm compiling on Windows for Windows.

The runtime is not fundamentally incompatible. We just don't ship pre-compiled binaries as it's a pain to set up a build pipeline for Mono integration for all platforms.

What specific errors are you getting?

    Mario

    PS C:\GameDev\GodotEngine\Godot_3_5_Src\godot> scons module_mono_enabled=yes
    scons: Reading SConscript files ...
    Automatically detected platform: windows
    Auto-detected 24 CPU cores available for build parallelism. Using 23 cores by default. You can override it with the -j argument.
    Found MSVC version 14.2, arch x86_64
    Building for platform "windows", architecture "x86_64", target "editor".
    Checking for C header file mntent.h... (cached) no
    scons: done reading SConscript files.
    scons: Building targets ...
    [ 3%] Compiling main\main.cpp ...
    [ 3%] main.cpp
    [ 3%] Compiling modules\register_module_types.gen.cpp ...
    [ 3%] register_module_types.gen.cpp
    [ 18%] Compiling modules\gdscript\register_types.cpp ...
    [ 18%] register_types.cpp
    [ 18%] Compiling modules\gdscript\language_server\gdscript_extend_parser.cpp ...
    gdscript_extend_parser.cpp
    [ 18%] Compiling modules\gdscript\language_server\gdscript_language_protocol.cpp ...
    [ 18%] Compiling modules\gdscript\language_server\gdscript_language_server.cpp ...
    gdscript_language_protocol.cpp
    gdscript_language_server.cpp
    [ 18%] Compiling modules\gdscript\language_server\gdscript_text_document.cpp ...
    [ 18%] Compiling modules\gdscript\language_server\gdscript_workspace.cpp ...
    gdscript_text_document.cpp
    gdscript_workspace.cpp
    [ 20%] Compiling modules\gltf\gltf_document.cpp ...
    [ 20%] gltf_document.cpp
    [ 20%] Compiling modules\gltf\register_types.cpp ...
    [ 20%] register_types.cpp
    [ 20%] Compiling modules\gltf\editor\editor_scene_exporter_gltf_plugin.cpp ...
    [ 20%] Compiling modules\gltf\editor\editor_scene_importer_blend.cpp ...
    [ 20%] editor_scene_exporter_gltf_plugin.cpp
    [ 20%] Compiling modules\gltf\editor\editor_scene_importer_fbx.cpp ...
    [ 20%] Compiling modules\gltf\editor\editor_scene_importer_gltf.cpp ...
    editor_scene_importer_blend.cpp
    editor_scene_importer_fbx.cpp
    editor_scene_importer_gltf.cpp
    [ 26%] Compiling modules\navigation\navigation_mesh_generator.cpp ...
    [ 26%] navigation_mesh_generator.cpp
    [ 34%] Compiling modules\spine_godot\GodotSpineExtension.cpp ...
    GodotSpineExtension.cpp
    C:\GameDev\GodotEngine\Godot_3_5_Src\godot\modules\spine_godot\GodotSpineExtension.h(32): fatal error C1083: Cannot open include file: 'spine/Extension.h': No such file or directory
    [ 34%] Compiling modules\spine_godot\SpineAnimation.cpp ...
    SpineAnimation.cpp
    [ 34%] Compiling modules\spine_godot\SpineAnimationState.cpp ...
    SpineAnimationState.cpp
    [ 34%] Compiling modules\spine_godot\SpineAnimationTrack.cpp ...
    [ 34%] Compiling modules\spine_godot\SpineAtlasResource.cpp ...
    SpineAnimationTrack.cpp
    [ 34%] Compiling modules\spine_godot\SpineAttachment.cpp ...
    SpineAtlasResource.cpp
    [ 34%] Compiling modules\spine_godot\SpineBone.cpp ...
    [ 34%] Compiling modules\spine_godot\SpineBoneData.cpp ...
    SpineAttachment.cpp
    SpineBone.cpp
    SpineBoneData.cpp
    scons: *** [modules\spine_godot\GodotSpineExtension.windows.editor.x86_64.obj] Error 2
    C:\GameDev\GodotEngine\Godot_3_5_Src\godot\modules\spine_godot\SpineAnimation.h(34): fatal error C1083: Cannot open include file: 'spine/Animation.h': No such file or directory
    scons: *** [modules\spine_godot\SpineAnimation.windows.editor.x86_64.obj] Error 2
    C:\GameDev\GodotEngine\Godot_3_5_Src\godot\modules\spine_godot\SpineAtlasResource.h(36): fatal error C1083: Cannot open include file: 'spine/Atlas.h': No such file or directory
    scons: *** [modules\spine_godot\SpineAnimationState.windows.editor.x86_64.obj] Error 2
    C:\GameDev\GodotEngine\Godot_3_5_Src\godot\modules\spine_godot\SpineAtlasResource.h(36): fatal error C1083: Cannot open include file: 'spine/Atlas.h': No such file or directory
    scons: *** [modules\spine_godot\SpineAtlasResource.windows.editor.x86_64.obj] Error 2
    C:\GameDev\GodotEngine\Godot_3_5_Src\godot\modules\spine_godot\SpineAtlasResource.h(36): fatal error C1083: Cannot open include file: 'spine/Atlas.h': No such file or directory
    scons: *** [modules\spine_godot\SpineAnimationTrack.windows.editor.x86_64.obj] Error 2
    C:\GameDev\GodotEngine\Godot_3_5_Src\godot\modules\spine_godot\SpineAttachment.h(33): fatal error C1083: Cannot open include file: 'spine/spine.h': No such file or directory
    C:\GameDev\GodotEngine\Godot_3_5_Src\godot\modules\spine_godot\SpineBoneData.h(34): fatal error C1083: Cannot open include file: 'spine/BoneData.h': No such file or directory
    scons: *** [modules\spine_godot\SpineAttachment.windows.editor.x86_64.obj] Error 2
    scons: *** [modules\spine_godot\SpineBone.windows.editor.x86_64.obj] Error 2
    C:\GameDev\GodotEngine\Godot_3_5_Src\godot\modules\spine_godot\SpineBoneData.h(34): fatal error C1083: Cannot open include file: 'spine/BoneData.h': No such file or directory
    scons: *** [modules\spine_godot\SpineBoneData.windows.editor.x86_64.obj] Error 2
    scons: building terminated because of errors.
    [Time elapsed: 00:00:16.617]
    PS C:\GameDev\GodotEngine\Godot_3_5_Src\godot>

    The process I've followed so far:

    1. Cloned Godot 3.5 branch.
    2. Cloned Spine Runtimes.
    3. Copy/pasted spine_godot folder from Runtimes to engine source in godot/modules.
    4. Then followed compiling with mono instructions up until the "Enable the Mono module" step where I get the above error.

    I have not run any of the included spine shell scripts as I'm unsure if/when I should do any of that.

    EDIT: Assuming I have to go the shell script route where I have to modify the scripts to include the mono steps, I've been unsuccessful in running the default scripts as well:

    The world of compiling from source, shell scripts and everything else related is completely foreign to me.

    Here's the reason things don't compile for you:

    C:\GameDev\GodotEngine\Godot_3_5_Src\godot\modules\spine_godot\GodotSpineExtension.h(32): fatal error C1083: Cannot open include file: 'spine/Extension.h': No such file or directory

    You don't have to use the shell scripts that come with spine-godot, but you need to copy over the folder spine-runtimes/spine-cpp/spine-cpp to your copy of the spine_godot folder.

    Here's what that looks like:

    The errors you get when executing the Bash scripts in spine-godot are due to the spaces in your path. I'll fix that up on our end. But I strongly suggest to never use spaces in your files and/or folder names as many (programming) tools don't deal with those properly.

      Mario I've copied spine-runtimes/spine-cpp/spine-cpp folder to spine_godot folder:

      But I'm still experiencing issues:

      C:\GameDev\GodotEngine\Godot_Src\godot>scons p=windows tools=yes module_mono_enabled=yes mono_glue=no
      scons: Reading SConscript files ...
      Auto-detected 24 CPU cores available for build parallelism. Using 23 cores by default. You can override it with the -j argument.
      Configuring for Windows: target=debug, bits=default
      Found MSVC version 14.2, arch amd64, bits=64
      Note: Building a debug binary (which will run slowly). Use target=release_debug to build an optimized release binary.
      Checking for thread_local support... supported
      Found Mono root directory: C:\Program Files\Mono\
      Checking for C header file mntent.h... (cached) no
      scons: done reading SConscript files.
      scons: Building targets ...
      [ 4%] generate_modules_enabled(["modules\modules_enabled.gen.h"], [OrderedDict([('bmp', 'modules/bmp'), ('bullet', 'modules/bullet'), ('camera', 'modules/camera'), ('csg', 'modules/csg'), ('cvtt', 'modules/cvtt'), ('dds', 'modules/dds'), ('denoise', 'modules/denoise'), ('enet', 'modules/enet'), ('etc', 'modules/etc'), ('fbx', 'modules/fbx'), ('freetype', 'modules/freetype'), ('gdnative', 'modules/gdnative'), ('gdscript', 'modules/gdscript'), ('gltf', 'modules/gltf'), ('gridmap', 'modules/gridmap'), ('hdr', 'modules/hdr'), ('jpg', 'modules/jpg'), ('jsonrpc', 'modules/jsonrpc'), ('lightmapper_cpu', 'modules/lightmapper_cpu'), ('mbedtls', 'modules/mbedtls'), ('minimp3', 'modules/minimp3'), ('mobile_vr', 'modules/mobile_vr'), ('mono', 'modules/mono'), ('navigation', 'modules/navigation'), ('ogg', 'modules/ogg'), ('opensimplex', 'modules/opensimplex'), ('opus', 'modules/opus'), ('pvr', 'modules/pvr'), ('raycast', 'modules/raycast'), ('regex', 'modules/regex'), ('spine_godot', 'modules/spine_godot'), ('squish', 'modules/squish'), ('stb_vorbis', 'modules/stb_vorbis'), ('svg', 'modules/svg'), ('tga', 'modules/tga'), ('theora', 'modules/theora'), ('tinyexr', 'modules/tinyexr'), ('upnp', 'modules/upnp'), ('vhacd', 'modules/vhacd'), ('visual_script', 'modules/visual_script'), ('vorbis', 'modules/vorbis'), ('webm', 'modules/webm'), ('webp', 'modules/webp'), ('webrtc', 'modules/webrtc'), ('websocket', 'modules/websocket'), ('webxr', 'modules/webxr'), ('xatlas_unwrap', 'modules/xatlas_unwrap')])])
      [ 45%] Compiling ==> modules\spine_godot\spine-cpp\src\spine\Animation.cpp
      [ 45%] Compiling ==> modules\spine_godot\spine-cpp\src\spine\AnimationState.cpp
      [ 45%] Compiling ==> modules\spine_godot\spine-cpp\src\spine\AnimationStateData.cpp
      Animation.cpp
      [ 45%] Compiling ==> modules\spine_godot\spine-cpp\src\spine\Atlas.cpp
      AnimationState.cpp
      [ 45%] Compiling ==> modules\spine_godot\spine-cpp\src\spine\AtlasAttachmentLoader.cpp
      AnimationStateData.cpp
      [ 45%] Compiling ==> modules\spine_godot\spine-cpp\src\spine\Attachment.cpp
      [ 45%] Atlas.cpp
      [ 45%] Compiling ==> modules\spine_godot\spine-cpp\src\spine\AttachmentLoader.cpp
      AtlasAttachmentLoader.cpp
      [ 45%] Compiling ==> modules\spine_godot\spine-cpp\src\spine\AttachmentTimeline.cpp
      Attachment.cpp
      [ 45%] AttachmentLoader.cpp
      [ 45%] Compiling ==> modules\spine_godot\spine-cpp\src\spine\Bone.cpp
      AttachmentTimeline.cpp
      [ 45%] Compiling ==> modules\spine_godot\spine-cpp\src\spine\BoneData.cpp
      [ 45%] Compiling ==> modules\spine_godot\spine-cpp\src\spine\BoundingBoxAttachment.cpp
      Bone.cpp
      [ 45%] Compiling ==> modules\spine_godot\spine-cpp\src\spine\ClippingAttachment.cpp
      BoneData.cpp
      [ 45%] modules\spine_godot\spine-cpp\src\spine\AnimationStateData.cpp(30): fatal error C1083: Cannot open include file: 'spine/AnimationStateData.h': No such file or directory
      [ 45%] modules\spine_godot\spine-cpp\src\spine\AttachmentTimeline.cpp(30): fatal error C1083: Cannot open include file: 'spine/AttachmentTimeline.h': No such file or directory
      Compiling ==> modules\spine_godot\spine-cpp\src\spine\ColorTimeline.cpp
      modules\spine_godot\spine-cpp\src\spine\Atlas.cpp(30): fatal error C1083: Cannot open include file: 'spine/Atlas.h': No such file or directory
      BoundingBoxAttachment.cpp
      modules\spine_godot\spine-cpp\src\spine\Animation.cpp(30): fatal error C1083: Cannot open include file: 'spine/Animation.h': No such file or directorymodules\spine_godot\spine-cpp\src\spine\Attachment.cpp(30): fatal error C1083: Cannot open include file: 'spine/Attachment.h': No such file or directory

      modules\spine_godot\spine-cpp\src\spine\AttachmentLoader.cpp(30): fatal error C1083: Cannot open include file: 'spine/AttachmentLoader.h': No such file or directory
      modules\spine_godot\spine-cpp\src\spine\AnimationState.cpp(30): fatal error C1083: Cannot open include file: 'spine/AnimationState.h': No such file or directory
      modules\spine_godot\spine-cpp\src\spine\AtlasAttachmentLoader.cpp(30): fatal error C1083: Cannot open include file: 'spine/AtlasAttachmentLoader.h': No such file or directorymodules\spine_godot\spine-cpp\src\spine\BoneData.cpp(30): fatal error C1083: Cannot open include file: 'spine/BoneData.h': No such file or directorymodules\spine_godot\spine-cpp\src\spine\Bone.cpp(30): fatal error C1083: Cannot open include file: 'spine/Bone.h': No such file or directory
      [ 45%]

      [ 45%] Compiling ==> modules\spine_godot\spine-cpp\src\spine\ConstraintData.cpp
      ClippingAttachment.cpp
      [ 45%] Compiling ==> modules\spine_godot\spine-cpp\src\spine\CurveTimeline.cpp
      ColorTimeline.cpp
      [ 45%] ConstraintData.cpp
      Compiling ==> modules\spine_godot\spine-cpp\src\spine\DeformTimeline.cpp
      [ 46%] Compiling ==> modules\spine_godot\spine-cpp\src\spine\DrawOrderTimeline.cpp
      CurveTimeline.cpp
      [ 46%] Compiling ==> modules\spine_godot\spine-cpp\src\spine\Event.cpp
      DeformTimeline.cpp
      [ 46%] Compiling ==> modules\spine_godot\spine-cpp\src\spine\EventData.cpp
      DrawOrderTimeline.cpp
      [ 46%] Compiling ==> modules\spine_godot\spine-cpp\src\spine\EventTimeline.cpp
      Event.cpp
      [ 46%] Compiling ==> modules\spine_godot\spine-cpp\src\spine\Extension.cpp
      EventData.cpp
      modules\spine_godot\spine-cpp\src\spine\DeformTimeline.cpp(30): fatal error C1083: Cannot open include file: 'spine/DeformTimeline.h': No such file or directory
      modules\spine_godot\spine-cpp\src\spine\BoundingBoxAttachment.cpp(30): fatal error C1083: Cannot open include file: 'spine/BoundingBoxAttachment.h': No such file or directorymodules\spine_godot\spine-cpp\src\spine\ConstraintData.cpp(30): fatal error C1083: Cannot open include file: 'spine/ConstraintData.h': No such file or directorymodules\spine_godot\spine-cpp\src\spine\ColorTimeline.cpp(30): fatal error C1083: Cannot open include file: 'spine/ColorTimeline.h': No such file [ 46%] ctory

      modules\spine_godot\spine-cpp\src\spine\ClippingAttachment.cpp(30): fatal error C1083: Cannot open include file: 'spine/ClippingAttachment.h': No such file or directory
      modules\spine_godot\spine-cpp\src\spine\Event.cpp(30): fatal error C1083: Cannot open include file: 'spine/Event.h': No such file or directory

      [ 46%] open include file: 'spine/CurveTimeline.h': No such file or directoryerror C1083: Cannot
      Compiling ==> modules\spine_godot\spine-cpp\src\spine\IkConstraint.cpp
      modules\spine_godot\spine-cpp\src\spine\DrawOrderTimeline.cpp(30): fatal error C1083: Cannot open include file: 'spine/DrawOrderTimeline.h': No such file or directory
      EventTimeline.cpp
      Extension.cpp
      modules\spine_godot\spine-cpp\src\spine\EventTimeline.cpp(30): fatal error C1083: Cannot open include file: 'spine/EventTimeline.h': No such file or directory
      modules\spine_godot\spine-cpp\src\spine\EventData.cpp(30): fatal error C1083: Cannot open include file: 'spine/EventData.h': No such file or directory
      IkConstraint.cpp
      [ 46%] Compiling ==> modules\navigation\register_types.cpp
      scons: *** [modules\spine_godot\spine-cpp\src\spine\CurveTimeline.windows.tools.64.obj] Error 2
      scons: *** [modules\spine_godot\spine-cpp\src\spine\BoundingBoxAttachment.windows.tools.64.obj] Error 2
      scons: *** [modules\spine_godot\spine-cpp\src\spine\AnimationStateData.windows.tools.64.obj] Error 2
      scons: *** [modules\spine_godot\spine-cpp\src\spine\Atlas.windows.tools.64.obj] Error 2
      scons: *** [modules\spine_godot\spine-cpp\src\spine\AttachmentTimeline.windows.tools.64.obj] Error 2
      scons: *** [modules\spine_godot\spine-cpp\src\spine\ConstraintData.windows.tools.64.obj] Error 2
      scons: *** [modules\spine_godot\spine-cpp\src\spine\AtlasAttachmentLoader.windows.tools.64.obj] Error 2
      scons: *** [modules\spine_godot\spine-cpp\src\spine\Bone.windows.tools.64.obj] Error 2
      register_types.cpp
      scons: *** [modules\spine_godot\spine-cpp\src\spine\ClippingAttachment.windows.tools.64.obj] Error 2
      scons: *** [modules\spine_godot\spine-cpp\src\spine\AnimationState.windows.tools.64.obj] Error 2
      scons: *** [modules\spine_godot\spine-cpp\src\spine\Event.windows.tools.64.obj] Error 2
      scons: *** [modules\spine_godot\spine-cpp\src\spine\DrawOrderTimeline.windows.tools.64.obj] Error 2
      scons: *** [modules\spine_godot\spine-cpp\src\spine\EventData.windows.tools.64.obj] Error 2
      scons: *** [modules\spine_godot\spine-cpp\src\spine\Attachment.windows.tools.64.obj] Error 2
      scons: *** [modules\spine_godot\spine-cpp\src\spine\Animation.windows.tools.64.obj] Error 2
      scons: *** [modules\spine_godot\spine-cpp\src\spine\ColorTimeline.windows.tools.64.obj] Error 2
      scons: *** [modules\spine_godot\spine-cpp\src\spine\DeformTimeline.windows.tools.64.obj] Error 2
      scons: *** [modules\spine_godot\spine-cpp\src\spine\AttachmentLoader.windows.tools.64.obj] Error 2
      scons: *** [modules\spine_godot\spine-cpp\src\spine\EventTimeline.windows.tools.64.obj] Error 2
      scons: *** [modules\spine_godot\spine-cpp\src\spine\BoneData.windows.tools.64.obj] Error 2
      modules\spine_godot\spine-cpp\src\spine\IkConstraint.cpp(30): fatal error C1083: Cannot open include file: 'spine/IkConstraint.h': No such file or directorymodules\spine_godot\spine-cpp\src\spine\Extension.cpp(30): fatal error C1083: Cannot open include file: 'spine/Extension.h': No such file or directory

      scons: *** [modules\spine_godot\spine-cpp\src\spine\Extension.windows.tools.64.obj] Error 2
      scons: *** [modules\spine_godot\spine-cpp\src\spine\IkConstraint.windows.tools.64.obj] Error 2
      scons: building terminated because of errors.
      [Time elapsed: 00:00:04.263]

      I did manage to resolve the shell script issue, thank you for the Path tip.

      Ah, you are copying the Spine module into the Godot source tree. We keep the Spine module outside the Godot source tree. Have a look at the spine_godot/SCsub file, lines 5 and 8. The paths given there are relative to the godot/ directory. I think if you change them to spine-cpp/include it should work.

      5 meses más tarde

      Now that Godot 4.1 is out, it would be great to see the signal name conflicts resolved as well as the other ongoing Godot 4 issues like mesh culling and 3D support.

      GDExtension also has a backwards compatibility system in place now and no breaking changes are expected in the future. Perhaps the implementation could be ported to GDExtension?

      I was on vacation last week, so couldn't fully check the 4.1 release yet.

      I'm not sure 4.1 has any new means for us to fix mesh culling as described here: EsotericSoftware/spine-runtimes2248

      3D support is independent of the Godot version. I just currently lack the time to work on it, as I have other runtimes to update/create. I'd welcome pull requests in that area.

      I'd love to go GDExtension for the plugin, but that's still not well documented, especially for mobile and web platforms. I see what changed in 4.1.