-
-
Notifications
You must be signed in to change notification settings - Fork 22.7k
Implement an importer to support Lottie animation #91580
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: master
Are you sure you want to change the base?
Conversation
I'll put this on my list to review for the pipeline import. |
Here are the changes: beicause/godot@lottie...V-Sekai:godot:vsk-lottie-4.3
|
Thanks for your guide. |
I was stuck, I suspect we need to use the resource importer system that takes json and gives a LottieTexture2D |
Don't open json directly. Create a LottieTexture2D and add the json as subresource. |
I'm not very familiar with custom resource. I still can't understan why using code to set this texture works: texture=LottieTexture2D.create_from_string(FileAccess.get_file_as_string("res://lottie.json"),1.0)
For resource importer, since lottie extension name is also |
So there's a way to create a resource importer plugin that scans for "*.json" as lottie. I'll try to give you instructions as soon as I can or you can try it. |
While this is a simpler approach, note that it'll result in less smooth animations that no longer look crisp when zoomed in (e.g. due to Camera2D zoom or I think Lottie's biggest use case is that it allows for vector-based 2D animation with an arbitrary amount of frames (in other words, things can be freely interpolated). While you could choose to import at a high framerate (which doesn't seem to be adjustable in this importer right now), targeting 60 FPS will require a lot of memory. This might be a dealbreaker for some use cases, so it's worth considering whether a true vector-based approach is more suitable first. Performance is also an important caveat, similar to AnimatedTexture. Updating texture data often is slow, and it can also be inflexible (e.g. it might not obey pausing as expected). On the bright side, this texture-based approach has some upsides, such as being easier to use in 3D (e.g. with Sprite3D). A vector-based solution wouldn't be usable in 3D unless rendered to a texture via ViewportTexture, in which case it would also lose its vector-based nature. |
The common use case of Lottie is UI or other short duration animation, where |
Hello, Texture (or AnimatedTexture) methods have several advantages. Primarily, GPU with direct drawing is not always good & faster since the following factors:
On the other hand, directly outputting vector drawings without going through textures can be more efficient in terms of memory use & performance in situations such as:
Obviously it could be more beneficial to unify the vector drawing primitives as a single form in the Godot, however, implementing complex rendering logic like Lottie directly in Godot can be costly in terms of development resources and maintenance. Therefore, using third-party libraries may be advisable. In such architectures, typically using FBOs or textures can provide a stable integration structure during the main rendering and thorvg rendering. Moving forward, ThorVG would be able to attempt hardware acceleration through its own hw rendering backend in order to integrate with Godot's main rendering pipeline, targeting FBOs for drawing. Nevertheless, if performance issues arise, attempting an aggressive integration structure based on direct drawing methods and sharing rendering contexts might be considered, although it will be comparatively challenging. |
This comment was marked as resolved.
This comment was marked as resolved.
Hmm... it looks threading dead lock. let me review the patch first. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@beicause Could you please check the comments?
Also an opinion:
I just noticed that generating all frame images like this is quite intensive. I expect that dynamically updating the texture every frame by using ThorVG animation would be better for saving texture memory and reducing the harsh initialization bottleneck.
I think it's easier to use it in Another option is implementing a import plugin to import Lottie as a image texture, like SVG. This avoids run-time cost, but increases app size. |
Another option is to treat this like theora like a video. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thank you for your update. I have some additional feedback on your code, although it might not help to resolve this issue.
Unfortunately, I've tried similar calls with our ThorVG example with your attached resource(lottie.json in lottie_test.zip) using one extra thread but didn't encounter any issues, and even the thread sanitizer didn’t report anything.
I might need more context. Could you please conduct some tests and observe the results?
- Disable the ThorVG threading feature and see the result:
-> Remove#define THORVG_THREAD_SUPPORT
in inc/config.h. - Does this worker thread seems not same with the thread which calls initialize_svg_module?
- How many LottieTexture2D instances are created from this issue, and does update_image() calls are made just once per its instance?
It's been ratified by IANA https://www.iana.org/assignments/media-types/video/lottie+json |
Can we add the .lot extension now that it is IANA ratified? |
Needs a rebase on master because of thorvg changes.
|
2de4969
to
75df631
Compare
Done. I noticed thorvg also supports .lot extension thorvg/thorvg#3248 |
Something is weird. I rebased on master and had some errors.
https://github.com/V-Sekai/godot/actions/runs/14289250169/job/40048338160 |
This PR needs to be updated. String::parser_utf8 has been replaced by String::append_utf8 |
Perhaps the doctool still need to modify to support inheriting resource importer. Currently the docs of texture importer part are all copied. I noticed there are several PRs that might add texture import options. Lottie importer's docs need to update every time the texture import options change. |
a5f38f4
to
2f63302
Compare
Handle ResourceImporterLottie individually in doctool now so that the docs doesn't include texture importer's options. This is a bit of hack, but still better than updating docs manually. |
Converted to draft as this can make use of #105342 to reimplement. |
We should not make this dependent on #105342 to get merged, and even if you did want to wait for another PR, there is no need to mark this as a draft. If you want this merged into Godot 4.5, I would encourage you to mark this ready for review, it can get merged, and then after #105342 is merged (if it is agreed on and merged), then another PR can adjust the Lottie (or SVG) importers to use that new texture importer system. |
Alright, I mark it as ready and let teams decide whether to merge. I removed the support for dotLottie as it's relatively incomplete. |
We can't access metadata set by importer in script? In this case, #105342 won't be able to achieve the conversion to AnimationPlayer2D like this PR. After importing lottie as texture, the information about animation is lost, and CompressedTexture doesn't support to serialize metadata... |
Add lottie importer for `.lot` to import lottie as CompressedTexture2D
I removed the feature of dropping AnimationPlayer2D from this PR. I wonder if there is a more general approach to support it for sprite sheet textures. |
Hello, what's going on with this? Any plan? |
I'm not very satisfied with the implementation. Essentially, it's no different from rendering animations as images and importing them into Godot, which may disappoint users. What users are expecting may be real-time vector rendering (godotengine/godot-proposals#2924), as discussed in that, it would be better to render mesh than rasterizing. Not sure if this PR is really needed. In fact, I personally rarely use Lottie in games. |
@beicause Thanks for info. "Rendering mesh instead of rasterizing" sounds ideal, but it's not as straightforward as people expect—unless Godot manually implements the entire pipeline. Even then, it would still require a render target and a final compositing pass to properly build an independent Lottie scenes. That wouldn’t be an easy task and is still a long way off. For certain icon use cases or complex Lottie animations, applying other module with real-time texture updates might be sufficient. Alternatively, Godot could potentially use ThorVG’s GL backend with a shareable texture. cc: @fire |
the simplest alternative be using the ThorVG GL backend? The ideas seem good, but I'm afraid that due to the complexity, this might end up not moving forward.. I would love to use Lottie in a project, even if it were just a game prototype. |
Related proposals:
Edit:
This PR addes a Lottie resource importer using ThorVG to import Lottie as CompressedTexture of pre-rendered sprite sheet. It's a editor only feature and doesn't implement real time rendering.