Transform mesh's AABB to skeleton's space when calculate mesh's bounds.
This commit is contained in:
@ -2041,6 +2041,12 @@ void RendererCanvasCull::update_visibility_notifiers() {
|
||||
}
|
||||
}
|
||||
|
||||
Rect2 RendererCanvasCull::_debug_canvas_item_get_rect(RID p_item) {
|
||||
Item *canvas_item = canvas_item_owner.get_or_null(p_item);
|
||||
ERR_FAIL_NULL_V(canvas_item, Rect2());
|
||||
return canvas_item->get_rect();
|
||||
}
|
||||
|
||||
bool RendererCanvasCull::free(RID p_rid) {
|
||||
if (canvas_owner.owns(p_rid)) {
|
||||
Canvas *canvas = canvas_owner.get_or_null(p_rid);
|
||||
|
||||
@ -326,6 +326,8 @@ public:
|
||||
|
||||
void update_visibility_notifiers();
|
||||
|
||||
Rect2 _debug_canvas_item_get_rect(RID p_item);
|
||||
|
||||
bool free(RID p_rid);
|
||||
RendererCanvasCull();
|
||||
~RendererCanvasCull();
|
||||
|
||||
@ -430,6 +430,7 @@ void MeshStorage::mesh_add_surface(RID p_mesh, const RS::SurfaceData &p_surface)
|
||||
|
||||
s->aabb = new_surface.aabb;
|
||||
s->bone_aabbs = new_surface.bone_aabbs; //only really useful for returning them.
|
||||
s->mesh_to_skeleton_xform = p_surface.mesh_to_skeleton_xform;
|
||||
|
||||
s->uv_scale = new_surface.uv_scale;
|
||||
|
||||
@ -617,6 +618,7 @@ RS::SurfaceData MeshStorage::mesh_get_surface(RID p_mesh, int p_surface) const {
|
||||
}
|
||||
|
||||
sd.bone_aabbs = s.bone_aabbs;
|
||||
sd.mesh_to_skeleton_xform = s.mesh_to_skeleton_xform;
|
||||
|
||||
if (s.blend_shape_buffer.is_valid()) {
|
||||
sd.blend_shape_data = RD::get_singleton()->buffer_get_data(s.blend_shape_buffer);
|
||||
@ -663,15 +665,16 @@ AABB MeshStorage::mesh_get_aabb(RID p_mesh, RID p_skeleton) {
|
||||
|
||||
for (uint32_t i = 0; i < mesh->surface_count; i++) {
|
||||
AABB laabb;
|
||||
if ((mesh->surfaces[i]->format & RS::ARRAY_FORMAT_BONES) && mesh->surfaces[i]->bone_aabbs.size()) {
|
||||
int bs = mesh->surfaces[i]->bone_aabbs.size();
|
||||
const AABB *skbones = mesh->surfaces[i]->bone_aabbs.ptr();
|
||||
const Mesh::Surface &surface = *mesh->surfaces[i];
|
||||
if ((surface.format & RS::ARRAY_FORMAT_BONES) && surface.bone_aabbs.size()) {
|
||||
int bs = surface.bone_aabbs.size();
|
||||
const AABB *skbones = surface.bone_aabbs.ptr();
|
||||
|
||||
int sbs = skeleton->size;
|
||||
ERR_CONTINUE(bs > sbs);
|
||||
const float *baseptr = skeleton->data.ptr();
|
||||
|
||||
bool first = true;
|
||||
bool found_bone_aabb = false;
|
||||
|
||||
if (skeleton->use_2d) {
|
||||
for (int j = 0; j < bs; j++) {
|
||||
@ -691,11 +694,13 @@ AABB MeshStorage::mesh_get_aabb(RID p_mesh, RID p_skeleton) {
|
||||
mtx.basis.rows[1][1] = dataptr[5];
|
||||
mtx.origin.y = dataptr[7];
|
||||
|
||||
AABB baabb = mtx.xform(skbones[j]);
|
||||
// Transform bounds to skeleton's space before applying animation data.
|
||||
AABB baabb = surface.mesh_to_skeleton_xform.xform(skbones[j]);
|
||||
baabb = mtx.xform(baabb);
|
||||
|
||||
if (first) {
|
||||
if (!found_bone_aabb) {
|
||||
laabb = baabb;
|
||||
first = false;
|
||||
found_bone_aabb = true;
|
||||
} else {
|
||||
laabb.merge_with(baabb);
|
||||
}
|
||||
@ -723,21 +728,29 @@ AABB MeshStorage::mesh_get_aabb(RID p_mesh, RID p_skeleton) {
|
||||
mtx.basis.rows[2][2] = dataptr[10];
|
||||
mtx.origin.z = dataptr[11];
|
||||
|
||||
AABB baabb = mtx.xform(skbones[j]);
|
||||
if (first) {
|
||||
// Transform bounds to skeleton's space before applying animation data.
|
||||
AABB baabb = surface.mesh_to_skeleton_xform.xform(skbones[j]);
|
||||
baabb = mtx.xform(baabb);
|
||||
|
||||
if (!found_bone_aabb) {
|
||||
laabb = baabb;
|
||||
first = false;
|
||||
found_bone_aabb = true;
|
||||
} else {
|
||||
laabb.merge_with(baabb);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (found_bone_aabb) {
|
||||
// Transform skeleton bounds back to mesh's space if any animated AABB applied.
|
||||
laabb = surface.mesh_to_skeleton_xform.affine_inverse().xform(laabb);
|
||||
}
|
||||
|
||||
if (laabb.size == Vector3()) {
|
||||
laabb = mesh->surfaces[i]->aabb;
|
||||
laabb = surface.aabb;
|
||||
}
|
||||
} else {
|
||||
laabb = mesh->surfaces[i]->aabb;
|
||||
laabb = surface.aabb;
|
||||
}
|
||||
|
||||
if (i == 0) {
|
||||
|
||||
@ -120,6 +120,10 @@ private:
|
||||
|
||||
Vector<AABB> bone_aabbs;
|
||||
|
||||
// Transform used in runtime bone AABBs compute.
|
||||
// As bone AABBs are saved in Mesh space, but bones animation is in Skeleton space.
|
||||
Transform3D mesh_to_skeleton_xform;
|
||||
|
||||
Vector4 uv_scale;
|
||||
|
||||
RID blend_shape_buffer;
|
||||
|
||||
@ -940,6 +940,8 @@ public:
|
||||
|
||||
FUNC1(canvas_set_shadow_texture_size, int)
|
||||
|
||||
FUNC1R(Rect2, _debug_canvas_item_get_rect, RID)
|
||||
|
||||
/* GLOBAL SHADER UNIFORMS */
|
||||
|
||||
#undef server_name
|
||||
|
||||
@ -1777,6 +1777,14 @@ Array RenderingServer::_mesh_surface_get_skeleton_aabb_bind(RID p_mesh, int p_su
|
||||
}
|
||||
#endif
|
||||
|
||||
Rect2 RenderingServer::debug_canvas_item_get_rect(RID p_item) {
|
||||
#ifdef TOOLS_ENABLED
|
||||
return _debug_canvas_item_get_rect(p_item);
|
||||
#else
|
||||
return Rect2();
|
||||
#endif
|
||||
}
|
||||
|
||||
int RenderingServer::global_shader_uniform_type_get_shader_datatype(GlobalShaderParameterType p_type) {
|
||||
switch (p_type) {
|
||||
case RS::GLOBAL_VAR_TYPE_BOOL:
|
||||
@ -3161,6 +3169,8 @@ void RenderingServer::_bind_methods() {
|
||||
ClassDB::bind_method(D_METHOD("canvas_item_set_visibility_notifier", "item", "enable", "area", "enter_callable", "exit_callable"), &RenderingServer::canvas_item_set_visibility_notifier);
|
||||
ClassDB::bind_method(D_METHOD("canvas_item_set_canvas_group_mode", "item", "mode", "clear_margin", "fit_empty", "fit_margin", "blur_mipmaps"), &RenderingServer::canvas_item_set_canvas_group_mode, DEFVAL(5.0), DEFVAL(false), DEFVAL(0.0), DEFVAL(false));
|
||||
|
||||
ClassDB::bind_method(D_METHOD("debug_canvas_item_get_rect", "item"), &RenderingServer::debug_canvas_item_get_rect);
|
||||
|
||||
BIND_ENUM_CONSTANT(NINE_PATCH_STRETCH);
|
||||
BIND_ENUM_CONSTANT(NINE_PATCH_TILE);
|
||||
BIND_ENUM_CONSTANT(NINE_PATCH_TILE_FIT);
|
||||
|
||||
@ -328,6 +328,10 @@ public:
|
||||
Vector<LOD> lods;
|
||||
Vector<AABB> bone_aabbs;
|
||||
|
||||
// Transforms used in runtime bone AABBs compute.
|
||||
// Since bone AABBs is saved in Mesh space, but bones is in Skeleton space.
|
||||
Transform3D mesh_to_skeleton_xform;
|
||||
|
||||
Vector<uint8_t> blend_shape_data;
|
||||
|
||||
Vector4 uv_scale;
|
||||
@ -1491,6 +1495,9 @@ public:
|
||||
|
||||
virtual void canvas_set_shadow_texture_size(int p_size) = 0;
|
||||
|
||||
Rect2 debug_canvas_item_get_rect(RID p_item);
|
||||
virtual Rect2 _debug_canvas_item_get_rect(RID p_item) = 0;
|
||||
|
||||
/* GLOBAL SHADER UNIFORMS */
|
||||
|
||||
enum GlobalShaderParameterType {
|
||||
|
||||
Reference in New Issue
Block a user