- Removed superfluous check for a valid skeleton.

- Fixed getting mesh vertices on meshes with no skeleton.
This commit is contained in:
2026-08-23 22:35:45 -04:00
parent bbaa3d01d2
commit 1d6bdd289b
+37 -38
View File
@@ -600,10 +600,10 @@ SkinnedSurfaces MeshEditingLibrary::get_skinned_vertex_positions(const Mesh *mes
SkinnedSurfaces skinned_vertex_surfaces; SkinnedSurfaces skinned_vertex_surfaces;
skinned_vertex_surfaces.resize(num_surfaces); skinned_vertex_surfaces.resize(num_surfaces);
TypedArray<Transform3D> bone_transforms; if (!skeleton)
if (skeleton)
{ {
const uint16_t bone_count = skeleton->get_bone_count(); const uint16_t bone_count = skeleton->get_bone_count();
TypedArray<Transform3D> bone_transforms;
bone_transforms.resize(bone_count); bone_transforms.resize(bone_count);
for (uint8_t bone_index = 0; bone_index < bone_count; bone_index++) for (uint8_t bone_index = 0; bone_index < bone_count; bone_index++)
{ {
@@ -620,45 +620,42 @@ SkinnedSurfaces MeshEditingLibrary::get_skinned_vertex_positions(const Mesh *mes
SkinnedVertices skinned_vertex_array; SkinnedVertices skinned_vertex_array;
skinned_vertex_array.resize(mesh_vertex_array_size); skinned_vertex_array.resize(mesh_vertex_array_size);
if (skeleton) const PackedInt32Array &mesh_bones_array = mesh_arrays[ArrayMesh::ARRAY_BONES];
const PackedFloat32Array &mesh_weights_array = mesh_arrays[ArrayMesh::ARRAY_WEIGHTS];
const uint8_t num_bones_per_vertex = mesh_bones_array.size() / mesh_vertex_array_size;
for (uint32_t vertex_index = 0; vertex_index < mesh_vertex_array_size; vertex_index++)
{ {
const PackedInt32Array &mesh_bones_array = mesh_arrays[ArrayMesh::ARRAY_BONES]; const Vector3 &vertex = mesh_vertex_array[vertex_index];
const PackedFloat32Array &mesh_weights_array = mesh_arrays[ArrayMesh::ARRAY_WEIGHTS]; Transform3D *transforms = new Transform3D[num_bones_per_vertex];
const uint8_t num_bones_per_vertex = mesh_bones_array.size() / mesh_vertex_array_size; const uint32_t bone_index_start = (vertex_index * num_bones_per_vertex);
for (uint32_t vertex_index = 0; vertex_index < mesh_vertex_array_size; vertex_index++) for (uint8_t bone_index_offset = 0; bone_index_offset < num_bones_per_vertex; bone_index_offset++)
{ {
const Vector3 &vertex = mesh_vertex_array[vertex_index]; const float weight = mesh_weights_array[bone_index_start + bone_index_offset];
Transform3D *transforms = new Transform3D[num_bones_per_vertex]; const uint32_t bone = mesh_bones_array[bone_index_start + bone_index_offset];
const uint32_t bone_index_start = (vertex_index * num_bones_per_vertex); transforms[bone_index_offset] = ((Transform3D)bone_transforms[bone]) * weight;
for (uint8_t bone_index_offset = 0; bone_index_offset < num_bones_per_vertex; bone_index_offset++)
{
const float weight = mesh_weights_array[bone_index_start + bone_index_offset];
const uint32_t bone = mesh_bones_array[bone_index_start + bone_index_offset];
transforms[bone_index_offset] = ((Transform3D)bone_transforms[bone]) * weight;
}
Vector3 x_basis, y_basis, z_basis, origin;
for (uint8_t transform = 0; transform < num_bones_per_vertex; transform++)
{
x_basis += transforms[transform].basis.rows[0];
y_basis += transforms[transform].basis.rows[1];
z_basis += transforms[transform].basis.rows[2];
origin += transforms[transform].origin;
}
const Vector3 &transformed_vertex = Vector3(
x_basis.dot(vertex) + origin.x,
y_basis.dot(vertex) + origin.y,
z_basis.dot(vertex) + origin.z);
skinned_vertex_array[vertex_index] = transformed_vertex;
// The above is identical to the code seen below, except the below code does not work.
// This is fucking stupid.
//
// const Transform3D &final_transform = Transform3D(x_basis, y_basis, z_basis, origin);
// skinned_vertex_array[vertex_index] = final_transform.xform(vertex);
delete transforms;
} }
Vector3 x_basis, y_basis, z_basis, origin;
for (uint8_t transform = 0; transform < num_bones_per_vertex; transform++)
{
x_basis += transforms[transform].basis.rows[0];
y_basis += transforms[transform].basis.rows[1];
z_basis += transforms[transform].basis.rows[2];
origin += transforms[transform].origin;
}
const Vector3 &transformed_vertex = Vector3(
x_basis.dot(vertex) + origin.x,
y_basis.dot(vertex) + origin.y,
z_basis.dot(vertex) + origin.z);
skinned_vertex_array[vertex_index] = transformed_vertex;
// The above is identical to the code seen below, except the below code does not work.
// This is fucking stupid.
//
// const Transform3D &final_transform = Transform3D(x_basis, y_basis, z_basis, origin);
// skinned_vertex_array[vertex_index] = final_transform.xform(vertex);
delete transforms;
} }
skinned_vertex_surfaces[surface] = skinned_vertex_array; skinned_vertex_surfaces[surface] = skinned_vertex_array;
@@ -682,6 +679,8 @@ SkinnedSurfaces MeshEditingLibrary::get_skinned_vertex_positions(const Mesh *mes
{ {
skinned_vertex_array[vertex_index] = mesh_vertex_array[vertex_index]; skinned_vertex_array[vertex_index] = mesh_vertex_array[vertex_index];
} }
skinned_vertex_surfaces[surface] = skinned_vertex_array;
} }
return skinned_vertex_surfaces; return skinned_vertex_surfaces;