A Demo Project for the UnrealEngineSDK
Loading...
Searching...
No Matches
VRLeverComponent.cpp
Go to the documentation of this file.
1// Copyright 1998-2016 Epic Games, Inc. All Rights Reserved.
2
4#include "Net/UnrealNetwork.h"
5
6 //=============================================================================
7UVRLeverComponent::UVRLeverComponent(const FObjectInitializer& ObjectInitializer)
8 : Super(ObjectInitializer)
9{
10 this->SetGenerateOverlapEvents(true);
11 this->PrimaryComponentTick.bStartWithTickEnabled = false;
12 PrimaryComponentTick.bCanEverTick = true;
13
14 bRepGameplayTags = false;
15
16 // Defaulting these true so that they work by default in networked environments
17 bReplicateMovement = true;
18
20 BreakDistance = 100.0f;
21 Stiffness = 1500.0f;
22 Damping = 200.0f;
23
24#if PHYSICS_INTERFACE_PHYSX
25 HandleData = nullptr;
26#endif
27 //SceneIndex = 0;
28
29 bIsPhysicsLever = false;
30 ParentComponent = nullptr;
32
33 LeverLimitNegative = 0.0f;
34 LeverLimitPositive = 90.0f;
35 FlightStickYawLimit = 180.0f;
36 bLeverState = false;
38
39 LastDeltaAngle = 0.0f;
40 FullCurrentAngle = 0.0f;
41
43 LeverReturnSpeed = 50.0f;
44
45 MomentumAtDrop = 0.0f;
47 MaxLeverMomentum = 180.0f;
49
51 AngleThreshold = 90.0f;
52
53 LastLeverAngle = 0.0f;
54
56
57 InitialRelativeTransform = FTransform::Identity;
58 InitialInteractorLocation = FVector::ZeroVector;
59 InteractorOffsetTransform = FTransform::Identity;
60 AllCurrentLeverAngles = FRotator::ZeroRotator;
61 InitialGripRot = 0.0f;
62 qRotAtGrab = FQuat::Identity;
63 bIsLerping = false;
65 bDenyGripping = false;
66
67 bIsLocked = false;
69
70 PrimarySlotRange = 100.f;
71 SecondarySlotRange = 100.f;
72 GripPriority = 1;
73
74 // Set to only overlap with things so that its not ruined by touching over actors
75 this->SetCollisionResponseToAllChannels(ECollisionResponse::ECR_Overlap);
76}
77
78//=============================================================================
82
83
84void UVRLeverComponent::GetLifetimeReplicatedProps(TArray< class FLifetimeProperty > & OutLifetimeProps) const
85{
86 Super::GetLifetimeReplicatedProps(OutLifetimeProps);
87
89 //DOREPLIFETIME_CONDITION(UVRLeverComponent, bIsLerping, COND_InitialOnly);
90
91 DOREPLIFETIME(UVRLeverComponent, bRepGameplayTags);
93 DOREPLIFETIME_CONDITION(UVRLeverComponent, GameplayTags, COND_Custom);
94}
95
96void UVRLeverComponent::PreReplication(IRepChangedPropertyTracker & ChangedPropertyTracker)
97{
98 Super::PreReplication(ChangedPropertyTracker);
99
100 // Replicate the levers initial transform if we are replicating movement
101 //DOREPLIFETIME_ACTIVE_OVERRIDE(UVRLeverComponent, InitialRelativeTransform, bReplicateMovement);
102
103 // Don't replicate if set to not do it
104 DOREPLIFETIME_ACTIVE_OVERRIDE(UVRLeverComponent, GameplayTags, bRepGameplayTags);
105
106 DOREPLIFETIME_ACTIVE_OVERRIDE_PRIVATE_PROPERTY(USceneComponent, RelativeLocation, bReplicateMovement);
107 DOREPLIFETIME_ACTIVE_OVERRIDE_PRIVATE_PROPERTY(USceneComponent, RelativeRotation, bReplicateMovement);
108 DOREPLIFETIME_ACTIVE_OVERRIDE_PRIVATE_PROPERTY(USceneComponent, RelativeScale3D, bReplicateMovement);
109}
110
112{
113 Super::OnRegister();
114 ResetInitialLeverLocation(); // Load the original lever location
115}
116
118{
119 // Call the base class
120 Super::BeginPlay();
123}
124
125void UVRLeverComponent::TickComponent(float DeltaTime, enum ELevelTick TickType, FActorComponentTickFunction *ThisTickFunction)
126{
127 // Call supers tick (though I don't think any of the base classes to this actually implement it)
128 Super::TickComponent(DeltaTime, TickType, ThisTickFunction);
129
130 bool bWasLerping = bIsLerping;
131
132 // If we are locked then end the lerp, no point
133 if (bIsLocked)
134 {
135
136 if (bWasLerping)
137 {
138 bIsLerping = false;
139
140 // If we start lerping while locked, just end it
143 }
144
145 return;
146 }
147
148 if (bIsLerping)
149 {
150 FTransform CurRelativeTransform = this->GetComponentTransform().GetRelativeTransform(UVRInteractibleFunctionLibrary::Interactible_GetCurrentParentTransform(this));
151
152 switch (LeverRotationAxis)
153 {
157 {
158 LerpAxis(FullCurrentAngle, DeltaTime);
159 }break;
162 {
163 // Only supporting LerpToZero with this mode currently
164 FQuat LerpedQuat = FMath::QInterpConstantTo(CurRelativeTransform.GetRelativeTransform(InitialRelativeTransform).GetRotation(), FQuat::Identity, DeltaTime, FMath::DegreesToRadians(LeverReturnSpeed));
165
166 if (LerpedQuat.IsIdentity())
167 {
168 this->SetComponentTickEnabled(false);
169 bIsLerping = false;
171 this->SetRelativeRotation(InitialRelativeTransform.Rotator());
172 }
173 else
174 {
175 this->SetRelativeRotation((FTransform(LerpedQuat) * InitialRelativeTransform).GetRotation());
176 }
177 }break;
178 default:break;
179 }
180 }
181
182 FTransform CurrentRelativeTransform = this->GetComponentTransform().GetRelativeTransform(UVRInteractibleFunctionLibrary::Interactible_GetCurrentParentTransform(this));
183 CalculateCurrentAngle(CurrentRelativeTransform);
184
185
187 {
188 // Rolling average across num samples
191
193
195 }
196
197 // Check for events and set current state and check for auto drop
198 ProccessCurrentState(bWasLerping, true, true);
199
200 // If the lerping state changed from the above
201 if (bWasLerping && !bIsLerping)
202 {
205 }
206}
207
208void UVRLeverComponent::ProccessCurrentState(bool bWasLerping, bool bThrowEvents, bool bCheckAutoDrop)
209{
210 bool bNewLeverState = (!FMath::IsNearlyZero(LeverLimitNegative) && FullCurrentAngle <= -(LeverLimitNegative * LeverTogglePercentage)) || (!FMath::IsNearlyZero(LeverLimitPositive) && FullCurrentAngle >= (LeverLimitPositive * LeverTogglePercentage));
211 //if (FMath::Abs(CurrentLeverAngle) >= LeverLimit )
212 if (bNewLeverState != bLeverState)
213 {
214 bLeverState = bNewLeverState;
215
216 if (bThrowEvents && (bSendLeverEventsDuringLerp || !bWasLerping))
217 {
220 }
221
222 if (bCheckAutoDrop)
223 {
224 if (!bWasLerping && bUngripAtTargetRotation && bLeverState && HoldingGrip.IsValid())
225 {
226 FBPActorGripInformation GripInformation;
227 EBPVRResultSwitch result;
230 {
232 }
233 }
234 }
235 }
236}
237
239{
241 Super::OnUnregister();
242}
243
245{
246 // Converted to a relative value now so it should be correct
247 if (BreakDistance > 0.f && GrippingController->HasGripAuthority(GripInformation) && FVector::DistSquared(InitialInteractorDropLocation, this->GetComponentTransform().InverseTransformPosition(GrippingController->GetPivotLocation())) >= FMath::Square(BreakDistance))
248 {
249 if (GrippingController->OnGripOutOfRange.IsBound())
250 {
251 uint8 GripID = GripInformation.GripID;
252 GrippingController->OnGripOutOfRange.Broadcast(GripInformation, GripInformation.GripDistance);
253 }
254 else
255 {
256 GrippingController->DropObjectByInterface(this, HoldingGrip.GripID);
257 }
258
259 return true;
260 }
261
262 return false;
263}
264
265void UVRLeverComponent::TickGrip_Implementation(UGripMotionControllerComponent * GrippingController, const FBPActorGripInformation & GripInformation, float DeltaTime)
266{
267 if (bIsLocked)
268 {
270 {
271 // Check if we should auto drop
272 CheckAutoDrop(GrippingController, GripInformation);
273 }
274
275 return;
276 }
277
278 // Handle manual tracking here
280 FTransform CurrentRelativeTransform = InitialRelativeTransform * ParentTransform;
281 FTransform PivotTransform = GrippingController->GetPivotTransform();
282 FVector CurInteractorLocation = (InteractorOffsetTransform * PivotTransform).GetRelativeTransform(CurrentRelativeTransform).GetTranslation();
283
284 switch (LeverRotationAxis)
285 {
288 {
289 FRotator Rot;
290
291 FVector nAxis;
292 float nAngle = 0.0f;
293
294 FQuat::FindBetweenVectors(qRotAtGrab.UnrotateVector(InitialInteractorLocation), CurInteractorLocation).ToAxisAndAngle(nAxis, nAngle);
295 float MaxAngle = FMath::DegreesToRadians(LeverLimitPositive);
296
297 bool bWasClamped = nAngle > MaxAngle;
298 nAngle = FMath::Clamp(nAngle, 0.0f, MaxAngle);
299 Rot = FQuat(nAxis, nAngle).Rotator();
300
302 {
303 // Store our projected relative transform
304 FTransform CalcTransform = (FTransform(Rot) * InitialRelativeTransform);
305
306 // Fixup yaw if this is a flight stick
307
308 if (bWasClamped)
309 {
310 // If we clamped the angle due to limits then lets re-project the hand back to get the correct facing again
311 // This is only when things have been clamped to avoid the extra calculations
312 FTransform NewPivTrans = PivotTransform.GetRelativeTransform((CalcTransform * ParentTransform));
313 CurInteractorLocation = NewPivTrans.GetTranslation();
314
315 FVector OffsetVal = CurInteractorLocation + NewPivTrans.GetRotation().RotateVector(InteractorOffsetTransform.GetTranslation());
316 OffsetVal.Z = 0;
317
318 CurInteractorLocation -= OffsetVal;
319 }
320 else
321 {
322 CurInteractorLocation = (CalcTransform * ParentTransform).InverseTransformPosition(GrippingController->GetPivotLocation());
323 }
324
325 float CurrentLeverYawAngle = FRotator::NormalizeAxis(UVRInteractibleFunctionLibrary::GetAtan2Angle(EVRInteractibleAxis::Axis_Z, CurInteractorLocation, InitialGripRot));
326
327 if (FlightStickYawLimit < 180.0f)
328 {
329 CurrentLeverYawAngle = FMath::Clamp(CurrentLeverYawAngle, -FlightStickYawLimit, FlightStickYawLimit);
330 }
331
332 FQuat newLocalRot = CalcTransform.GetRotation() * FQuat(FVector::UpVector, FMath::DegreesToRadians(CurrentLeverYawAngle));
333 this->SetRelativeRotation(newLocalRot.Rotator());
334 }
335 else
336 {
337 this->SetRelativeRotation((FTransform(Rot) * InitialRelativeTransform).Rotator());
338 }
339 }
340 break;
344 {
345 float DeltaAngle = CalcAngle(LeverRotationAxis, CurInteractorLocation);
346 LastDeltaAngle = DeltaAngle;
347 FTransform CalcTransform = (FTransform(UVRInteractibleFunctionLibrary::SetAxisValueRot((EVRInteractibleAxis)LeverRotationAxis, DeltaAngle, FRotator::ZeroRotator)) * InitialRelativeTransform);
348 this->SetRelativeRotation(CalcTransform.Rotator());
349 }break;
350 default:break;
351 }
352
353 // Recalc current angle
354 CurrentRelativeTransform = this->GetComponentTransform().GetRelativeTransform(UVRInteractibleFunctionLibrary::Interactible_GetCurrentParentTransform(this));
355 CalculateCurrentAngle(CurrentRelativeTransform);
356
357 // Check for events and set current state and check for auto drop
358 ProccessCurrentState(bIsLerping, true, true);
359
360 // Check if we should auto drop
361 CheckAutoDrop(GrippingController, GripInformation);
362}
363
365{
366 ParentComponent = this->GetAttachParent();
367
368 if (bIsPhysicsLever)
369 {
371 }
372 else
373 {
375
376 // This lets me use the correct original location over the network without changes
377 FTransform ReversedRelativeTransform = FTransform(GripInformation.RelativeTransform.ToInverseMatrixWithScale());
378 FTransform CurrentTransform = this->GetComponentTransform();
379 FTransform RelativeToGripTransform = FTransform::Identity;
380
382 {
383 // Offset the grip to the same height on the cross axis and centered on the lever
384 FVector InitialInteractorOffset = ReversedRelativeTransform.GetTranslation();
385 FTransform InitTrans = ReversedRelativeTransform;
386 InitialInteractorOffset.X = 0;
387 InitialInteractorOffset.Y = 0;
388 InteractorOffsetTransform = ReversedRelativeTransform;
389 InteractorOffsetTransform.AddToTranslation(-InitialInteractorOffset);
390 InteractorOffsetTransform = FTransform(InteractorOffsetTransform.ToInverseMatrixWithScale());
391
392 InitialInteractorOffset = ReversedRelativeTransform.GetTranslation();
393 InitialInteractorOffset.Z = 0;
394
395 InitTrans.AddToTranslation(-InitialInteractorOffset);
396 RelativeToGripTransform = InitTrans * CurrentTransform;
397 }
398 else
399 {
400 RelativeToGripTransform = ReversedRelativeTransform * CurrentTransform;
401 InteractorOffsetTransform = FTransform::Identity;
402 }
403
404 InitialInteractorLocation = CurrentRelativeTransform.InverseTransformPosition(RelativeToGripTransform.GetTranslation());
405 InitialInteractorDropLocation = ReversedRelativeTransform.GetTranslation();
406
407 switch (LeverRotationAxis)
408 {
410 {
411 qRotAtGrab = this->GetComponentTransform().GetRelativeTransform(CurrentRelativeTransform).GetRotation();
412 }break;
414 {
415 qRotAtGrab = this->GetComponentTransform().GetRelativeTransform(CurrentRelativeTransform).GetRotation();
417 }break;
420 {
421 // Get our initial interactor rotation
423 }break;
424
426 {
427 // Get our initial interactor rotation
429 }break;
430
431 default:break;
432 }
433
434 // Get out current rotation at grab
436 }
437
439 bIsLerping = false;
440 bIsInFirstTick = true;
441 MomentumAtDrop = 0.0f;
442
443 this->SetComponentTickEnabled(true);
444
445 //OnGripped.Broadcast(GrippingController, GripInformation);
446}
447
448void UVRLeverComponent::OnGripRelease_Implementation(UGripMotionControllerComponent * ReleasingController, const FBPActorGripInformation & GripInformation, bool bWasSocketed)
449{
451 {
453 FAttachmentTransformRules AttachRules(EAttachmentRule::KeepWorld, true);
454 this->AttachToComponent(ParentComponent.Get(), AttachRules);
455 }
456
458 {
459 bIsLerping = true;
460 this->SetComponentTickEnabled(true);
462 bReplicateMovement = false;
463 }
464 else
465 {
466 this->SetComponentTickEnabled(false);
468 }
469
470 //OnDropped.Broadcast(ReleasingController, GripInformation, bWasSocketed);
471}
472
473void UVRLeverComponent::SetGripPriority(int NewGripPriority)
474{
475 GripPriority = NewGripPriority;
476}
477
478void UVRLeverComponent::SetIsLocked(bool bNewLockedState)
479{
480 bIsLocked = bNewLockedState;
481}
482
484void UVRLeverComponent::OnChildGripRelease_Implementation(UGripMotionControllerComponent * ReleasingController, const FBPActorGripInformation & GripInformation, bool bWasSocketed) {}
485void UVRLeverComponent::OnSecondaryGrip_Implementation(UGripMotionControllerComponent * GripOwningController, USceneComponent * SecondaryGripComponent, const FBPActorGripInformation & GripInformation) {}
486void UVRLeverComponent::OnSecondaryGripRelease_Implementation(UGripMotionControllerComponent * GripOwningController, USceneComponent * ReleasingSecondaryGripComponent, const FBPActorGripInformation & GripInformation) {}
491void UVRLeverComponent::OnInput_Implementation(FKey Key, EInputEvent KeyEvent) {}
492bool UVRLeverComponent::RequestsSocketing_Implementation(USceneComponent *& ParentToSocketTo, FName & OptionalSocketName, FTransform_NetQuantize & RelativeTransform) { return false; }
493
498
503
505{
506 return false;
507}
508
509/*EGripCollisionType UVRLeverComponent::SlotGripType_Implementation()
510{
511 if (bIsPhysicsLever)
512 return EGripCollisionType::ManipulationGrip;
513 else
514 return EGripCollisionType::CustomGrip;
515}
516
517EGripCollisionType UVRLeverComponent::FreeGripType_Implementation()
518{
519 if (bIsPhysicsLever)
520 return EGripCollisionType::ManipulationGrip;
521 else
522 return EGripCollisionType::CustomGrip;
523}*/
524
532
537
538
543
548
549/*float UVRLeverComponent::GripStiffness_Implementation()
550{
551 return Stiffness;
552}
553
554float UVRLeverComponent::GripDamping_Implementation()
555{
556 return Damping;
557}*/
558void UVRLeverComponent::GetGripStiffnessAndDamping_Implementation(float &GripStiffnessOut, float &GripDampingOut)
559{
560 GripStiffnessOut = Stiffness;
561 GripDampingOut = Damping;
562}
563
568
573
574/*void UVRLeverComponent::ClosestSecondarySlotInRange_Implementation(FVector WorldLocation, bool & bHadSlotInRange, FTransform & SlotWorldTransform, UGripMotionControllerComponent * CallingController, FName OverridePrefix)
575{
576 bHadSlotInRange = false;
577}
578
579void UVRLeverComponent::ClosestPrimarySlotInRange_Implementation(FVector WorldLocation, bool & bHadSlotInRange, FTransform & SlotWorldTransform, UGripMotionControllerComponent * CallingController, FName OverridePrefix)
580{
581 bHadSlotInRange = false;
582}*/
583
584void UVRLeverComponent::ClosestGripSlotInRange_Implementation(FVector WorldLocation, bool bSecondarySlot, bool & bHadSlotInRange, FTransform & SlotWorldTransform, FName & SlotName, UGripMotionControllerComponent * CallingController, FName OverridePrefix)
585{
586 if (OverridePrefix.IsNone())
587 bSecondarySlot ? OverridePrefix = "VRGripS" : OverridePrefix = "VRGripP";
588
589 UVRExpansionFunctionLibrary::GetGripSlotInRangeByTypeName_Component(OverridePrefix, this, WorldLocation, bSecondarySlot ? SecondarySlotRange : PrimarySlotRange, bHadSlotInRange, SlotWorldTransform, SlotName, CallingController);
590}
591
596
597void UVRLeverComponent::IsHeld_Implementation(TArray<FBPGripPair> & CurHoldingControllers, bool & bCurIsHeld)
598{
599 CurHoldingControllers.Empty();
600 if (HoldingGrip.IsValid())
601 {
602 CurHoldingControllers.Add(HoldingGrip);
603 bCurIsHeld = bIsHeld;
604 }
605 else
606 {
607 bCurIsHeld = false;
608 }
609}
610
612{
613 if (bGripped)
614 {
615 OnGripped.Broadcast(Controller, GripInformation);
616 }
617 else
618 {
619 OnDropped.Broadcast(Controller, GripInformation, bWasSocketed);
620 }
621}
622
623void UVRLeverComponent::SetHeld_Implementation(UGripMotionControllerComponent * NewHoldingController, uint8 GripID, bool bNewIsHeld)
624{
625 if (bNewIsHeld)
626 {
627 HoldingGrip = FBPGripPair(NewHoldingController, GripID);
629 {
630 if (!bIsHeld && !bIsLerping)
632 bReplicateMovement = false;
633 }
634 }
635 else
636 {
639 {
641 }
642 }
643
644 bIsHeld = bNewIsHeld;
645}
646
647/*FBPInteractionSettings UVRLeverComponent::GetInteractionSettings_Implementation()
648{
649 return FBPInteractionSettings();
650}*/
651
652bool UVRLeverComponent::GetGripScripts_Implementation(TArray<UVRGripScriptBase*> & ArrayReference)
653{
654 return false;
655}
656
658{
659#if PHYSICS_INTERFACE_PHYSX
660 if (HandleData)
661 {
662 // use correct scene
663 PxScene* PScene = HandleData->getScene();//GetPhysXSceneFromIndex(SceneIndex);
664 if (PScene)
665 {
666 PScene->lockWrite();
667 //SCOPED_SCENE_WRITE_LOCK(PScene);
668 // Destroy joint.
669 HandleData->release();
670 PScene->unlockWrite();
671 }
672
673 HandleData = NULL;
674 return true;
675 }
676 else
677 {
678 return false;
679 }
680#endif // WITH_PHYSX
681
682 return true;
683}
684
686{
687#if PHYSICS_INTERFACE_PHYSX
688
689 if (HandleData)
690 return true;
691
692 // Get the PxRigidDynamic that we want to grab.
693 FBodyInstance* rBodyInstance = this->GetBodyInstance(NAME_None);
694 if (!rBodyInstance)
695 {
696 return false;
697 }
698
699
700 FTransform A2Transform = FTransform::Identity;//GetComponentTransform().Inverse();
701 if (ParentComponent.IsValid())
702 {
703 UPrimitiveComponent * PrimComp = Cast<UPrimitiveComponent>(ParentComponent.Get());
704
705 if (PrimComp)
706 A2Transform = PrimComp->GetComponentTransform();
707 }
708
709 float rotationalOffset = (LeverLimitPositive - LeverLimitNegative) / 2;
710 FRotator AngularRotationOffset = UVRInteractibleFunctionLibrary::SetAxisValueRot((EVRInteractibleAxis)LeverRotationAxis, rotationalOffset, FRotator::ZeroRotator);
711 FTransform RefFrame2 = FTransform(InitialRelativeTransform.GetRotation() * AngularRotationOffset.Quaternion(), A2Transform.InverseTransformPosition(GetComponentLocation()));
712
713 // If we don't already have a handle - make one now.
714 if (!HandleData)
715 {
716 FPhysicsCommand::ExecuteWrite(BodyInstance.ActorHandle, [&](const FPhysicsActorHandle& Actor)
717 //ExecuteOnPxRigidDynamicReadWrite(rBodyInstance, [&](PxRigidDynamic* Actor)
718 {
719 if (PxRigidActor* PActor = FPhysicsInterface::GetPxRigidActor_AssumesLocked(Actor))
720 {
721 PxScene* Scene = PActor->getScene();
722 PxD6Joint* NewJoint = NULL;
723 PxRigidDynamic * ParentBody = NULL;
724
725 if (ParentComponent.IsValid())
726 {
727 UPrimitiveComponent * PrimComp = Cast<UPrimitiveComponent>(ParentComponent.Get());
728
729 if (PrimComp && PrimComp->BodyInstance.IsValidBodyInstance())
730 {
731 ParentBody = FPhysicsInterface::GetPxRigidDynamic_AssumesLocked(PrimComp->BodyInstance.ActorHandle);
732 //ParentBody = PrimComp->BodyInstance.GetPxRigidDynamic_AssumesLocked();
733 }
734 }
735
736 NewJoint = PxD6JointCreate(Scene->getPhysics(), ParentBody, U2PTransform(RefFrame2), PActor, PxTransform(PxIdentity));
737
738 if (!NewJoint)
739 {
740 HandleData = NULL;
741 }
742 else
743 {
744 // No constraint instance
745 NewJoint->userData = NULL; // don't need
746 HandleData = NewJoint;
747
748 // Remember the scene index that the handle joint/actor are in.
749 FPhysScene* RBScene = FPhysxUserData::Get<FPhysScene>(Scene->userData);
750 //const uint32 SceneType = rBodyInstance->UseAsyncScene(RBScene) ? PST_Async : PST_Sync;
751 //SceneIndex = RBScene->PhysXSceneIndex[SceneType];
752
753 // Pretty Much Unbreakable
754 NewJoint->setBreakForce(PX_MAX_REAL, PX_MAX_REAL);
755 // NewJoint->setConstraintFlag(PxConstraintFlag::ePROJECTION, true);
756
757 // NewJoint->setConstraintFlag(PxConstraintFlag::eCOLLISION_ENABLED, false);
758
759 PxConstraintFlags Flags = NewJoint->getConstraintFlags();
760
761 // False flags
762 //Flags |= PxConstraintFlag::ePROJECTION;
763 Flags |= PxConstraintFlag::eCOLLISION_ENABLED;
764
765 // True flags
766 Flags &= ~PxConstraintFlag::ePROJECTION;
767
768 NewJoint->setConstraintFlag(PxConstraintFlag::ePROJECTION, true);
769 NewJoint->setProjectionAngularTolerance(FMath::DegreesToRadians(0.1f));
770 NewJoint->setProjectionLinearTolerance(0.1f);
771 NewJoint->setConstraintFlags(Flags);
772
773 // Setting up the joint
774 NewJoint->setMotion(PxD6Axis::eX, PxD6Motion::eLOCKED);
775 NewJoint->setMotion(PxD6Axis::eY, PxD6Motion::eLOCKED);
776 NewJoint->setMotion(PxD6Axis::eZ, PxD6Motion::eLOCKED);
777
778 NewJoint->setMotion(PxD6Axis::eTWIST, LeverRotationAxis == EVRInteractibleLeverAxis::Axis_X || LeverRotationAxis == EVRInteractibleLeverAxis::Axis_XY ? PxD6Motion::eLIMITED : PxD6Motion::eLOCKED);
779 NewJoint->setMotion(PxD6Axis::eSWING1, LeverRotationAxis == EVRInteractibleLeverAxis::Axis_Y || LeverRotationAxis == EVRInteractibleLeverAxis::Axis_XY ? PxD6Motion::eLIMITED : PxD6Motion::eLOCKED);
780 NewJoint->setMotion(PxD6Axis::eSWING2, PxD6Motion::eLOCKED);
781
782 const float CorrectedLeverLimit = (LeverLimitPositive + LeverLimitNegative) / 2;
783 const float LeverLimitRad = CorrectedLeverLimit * (PI / 180.0f);
784 //PxReal LimitContactDistance = FMath::DegreesToRadians(FMath::Max(1.f, ProfileInstance.ConeLimit.ContactDistance));
785
786 //The limit values need to be clamped so it will be valid in PhysX
787 PxReal ZLimitAngle = FMath::ClampAngle(CorrectedLeverLimit, KINDA_SMALL_NUMBER, 179.9999f) * (PI / 180.0f);
788 PxReal YLimitAngle = FMath::ClampAngle(CorrectedLeverLimit, KINDA_SMALL_NUMBER, 179.9999f) * (PI / 180.0f);
789 //PxReal LimitContactDistance = FMath::DegreesToRadians(FMath::Max(1.f, ProfileInstance.ConeLimit.ContactDistance * FMath::Min(InSwing1LimitScale, InSwing2LimitScale)));
790
791 NewJoint->setSwingLimit(PxJointLimitCone(YLimitAngle, ZLimitAngle));
792 NewJoint->setTwistLimit(PxJointAngularLimitPair(-LeverLimitRad, LeverLimitRad));
793
794 return true;
795 }
796 }
797 return false;
798 });
799 }
800
801#else
802 return false;
803#endif // WITH_PHYSX
804
805 return false;
806}
807
808float UVRLeverComponent::ReCalculateCurrentAngle(bool bAllowThrowingEvents)
809{
810 FTransform CurRelativeTransform = this->GetComponentTransform().GetRelativeTransform(UVRInteractibleFunctionLibrary::Interactible_GetCurrentParentTransform(this));
811 CalculateCurrentAngle(CurRelativeTransform);
812 ProccessCurrentState(bIsLerping, bAllowThrowingEvents, bAllowThrowingEvents);
813 return CurrentLeverAngle;
814}
815
816void UVRLeverComponent::SetLeverAngle(float NewAngle, FVector DualAxisForwardVector, bool bAllowThrowingEvents)
817{
818 NewAngle = -NewAngle; // Need to inverse the sign
819
820 FVector ForwardVector = DualAxisForwardVector;
821 switch (LeverRotationAxis)
822 {
824 ForwardVector = FVector(FMath::Sign(NewAngle), 0.0f, 0.0f); break;
826 ForwardVector = FVector(0.0f, FMath::Sign(NewAngle), 0.0f); break;
828 ForwardVector = FVector(0.0f, 0.0f, FMath::Sign(NewAngle)); break;
829 default:break;
830 }
831
832 FQuat NewLeverRotation(ForwardVector, FMath::DegreesToRadians(FMath::Abs(NewAngle)));
833
834 this->SetRelativeTransform(FTransform(NewLeverRotation) * InitialRelativeTransform);
835 ReCalculateCurrentAngle(bAllowThrowingEvents);
836}
837
838void UVRLeverComponent::ResetInitialLeverLocation(bool bAllowThrowingEvents)
839{
840 // Get our initial relative transform to our parent (or not if un-parented).
841 InitialRelativeTransform = this->GetRelativeTransform();
843 ProccessCurrentState(bIsLerping, bAllowThrowingEvents, bAllowThrowingEvents);
844}
845
846void UVRLeverComponent::CalculateCurrentAngle(FTransform & CurrentTransform)
847{
848 float Angle;
849 switch (LeverRotationAxis)
850 {
853 {
854 FTransform RelativeToSpace = CurrentTransform.GetRelativeTransform(InitialRelativeTransform);
855 FQuat CurrentRelRot = RelativeToSpace.GetRotation();// CurrentTransform.GetRotation();
856 FVector UpVec = CurrentRelRot.GetUpVector();
857
858 CurrentLeverForwardVector = FVector::VectorPlaneProject(UpVec, FVector::UpVector);
859 CurrentLeverForwardVector.Normalize();
860
861 FullCurrentAngle = FMath::RadiansToDegrees(FMath::Acos(FVector::DotProduct(UpVec, FVector::UpVector)));
862 CurrentLeverAngle = FMath::RoundToFloat(FullCurrentAngle);
863
864 AllCurrentLeverAngles.Roll = FMath::Sign(UpVec.Y) * FMath::RadiansToDegrees(FMath::Acos(FVector::DotProduct(FVector(0.0f, UpVec.Y, UpVec.Z), FVector::UpVector)));
865 AllCurrentLeverAngles.Pitch = FMath::Sign(UpVec.X) * FMath::RadiansToDegrees(FMath::Acos(FVector::DotProduct(FVector(UpVec.X, 0.0f, UpVec.Z), FVector::UpVector)));
866
868 {
869 FVector ProjectedLoc = FVector(UpVec.X, UpVec.Y, 0.0f).GetSafeNormal();
870 AllCurrentLeverAngles.Pitch *= FMath::Clamp(1.0f - (FMath::Abs(FMath::RadiansToDegrees(FMath::Acos(FVector::DotProduct(ProjectedLoc, FMath::Sign(UpVec.X) * FVector::ForwardVector)))) / AngleThreshold), 0.0f, 1.0f);
871 AllCurrentLeverAngles.Roll *= FMath::Clamp(1.0f - (FMath::Abs(FMath::RadiansToDegrees(FMath::Acos(FVector::DotProduct(ProjectedLoc, FMath::Sign(UpVec.Y) * FVector::RightVector)))) / AngleThreshold), 0.0f, 1.0f);
872 }
873
874 AllCurrentLeverAngles.Roll = FMath::RoundToFloat(AllCurrentLeverAngles.Roll);
875 AllCurrentLeverAngles.Pitch = FMath::RoundToFloat(AllCurrentLeverAngles.Pitch);
876
878 {
879 AllCurrentLeverAngles.Yaw = FRotator::NormalizeAxis(FMath::RoundToFloat(UVRExpansionFunctionLibrary::GetHMDPureYaw_I(CurrentRelRot.Rotator()).Yaw));
880 if (FlightStickYawLimit < 180.0f)
881 {
883 }
884 }
885 else
886 AllCurrentLeverAngles.Yaw = 0.0f;
887
888 }break;
889 default:
890 {
892 FullCurrentAngle = Angle;
893 CurrentLeverAngle = FMath::RoundToFloat(FullCurrentAngle);
896
897 }break;
898 }
899}
900
901void UVRLeverComponent::LerpAxis(float CurrentAngle, float DeltaTime)
902{
903 float TargetAngle = 0.0f;
904 float FinalReturnSpeed = LeverReturnSpeed;
905
907 {
909 {
910 if (CurrentAngle >= 0)
911 TargetAngle = FMath::RoundToFloat(LeverLimitPositive);
912 else
913 TargetAngle = -FMath::RoundToFloat(LeverLimitNegative);
914 }break;
916 {
917 if ((!FMath::IsNearlyZero(LeverLimitPositive) && CurrentAngle >= (LeverLimitPositive * LeverTogglePercentage)))
918 TargetAngle = FMath::RoundToFloat(LeverLimitPositive);
919 else if ((!FMath::IsNearlyZero(LeverLimitNegative) && CurrentAngle <= -(LeverLimitNegative * LeverTogglePercentage)))
920 TargetAngle = -FMath::RoundToFloat(LeverLimitNegative);
921 }break;
923 {
924 if (FMath::IsNearlyZero(MomentumAtDrop * DeltaTime, 0.1f))
925 {
926 MomentumAtDrop = 0.0f;
927 this->SetComponentTickEnabled(false);
928 bIsLerping = false;
930 return;
931 }
932 else
933 {
934 MomentumAtDrop = FMath::FInterpTo(MomentumAtDrop, 0.0f, DeltaTime, LeverMomentumFriction);
935
936 FinalReturnSpeed = FMath::Abs(MomentumAtDrop);
937
938 if (MomentumAtDrop >= 0.0f)
939 TargetAngle = FMath::RoundToFloat(LeverLimitPositive);
940 else
941 TargetAngle = -FMath::RoundToFloat(LeverLimitNegative);
942 }
943
944 }break;
946 default:
947 {}break;
948 }
949
950 //float LerpedVal = FMath::FixedTurn(CurrentAngle, TargetAngle, FinalReturnSpeed * DeltaTime);
951 float LerpedVal = FMath::FInterpConstantTo(CurrentAngle, TargetAngle, DeltaTime, FinalReturnSpeed);
952
953 if (FMath::IsNearlyEqual(LerpedVal, TargetAngle))
954 {
955 if (LeverRestitution > 0.0f)
956 {
958 FTransform CalcTransform = (FTransform(UVRInteractibleFunctionLibrary::SetAxisValueRot((EVRInteractibleAxis)LeverRotationAxis, TargetAngle, FRotator::ZeroRotator)) * InitialRelativeTransform);
959 this->SetRelativeRotation(CalcTransform.Rotator());
960 }
961 else
962 {
963 this->SetComponentTickEnabled(false);
964 bIsLerping = false;
966 FTransform CalcTransform = (FTransform(UVRInteractibleFunctionLibrary::SetAxisValueRot((EVRInteractibleAxis)LeverRotationAxis, TargetAngle, FRotator::ZeroRotator)) * InitialRelativeTransform);
967 this->SetRelativeRotation(CalcTransform.Rotator());
968 }
969 }
970 else
971 {
972 FTransform CalcTransform = (FTransform(UVRInteractibleFunctionLibrary::SetAxisValueRot((EVRInteractibleAxis)LeverRotationAxis, LerpedVal, FRotator::ZeroRotator)) * InitialRelativeTransform);
973 this->SetRelativeRotation(CalcTransform.Rotator());
974 }
975}
976
977float UVRLeverComponent::CalcAngle(EVRInteractibleLeverAxis AxisToCalc, FVector CurInteractorLocation, bool bSkipLimits)
978{
979 float ReturnAxis = 0.0f;
980
981 ReturnAxis = UVRInteractibleFunctionLibrary::GetAtan2Angle((EVRInteractibleAxis)AxisToCalc, CurInteractorLocation, InitialGripRot);
982
983 if (bSkipLimits)
984 return ReturnAxis;
985
986 if (LeverLimitPositive > 0.0f && LeverLimitNegative > 0.0f && FMath::IsNearlyEqual(LeverLimitNegative, 180.f, 0.01f) && FMath::IsNearlyEqual(LeverLimitPositive, 180.f, 0.01f))
987 {
988 // Don't run the clamping or the flip detection, we are a 360 degree lever
989 }
990 else
991 {
992 ReturnAxis = FMath::ClampAngle(FRotator::NormalizeAxis(RotAtGrab + ReturnAxis), -LeverLimitNegative, LeverLimitPositive);
993
994 // Ignore rotations that would flip the angle of the lever to the other side, with a 90 degree allowance
995 if (!bIsInFirstTick && ((LeverLimitPositive > 0.0f && LastDeltaAngle >= LeverLimitPositive) || (LeverLimitNegative > 0.0f && LastDeltaAngle <= -LeverLimitNegative)) && FMath::Sign(LastDeltaAngle) != FMath::Sign(ReturnAxis))
996 {
997 ReturnAxis = LastDeltaAngle;
998 }
999 }
1000
1001 bIsInFirstTick = false;
1002 return ReturnAxis;
1003}
EGripMovementReplicationSettings
UENUM(Blueprintable)
ESecondaryGripType
UENUM(Blueprintable)
EBPVRResultSwitch
UENUM()
EGripCollisionType
UENUM(Blueprintable)
EGripLateUpdateSettings
UENUM(Blueprintable)
EGripInterfaceTeleportBehavior
UENUM(Blueprintable)
EVRInteractibleAxis
UENUM(Blueprintable)
EVRInteractibleLeverAxis
UENUM(Blueprintable)
UCLASS(Blueprintable, meta = (BlueprintSpawnableComponent), ClassGroup = MotionController)
bool HasGripAuthority(const FBPActorGripInformation &Grip)
void GetGripByID(FBPActorGripInformation &Grip, uint8 IDToLookForGrip, EBPVRResultSwitch &Result)
UFUNCTION(BlueprintCallable, Category = "GripMotionController", meta = (ExpandEnumAsExecs = "Result")...
FVRGripControllerOnGripOutOfRange OnGripOutOfRange
UPROPERTY(BlueprintAssignable, Category = "GripMotionController")
bool DropObjectByInterface(UObject *ObjectToDrop=nullptr, uint8 GripIDToDrop=0, FVector OptionalAngularVelocity=FVector::ZeroVector, FVector OptionalLinearVelocity=FVector::ZeroVector)
UFUNCTION(BlueprintCallable, Category = "GripMotionController")
static void GetGripSlotInRangeByTypeName_Component(FName SlotType, USceneComponent *Component, FVector WorldLocation, float MaxRange, bool &bHadSlotInRange, FTransform &SlotWorldTransform, FName &SlotName, UGripMotionControllerComponent *QueryController=nullptr)
UFUNCTION(BlueprintPure, Category = "VRGrip", meta = (bIgnoreSelf = "true", DisplayName = "GetGripSlo...
static FRotator GetHMDPureYaw_I(FRotator HMDRotation)
static float GetDeltaAngleFromTransforms(EVRInteractibleAxis RotAxis, FTransform &InitialRelativeTransform, FTransform &CurrentRelativeTransform)
static FRotator SetAxisValueRot(EVRInteractibleAxis RotAxis, float SetValue)
static float GetAtan2Angle(EVRInteractibleAxis AxisToCalc, FVector CurInteractorLocation, float OptionalInitialRotation=0.0f)
static FVector SetAxisValueVec(EVRInteractibleAxis RotAxis, float SetValue)
static FTransform Interactible_GetCurrentParentTransform(USceneComponent *SceneComponentToCheck)
UFUNCTION(BlueprintPure, Category = "VRInteractibleFunctions", meta = (bIgnoreSelf = "true"))
UCLASS(Blueprintable, meta = (BlueprintSpawnableComponent), ClassGroup = (VRExpansionPlugin))
float MaxLeverMomentum
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "VRLeverComponent|Momentum Settings",...
float LeverLimitNegative
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "VRLeverComponent", meta = (ClampMin = "0....
FBPAdvGripSettings AdvancedGripSettings_Implementation() override
UVRLeverComponent(const FObjectInitializer &ObjectInitializer)
void OnGrip_Implementation(UGripMotionControllerComponent *GrippingController, const FBPActorGripInformation &GripInformation) override
void OnGripRelease_Implementation(UGripMotionControllerComponent *ReleasingController, const FBPActorGripInformation &GripInformation, bool bWasSocketed=false) override
FTransform InteractorOffsetTransform
void OnUsed_Implementation() override
float LeverRestitution
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "VRLeverComponent|Momentum Settings",...
EGripInterfaceTeleportBehavior TeleportBehavior_Implementation() override
void TickGrip_Implementation(UGripMotionControllerComponent *GrippingController, const FBPActorGripInformation &GripInformation, float DeltaTime) override
bool bReplicateMovement
UPROPERTY(EditAnywhere, Replicated, BlueprintReadWrite, Category = "VRGripInterface|Replication")
FBPGripPair HoldingGrip
UPROPERTY(BlueprintReadOnly, Category = "VRGripInterface")
FTransform_NetQuantize InitialRelativeTransform
UPROPERTY(BlueprintReadOnly, ReplicatedUsing = OnRep_InitialRelativeTransform, Category = "VRLeverCom...
void ProccessCurrentState(bool bWasLerping=false, bool bThrowEvents=true, bool bCheckAutoDrop=true)
float Stiffness
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "VRGripInterface")
virtual void OnRegister() override
bool bIsLocked
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "VRLeverComponent")
void OnEndUsed_Implementation() override
bool bDenyGripping
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "VRGripInterface", meta = (ScriptName = "IsDen...
EGripLateUpdateSettings GripLateUpdateSetting_Implementation() override
void OnChildGrip_Implementation(UGripMotionControllerComponent *GrippingController, const FBPActorGripInformation &GripInformation) override
bool bRepGameplayTags
UPROPERTY(EditAnywhere, Replicated, BlueprintReadWrite, Category = "VRGripInterface")
void ReceiveLeverFinishedLerping(float LeverFinalAngle)
UFUNCTION(BlueprintImplementableEvent, meta = (DisplayName = "Lever Finished Lerping"))
int GripPriority
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "GripSettings")
EGripMovementReplicationSettings MovementReplicationSetting
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "VRGripInterface")
bool bIsHeld
UPROPERTY(BlueprintReadOnly, Category = "VRGripInterface", meta = (ScriptName = "IsCurrentlyHeld"))
bool bIsPhysicsLever
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "VRLeverComponent")
float LeverMomentumFriction
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "VRLeverComponent|Momentum Settings",...
int FramesToAverage
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "VRLeverComponent|Momentum Settings",...
virtual void OnUnregister() override
float SecondarySlotRange
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "GripSettings")
void IsHeld_Implementation(TArray< FBPGripPair > &CurHoldingControllers, bool &bCurIsHeld) override
EVRInteractibleLeverAxis LeverRotationAxis
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "VRLeverComponent")
float LeverLimitPositive
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "VRLeverComponent", meta = (ClampMin = "0....
ESecondaryGripType SecondaryGripType_Implementation() override
bool DenyGripping_Implementation(UGripMotionControllerComponent *GripInitiator=nullptr) override
float AngleThreshold
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "VRLeverComponent|Flight Stick Settings",...
bool bIsLerping
UPROPERTY(BlueprintReadOnly, Category = "VRLeverComponent")
void OnSecondaryGripRelease_Implementation(UGripMotionControllerComponent *GripOwningController, USceneComponent *ReleasingSecondaryGripComponent, const FBPActorGripInformation &GripInformation) override
bool bBlendAxisValuesByAngleThreshold
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "VRLeverComponent|Flight Stick Settings")
float CalcAngle(EVRInteractibleLeverAxis AxisToCalc, FVector CurInteractorLocation, bool bSkipLimits=false)
void SetLeverAngle(float NewAngle, FVector DualAxisForwardVector, bool bAllowThrowingEvents=true)
UFUNCTION(BlueprintCallable, Category = "VRLeverComponent")
void SetIsLocked(bool bNewLockedState)
UFUNCTION(BlueprintCallable, Category = "GripSettings")
void ClosestGripSlotInRange_Implementation(FVector WorldLocation, bool bSecondarySlot, bool &bHadSlotInRange, FTransform &SlotWorldTransform, FName &SlotName, UGripMotionControllerComponent *CallingController=nullptr, FName OverridePrefix=NAME_None) override
FRotator AllCurrentLeverAngles
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "VRLeverComponent")
FVRLeverStateChangedSignature OnLeverStateChanged
UPROPERTY(BlueprintAssignable, Category = "VRLeverComponent")
FVROnGripSignature OnGripped
UPROPERTY(BlueprintAssignable, Category = "Grip Events")
bool RequestsSocketing_Implementation(USceneComponent *&ParentToSocketTo, FName &OptionalSocketName, FTransform_NetQuantize &RelativeTransform) override
float LeverTogglePercentage
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "VRLeverComponent", meta = (ClampMin = "0....
virtual void Native_NotifyThrowGripDelegates(UGripMotionControllerComponent *Controller, bool bGripped, const FBPActorGripInformation &GripInformation, bool bWasSocketed=false) override
void OnInput_Implementation(FKey Key, EInputEvent KeyEvent) override
void SetGripPriority(int NewGripPriority)
UFUNCTION(BlueprintCallable, Category = "GripSettings")
EGripMovementReplicationSettings GripMovementReplicationType_Implementation() override
void CalculateCurrentAngle(FTransform &CurrentTransform)
float LeverReturnSpeed
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "VRLeverComponent")
bool GetGripScripts_Implementation(TArray< UVRGripScriptBase * > &ArrayReference) override
void OnChildGripRelease_Implementation(UGripMotionControllerComponent *ReleasingController, const FBPActorGripInformation &GripInformation, bool bWasSocketed=false) override
void OnSecondaryGrip_Implementation(UGripMotionControllerComponent *GripOwningController, USceneComponent *SecondaryGripComponent, const FBPActorGripInformation &GripInformation) override
bool AllowsMultipleGrips_Implementation() override
virtual void PreReplication(IRepChangedPropertyTracker &ChangedPropertyTracker) override
bool bUngripAtTargetRotation
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "VRLeverComponent")
FVector InitialInteractorLocation
void OnEndSecondaryUsed_Implementation() override
bool bSendLeverEventsDuringLerp
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "VRLeverComponent")
float FlightStickYawLimit
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "VRLeverComponent|Flight Stick Settings",...
float GripBreakDistance_Implementation() override
virtual void BeginPlay() override
FVector InitialInteractorDropLocation
void ReceiveLeverStateChanged(bool LeverStatus, EVRInteractibleLeverEventType LeverStatusType, float LeverAngleAtTime, float FullLeverAngleAttime)
UFUNCTION(BlueprintImplementableEvent, meta = (DisplayName = "Lever State Changed"))
FVRLeverFinishedLerpingSignature OnLeverFinishedLerping
UPROPERTY(BlueprintAssignable, Category = "VRLeverComponent")
TWeakObjectPtr< USceneComponent > ParentComponent
float Damping
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "VRGripInterface")
void ResetInitialLeverLocation(bool bAllowThrowingEvents=true)
UFUNCTION(BlueprintCallable, Category = "VRLeverComponent")
bool CheckAutoDrop(UGripMotionControllerComponent *GrippingController, const FBPActorGripInformation &GripInformation)
FVROnDropSignature OnDropped
UPROPERTY(BlueprintAssignable, Category = "Grip Events")
FGameplayTagContainer GameplayTags
UPROPERTY(EditAnywhere, Replicated, BlueprintReadWrite, Category = "GameplayTags")
void SetHeld_Implementation(UGripMotionControllerComponent *NewHoldingController, uint8 GripID, bool bNewIsHeld) override
virtual void TickComponent(float DeltaTime, enum ELevelTick TickType, FActorComponentTickFunction *ThisTickFunction) override
float ReCalculateCurrentAngle(bool bAllowThrowingEvents=true)
UFUNCTION(BlueprintCallable, Category = "VRLeverComponent")
float CurrentLeverAngle
UPROPERTY(BlueprintReadOnly, Category = "VRLeverComponent")
bool SimulateOnDrop_Implementation() override
float BreakDistance
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "VRGripInterface")
void LerpAxis(float CurrentAngle, float DeltaTime)
float PrimarySlotRange
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "GripSettings")
EVRInteractibleLeverReturnType LeverReturnTypeWhenReleased
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "VRLeverComponent")
bool bAutoDropWhenLocked
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "VRLeverComponent")
void GetGripStiffnessAndDamping_Implementation(float &GripStiffnessOut, float &GripDampingOut) override
void OnSecondaryUsed_Implementation() override
EGripCollisionType GetPrimaryGripType_Implementation(bool bIsSlot) override
FVector CurrentLeverForwardVector
UPROPERTY(BlueprintReadOnly, Category = "VRLeverComponent")
USTRUCT(BlueprintType, Category = "VRExpansionLibrary")
FTransform_NetQuantize RelativeTransform
UPROPERTY(BlueprintReadWrite, Category = "Settings")
uint8 GripID
UPROPERTY(BlueprintReadOnly, Category = "Settings")
float GripDistance
UPROPERTY(BlueprintReadOnly, NotReplicated, Category = "Settings")
USTRUCT(BlueprintType, Category = "VRExpansionLibrary")
USTRUCT(BlueprintType, Category = "VRExpansionLibrary")
UGripMotionControllerComponent * HoldingController
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "GripPair")
uint8 GripID
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "GripPair")
USTRUCT(BlueprintType, Category = "VRExpansionLibrary|TransformNetQuantize", meta = (HasNativeMake = ...