diff --git a/spine-godot/spine_godot/SpineAtlasResource.cpp b/spine-godot/spine_godot/SpineAtlasResource.cpp index 6d69d1be9..b7da1d80b 100644 --- a/spine-godot/spine_godot/SpineAtlasResource.cpp +++ b/spine-godot/spine_godot/SpineAtlasResource.cpp @@ -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 = renderer_object->texture; - if (texture.is_valid()) texture.unref(); - Ref &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); } }; diff --git a/spine-godot/spine_godot/SpineRendererObject.h b/spine-godot/spine_godot/SpineRendererObject.h index 1ee620219..bc034f7cb 100644 --- a/spine-godot/spine_godot/SpineRendererObject.h +++ b/spine-godot/spine_godot/SpineRendererObject.h @@ -32,9 +32,16 @@ #include +#if VERSION_MAJOR > 3 +#include +#endif + struct SpineRendererObject { Ref texture; Ref normal_map; +#if VERSION_MAJOR > 3 + Ref canvas_texture; +#endif }; #endif diff --git a/spine-godot/spine_godot/SpineSprite.cpp b/spine-godot/spine_godot/SpineSprite.cpp index 95411b4f3..65ac3c366 100644 --- a/spine-godot/spine_godot/SpineSprite.cpp +++ b/spine-godot/spine_godot/SpineSprite.cpp @@ -471,8 +471,7 @@ static void add_triangles(MeshInstance2D *mesh_instance, const Vector &uvs, const Vector &colors, const Vector &indices, - Ref texture, - Ref 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(), Vector(), - 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 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; - Ref normal_map; + SpineRendererObject *renderer_object; spine::Vector *vertices = &scratch_vertices; spine::Vector *uvs; spine::Vector *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 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 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 custom_material;