Skeleton was not providing prober AABB in GLES2, fixed.
This commit is contained in:
parent
51b80f6857
commit
ff34cd58ff
@ -2542,16 +2542,110 @@ AABB RasterizerStorageGLES2::mesh_get_aabb(RID p_mesh, RID p_skeleton) const {
|
|||||||
if (mesh->custom_aabb != AABB())
|
if (mesh->custom_aabb != AABB())
|
||||||
return mesh->custom_aabb;
|
return mesh->custom_aabb;
|
||||||
|
|
||||||
// TODO handle skeletons
|
Skeleton *sk = NULL;
|
||||||
|
if (p_skeleton.is_valid()) {
|
||||||
|
sk = skeleton_owner.get(p_skeleton);
|
||||||
|
}
|
||||||
|
|
||||||
AABB aabb;
|
AABB aabb;
|
||||||
|
|
||||||
if (mesh->surfaces.size() >= 1) {
|
if (sk && sk->size != 0) {
|
||||||
aabb = mesh->surfaces[0]->aabb;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (int i = 0; i < mesh->surfaces.size(); i++) {
|
for (int i = 0; i < mesh->surfaces.size(); i++) {
|
||||||
aabb.merge_with(mesh->surfaces[i]->aabb);
|
|
||||||
|
AABB laabb;
|
||||||
|
if ((mesh->surfaces[i]->format & VS::ARRAY_FORMAT_BONES) && mesh->surfaces[i]->skeleton_bone_aabb.size()) {
|
||||||
|
|
||||||
|
int bs = mesh->surfaces[i]->skeleton_bone_aabb.size();
|
||||||
|
const AABB *skbones = mesh->surfaces[i]->skeleton_bone_aabb.ptr();
|
||||||
|
const bool *skused = mesh->surfaces[i]->skeleton_bone_used.ptr();
|
||||||
|
|
||||||
|
int sbs = sk->size;
|
||||||
|
ERR_CONTINUE(bs > sbs);
|
||||||
|
const float *texture = sk->bone_data.ptr();
|
||||||
|
|
||||||
|
bool first = true;
|
||||||
|
if (sk->use_2d) {
|
||||||
|
for (int j = 0; j < bs; j++) {
|
||||||
|
|
||||||
|
if (!skused[j])
|
||||||
|
continue;
|
||||||
|
|
||||||
|
int base_ofs = j * 2 * 4;
|
||||||
|
|
||||||
|
Transform mtx;
|
||||||
|
|
||||||
|
mtx.basis[0].x = texture[base_ofs + 0];
|
||||||
|
mtx.basis[0].y = texture[base_ofs + 1];
|
||||||
|
mtx.origin.x = texture[base_ofs + 3];
|
||||||
|
base_ofs += 256 * 4;
|
||||||
|
mtx.basis[1].x = texture[base_ofs + 0];
|
||||||
|
mtx.basis[1].y = texture[base_ofs + 1];
|
||||||
|
mtx.origin.y = texture[base_ofs + 3];
|
||||||
|
|
||||||
|
AABB baabb = mtx.xform(skbones[j]);
|
||||||
|
|
||||||
|
if (first) {
|
||||||
|
laabb = baabb;
|
||||||
|
first = false;
|
||||||
|
} else {
|
||||||
|
laabb.merge_with(baabb);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
for (int j = 0; j < bs; j++) {
|
||||||
|
|
||||||
|
if (!skused[j])
|
||||||
|
continue;
|
||||||
|
|
||||||
|
int base_ofs = j * 3 * 4;
|
||||||
|
|
||||||
|
Transform mtx;
|
||||||
|
|
||||||
|
mtx.basis[0].x = texture[base_ofs + 0];
|
||||||
|
mtx.basis[0].y = texture[base_ofs + 1];
|
||||||
|
mtx.basis[0].z = texture[base_ofs + 2];
|
||||||
|
mtx.origin.x = texture[base_ofs + 3];
|
||||||
|
base_ofs += 256 * 4;
|
||||||
|
mtx.basis[1].x = texture[base_ofs + 0];
|
||||||
|
mtx.basis[1].y = texture[base_ofs + 1];
|
||||||
|
mtx.basis[1].z = texture[base_ofs + 2];
|
||||||
|
mtx.origin.y = texture[base_ofs + 3];
|
||||||
|
base_ofs += 256 * 4;
|
||||||
|
mtx.basis[2].x = texture[base_ofs + 0];
|
||||||
|
mtx.basis[2].y = texture[base_ofs + 1];
|
||||||
|
mtx.basis[2].z = texture[base_ofs + 2];
|
||||||
|
mtx.origin.z = texture[base_ofs + 3];
|
||||||
|
|
||||||
|
AABB baabb = mtx.xform(skbones[j]);
|
||||||
|
if (first) {
|
||||||
|
laabb = baabb;
|
||||||
|
first = false;
|
||||||
|
} else {
|
||||||
|
laabb.merge_with(baabb);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
} else {
|
||||||
|
|
||||||
|
laabb = mesh->surfaces[i]->aabb;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (i == 0)
|
||||||
|
aabb = laabb;
|
||||||
|
else
|
||||||
|
aabb.merge_with(laabb);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
|
||||||
|
for (int i = 0; i < mesh->surfaces.size(); i++) {
|
||||||
|
|
||||||
|
if (i == 0)
|
||||||
|
aabb = mesh->surfaces[i]->aabb;
|
||||||
|
else
|
||||||
|
aabb.merge_with(mesh->surfaces[i]->aabb);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return aabb;
|
return aabb;
|
||||||
|
Loading…
Reference in New Issue
Block a user