mirror of
https://github.com/EsotericSoftware/spine-runtimes.git
synced 2026-03-25 22:23:42 +08:00
[godot] Fix normal maps in Godot 4.
This commit is contained in:
parent
151af3abdf
commit
e7f0455487
@ -91,6 +91,12 @@ public:
|
||||
renderer_object->normal_map = normal_map;
|
||||
}
|
||||
|
||||
#if VERSION_MAJOR > 3
|
||||
renderer_object->canvas_texture.instantiate();
|
||||
renderer_object->canvas_texture->set_diffuse_texture(renderer_object->texture);
|
||||
renderer_object->canvas_texture->set_normal_texture(renderer_object->normal_map);
|
||||
#endif
|
||||
|
||||
page.setRendererObject((void *) renderer_object);
|
||||
page.width = texture->get_width();
|
||||
page.height = texture->get_height();
|
||||
@ -98,10 +104,11 @@ public:
|
||||
|
||||
void unload(void *data) override {
|
||||
auto renderer_object = (SpineRendererObject *) data;
|
||||
Ref<Texture> &texture = renderer_object->texture;
|
||||
if (texture.is_valid()) texture.unref();
|
||||
Ref<Texture> &normal_map = renderer_object->normal_map;
|
||||
if (normal_map.is_valid()) normal_map.unref();
|
||||
if (renderer_object->texture.is_valid()) renderer_object->texture.unref();
|
||||
if (renderer_object->normal_map.is_valid()) renderer_object->normal_map.unref();
|
||||
#if VERSION_MAJOR > 3
|
||||
if (renderer_object->canvas_texture.is_valid()) renderer_object->canvas_texture.unref();
|
||||
#endif
|
||||
memdelete(renderer_object);
|
||||
}
|
||||
};
|
||||
|
||||
@ -32,9 +32,16 @@
|
||||
|
||||
#include <scene/resources/texture.h>
|
||||
|
||||
#if VERSION_MAJOR > 3
|
||||
#include <scene/main/canvas_item.h>
|
||||
#endif
|
||||
|
||||
struct SpineRendererObject {
|
||||
Ref<Texture> texture;
|
||||
Ref<Texture> normal_map;
|
||||
#if VERSION_MAJOR > 3
|
||||
Ref<CanvasTexture> canvas_texture;
|
||||
#endif
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
@ -471,8 +471,7 @@ static void add_triangles(MeshInstance2D *mesh_instance,
|
||||
const Vector<Point2> &uvs,
|
||||
const Vector<Color> &colors,
|
||||
const Vector<int> &indices,
|
||||
Ref<Texture> texture,
|
||||
Ref<Texture> normal_map) {
|
||||
SpineRendererObject *renderer_object) {
|
||||
#if VERSION_MAJOR > 3
|
||||
RenderingServer::get_singleton()->canvas_item_add_triangle_array(mesh_instance->get_canvas_item(),
|
||||
indices,
|
||||
@ -481,9 +480,11 @@ static void add_triangles(MeshInstance2D *mesh_instance,
|
||||
uvs,
|
||||
Vector<int>(),
|
||||
Vector<float>(),
|
||||
texture.is_null() ? RID() : texture->get_rid(),
|
||||
renderer_object->canvas_texture.is_valid() ? renderer_object->canvas_texture->get_rid() : RID(),
|
||||
-1);
|
||||
#else
|
||||
auto texture = renderer_object->texture;
|
||||
auto normal_map = renderer_object->normal_map;
|
||||
VisualServer::get_singleton()->canvas_item_add_triangle_array(mesh_instance->get_canvas_item(),
|
||||
indices,
|
||||
vertices,
|
||||
@ -514,17 +515,14 @@ void SpineSprite::update_meshes(Ref<SpineSkeleton> skeleton_ref) {
|
||||
spine::Color skeleton_color = skeleton->getColor();
|
||||
spine::Color slot_color = slot->getColor();
|
||||
spine::Color tint(skeleton_color.r * slot_color.r, skeleton_color.g * slot_color.g, skeleton_color.b * slot_color.b, skeleton_color.a * slot_color.a);
|
||||
Ref<Texture> texture;
|
||||
Ref<Texture> normal_map;
|
||||
SpineRendererObject *renderer_object;
|
||||
spine::Vector<float> *vertices = &scratch_vertices;
|
||||
spine::Vector<float> *uvs;
|
||||
spine::Vector<unsigned short> *indices;
|
||||
|
||||
if (attachment->getRTTI().isExactly(spine::RegionAttachment::rtti)) {
|
||||
auto *region = (spine::RegionAttachment *) attachment;
|
||||
auto renderer_object = (SpineRendererObject *) ((spine::AtlasRegion *) region->getRendererObject())->page->getRendererObject();
|
||||
texture = renderer_object->texture;
|
||||
normal_map = renderer_object->normal_map;
|
||||
renderer_object = (SpineRendererObject *) ((spine::AtlasRegion *) region->getRendererObject())->page->getRendererObject();
|
||||
|
||||
vertices->setSize(8, 0);
|
||||
region->computeWorldVertices(*slot, *vertices, 0);
|
||||
@ -538,9 +536,7 @@ void SpineSprite::update_meshes(Ref<SpineSkeleton> skeleton_ref) {
|
||||
tint.a *= attachment_color.a;
|
||||
} else if (attachment->getRTTI().isExactly(spine::MeshAttachment::rtti)) {
|
||||
auto *mesh = (spine::MeshAttachment *) attachment;
|
||||
auto renderer_object = (SpineRendererObject *) ((spine::AtlasRegion *) mesh->getRendererObject())->page->getRendererObject();
|
||||
texture = renderer_object->texture;
|
||||
normal_map = renderer_object->normal_map;
|
||||
renderer_object = (SpineRendererObject *) ((spine::AtlasRegion *) mesh->getRendererObject())->page->getRendererObject();
|
||||
|
||||
vertices->setSize(mesh->getWorldVerticesLength(), 0);
|
||||
mesh->computeWorldVertices(*slot, *vertices);
|
||||
@ -588,7 +584,7 @@ void SpineSprite::update_meshes(Ref<SpineSkeleton> skeleton_ref) {
|
||||
scratch_indices.set(j, indices->buffer()[j]);
|
||||
}
|
||||
|
||||
add_triangles(mesh_instance, scratch_points, scratch_uvs, scratch_colors, scratch_indices, texture, normal_map);
|
||||
add_triangles(mesh_instance, scratch_points, scratch_uvs, scratch_colors, scratch_indices, renderer_object);
|
||||
|
||||
spine::BlendMode blend_mode = slot->getData().getBlendMode();
|
||||
Ref<Material> custom_material;
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user