Skip to content

Commit 0ce49d9

Browse files
committed
Fix Issue : Crash in Editmode of Data Asset Limits #119
1 parent 95d5e39 commit 0ce49d9

File tree

4 files changed

+61
-36
lines changed

4 files changed

+61
-36
lines changed
Binary file not shown.

Plugins/KawaiiPhysics/Source/KawaiiPhysics/Public/KawaiiPhysics.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55
#include "CoreMinimal.h"
66
#include "Modules/ModuleInterface.h"
77

8+
DECLARE_LOG_CATEGORY_EXTERN(LogKawaiiPhysics, Log, All);
9+
810
class FKawaiiPhysicsModule : public IModuleInterface
911
{
1012
public:

Plugins/KawaiiPhysics/Source/KawaiiPhysicsEd/Private/KawaiiPhysicsEditMode.cpp

Lines changed: 58 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,16 @@
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

1515
struct HKawaiiPhysicsHitProxy : public HHitProxy
1616
{
@@ -39,7 +39,7 @@ IMPLEMENT_HIT_PROXY(HKawaiiPhysicsHitProxy, HHitProxy);
3939
FKawaiiPhysicsEditMode::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
}

Plugins/KawaiiPhysics/Source/KawaiiPhysicsEd/Public/KawaiiPhysicsEditMode.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ class FKawaiiPhysicsEditMode : public FKawaiiPhysicsEditModeBase
8686
/** The current bone selection mode */
8787
ECollisionLimitType SelectCollisionType = ECollisionLimitType::None;
8888
int32 SelectCollisionIndex = -1;
89-
bool SelectCollisionIsFromDataAsset;
89+
bool bIsSelectCollisionFromDataAsset;
9090

9191
// storing current widget mode
9292
mutable UE_WIDGET::EWidgetMode CurWidgetMode;

0 commit comments

Comments
 (0)