void UDestructibleComponent::OnUpdateTransform(bool bSkipPhysicsMove) { // We are handling the physics move below, so don't handle it at higher levels Super::OnUpdateTransform(true); if (SkeletalMesh == NULL) { return; } if (!bPhysicsStateCreated || bSkipPhysicsMove) { return; } const FTransform& CurrentLocalToWorld = ComponentToWorld; if(CurrentLocalToWorld.ContainsNaN()) { return; } // warn if it has non-uniform scale const FVector& MeshScale3D = CurrentLocalToWorld.GetScale3D(); #if !(UE_BUILD_SHIPPING || UE_BUILD_TEST) if( !MeshScale3D.IsUniform() ) { UE_LOG(LogPhysics, Log, TEXT("UDestructibleComponent::SendPhysicsTransform : Non-uniform scale factor (%s) can cause physics to mismatch for %s SkelMesh: %s"), *MeshScale3D.ToString(), *GetFullName(), SkeletalMesh ? *SkeletalMesh->GetFullName() : TEXT("NULL")); } #endif #if WITH_APEX if (ApexDestructibleActor) { PxRigidDynamic* PRootActor = ApexDestructibleActor->getChunkPhysXActor(0); PxMat44 GlobalPose(PxMat33(U2PQuat(CurrentLocalToWorld.GetRotation())), U2PVector(CurrentLocalToWorld.GetTranslation())); if(!PRootActor || PRootActor->getScene()) //either root chunk is null meaning fractured (so there's a scene), or the root has a scene { ApexDestructibleActor->setGlobalPose(GlobalPose); }else { PRootActor->setGlobalPose(PxTransform(GlobalPose)); //we're not in a scene yet, so place the root actor in this new position } } #endif // #if WITH_APEX }
void UDestructibleComponent::OnUpdateTransform(bool bSkipPhysicsMove) { // We are handling the physics move below, so don't handle it at higher levels Super::OnUpdateTransform(true); if (SkeletalMesh == NULL) { return; } if (!bPhysicsStateCreated || bSkipPhysicsMove) { return; } const FTransform& CurrentLocalToWorld = ComponentToWorld; if(CurrentLocalToWorld.ContainsNaN()) { return; } // warn if it has non-uniform scale const FVector & MeshScale3D = CurrentLocalToWorld.GetScale3D(); #if !(UE_BUILD_SHIPPING || UE_BUILD_TEST) if( !MeshScale3D.IsUniform() ) { UE_LOG(LogPhysics, Log, TEXT("UDestructibleComponent::SendPhysicsTransform : Non-uniform scale factor (%s) can cause physics to mismatch for %s SkelMesh: %s"), *MeshScale3D.ToString(), *GetFullName(), SkeletalMesh ? *SkeletalMesh->GetFullName() : TEXT("NULL")); } #endif #if WITH_APEX if (ApexDestructibleActor != NULL && !BodyInstance.bSimulatePhysics) { PxMat44 GlobalPose(PxMat33(U2PQuat(CurrentLocalToWorld.GetRotation())), U2PVector(CurrentLocalToWorld.GetTranslation())); ApexDestructibleActor->setGlobalPose(GlobalPose); } #endif // #if WITH_APEX }