Transform mesh's AABB to skeleton's space when calculate mesh's bounds.
This commit is contained in:
parent
3e7f638d7b
commit
27f71c4e78
11 changed files with 122 additions and 25 deletions
|
|
@ -101,7 +101,12 @@ void Polygon2D::_skeleton_bone_setup_changed() {
|
|||
}
|
||||
|
||||
void Polygon2D::_notification(int p_what) {
|
||||
if (p_what == NOTIFICATION_TRANSFORM_CHANGED && !Engine::get_singleton()->is_editor_hint()) {
|
||||
return; // Mesh recreation for NOTIFICATION_TRANSFORM_CHANGED is only needed in editor.
|
||||
}
|
||||
|
||||
switch (p_what) {
|
||||
case NOTIFICATION_TRANSFORM_CHANGED:
|
||||
case NOTIFICATION_DRAW: {
|
||||
if (polygon.size() < 3) {
|
||||
return;
|
||||
|
|
@ -364,7 +369,30 @@ void Polygon2D::_notification(int p_what) {
|
|||
|
||||
arr[RS::ARRAY_INDEX] = index_array;
|
||||
|
||||
RS::get_singleton()->mesh_add_surface_from_arrays(mesh, RS::PRIMITIVE_TRIANGLES, arr, Array(), Dictionary(), RS::ARRAY_FLAG_USE_2D_VERTICES);
|
||||
RS::SurfaceData sd;
|
||||
|
||||
if (skeleton_node) {
|
||||
// Compute transform between mesh and skeleton for runtime AABB compute.
|
||||
const Transform2D mesh_transform = get_global_transform();
|
||||
const Transform2D skeleton_transform = skeleton_node->get_global_transform();
|
||||
const Transform2D mesh_to_sk2d = mesh_transform * skeleton_transform.affine_inverse();
|
||||
|
||||
// Convert 2d transform to 3d.
|
||||
sd.mesh_to_skeleton_xform.basis.rows[0][0] = mesh_to_sk2d.columns[0][0];
|
||||
sd.mesh_to_skeleton_xform.basis.rows[0][1] = mesh_to_sk2d.columns[0][1];
|
||||
sd.mesh_to_skeleton_xform.origin.x = mesh_to_sk2d.get_origin().x;
|
||||
|
||||
sd.mesh_to_skeleton_xform.basis.rows[1][0] = mesh_to_sk2d.columns[1][0];
|
||||
sd.mesh_to_skeleton_xform.basis.rows[1][1] = mesh_to_sk2d.columns[1][1];
|
||||
sd.mesh_to_skeleton_xform.origin.y = mesh_to_sk2d.get_origin().y;
|
||||
}
|
||||
|
||||
Error err = RS::get_singleton()->mesh_create_surface_data_from_arrays(&sd, RS::PRIMITIVE_TRIANGLES, arr, Array(), Dictionary(), RS::ARRAY_FLAG_USE_2D_VERTICES);
|
||||
if (err != OK) {
|
||||
return;
|
||||
}
|
||||
|
||||
RS::get_singleton()->mesh_add_surface(mesh, sd);
|
||||
RS::get_singleton()->canvas_item_add_mesh(get_canvas_item(), mesh, Transform2D(), Color(1, 1, 1), texture.is_valid() ? texture->get_rid() : RID());
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue