11#include " KawaiiPhysicsEditMode.h"
22#include " SceneManagement.h"
3- #include " EngineUtils.h"
43#include " IPersonaPreviewScene.h"
54#include " Animation/DebugSkelMeshComponent.h"
65#include " EditorModeManager.h"
76#include " CanvasItem.h"
87#include " CanvasTypes.h"
98#include " Materials/MaterialInstanceDynamic.h"
10- #include " AnimationRuntime .h"
9+ #include " KawaiiPhysics .h"
1110#include " KawaiiPhysicsLimitsDataAsset.h"
1211
1312#define LOCTEXT_NAMESPACE " KawaiiPhysicsEditMode"
13+ DEFINE_LOG_CATEGORY (LogKawaiiPhysics);
1414
1515struct HKawaiiPhysicsHitProxy : public HHitProxy
1616{
@@ -39,7 +39,7 @@ IMPLEMENT_HIT_PROXY(HKawaiiPhysicsHitProxy, HHitProxy);
3939FKawaiiPhysicsEditMode::FKawaiiPhysicsEditMode ()
4040 : RuntimeNode(nullptr )
4141 , GraphNode(nullptr )
42- , SelectCollisionIsFromDataAsset (false )
42+ , bIsSelectCollisionFromDataAsset (false )
4343 , CurWidgetMode(UE_WIDGET::EWidgetMode::WM_Translate)
4444{
4545}
@@ -371,7 +371,7 @@ bool FKawaiiPhysicsEditMode::HandleClick(FEditorViewportClient* InViewportClient
371371 HKawaiiPhysicsHitProxy* KawaiiPhysicsHitProxy = static_cast <HKawaiiPhysicsHitProxy*>(HitProxy);
372372 SelectCollisionType = KawaiiPhysicsHitProxy->CollisionType ;
373373 SelectCollisionIndex = KawaiiPhysicsHitProxy->CollisionIndex ;
374- SelectCollisionIsFromDataAsset = KawaiiPhysicsHitProxy->bFromDataAsset ;
374+ bIsSelectCollisionFromDataAsset = KawaiiPhysicsHitProxy->bFromDataAsset ;
375375 return true ;
376376 }
377377
@@ -407,7 +407,7 @@ bool FKawaiiPhysicsEditMode::InputKey(FEditorViewportClient* InViewportClient, F
407407 switch (SelectCollisionType)
408408 {
409409 case ECollisionLimitType::Spherical:
410- if (SelectCollisionIsFromDataAsset )
410+ if (bIsSelectCollisionFromDataAsset )
411411 {
412412 RuntimeNode->LimitsDataAsset ->SphericalLimitsData .RemoveAt (SelectCollisionIndex);
413413 RuntimeNode->LimitsDataAsset ->Sync ();
@@ -420,7 +420,7 @@ bool FKawaiiPhysicsEditMode::InputKey(FEditorViewportClient* InViewportClient, F
420420 }
421421 break ;
422422 case ECollisionLimitType::Capsule:
423- if (SelectCollisionIsFromDataAsset )
423+ if (bIsSelectCollisionFromDataAsset )
424424 {
425425 RuntimeNode->LimitsDataAsset ->CapsuleLimitsData .RemoveAt (SelectCollisionIndex);
426426 RuntimeNode->LimitsDataAsset ->Sync ();
@@ -433,7 +433,7 @@ bool FKawaiiPhysicsEditMode::InputKey(FEditorViewportClient* InViewportClient, F
433433 }
434434 break ;
435435 case ECollisionLimitType::Planar:
436- if (SelectCollisionIsFromDataAsset )
436+ if (bIsSelectCollisionFromDataAsset )
437437 {
438438 RuntimeNode->LimitsDataAsset ->PlanarLimitsData .RemoveAt (SelectCollisionIndex);
439439 RuntimeNode->LimitsDataAsset ->Sync ();
@@ -494,13 +494,13 @@ bool FKawaiiPhysicsEditMode::IsValidSelectCollision() const
494494 switch (SelectCollisionType)
495495 {
496496 case ECollisionLimitType::Spherical:
497- return SelectCollisionIsFromDataAsset ? RuntimeNode->SphericalLimitsData .IsValidIndex (SelectCollisionIndex)
497+ return bIsSelectCollisionFromDataAsset ? RuntimeNode->SphericalLimitsData .IsValidIndex (SelectCollisionIndex)
498498 : RuntimeNode->SphericalLimits .IsValidIndex (SelectCollisionIndex);
499499 case ECollisionLimitType::Capsule:
500- return SelectCollisionIsFromDataAsset ? RuntimeNode->CapsuleLimitsData .IsValidIndex (SelectCollisionIndex)
500+ return bIsSelectCollisionFromDataAsset ? RuntimeNode->CapsuleLimitsData .IsValidIndex (SelectCollisionIndex)
501501 : RuntimeNode->CapsuleLimits .IsValidIndex (SelectCollisionIndex);
502502 case ECollisionLimitType::Planar:
503- return SelectCollisionIsFromDataAsset ? RuntimeNode->PlanarLimitsData .IsValidIndex (SelectCollisionIndex)
503+ return bIsSelectCollisionFromDataAsset ? RuntimeNode->PlanarLimitsData .IsValidIndex (SelectCollisionIndex)
504504 : RuntimeNode->PlanarLimits .IsValidIndex (SelectCollisionIndex);
505505 case ECollisionLimitType::None: break ;
506506 default : ;
@@ -518,13 +518,13 @@ FCollisionLimitBase* FKawaiiPhysicsEditMode::GetSelectCollisionLimitRuntime() co
518518 switch (SelectCollisionType)
519519 {
520520 case ECollisionLimitType::Spherical:
521- return SelectCollisionIsFromDataAsset ? &(RuntimeNode->SphericalLimitsData [SelectCollisionIndex])
521+ return bIsSelectCollisionFromDataAsset ? &(RuntimeNode->SphericalLimitsData [SelectCollisionIndex])
522522 : &(RuntimeNode->SphericalLimits [SelectCollisionIndex]);
523523 case ECollisionLimitType::Capsule:
524- return SelectCollisionIsFromDataAsset ? &(RuntimeNode->CapsuleLimitsData [SelectCollisionIndex])
524+ return bIsSelectCollisionFromDataAsset ? &(RuntimeNode->CapsuleLimitsData [SelectCollisionIndex])
525525 : &(RuntimeNode->CapsuleLimits [SelectCollisionIndex]);
526526 case ECollisionLimitType::Planar:
527- return SelectCollisionIsFromDataAsset ? &(RuntimeNode->PlanarLimitsData [SelectCollisionIndex])
527+ return bIsSelectCollisionFromDataAsset ? &(RuntimeNode->PlanarLimitsData [SelectCollisionIndex])
528528 : &(RuntimeNode->PlanarLimits [SelectCollisionIndex]);
529529 case ECollisionLimitType::None: break ;
530530 default : ;
@@ -539,18 +539,27 @@ FCollisionLimitBase* FKawaiiPhysicsEditMode::GetSelectCollisionLimitGraph() cons
539539 {
540540 return nullptr ;
541541 }
542-
542+
543543 switch (SelectCollisionType)
544544 {
545545 case ECollisionLimitType::Spherical:
546- return SelectCollisionIsFromDataAsset ? &(GraphNode->Node .SphericalLimitsData [SelectCollisionIndex])
547- : &(GraphNode->Node .SphericalLimits [SelectCollisionIndex]);
546+ {
547+ auto & CollisionLimits = bIsSelectCollisionFromDataAsset ?
548+ GraphNode->Node .SphericalLimitsData : GraphNode->Node .SphericalLimits ;
549+ return CollisionLimits.IsValidIndex (SelectCollisionIndex) ? &CollisionLimits[SelectCollisionIndex] : nullptr ;
550+ }
548551 case ECollisionLimitType::Capsule:
549- return SelectCollisionIsFromDataAsset ? &(GraphNode->Node .CapsuleLimitsData [SelectCollisionIndex])
550- : &(GraphNode->Node .CapsuleLimits [SelectCollisionIndex]);
552+ {
553+ auto & CollisionLimits = bIsSelectCollisionFromDataAsset ?
554+ GraphNode->Node .CapsuleLimitsData : GraphNode->Node .CapsuleLimits ;
555+ return CollisionLimits.IsValidIndex (SelectCollisionIndex) ? &CollisionLimits[SelectCollisionIndex] : nullptr ;
556+ }
551557 case ECollisionLimitType::Planar:
552- return SelectCollisionIsFromDataAsset ? &(GraphNode->Node .PlanarLimitsData [SelectCollisionIndex])
553- : &(GraphNode->Node .PlanarLimits [SelectCollisionIndex]);
558+ {
559+ auto & CollisionLimits = bIsSelectCollisionFromDataAsset ?
560+ GraphNode->Node .PlanarLimitsData : GraphNode->Node .PlanarLimits ;
561+ return CollisionLimits.IsValidIndex (SelectCollisionIndex) ? &CollisionLimits[SelectCollisionIndex] : nullptr ;
562+ }
554563 case ECollisionLimitType::None: break ;
555564 default : ;
556565 }
@@ -569,6 +578,11 @@ void FKawaiiPhysicsEditMode::DoTranslation(FVector& InTranslation)
569578 FCollisionLimitBase* CollisionGraph = GetSelectCollisionLimitGraph ();
570579 if (!CollisionRuntime || !CollisionGraph)
571580 {
581+ UE_LOG (LogKawaiiPhysics, Warning, TEXT ( " Fail to edit limit." ));
582+ if (bIsSelectCollisionFromDataAsset)
583+ {
584+ UE_LOG (LogKawaiiPhysics, Warning, TEXT ( " Please try saving the DataAsset (%s) and compile this ABP." ), *RuntimeNode->LimitsDataAsset .GetName ());
585+ }
572586 return ;
573587 }
574588
@@ -585,7 +599,7 @@ void FKawaiiPhysicsEditMode::DoTranslation(FVector& InTranslation)
585599 CollisionRuntime->OffsetLocation += Offset;
586600 CollisionGraph->OffsetLocation = CollisionRuntime->OffsetLocation ;
587601
588- if (SelectCollisionIsFromDataAsset )
602+ if (bIsSelectCollisionFromDataAsset )
589603 {
590604 RuntimeNode->LimitsDataAsset ->UpdateLimit (CollisionRuntime);
591605 }
@@ -602,6 +616,11 @@ void FKawaiiPhysicsEditMode::DoRotation(FRotator& InRotation)
602616 FCollisionLimitBase* CollisionGraph = GetSelectCollisionLimitGraph ();
603617 if (!CollisionRuntime || !CollisionGraph)
604618 {
619+ UE_LOG (LogKawaiiPhysics, Warning, TEXT ( " Fail to edit limit." ));
620+ if (bIsSelectCollisionFromDataAsset)
621+ {
622+ UE_LOG (LogKawaiiPhysics, Warning, TEXT ( " Please try saving the DataAsset (%s) and compile this ABP." ), *RuntimeNode->LimitsDataAsset .GetName ());
623+ }
605624 return ;
606625 }
607626
@@ -619,7 +638,7 @@ void FKawaiiPhysicsEditMode::DoRotation(FRotator& InRotation)
619638 CollisionRuntime->OffsetRotation = FRotator (DeltaQuat * CollisionRuntime->OffsetRotation .Quaternion ());
620639 CollisionGraph->OffsetRotation = CollisionRuntime->OffsetRotation ;
621640
622- if (SelectCollisionIsFromDataAsset )
641+ if (bIsSelectCollisionFromDataAsset )
623642 {
624643 RuntimeNode->LimitsDataAsset ->UpdateLimit (CollisionRuntime);
625644 }
@@ -631,15 +650,22 @@ void FKawaiiPhysicsEditMode::DoScale(FVector& InScale)
631650 {
632651 return ;
633652 }
634-
653+ FCollisionLimitBase* CollisionRuntime = GetSelectCollisionLimitRuntime ();
654+ FCollisionLimitBase* CollisionGraph = GetSelectCollisionLimitGraph ();
655+ if (!CollisionRuntime || !CollisionGraph)
656+ {
657+ UE_LOG (LogKawaiiPhysics, Warning, TEXT ( " Fail to edit limit." ));
658+ if (bIsSelectCollisionFromDataAsset)
659+ {
660+ UE_LOG (LogKawaiiPhysics, Warning, TEXT ( " Please try saving the DataAsset (%s) and compile this ABP." ), *RuntimeNode->LimitsDataAsset .GetName ());
661+ }
662+ return ;
663+ }
635664
636665 if (SelectCollisionType == ECollisionLimitType::Spherical)
637666 {
638- FSphericalLimit& SphericalLimitRuntime = SelectCollisionIsFromDataAsset ? RuntimeNode->SphericalLimitsData [SelectCollisionIndex]
639- : RuntimeNode->SphericalLimits [SelectCollisionIndex];
640-
641- FSphericalLimit& SphericalLimitGraph = SelectCollisionIsFromDataAsset ? (GraphNode->Node .SphericalLimitsData [SelectCollisionIndex])
642- : (GraphNode->Node .SphericalLimits [SelectCollisionIndex]);
667+ FSphericalLimit& SphericalLimitRuntime = *static_cast <FSphericalLimit*>(CollisionRuntime);
668+ FSphericalLimit& SphericalLimitGraph = *static_cast <FSphericalLimit*>(CollisionGraph);
643669
644670 SphericalLimitRuntime.Radius += InScale.X ;
645671 SphericalLimitRuntime.Radius += InScale.Y ;
@@ -648,18 +674,15 @@ void FKawaiiPhysicsEditMode::DoScale(FVector& InScale)
648674
649675 SphericalLimitGraph.Radius = SphericalLimitRuntime.Radius ;
650676
651- if (SelectCollisionIsFromDataAsset )
677+ if (bIsSelectCollisionFromDataAsset )
652678 {
653679 RuntimeNode->LimitsDataAsset ->UpdateLimit (&SphericalLimitRuntime);
654680 }
655681 }
656682 else if (SelectCollisionType == ECollisionLimitType::Capsule)
657683 {
658- FCapsuleLimit& CapsuleLimitRuntime = SelectCollisionIsFromDataAsset ? RuntimeNode->CapsuleLimitsData [SelectCollisionIndex]
659- : RuntimeNode->CapsuleLimits [SelectCollisionIndex];
660-
661- FCapsuleLimit& CapsuleLimitGraph = SelectCollisionIsFromDataAsset ? GraphNode->Node .CapsuleLimitsData [SelectCollisionIndex]
662- : GraphNode->Node .CapsuleLimits [SelectCollisionIndex];
684+ FCapsuleLimit& CapsuleLimitRuntime = *static_cast <FCapsuleLimit*>(CollisionRuntime);
685+ FCapsuleLimit& CapsuleLimitGraph = *static_cast <FCapsuleLimit*>(CollisionGraph);
663686
664687 CapsuleLimitRuntime.Radius += InScale.X ;
665688 CapsuleLimitRuntime.Radius += InScale.Y ;
@@ -671,7 +694,7 @@ void FKawaiiPhysicsEditMode::DoScale(FVector& InScale)
671694 CapsuleLimitGraph.Radius = CapsuleLimitRuntime.Radius ;
672695 CapsuleLimitGraph.Length = CapsuleLimitRuntime.Length ;
673696
674- if (SelectCollisionIsFromDataAsset )
697+ if (bIsSelectCollisionFromDataAsset )
675698 {
676699 RuntimeNode->LimitsDataAsset ->UpdateLimit (&CapsuleLimitRuntime);
677700 }
0 commit comments