Merge pull request #68863 from clayjohn/RD-2D-skeleton
Fix drawing of 2D skeletons in the RD renderer.
This commit is contained in:
commit
895428c805
@ -153,48 +153,6 @@ void main() {
|
|||||||
uv += 1e-5;
|
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 = (canvas_transform * vec4(vertex, 0.0, 1.0)).xy;
|
||||||
|
|
||||||
vertex_interp = vertex;
|
vertex_interp = vertex;
|
||||||
|
@ -114,7 +114,7 @@ void Polygon2D::_notification(int p_what) {
|
|||||||
|
|
||||||
ObjectID new_skeleton_id;
|
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());
|
RS::get_singleton()->canvas_item_attach_skeleton(get_canvas_item(), skeleton_node->get_skeleton());
|
||||||
new_skeleton_id = skeleton_node->get_instance_id();
|
new_skeleton_id = skeleton_node->get_instance_id();
|
||||||
} else {
|
} else {
|
||||||
|
@ -32,7 +32,7 @@
|
|||||||
#include "servers/rendering/rendering_server_globals.h"
|
#include "servers/rendering/rendering_server_globals.h"
|
||||||
|
|
||||||
const Rect2 &RendererCanvasRender::Item::get_rect() const {
|
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;
|
return rect;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -80,7 +80,7 @@ const Rect2 &RendererCanvasRender::Item::get_rect() const {
|
|||||||
} break;
|
} break;
|
||||||
case Item::Command::TYPE_MESH: {
|
case Item::Command::TYPE_MESH: {
|
||||||
const Item::CommandMesh *mesh = static_cast<const Item::CommandMesh *>(c);
|
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);
|
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);
|
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
|
//default shadow texture to keep uniform set happy
|
||||||
RD::TextureFormat tf;
|
RD::TextureFormat tf;
|
||||||
@ -2834,8 +2824,6 @@ RendererCanvasRenderRD::~RendererCanvasRenderRD() {
|
|||||||
|
|
||||||
memdelete_arr(state.light_uniforms);
|
memdelete_arr(state.light_uniforms);
|
||||||
RD::get_singleton()->free(state.lights_uniform_buffer);
|
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
|
//shadow rendering
|
||||||
|
@ -144,10 +144,6 @@ class RendererCanvasRenderRD : public RendererCanvasRender {
|
|||||||
RID quad_index_array;
|
RID quad_index_array;
|
||||||
PipelineVariants pipeline_variants;
|
PipelineVariants pipeline_variants;
|
||||||
|
|
||||||
// default_skeleton uniform set
|
|
||||||
RID default_skeleton_uniform_buffer;
|
|
||||||
RID default_skeleton_texture_buffer;
|
|
||||||
|
|
||||||
ShaderCompiler compiler;
|
ShaderCompiler compiler;
|
||||||
} shader;
|
} shader;
|
||||||
|
|
||||||
@ -409,11 +405,6 @@ class RendererCanvasRenderRD : public RendererCanvasRender {
|
|||||||
uint32_t lights[4];
|
uint32_t lights[4];
|
||||||
};
|
};
|
||||||
|
|
||||||
struct SkeletonUniform {
|
|
||||||
float skeleton_transform[16];
|
|
||||||
float skeleton_inverse[16];
|
|
||||||
};
|
|
||||||
|
|
||||||
Item *items[MAX_RENDER_ITEMS];
|
Item *items[MAX_RENDER_ITEMS];
|
||||||
|
|
||||||
bool using_directional_lights = false;
|
bool using_directional_lights = false;
|
||||||
|
@ -191,48 +191,6 @@ void main() {
|
|||||||
uv += 1e-5;
|
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 = (canvas_data.canvas_transform * vec4(vertex, 0.0, 1.0)).xy;
|
||||||
|
|
||||||
vertex_interp = vertex;
|
vertex_interp = vertex;
|
||||||
|
@ -143,8 +143,8 @@ void main() {
|
|||||||
uint skin_offset = params.skin_stride * index;
|
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 = 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_01 = uvec2(bones.x & 0xFFFF, bones.x >> 16) * 2; //pre-add xform offset
|
||||||
uvec2 bones_23 = uvec2(bones.y & 0xFFFF, bones.y >> 16) * 3;
|
uvec2 bones_23 = uvec2(bones.y & 0xFFFF, bones.y >> 16) * 2;
|
||||||
|
|
||||||
skin_offset += params.skin_weight_offset;
|
skin_offset += params.skin_weight_offset;
|
||||||
|
|
||||||
@ -161,6 +161,13 @@ void main() {
|
|||||||
//reverse order because its transposed
|
//reverse order because its transposed
|
||||||
vertex = (vec4(vertex, 0.0, 1.0) * m).xy;
|
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
|
#else
|
||||||
vec3 vertex;
|
vec3 vertex;
|
||||||
vec3 normal;
|
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);
|
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;
|
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;
|
return aabb;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -144,6 +144,7 @@ private:
|
|||||||
|
|
||||||
AABB aabb;
|
AABB aabb;
|
||||||
AABB custom_aabb;
|
AABB custom_aabb;
|
||||||
|
uint64_t skeleton_aabb_version = 0;
|
||||||
|
|
||||||
Vector<RID> material_cache;
|
Vector<RID> material_cache;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user