void FApexChunkReport::onDamageNotify(const NxApexDamageEventReportData& damageEvent) { UDestructibleComponent* DestructibleComponent = Cast<UDestructibleComponent>(FPhysxUserData::Get<UPrimitiveComponent>(damageEvent.destructible->userData)); check(DestructibleComponent); if (DestructibleComponent->IsPendingKill()) //don't notify if object is being destroyed { return; } DestructibleComponent->OnDamageEvent(damageEvent); }
void FPhysScene::DispatchPhysNotifications() { SCOPE_CYCLE_COUNTER(STAT_PhysicsEventTime); //Collision notification { // Let the game-specific PhysicsCollisionHandler process any physics collisions that took place if (OwningWorld != NULL && OwningWorld->PhysicsCollisionHandler != NULL) { OwningWorld->PhysicsCollisionHandler->HandlePhysicsCollisions(PendingCollisionNotifies); } // Fire any collision notifies in the queue. for (int32 i = 0; i<PendingCollisionNotifies.Num(); i++) { FCollisionNotifyInfo& NotifyInfo = PendingCollisionNotifies[i]; if (NotifyInfo.RigidCollisionData.ContactInfos.Num() > 0) { if (NotifyInfo.bCallEvent0 && NotifyInfo.IsValidForNotify() && NotifyInfo.Info0.Actor.IsValid()) { NotifyInfo.Info0.Actor->DispatchPhysicsCollisionHit(NotifyInfo.Info0, NotifyInfo.Info1, NotifyInfo.RigidCollisionData); } // Need to check IsValidForNotify again in case first call broke something. if (NotifyInfo.bCallEvent1 && NotifyInfo.IsValidForNotify() && NotifyInfo.Info1.Actor.IsValid()) { NotifyInfo.RigidCollisionData.SwapContactOrders(); NotifyInfo.Info1.Actor->DispatchPhysicsCollisionHit(NotifyInfo.Info1, NotifyInfo.Info0, NotifyInfo.RigidCollisionData); } } } PendingCollisionNotifies.Empty(); } #if WITH_SUBSTEPPING #if WITH_APEX //TODO: Queue is always empty for now - waiting for support from NVIDIA //Destructible notification { for (int32 i = 0; i < DestructibleDamageEventQueue.Num(); ++i) { const NxApexDamageEventReportData & damageEvent = DestructibleDamageEventQueue[i]; UDestructibleComponent* DestructibleComponent = Cast<UDestructibleComponent>(FPhysxUserData::Get<UPrimitiveComponent>(damageEvent.destructible->userData)); DestructibleComponent->OnDamageEvent(damageEvent); } DestructibleDamageEventQueue.Empty(); } #endif #endif }