diff --git a/havana/havok/hk_physics/constraint/ragdoll/ragdoll_constraint.cpp b/havana/havok/hk_physics/constraint/ragdoll/ragdoll_constraint.cpp index a42259a..5ed9076 100644 --- a/havana/havok/hk_physics/constraint/ragdoll/ragdoll_constraint.cpp +++ b/havana/havok/hk_physics/constraint/ragdoll/ragdoll_constraint.cpp @@ -348,8 +348,14 @@ void hk_Ragdoll_Constraint::update_friction(hk_real max_angular_impulse) } } -void hk_Ragdoll_Constraint::update_transforms(hk_Transform& os_ks_0, hk_Transform& os_ks_1) +void hk_Ragdoll_Constraint::update_transforms(const hk_Transform& os_ks_0, const hk_Transform& os_ks_1) { - m_transform_os_ks[0] = os_ks_0; - m_transform_os_ks[1] = os_ks_1; + m_transform_os_ks[0].get_column(0) = os_ks_0.get_column(m_axisMap[0]); + m_transform_os_ks[1].get_column(0) = os_ks_1.get_column(m_axisMap[0]); + + m_transform_os_ks[0].get_column(1) = os_ks_0.get_column(m_axisMap[2]); + m_transform_os_ks[1].get_column(1) = os_ks_1.get_column(m_axisMap[2]); + + m_transform_os_ks[0].get_column(2) = os_ks_0.get_column(m_axisMap[1]); + m_transform_os_ks[1].get_column(2) = os_ks_1.get_column(m_axisMap[1]); } diff --git a/havana/havok/hk_physics/constraint/ragdoll/ragdoll_constraint.h b/havana/havok/hk_physics/constraint/ragdoll/ragdoll_constraint.h index 2784b5c..dc2822e 100644 --- a/havana/havok/hk_physics/constraint/ragdoll/ragdoll_constraint.h +++ b/havana/havok/hk_physics/constraint/ragdoll/ragdoll_constraint.h @@ -48,7 +48,7 @@ class hk_Ragdoll_Constraint : public hk_Constraint return m_transform_os_ks[x]; } - void update_transforms(hk_Transform& os_ks_0, hk_Transform& os_ks_1); + void update_transforms(const hk_Transform& os_ks_0, const hk_Transform& os_ks_1); void update_friction(hk_real max_angular_impulse); protected: diff --git a/havana/havok/hk_physics/constraint/ragdoll/ragdoll_constraint_bp_builder.cpp b/havana/havok/hk_physics/constraint/ragdoll/ragdoll_constraint_bp_builder.cpp index 4c21100..99b5563 100644 --- a/havana/havok/hk_physics/constraint/ragdoll/ragdoll_constraint_bp_builder.cpp +++ b/havana/havok/hk_physics/constraint/ragdoll/ragdoll_constraint_bp_builder.cpp @@ -75,7 +75,15 @@ hk_result hk_Ragdoll_Constraint_BP_Builder::initialize_from_limited_ball_socket_ r.m_transform_os_ks[0].get_column(2) = m0.get_column( axis ); r.m_transform_os_ks[1].get_column(2) = m1.get_column( axis ); + if( limit_diff[axis] > HK_PI && limit_diff[axis] < HK_PI*2.f ) + limit_diff[axis] = HK_PI; + r.m_limits[ HK_LIMIT_CONE ].set_limits( -limit_diff[axis] * 0.5f, limit_diff[axis] * 0.5f); + + r.m_axisMap[0] = naxis; + r.m_axisMap[1] = axis; + r.m_axisMap[2] = paxis; + break; } @@ -150,15 +158,19 @@ hk_result hk_Ragdoll_Constraint_BP_Builder::initialize_from_limited_ball_socket_ r.m_transform_os_ks[0].get_column(0) = m0.get_column( axis_of_min_inertia ); r.m_transform_os_ks[1].get_column(0) = m1.get_column( axis_of_min_inertia ); - r.m_transform_os_ks[0].get_column(1) = m0.get_column( u_axis ); - r.m_transform_os_ks[1].get_column(1) = m1.get_column( u_axis ); + r.m_transform_os_ks[0].get_column(1) = m0.get_column( l_axis ); + r.m_transform_os_ks[1].get_column(1) = m1.get_column( l_axis ); - r.m_transform_os_ks[0].get_column(2) = m0.get_column( l_axis ); - r.m_transform_os_ks[1].get_column(2) = m1.get_column( l_axis ); + r.m_transform_os_ks[0].get_column(2) = m0.get_column( u_axis ); + r.m_transform_os_ks[1].get_column(2) = m1.get_column( u_axis ); r.m_limits[ HK_LIMIT_TWIST ].set_limits( bp->m_angular_limits[axis_of_min_inertia].m_min, bp->m_angular_limits[axis_of_min_inertia].m_max ); r.m_limits[ HK_LIMIT_CONE ]. set_limits( - limit_diff[u_axis] * 0.5f, limit_diff[u_axis] * 0.5f); r.m_limits[ HK_LIMIT_PLANES].set_limits( bp->m_angular_limits[l_axis].m_min, bp->m_angular_limits[l_axis].m_max ); + + r.m_axisMap[0] = axis_of_min_inertia; + r.m_axisMap[1] = u_axis; + r.m_axisMap[2] = l_axis; } break; }