mirror of
https://github.com/EsotericSoftware/spine-runtimes.git
synced 2026-03-26 22:49:01 +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;
|
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);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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;
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user