[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;
}
#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);
}
};

View File

@ -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

View File

@ -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;