Fix drawing of 2D skeletons in the RD renderer.
Also clean up skeleton code in preparation for adding them to GLES3 Properly update Mesh2D AABBs when skeleton is updated
This commit is contained in:
parent
c9c09ad608
commit
0e5a98cdd8
@ -153,48 +153,6 @@ void main() {
|
||||
uv += 1e-5;
|
||||
}
|
||||
|
||||
#ifdef USE_ATTRIBUTES
|
||||
#if 0
|
||||
if (bool(draw_data[draw_data_instance].flags & FLAGS_USE_SKELETON) && bone_weights != vec4(0.0)) { //must be a valid bone
|
||||
//skeleton transform
|
||||
ivec4 bone_indicesi = ivec4(bone_indices);
|
||||
|
||||
uvec2 tex_ofs = bone_indicesi.x * 2;
|
||||
|
||||
mat2x4 m;
|
||||
m = mat2x4(
|
||||
texelFetch(skeleton_buffer, tex_ofs + 0),
|
||||
texelFetch(skeleton_buffer, tex_ofs + 1)) *
|
||||
bone_weights.x;
|
||||
|
||||
tex_ofs = bone_indicesi.y * 2;
|
||||
|
||||
m += mat2x4(
|
||||
texelFetch(skeleton_buffer, tex_ofs + 0),
|
||||
texelFetch(skeleton_buffer, tex_ofs + 1)) *
|
||||
bone_weights.y;
|
||||
|
||||
tex_ofs = bone_indicesi.z * 2;
|
||||
|
||||
m += mat2x4(
|
||||
texelFetch(skeleton_buffer, tex_ofs + 0),
|
||||
texelFetch(skeleton_buffer, tex_ofs + 1)) *
|
||||
bone_weights.z;
|
||||
|
||||
tex_ofs = bone_indicesi.w * 2;
|
||||
|
||||
m += mat2x4(
|
||||
texelFetch(skeleton_buffer, tex_ofs + 0),
|
||||
texelFetch(skeleton_buffer, tex_ofs + 1)) *
|
||||
bone_weights.w;
|
||||
|
||||
mat4 bone_matrix = skeleton_data.skeleton_transform * transpose(mat4(m[0], m[1], vec4(0.0, 0.0, 1.0, 0.0), vec4(0.0, 0.0, 0.0, 1.0))) * skeleton_data.skeleton_transform_inverse;
|
||||
|
||||
//outvec = bone_matrix * outvec;
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
|
||||
vertex = (canvas_transform * vec4(vertex, 0.0, 1.0)).xy;
|
||||
|
||||
vertex_interp = vertex;
|
||||
|
@ -114,7 +114,7 @@ void Polygon2D::_notification(int p_what) {
|
||||
|
||||
ObjectID new_skeleton_id;
|
||||
|
||||
if (skeleton_node) {
|
||||
if (skeleton_node && !invert && bone_weights.size()) {
|
||||
RS::get_singleton()->canvas_item_attach_skeleton(get_canvas_item(), skeleton_node->get_skeleton());
|
||||
new_skeleton_id = skeleton_node->get_instance_id();
|
||||
} else {
|
||||
|
@ -32,7 +32,7 @@
|
||||
#include "servers/rendering/rendering_server_globals.h"
|
||||
|
||||
const Rect2 &RendererCanvasRender::Item::get_rect() const {
|
||||
if (custom_rect || (!rect_dirty && !update_when_visible)) {
|
||||
if (custom_rect || (!rect_dirty && !update_when_visible && skeleton == RID())) {
|
||||
return rect;
|
||||
}
|
||||
|
||||
@ -80,7 +80,7 @@ const Rect2 &RendererCanvasRender::Item::get_rect() const {
|
||||
} break;
|
||||
case Item::Command::TYPE_MESH: {
|
||||
const Item::CommandMesh *mesh = static_cast<const Item::CommandMesh *>(c);
|
||||
AABB aabb = RSG::mesh_storage->mesh_get_aabb(mesh->mesh, RID());
|
||||
AABB aabb = RSG::mesh_storage->mesh_get_aabb(mesh->mesh, skeleton);
|
||||
|
||||
r = Rect2(aabb.position.x, aabb.position.y, aabb.size.x, aabb.size.y);
|
||||
|
||||
|
@ -2681,16 +2681,6 @@ RendererCanvasRenderRD::RendererCanvasRenderRD() {
|
||||
primitive_arrays.index_array[3] = shader.quad_index_array = RD::get_singleton()->index_array_create(shader.quad_index_buffer, 0, 6);
|
||||
}
|
||||
|
||||
{ //default skeleton buffer
|
||||
|
||||
shader.default_skeleton_uniform_buffer = RD::get_singleton()->uniform_buffer_create(sizeof(SkeletonUniform));
|
||||
SkeletonUniform su;
|
||||
_update_transform_2d_to_mat4(Transform2D(), su.skeleton_inverse);
|
||||
_update_transform_2d_to_mat4(Transform2D(), su.skeleton_transform);
|
||||
RD::get_singleton()->buffer_update(shader.default_skeleton_uniform_buffer, 0, sizeof(SkeletonUniform), &su);
|
||||
|
||||
shader.default_skeleton_texture_buffer = RD::get_singleton()->texture_buffer_create(32, RD::DATA_FORMAT_R32G32B32A32_SFLOAT);
|
||||
}
|
||||
{
|
||||
//default shadow texture to keep uniform set happy
|
||||
RD::TextureFormat tf;
|
||||
@ -2834,8 +2824,6 @@ RendererCanvasRenderRD::~RendererCanvasRenderRD() {
|
||||
|
||||
memdelete_arr(state.light_uniforms);
|
||||
RD::get_singleton()->free(state.lights_uniform_buffer);
|
||||
RD::get_singleton()->free(shader.default_skeleton_uniform_buffer);
|
||||
RD::get_singleton()->free(shader.default_skeleton_texture_buffer);
|
||||
}
|
||||
|
||||
//shadow rendering
|
||||
|
@ -144,10 +144,6 @@ class RendererCanvasRenderRD : public RendererCanvasRender {
|
||||
RID quad_index_array;
|
||||
PipelineVariants pipeline_variants;
|
||||
|
||||
// default_skeleton uniform set
|
||||
RID default_skeleton_uniform_buffer;
|
||||
RID default_skeleton_texture_buffer;
|
||||
|
||||
ShaderCompiler compiler;
|
||||
} shader;
|
||||
|
||||
@ -409,11 +405,6 @@ class RendererCanvasRenderRD : public RendererCanvasRender {
|
||||
uint32_t lights[4];
|
||||
};
|
||||
|
||||
struct SkeletonUniform {
|
||||
float skeleton_transform[16];
|
||||
float skeleton_inverse[16];
|
||||
};
|
||||
|
||||
Item *items[MAX_RENDER_ITEMS];
|
||||
|
||||
bool using_directional_lights = false;
|
||||
|
@ -191,48 +191,6 @@ void main() {
|
||||
uv += 1e-5;
|
||||
}
|
||||
|
||||
#ifdef USE_ATTRIBUTES
|
||||
#if 0
|
||||
if (bool(draw_data.flags & FLAGS_USE_SKELETON) && bone_weights != vec4(0.0)) { //must be a valid bone
|
||||
//skeleton transform
|
||||
ivec4 bone_indicesi = ivec4(bone_indices);
|
||||
|
||||
uvec2 tex_ofs = bone_indicesi.x * 2;
|
||||
|
||||
mat2x4 m;
|
||||
m = mat2x4(
|
||||
texelFetch(skeleton_buffer, tex_ofs + 0),
|
||||
texelFetch(skeleton_buffer, tex_ofs + 1)) *
|
||||
bone_weights.x;
|
||||
|
||||
tex_ofs = bone_indicesi.y * 2;
|
||||
|
||||
m += mat2x4(
|
||||
texelFetch(skeleton_buffer, tex_ofs + 0),
|
||||
texelFetch(skeleton_buffer, tex_ofs + 1)) *
|
||||
bone_weights.y;
|
||||
|
||||
tex_ofs = bone_indicesi.z * 2;
|
||||
|
||||
m += mat2x4(
|
||||
texelFetch(skeleton_buffer, tex_ofs + 0),
|
||||
texelFetch(skeleton_buffer, tex_ofs + 1)) *
|
||||
bone_weights.z;
|
||||
|
||||
tex_ofs = bone_indicesi.w * 2;
|
||||
|
||||
m += mat2x4(
|
||||
texelFetch(skeleton_buffer, tex_ofs + 0),
|
||||
texelFetch(skeleton_buffer, tex_ofs + 1)) *
|
||||
bone_weights.w;
|
||||
|
||||
mat4 bone_matrix = skeleton_data.skeleton_transform * transpose(mat4(m[0], m[1], vec4(0.0, 0.0, 1.0, 0.0), vec4(0.0, 0.0, 0.0, 1.0))) * skeleton_data.skeleton_transform_inverse;
|
||||
|
||||
//outvec = bone_matrix * outvec;
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
|
||||
vertex = (canvas_data.canvas_transform * vec4(vertex, 0.0, 1.0)).xy;
|
||||
|
||||
vertex_interp = vertex;
|
||||
|
@ -143,8 +143,8 @@ void main() {
|
||||
uint skin_offset = params.skin_stride * index;
|
||||
|
||||
uvec2 bones = uvec2(src_bone_weights.data[skin_offset + 0], src_bone_weights.data[skin_offset + 1]);
|
||||
uvec2 bones_01 = uvec2(bones.x & 0xFFFF, bones.x >> 16) * 3; //pre-add xform offset
|
||||
uvec2 bones_23 = uvec2(bones.y & 0xFFFF, bones.y >> 16) * 3;
|
||||
uvec2 bones_01 = uvec2(bones.x & 0xFFFF, bones.x >> 16) * 2; //pre-add xform offset
|
||||
uvec2 bones_23 = uvec2(bones.y & 0xFFFF, bones.y >> 16) * 2;
|
||||
|
||||
skin_offset += params.skin_weight_offset;
|
||||
|
||||
@ -161,6 +161,13 @@ void main() {
|
||||
//reverse order because its transposed
|
||||
vertex = (vec4(vertex, 0.0, 1.0) * m).xy;
|
||||
}
|
||||
|
||||
uint dst_offset = index * params.vertex_stride;
|
||||
|
||||
uvec2 uvertex = floatBitsToUint(vertex);
|
||||
dst_vertices.data[dst_offset + 0] = uvertex.x;
|
||||
dst_vertices.data[dst_offset + 1] = uvertex.y;
|
||||
|
||||
#else
|
||||
vec3 vertex;
|
||||
vec3 normal;
|
||||
|
@ -616,7 +616,7 @@ AABB MeshStorage::mesh_get_aabb(RID p_mesh, RID p_skeleton) {
|
||||
|
||||
Skeleton *skeleton = skeleton_owner.get_or_null(p_skeleton);
|
||||
|
||||
if (!skeleton || skeleton->size == 0) {
|
||||
if (!skeleton || skeleton->size == 0 || mesh->skeleton_aabb_version == skeleton->version) {
|
||||
return mesh->aabb;
|
||||
}
|
||||
|
||||
@ -708,6 +708,7 @@ AABB MeshStorage::mesh_get_aabb(RID p_mesh, RID p_skeleton) {
|
||||
}
|
||||
}
|
||||
|
||||
mesh->skeleton_aabb_version = skeleton->version;
|
||||
return aabb;
|
||||
}
|
||||
|
||||
|
@ -144,6 +144,7 @@ private:
|
||||
|
||||
AABB aabb;
|
||||
AABB custom_aabb;
|
||||
uint64_t skeleton_aabb_version = 0;
|
||||
|
||||
Vector<RID> material_cache;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user