FTransform UPhATEdSkeletalMeshComponent::GetPrimitiveTransform(FTransform& BoneTM, int32 BodyIndex, EKCollisionPrimitiveType PrimType, int32 PrimIndex, float Scale) { UBodySetup* BodySetup = SharedData->PhysicsAsset->BodySetup[BodyIndex]; FVector Scale3D(Scale); FTransform ManTM = FTransform::Identity; if(SharedData->bManipulating && !SharedData->bRunningSimulation && SharedData->EditingMode == FPhATSharedData::PEM_BodyEdit) { FPhATSharedData::FSelection Body(BodyIndex, PrimType, PrimIndex); for(int32 i=0; i<SharedData->SelectedBodies.Num(); ++i) { if (Body == SharedData->SelectedBodies[i]) { ManTM = SharedData->SelectedBodies[i].ManipulateTM; break; } } } if (PrimType == KPT_Sphere) { FTransform PrimTM = ManTM * BodySetup->AggGeom.SphereElems[PrimIndex].GetTransform(); PrimTM.ScaleTranslation(Scale3D); return PrimTM * BoneTM; } else if (PrimType == KPT_Box) { FTransform PrimTM = ManTM * BodySetup->AggGeom.BoxElems[PrimIndex].GetTransform(); PrimTM.ScaleTranslation(Scale3D); return PrimTM * BoneTM; } else if (PrimType == KPT_Sphyl) { FTransform PrimTM = ManTM * BodySetup->AggGeom.SphylElems[PrimIndex].GetTransform(); PrimTM.ScaleTranslation(Scale3D); return PrimTM * BoneTM; } else if (PrimType == KPT_Convex) { FTransform PrimTM = ManTM * BodySetup->AggGeom.ConvexElems[PrimIndex].GetTransform(); PrimTM.ScaleTranslation(Scale3D); return PrimTM * BoneTM; } // Should never reach here check(0); return FTransform::Identity; }
void PrepareInvMatrix(float Tx, float Ty, float Tz, float Sx, float Sy, float Sz, float Rx, float Ry, float Rz, Matx4x4 XForm) { Matx4x4 M1, M2, M3, M4, M5, M6, M7, M8, M9; Scale3D(Sx, Sy, Sz, M1); Rotate3D(1, Rx, M2); Rotate3D(2, Ry, M3); Rotate3D(3, Rz, M4); Translate3D(Tx, Ty, Tz, M5); Multiply3DMatricies(M4, M5, M6); Multiply3DMatricies(M3, M6, M7); Multiply3DMatricies(M2, M7, M8); Multiply3DMatricies(M1, M8, M9); MatCopy(M9, XForm); }