int32 GenerateSphylAsSimpleCollision(UStaticMesh* StaticMesh) { if (!PromptToRemoveExistingCollision(StaticMesh)) { return INDEX_NONE; } UBodySetup* bs = StaticMesh->BodySetup; // Calculate bounding box. FRawMesh RawMesh; FStaticMeshSourceModel& SrcModel = StaticMesh->SourceModels[0]; SrcModel.RawMeshBulkData->LoadRawMesh(RawMesh); FSphere sphere; float length; FRotator rotation; FVector unitVec = bs->BuildScale3D; CalcBoundingSphyl(RawMesh, sphere, length, rotation, unitVec); // Dont use if radius is zero. if (sphere.W <= 0.f) { FMessageDialog::Open(EAppMsgType::Ok, NSLOCTEXT("UnrealEd", "Prompt_10", "Could not create geometry.")); return INDEX_NONE; } // If height is zero, then a sphere would be better (should we just create one instead?) if (length <= 0.f) { length = SMALL_NUMBER; } bs->Modify(); // Create new GUID bs->InvalidatePhysicsData(); FKSphylElem SphylElem; SphylElem.Center = sphere.Center; SphylElem.Orientation = rotation.Quaternion(); SphylElem.Radius = sphere.W; SphylElem.Length = length; bs->AggGeom.SphylElems.Add(SphylElem); // refresh collision change back to staticmesh components RefreshCollisionChange(StaticMesh); // Mark staticmesh as dirty, to help make sure it gets saved. StaticMesh->MarkPackageDirty(); StaticMesh->bCustomizedCollision = true; //mark the static mesh for collision customization return bs->AggGeom.SphylElems.Num() - 1; }
int32 GenerateSphereAsSimpleCollision(UStaticMesh* StaticMesh) { if (!PromptToRemoveExistingCollision(StaticMesh)) { return INDEX_NONE; } UBodySetup* bs = StaticMesh->BodySetup; // Calculate bounding sphere. FRawMesh RawMesh; FStaticMeshSourceModel& SrcModel = StaticMesh->SourceModels[0]; SrcModel.RawMeshBulkData->LoadRawMesh(RawMesh); FSphere bSphere, bSphere2, bestSphere; FVector unitVec = bs->BuildScale3D; CalcBoundingSphere(RawMesh, bSphere, unitVec); CalcBoundingSphere2(RawMesh, bSphere2, unitVec); if(bSphere.W < bSphere2.W) bestSphere = bSphere; else bestSphere = bSphere2; // Dont use if radius is zero. if(bestSphere.W <= 0.f) { FMessageDialog::Open( EAppMsgType::Ok, NSLOCTEXT("UnrealEd", "Prompt_10", "Could not create geometry.") ); return INDEX_NONE; } bs->Modify(); // Create new GUID bs->InvalidatePhysicsData(); FKSphereElem SphereElem; SphereElem.Center = bestSphere.Center; SphereElem.Radius = bestSphere.W; bs->AggGeom.SphereElems.Add(SphereElem); // refresh collision change back to staticmesh components RefreshCollisionChange(StaticMesh); // Mark staticmesh as dirty, to help make sure it gets saved. StaticMesh->MarkPackageDirty(); StaticMesh->bCustomizedCollision = true; //mark the static mesh for collision customization return bs->AggGeom.SphereElems.Num() - 1; }
int32 GenerateBoxAsSimpleCollision(UStaticMesh* StaticMesh) { if (!PromptToRemoveExistingCollision(StaticMesh)) { return INDEX_NONE; } UBodySetup* bs = StaticMesh->BodySetup; // Calculate bounding Box. FRawMesh RawMesh; FStaticMeshSourceModel& SrcModel = StaticMesh->SourceModels[0]; SrcModel.RawMeshBulkData->LoadRawMesh(RawMesh); FVector unitVec = bs->BuildScale3D; FVector Center, Extents; CalcBoundingBox(RawMesh, Center, Extents, unitVec); bs->Modify(); // Create new GUID bs->InvalidatePhysicsData(); FKBoxElem BoxElem; BoxElem.Center = Center; BoxElem.X = Extents.X * 2.0f; BoxElem.Y = Extents.Y * 2.0f; BoxElem.Z = Extents.Z * 2.0f; bs->AggGeom.BoxElems.Add(BoxElem); // refresh collision change back to staticmesh components RefreshCollisionChange(StaticMesh); // Mark staticmesh as dirty, to help make sure it gets saved. StaticMesh->MarkPackageDirty(); StaticMesh->bCustomizedCollision = true; //mark the static mesh for collision customization return bs->AggGeom.BoxElems.Num() - 1; }