1
1
#include " KawaiiPhysicsEditMode.h"
2
2
#include " SceneManagement.h"
3
- #include " EngineUtils.h"
4
3
#include " IPersonaPreviewScene.h"
5
4
#include " Animation/DebugSkelMeshComponent.h"
6
5
#include " EditorModeManager.h"
7
6
#include " CanvasItem.h"
8
7
#include " CanvasTypes.h"
9
8
#include " Materials/MaterialInstanceDynamic.h"
10
- #include " AnimationRuntime .h"
9
+ #include " KawaiiPhysics .h"
11
10
#include " KawaiiPhysicsLimitsDataAsset.h"
12
11
13
12
#define LOCTEXT_NAMESPACE " KawaiiPhysicsEditMode"
13
+ DEFINE_LOG_CATEGORY (LogKawaiiPhysics);
14
14
15
15
struct HKawaiiPhysicsHitProxy : public HHitProxy
16
16
{
@@ -39,7 +39,7 @@ IMPLEMENT_HIT_PROXY(HKawaiiPhysicsHitProxy, HHitProxy);
39
39
FKawaiiPhysicsEditMode::FKawaiiPhysicsEditMode ()
40
40
: RuntimeNode(nullptr )
41
41
, GraphNode(nullptr )
42
- , SelectCollisionIsFromDataAsset (false )
42
+ , bIsSelectCollisionFromDataAsset (false )
43
43
, CurWidgetMode(UE_WIDGET::EWidgetMode::WM_Translate)
44
44
{
45
45
}
@@ -371,7 +371,7 @@ bool FKawaiiPhysicsEditMode::HandleClick(FEditorViewportClient* InViewportClient
371
371
HKawaiiPhysicsHitProxy* KawaiiPhysicsHitProxy = static_cast <HKawaiiPhysicsHitProxy*>(HitProxy);
372
372
SelectCollisionType = KawaiiPhysicsHitProxy->CollisionType ;
373
373
SelectCollisionIndex = KawaiiPhysicsHitProxy->CollisionIndex ;
374
- SelectCollisionIsFromDataAsset = KawaiiPhysicsHitProxy->bFromDataAsset ;
374
+ bIsSelectCollisionFromDataAsset = KawaiiPhysicsHitProxy->bFromDataAsset ;
375
375
return true ;
376
376
}
377
377
@@ -407,7 +407,7 @@ bool FKawaiiPhysicsEditMode::InputKey(FEditorViewportClient* InViewportClient, F
407
407
switch (SelectCollisionType)
408
408
{
409
409
case ECollisionLimitType::Spherical:
410
- if (SelectCollisionIsFromDataAsset )
410
+ if (bIsSelectCollisionFromDataAsset )
411
411
{
412
412
RuntimeNode->LimitsDataAsset ->SphericalLimitsData .RemoveAt (SelectCollisionIndex);
413
413
RuntimeNode->LimitsDataAsset ->Sync ();
@@ -420,7 +420,7 @@ bool FKawaiiPhysicsEditMode::InputKey(FEditorViewportClient* InViewportClient, F
420
420
}
421
421
break ;
422
422
case ECollisionLimitType::Capsule:
423
- if (SelectCollisionIsFromDataAsset )
423
+ if (bIsSelectCollisionFromDataAsset )
424
424
{
425
425
RuntimeNode->LimitsDataAsset ->CapsuleLimitsData .RemoveAt (SelectCollisionIndex);
426
426
RuntimeNode->LimitsDataAsset ->Sync ();
@@ -433,7 +433,7 @@ bool FKawaiiPhysicsEditMode::InputKey(FEditorViewportClient* InViewportClient, F
433
433
}
434
434
break ;
435
435
case ECollisionLimitType::Planar:
436
- if (SelectCollisionIsFromDataAsset )
436
+ if (bIsSelectCollisionFromDataAsset )
437
437
{
438
438
RuntimeNode->LimitsDataAsset ->PlanarLimitsData .RemoveAt (SelectCollisionIndex);
439
439
RuntimeNode->LimitsDataAsset ->Sync ();
@@ -494,13 +494,13 @@ bool FKawaiiPhysicsEditMode::IsValidSelectCollision() const
494
494
switch (SelectCollisionType)
495
495
{
496
496
case ECollisionLimitType::Spherical:
497
- return SelectCollisionIsFromDataAsset ? RuntimeNode->SphericalLimitsData .IsValidIndex (SelectCollisionIndex)
497
+ return bIsSelectCollisionFromDataAsset ? RuntimeNode->SphericalLimitsData .IsValidIndex (SelectCollisionIndex)
498
498
: RuntimeNode->SphericalLimits .IsValidIndex (SelectCollisionIndex);
499
499
case ECollisionLimitType::Capsule:
500
- return SelectCollisionIsFromDataAsset ? RuntimeNode->CapsuleLimitsData .IsValidIndex (SelectCollisionIndex)
500
+ return bIsSelectCollisionFromDataAsset ? RuntimeNode->CapsuleLimitsData .IsValidIndex (SelectCollisionIndex)
501
501
: RuntimeNode->CapsuleLimits .IsValidIndex (SelectCollisionIndex);
502
502
case ECollisionLimitType::Planar:
503
- return SelectCollisionIsFromDataAsset ? RuntimeNode->PlanarLimitsData .IsValidIndex (SelectCollisionIndex)
503
+ return bIsSelectCollisionFromDataAsset ? RuntimeNode->PlanarLimitsData .IsValidIndex (SelectCollisionIndex)
504
504
: RuntimeNode->PlanarLimits .IsValidIndex (SelectCollisionIndex);
505
505
case ECollisionLimitType::None: break ;
506
506
default : ;
@@ -518,13 +518,13 @@ FCollisionLimitBase* FKawaiiPhysicsEditMode::GetSelectCollisionLimitRuntime() co
518
518
switch (SelectCollisionType)
519
519
{
520
520
case ECollisionLimitType::Spherical:
521
- return SelectCollisionIsFromDataAsset ? &(RuntimeNode->SphericalLimitsData [SelectCollisionIndex])
521
+ return bIsSelectCollisionFromDataAsset ? &(RuntimeNode->SphericalLimitsData [SelectCollisionIndex])
522
522
: &(RuntimeNode->SphericalLimits [SelectCollisionIndex]);
523
523
case ECollisionLimitType::Capsule:
524
- return SelectCollisionIsFromDataAsset ? &(RuntimeNode->CapsuleLimitsData [SelectCollisionIndex])
524
+ return bIsSelectCollisionFromDataAsset ? &(RuntimeNode->CapsuleLimitsData [SelectCollisionIndex])
525
525
: &(RuntimeNode->CapsuleLimits [SelectCollisionIndex]);
526
526
case ECollisionLimitType::Planar:
527
- return SelectCollisionIsFromDataAsset ? &(RuntimeNode->PlanarLimitsData [SelectCollisionIndex])
527
+ return bIsSelectCollisionFromDataAsset ? &(RuntimeNode->PlanarLimitsData [SelectCollisionIndex])
528
528
: &(RuntimeNode->PlanarLimits [SelectCollisionIndex]);
529
529
case ECollisionLimitType::None: break ;
530
530
default : ;
@@ -539,18 +539,27 @@ FCollisionLimitBase* FKawaiiPhysicsEditMode::GetSelectCollisionLimitGraph() cons
539
539
{
540
540
return nullptr ;
541
541
}
542
-
542
+
543
543
switch (SelectCollisionType)
544
544
{
545
545
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
+ }
548
551
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
+ }
551
557
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
+ }
554
563
case ECollisionLimitType::None: break ;
555
564
default : ;
556
565
}
@@ -569,6 +578,11 @@ void FKawaiiPhysicsEditMode::DoTranslation(FVector& InTranslation)
569
578
FCollisionLimitBase* CollisionGraph = GetSelectCollisionLimitGraph ();
570
579
if (!CollisionRuntime || !CollisionGraph)
571
580
{
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
+ }
572
586
return ;
573
587
}
574
588
@@ -585,7 +599,7 @@ void FKawaiiPhysicsEditMode::DoTranslation(FVector& InTranslation)
585
599
CollisionRuntime->OffsetLocation += Offset;
586
600
CollisionGraph->OffsetLocation = CollisionRuntime->OffsetLocation ;
587
601
588
- if (SelectCollisionIsFromDataAsset )
602
+ if (bIsSelectCollisionFromDataAsset )
589
603
{
590
604
RuntimeNode->LimitsDataAsset ->UpdateLimit (CollisionRuntime);
591
605
}
@@ -602,6 +616,11 @@ void FKawaiiPhysicsEditMode::DoRotation(FRotator& InRotation)
602
616
FCollisionLimitBase* CollisionGraph = GetSelectCollisionLimitGraph ();
603
617
if (!CollisionRuntime || !CollisionGraph)
604
618
{
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
+ }
605
624
return ;
606
625
}
607
626
@@ -619,7 +638,7 @@ void FKawaiiPhysicsEditMode::DoRotation(FRotator& InRotation)
619
638
CollisionRuntime->OffsetRotation = FRotator (DeltaQuat * CollisionRuntime->OffsetRotation .Quaternion ());
620
639
CollisionGraph->OffsetRotation = CollisionRuntime->OffsetRotation ;
621
640
622
- if (SelectCollisionIsFromDataAsset )
641
+ if (bIsSelectCollisionFromDataAsset )
623
642
{
624
643
RuntimeNode->LimitsDataAsset ->UpdateLimit (CollisionRuntime);
625
644
}
@@ -631,15 +650,22 @@ void FKawaiiPhysicsEditMode::DoScale(FVector& InScale)
631
650
{
632
651
return ;
633
652
}
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
+ }
635
664
636
665
if (SelectCollisionType == ECollisionLimitType::Spherical)
637
666
{
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);
643
669
644
670
SphericalLimitRuntime.Radius += InScale.X ;
645
671
SphericalLimitRuntime.Radius += InScale.Y ;
@@ -648,18 +674,15 @@ void FKawaiiPhysicsEditMode::DoScale(FVector& InScale)
648
674
649
675
SphericalLimitGraph.Radius = SphericalLimitRuntime.Radius ;
650
676
651
- if (SelectCollisionIsFromDataAsset )
677
+ if (bIsSelectCollisionFromDataAsset )
652
678
{
653
679
RuntimeNode->LimitsDataAsset ->UpdateLimit (&SphericalLimitRuntime);
654
680
}
655
681
}
656
682
else if (SelectCollisionType == ECollisionLimitType::Capsule)
657
683
{
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);
663
686
664
687
CapsuleLimitRuntime.Radius += InScale.X ;
665
688
CapsuleLimitRuntime.Radius += InScale.Y ;
@@ -671,7 +694,7 @@ void FKawaiiPhysicsEditMode::DoScale(FVector& InScale)
671
694
CapsuleLimitGraph.Radius = CapsuleLimitRuntime.Radius ;
672
695
CapsuleLimitGraph.Length = CapsuleLimitRuntime.Length ;
673
696
674
- if (SelectCollisionIsFromDataAsset )
697
+ if (bIsSelectCollisionFromDataAsset )
675
698
{
676
699
RuntimeNode->LimitsDataAsset ->UpdateLimit (&CapsuleLimitRuntime);
677
700
}
0 commit comments