[godot] Fix normal maps in Godot 4.

This commit is contained in:
badlogic 2022-06-02 15:19:59 +02:00
parent 151af3abdf
commit e7f0455487
3 changed files with 26 additions and 16 deletions

View File

@ -91,6 +91,12 @@ public:
renderer_object->normal_map = normal_map; 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.setRendererObject((void *) renderer_object);
page.width = texture->get_width(); page.width = texture->get_width();
page.height = texture->get_height(); page.height = texture->get_height();
@ -98,10 +104,11 @@ public:
void unload(void *data) override { void unload(void *data) override {
auto renderer_object = (SpineRendererObject *) data; auto renderer_object = (SpineRendererObject *) data;
Ref<Texture> &texture = renderer_object->texture; if (renderer_object->texture.is_valid()) renderer_object->texture.unref();
if (texture.is_valid()) texture.unref(); if (renderer_object->normal_map.is_valid()) renderer_object->normal_map.unref();
Ref<Texture> &normal_map = renderer_object->normal_map; #if VERSION_MAJOR > 3
if (normal_map.is_valid()) normal_map.unref(); if (renderer_object->canvas_texture.is_valid()) renderer_object->canvas_texture.unref();
#endif
memdelete(renderer_object); memdelete(renderer_object);
} }
}; };

View File

@ -32,9 +32,16 @@
#include <scene/resources/texture.h> #include <scene/resources/texture.h>
#if VERSION_MAJOR > 3
#include <scene/main/canvas_item.h>
#endif
struct SpineRendererObject { struct SpineRendererObject {
Ref<Texture> texture; Ref<Texture> texture;
Ref<Texture> normal_map; Ref<Texture> normal_map;
#if VERSION_MAJOR > 3
Ref<CanvasTexture> canvas_texture;
#endif
}; };
#endif #endif

View File

@ -471,8 +471,7 @@ static void add_triangles(MeshInstance2D *mesh_instance,
const Vector<Point2> &uvs, const Vector<Point2> &uvs,
const Vector<Color> &colors, const Vector<Color> &colors,
const Vector<int> &indices, const Vector<int> &indices,
Ref<Texture> texture, SpineRendererObject *renderer_object) {
Ref<Texture> normal_map) {
#if VERSION_MAJOR > 3 #if VERSION_MAJOR > 3
RenderingServer::get_singleton()->canvas_item_add_triangle_array(mesh_instance->get_canvas_item(), RenderingServer::get_singleton()->canvas_item_add_triangle_array(mesh_instance->get_canvas_item(),
indices, indices,
@ -481,9 +480,11 @@ static void add_triangles(MeshInstance2D *mesh_instance,
uvs, uvs,
Vector<int>(), Vector<int>(),
Vector<float>(), Vector<float>(),
texture.is_null() ? RID() : texture->get_rid(), renderer_object->canvas_texture.is_valid() ? renderer_object->canvas_texture->get_rid() : RID(),
-1); -1);
#else #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(), VisualServer::get_singleton()->canvas_item_add_triangle_array(mesh_instance->get_canvas_item(),
indices, indices,
vertices, vertices,
@ -514,17 +515,14 @@ void SpineSprite::update_meshes(Ref<SpineSkeleton> skeleton_ref) {
spine::Color skeleton_color = skeleton->getColor(); spine::Color skeleton_color = skeleton->getColor();
spine::Color slot_color = slot->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); 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; SpineRendererObject *renderer_object;
Ref<Texture> normal_map;
spine::Vector<float> *vertices = &scratch_vertices; spine::Vector<float> *vertices = &scratch_vertices;
spine::Vector<float> *uvs; spine::Vector<float> *uvs;
spine::Vector<unsigned short> *indices; spine::Vector<unsigned short> *indices;
if (attachment->getRTTI().isExactly(spine::RegionAttachment::rtti)) { if (attachment->getRTTI().isExactly(spine::RegionAttachment::rtti)) {
auto *region = (spine::RegionAttachment *) attachment; auto *region = (spine::RegionAttachment *) attachment;
auto renderer_object = (SpineRendererObject *) ((spine::AtlasRegion *) region->getRendererObject())->page->getRendererObject(); renderer_object = (SpineRendererObject *) ((spine::AtlasRegion *) region->getRendererObject())->page->getRendererObject();
texture = renderer_object->texture;
normal_map = renderer_object->normal_map;
vertices->setSize(8, 0); vertices->setSize(8, 0);
region->computeWorldVertices(*slot, *vertices, 0); region->computeWorldVertices(*slot, *vertices, 0);
@ -538,9 +536,7 @@ void SpineSprite::update_meshes(Ref<SpineSkeleton> skeleton_ref) {
tint.a *= attachment_color.a; tint.a *= attachment_color.a;
} else if (attachment->getRTTI().isExactly(spine::MeshAttachment::rtti)) { } else if (attachment->getRTTI().isExactly(spine::MeshAttachment::rtti)) {
auto *mesh = (spine::MeshAttachment *) attachment; auto *mesh = (spine::MeshAttachment *) attachment;
auto renderer_object = (SpineRendererObject *) ((spine::AtlasRegion *) mesh->getRendererObject())->page->getRendererObject(); renderer_object = (SpineRendererObject *) ((spine::AtlasRegion *) mesh->getRendererObject())->page->getRendererObject();
texture = renderer_object->texture;
normal_map = renderer_object->normal_map;
vertices->setSize(mesh->getWorldVerticesLength(), 0); vertices->setSize(mesh->getWorldVerticesLength(), 0);
mesh->computeWorldVertices(*slot, *vertices); mesh->computeWorldVertices(*slot, *vertices);
@ -588,7 +584,7 @@ void SpineSprite::update_meshes(Ref<SpineSkeleton> skeleton_ref) {
scratch_indices.set(j, indices->buffer()[j]); 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(); spine::BlendMode blend_mode = slot->getData().getBlendMode();
Ref<Material> custom_material; Ref<Material> custom_material;