Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "VRacer.h"
- #include "DetailLayoutBuilder.h"
- #include "VectorTypes.h"
- #include "GameFramework/Actor.h"
- #include "Components/BillboardComponent.h"
- #include "Particles/ParticleSystemComponent.h"
- #include "Math/UnrealMathUtility.h"
- #include "Physics/ImmediatePhysics/ImmediatePhysicsShared/ImmediatePhysicsCore.h"
- // Sets default values
- AVRacer::AVRacer()
- {
- // Set this pawn to call Tick() every frame. You can turn this off to improve performance if you don't need it.
- PrimaryActorTick.bCanEverTick = true;
- SphereCollision = CreateDefaultSubobject<USphereComponent>("SphereCollision");
- SetRootComponent(SphereCollision);
- CamRotator = CreateDefaultSubobject<UBillboardComponent>("CamRotator");
- CamRotator->SetupAttachment(RootComponent);
- SpringArm = CreateDefaultSubobject<USpringArmComponent>(TEXT("SpringArm"));
- SpringArm->SetupAttachment(CamRotator);
- Camera = CreateDefaultSubobject<UCameraComponent>(TEXT("Camera"));
- Camera->SetupAttachment(SpringArm);
- ShipMesh = CreateDefaultSubobject<UStaticMeshComponent>("ShipMesh");
- ShipMesh->SetupAttachment(RootComponent);
- BackCamera = CreateDefaultSubobject<UCameraComponent>(TEXT("BackCamera"));
- BackCamera->SetupAttachment(ShipMesh);
- AirbrakeRight = CreateDefaultSubobject<UBillboardComponent>("AirbrakeRight");
- AirbrakeRight->SetupAttachment(ShipMesh);
- RightAirbrakeMesh = CreateDefaultSubobject<UStaticMeshComponent>("RightAirbrakeMesh");
- RightAirbrakeMesh->SetupAttachment(AirbrakeRight);
- AirbrakeLeft = CreateDefaultSubobject<UBillboardComponent>("AirbrakeLeft");
- AirbrakeLeft->SetupAttachment(ShipMesh);
- LeftAirbrakeMesh = CreateDefaultSubobject<UStaticMeshComponent>("LeftAirbrakeMesh");
- LeftAirbrakeMesh->SetupAttachment(AirbrakeLeft);
- PointLight = CreateDefaultSubobject<UPointLightComponent>("PointLightComponent");
- PointLight->SetupAttachment(ShipMesh);
- ParticleEffects = CreateDefaultSubobject<UBillboardComponent>("ParticleEffects");
- ParticleEffects->SetupAttachment(ShipMesh);
- AirflowLeft = CreateDefaultSubobject<UParticleSystemComponent>("AirflowLeft");
- AirflowLeft->SetupAttachment(ParticleEffects);
- AirflowRight = CreateDefaultSubobject<UParticleSystemComponent>("AirflowRight");
- AirflowRight->SetupAttachment(ParticleEffects);
- ExhaustRight = CreateDefaultSubobject<UParticleSystemComponent>("ExhaustRight");
- ExhaustRight->SetupAttachment(ParticleEffects);
- ExhaustLeft = CreateDefaultSubobject<UParticleSystemComponent>("ExhaustLeft");
- ExhaustLeft->SetupAttachment(ParticleEffects);
- SphereCollision->SetSimulatePhysics(true);
- SphereCollision->SetNotifyRigidBodyCollision(true);
- SphereCollision->BodyInstance.SetCollisionProfileName("BlockAllDynamic");
- SphereCollision->OnComponentHit.AddDynamic(this, &AVRacer::OnHit);
- }
- void AVRacer::OnHit(UPrimitiveComponent* HitComponent, AActor* OtherActor, UPrimitiveComponent* OtherComp, FVector NormalImpulse, const FHitResult& Hit)
- {
- if (Hit.PhysMaterial.Get() != nullptr )
- {
- if (Hit.PhysMaterial.Get()->GetFName().ToString() == "WallCollision")//WallCollisionMaterial
- {
- const FVector Force = GetVelocity()* (FMath::Max(WallDeceleration, 0)*-1);
- SphereCollision->AddForce(Force, NAME_None, true);
- }
- }
- }
- // Called when the game starts or when spawned
- void AVRacer::BeginPlay()
- {
- Super::BeginPlay();
- //this->
- }
- void AVRacer::LookBack(float value)
- {
- if (value > 0.5f)
- {
- BackCamera->SetActive(true,false);
- Camera->SetActive(false,false);
- } else
- {
- BackCamera->SetActive(false,false);
- Camera->SetActive(true,false);
- }
- }
- void AVRacer::InputActionTurbo()
- {
- if (IsLocallyControlled())
- {
- if (HasAuthority())//Should Do Event to run on Server
- {
- if (bIgnition && bTurboAvailable)
- {
- //run timeline
- Turbo();
- }
- }
- }
- }
- bool AVRacer::LineTraceSingleForObjects(const FVector Start, const FVector End, FHitResult& OutHit) const
- {
- FCollisionQueryParams Params;
- Params.AddIgnoredActor(this);
- Params.bReturnPhysicalMaterial = true;
- FCollisionObjectQueryParams ObjectParams;
- ObjectParams.AddObjectTypesToQuery(ECC_WorldStatic);
- ObjectParams.AddObjectTypesToQuery(ECC_WorldDynamic);
- bool const bHit = GetWorld()->LineTraceSingleByObjectType(OutHit, Start, End, ObjectParams, Params);
- return bHit;
- }
- bool AVRacer::LineTraceSingleForObjectsStatic(const FVector Start, const FVector End, FHitResult& OutHit) const
- {
- FCollisionQueryParams Params;
- Params.AddIgnoredActor(this);
- Params.bReturnPhysicalMaterial = true;
- FCollisionObjectQueryParams ObjectParams;
- ObjectParams.AddObjectTypesToQuery(ECC_WorldStatic);
- bool const bHit = GetWorld()->LineTraceSingleByObjectType(OutHit, Start, End, ObjectParams, Params);
- return bHit;
- }
- void AVRacer::ShipControls(float DeltaTime, float Steering, float Thrust, float LeftAirbrake, float RightAirbrake, float Pitch)
- {
- SteeringValue = FMath::FInterpTo(SteeringValue, Steering, DeltaTime, SteeringInterpSpeed);
- ThrustValue = FMath::FInterpTo(ThrustValue, Thrust, DeltaTime, ThrustInterpSpeed);
- LeftAirbrakeValue = FMath::FInterpTo(LeftAirbrakeValue, LeftAirbrake, DeltaTime, AirbrakeInterpSpeed);
- RightAirbrakeValue = FMath::FInterpTo(RightAirbrakeValue, RightAirbrake, DeltaTime, AirbrakeInterpSpeed);
- PitchValue = FMath::FInterpTo(PitchValue, Pitch, DeltaTime, PitchInterpSpeed);
- }
- // Called every frame
- void AVRacer::Tick(float DeltaTime)
- {
- Super::Tick(DeltaTime);
- if (IsLocallyControlled() && bIgnition) {
- ShipControls(DeltaTime, GetInputAxisValue("Steering"), GetInputAxisValue("Thrust"), GetInputAxisValue("LeftAirbrake"),
- GetInputAxisValue("RightAirbrake"), GetInputAxisValue("Pitch") );
- }
- /*Vehicle Physics*/
- //UE_LOG(LogTemp, Warning, TEXT("Steering %f"), GetInputAxisValue("Steering"));
- //UE_LOG(LogTemp, Warning, TEXT("Thrust %f"), GetInputAxisValue("Thrust"));
- //Get Linear & Angular Velocity //PASS
- const FTransform T = SphereCollision->GetComponentToWorld();
- RelativeLinearVelocity = T.InverseTransformVectorNoScale(SphereCollision->GetComponentVelocity());
- RelativeAngularVelocity = T.InverseTransformVectorNoScale(SphereCollision->GetPhysicsAngularVelocityInRadians());
- SpeedRatio = RelativeLinearVelocity.X/100.0/(TopSpeed/3.6);
- /*UE_LOG(LogTemp, Warning, TEXT("GetComponentVelocity %s"), *SphereCollision->GetComponentVelocity().ToString());
- UE_LOG(LogTemp, Warning, TEXT("RelativeLinearVelocity %s"), *RelativeLinearVelocity.ToString());
- UE_LOG(LogTemp, Warning, TEXT("RelativeAngularVelocity %s"), *RelativeAngularVelocity.ToString());
- UE_LOG(LogTemp, Warning, TEXT("SpeedRatio %f"), SpeedRatio); */
- /*UE_LOG(LogTemp, Warning, TEXT("RelativeLinearVelocity %s"), *RelativeLinearVelocity.ToString());
- UE_LOG(LogTemp, Warning, TEXT("RelativeAngularVelocity %s"), *RelativeAngularVelocity.ToString());*/
- /*PASS return;*/
- //LevitationTrace
- FVector InverseTransformDir = GetActorTransform().InverseTransformVectorNoScale(GetActorLocation());
- FVector EndDir = FVector(InverseTransformDir.X+ (LevitationHeight* ( DOUBLE_PI/(180.0)*(PitchValue*PitchAngle) )),
- InverseTransformDir.Y,InverseTransformDir.Z - (bMagneticSurface ? LevitationHeight*2 : LevitationHeight) );
- FVector End = GetActorTransform().InverseTransformVectorNoScale(EndDir);
- FHitResult OutHit;
- LineTraceSingleForObjectsStatic(GetActorLocation(),End, OutHit);
- LevitationFactor = 1.0-OutHit.Time;
- UE_LOG(LogTemp, Warning, TEXT("Start %s"), *GetActorLocation().ToString());
- UE_LOG(LogTemp, Warning, TEXT("End %s"), *End.ToString());
- UE_LOG(LogTemp, Warning, TEXT("LevitationFactor %f"), LevitationFactor);
- if (OutHit.PhysMaterial.Get() != nullptr) {
- //UE_LOG(LogTemp, Warning, TEXT("First Pass"));
- bLevitationTraceObstructed = OutHit.PhysMaterial.Get()->GetFName().ToString() == "MagneticSurface" || OutHit.PhysMaterial.Get()->GetFName().ToString() == "LevitationSurface";
- bMagneticSurface = OutHit.PhysMaterial.Get()->GetFName().ToString() == "MagneticSurface";
- } else {
- bLevitationTraceObstructed = false;
- bMagneticSurface = false;
- }
- /*UE_LOG(LogTemp, Warning, TEXT("bLevitationTraceObstructed is: %hs"), bLevitationTraceObstructed? "true" : "false" );
- UE_LOG(LogTemp, Warning, TEXT("bMagneticSurface is: %hs"), bMagneticSurface? "true" : "false" );
- UE_LOG(LogTemp, Warning, TEXT("End -----------------%s"), *End.ToString());*/
- //Align Traces
- TArray<FVector> AlignTraceDirectionsFromCenter; //= {FVector(0,0,-1), FVector(), FVector(),FVector()};
- AlignTraceDirectionsFromCenter.Add(FVector(0,0,-1));
- AlignTraceDirectionsFromCenter.Add(FVector(0,1,0));
- AlignTraceDirectionsFromCenter.Add(FVector(0,-1,0));
- AlignTraceDirectionsFromCenter.Add(FVector(1,0,0));
- AlignTraceDirectionsFromCenter.Add(FVector(-1,0,0));
- AlignTraceDirectionsFromCenter.Add(FVector(0,0,1));
- for (int i = 0; i <AlignTraceDirectionsFromCenter.Num(); i++)
- {
- FVector LineTraceEnd = GetActorTransform().TransformVectorNoScale(GetActorTransform().InverseTransformVectorNoScale(GetActorLocation()) + AlignTraceDirectionsFromCenter[i].GetSafeNormal(0.0001) * (bMagneticSurface ? LevitationHeight*2 : LevitationHeight) ); ;
- FHitResult Out;
- LineTraceSingleForObjects(GetActorLocation(), LineTraceEnd, Out);
- //UE_LOG(LogTemp, Warning, TEXT("End2 ----------------------%s"), *LineTraceEnd .ToString());
- if (Out.PhysMaterial.Get() != nullptr ) {
- if (Out.PhysMaterial.Get()->GetFName().ToString() == "LevitationSurface" || Out.PhysMaterial.Get()->GetFName().ToString() == "MagneticSurface")
- {
- bAlignTraceObstructed = true;
- FloorSurfaceNormal = Out.Normal;
- //UE_LOG(LogTemp, Warning, TEXT("FloorSurfaceNormal %s"), *FloorSurfaceNormal.ToString());
- //UE_LOG(LogTemp, Warning, TEXT("InsideBreak"));
- break;
- }
- //UE_LOG(LogTemp, Warning, TEXT("OutsideBreak"));
- break;
- }
- }
- /*PASS return;*/
- /*for (int i = 0; i <AlignTraceDirectionsFromCenter.Num(); i++)
- {
- UE_LOG(LogTemp, Warning, TEXT("LineTraceEnd -----------------%s"), *RelativeLevitationForce.ToString());
- }*/
- //UE_LOG(LogTemp, Warning, TEXT("FloorSurfaceNormal %s"), *FloorSurfaceNormal.ToString());
- //UE_LOG(LogTemp, Warning, TEXT("bAlignTraceObstructed is: %hs"), bAlignTraceObstructed ? "true" : "false" );
- //Set Levitation Force
- if (bLevitationTraceObstructed)
- {
- double LevForce;// = bMagneticSurface ? LevitationFactor*2-1 : pow(LevitationFactor,2.0) * LevitationForce;
- if (bMagneticSurface)
- {
- LevForce = LevitationFactor*2.0;//-1.0
- //UE_LOG(LogTemp, Warning, TEXT("True LevForce %f"), LevForce);
- } else
- {
- LevForce = pow(LevitationFactor,2.0);
- //UE_LOG(LogTemp, Warning, TEXT("False LevForce %f"), LevForce);
- }
- //bMagneticSurface ? LevForce = LevitationFactor*2-1 : pow(LevitationFactor,2.0)) * LevitationForce ;
- double LevDamping = RelativeLinearVelocity.Z * LevitationDamping * LevitationFactor * -1.0;
- FVector LevDir = FloorSurfaceNormal* ( (LevForce-1.0)*LevitationForce*1.0 + LevDamping );
- RelativeLevitationForce = GetActorTransform().InverseTransformVectorNoScale(LevDir);
- UE_LOG(LogTemp, Warning, TEXT("LevDir %s"), *LevDir.ToString());
- } else
- {
- RelativeLevitationForce = FVector(0,0,0);
- }
- //UE_LOG(LogTemp, Warning, TEXT("Bool value is: %hs"), bLevitationTraceObstructed? "true" : "false" );
- //UE_LOG(LogTemp, Warning, TEXT("RelativeLevitationForce %s"), *RelativeLevitationForce.ToString());
- return;
- //Set Sideways Stabilization Force
- RelativeSidewaysStabilizationForce = FVector(0, RelativeLinearVelocity.Y*-1*SidewaysStability,0 );
- //Set Thrust Force
- //ReverseThrustForce = 1-sqrt(SpeedRatio) * ( () );
- double GetReverseTrust;
- ThrustValue > 0.0 ? GetReverseTrust = ThrustForce*ThrustValue : GetReverseTrust = ReverseThrustForce*ThrustValue;
- double MThrust = 1-SpeedRatio*SpeedRatio;
- if (bLevitationTraceObstructed)
- {
- RelativeThrustForce = FVector( GetReverseTrust*MThrust ,0,0);
- } else
- {
- RelativeThrustForce = FVector( GetReverseTrust*MThrust* (1 - FMath::Clamp(AirThrustReduction,0,1) ,0,0));
- }
- //bLevitationTraceObstructed ? FVector( GetReverseTrust*MThrust ,0,0) : RelativeThrustForce = FVector( GetReverseTrust*MThrust* (1 - FMath::Clamp(AirThrustReduction,0,1) ,0,0));
- //UE_LOG(LogTemp, Warning, TEXT("RelativeThrustForce %s"), *RelativeThrustForce.ToString());
- //Set Boost Force++
- RelativeBoostForce = FVector( BoostValue*BoostMultiplier + TurboValue*TurboMultiplier,0,0 );
- //Set Brake Force
- double CombinedInputs;
- if (RelativeLinearVelocity.X > 0)
- {
- CombinedInputs = (LeftAirbrakeValue+RightAirbrakeValue) * AirbrakeDeceleration * -1;
- } else
- {
- CombinedInputs = 0;
- }
- //if (RelativeLinearVelocity.X > 0){CombinedInputs = (LeftAirbrakeValue+RightAirbrakeValue) * AirbrakeDeceleration * -1;} else{CombinedInputs = 0;}
- RelativeBrakeForce = FVector( CombinedInputs,0, 0);
- //Set Downforce++
- RelativeDownforce = GetActorTransform().InverseTransformVectorNoScale(FVector(0,0,(DownforceMultiplier*FMath::Abs(SpeedRatio)*-1)));
- //Set E Brake Force++
- if (bLevitationTraceObstructed && LeftAirbrakeValue> 0.9 && RightAirbrakeValue > 0.9 && RelativeLinearVelocity.Size() < (EBrakeMaxVelocity*27.777) )
- {
- RelativeEbrakeForce = RelativeLinearVelocity*(FMath::Abs(EBrakeForce)*-1);
- } else
- {
- RelativeEbrakeForce = FVector(0,0,0);
- }
- //Set Angular Force//
- //Set Align Torque
- if (bAlignTraceObstructed)
- {
- //Get Roll Angle
- //FloorSurfaceNormal.GetSafeNormal(0.0001);
- //SphereCollision->GetRightVector().Normalize(0.0001);
- float Xterm = (FVector::DotProduct( SphereCollision->GetRightVector().GetSafeNormal(0.0001), FloorSurfaceNormal.GetSafeNormal(0.0001))*-1)*UpdateTorqueAlign();
- float Yterm = UpdateTorqueAlign()*GetPitchAngle();
- RelativeAlignTorque = FVector( Xterm, Yterm,0);
- } else
- {
- RelativeAlignTorque = FVector(0,0,0);
- }
- //Set Steering Torque
- RelativeSteeringTorque = FVector(0,0, SteeringTorque*SteeringValue + ((LeftAirbrakeValue*-1+RightAirbrakeValue) * AirbrakeSteeringSupport * SpeedRatio));
- /*Apply Force*/
- //Apply Linear Forces
- bool bPickA = true;
- FVector Sum = RelativeLevitationForce+RelativeLevitationDampingForce+RelativeSidewaysStabilizationForce
- +RelativeThrustForce+RelativeBoostForce+RelativeBrakeForce+RelativeDownforce+RelativeDragForce+RelativeEbrakeForce;
- if (bPickA)
- {
- if (Sum.Size() < 10.0f)
- {
- Sum = FVector(0,0,0);
- }
- }
- FVector Force = GetActorTransform().TransformVectorNoScale(Sum);
- SphereCollision->AddForce(Force, NAME_None, true);
- //UE_LOG(LogTemp, Warning, TEXT("Sum %s"), *Sum.ToString());
- //UE_LOG(LogTemp, Warning, TEXT("RelativeLevitationDampingForce %s"), *RelativeLevitationDampingForce.ToString());
- //UE_LOG(LogTemp, Warning, TEXT("RelativeSidewaysStabilizationForce %s"), *RelativeSidewaysStabilizationForce.ToString());
- //UE_LOG(LogTemp, Warning, TEXT("RelativeDragForce %s"), *RelativeDragForce.ToString());
- //Apply Angular Forces++
- FVector Torque = GetActorTransform().TransformVectorNoScale(RelativeAlignTorque+RelativeSteeringTorque);
- SphereCollision->AddTorqueInRadians(Torque, NAME_None, true);
- //Set Gravity
- if (bMagneticSurface)
- {
- if (SphereCollision->IsGravityEnabled()) {SphereCollision->SetEnableGravity(false); }
- } else{ if (!SphereCollision->IsGravityEnabled()) { SphereCollision->SetEnableGravity(true); }
- }
- }
- double AVRacer::GetPitchAngle() const
- {
- //const USceneComponent* SceneComp = Cast<USceneComponent>(GetComponentByClass(USceneComponent::StaticClass()));
- const FVector VectorToRotate = SphereCollision->GetComponentToWorld().InverseTransformVectorNoScale(SphereCollision->GetForwardVector());//SceneComp->GetComponentToWorld().TransformVectorNoScale(SceneComp->GetForwardVector());
- FVector Dir = FRotator(PitchValue*PitchAngle,0,0).RotateVector(VectorToRotate);
- FVector Member1 = SphereCollision->GetComponentToWorld().TransformVectorNoScale(Dir);/*Member1.Normalize(0.0001);
- FloorSurfaceNormal.Normalize(0.0001);*/
- //SphereCollision->GetComponentToWorld();
- return FVector::DotProduct( Member1.GetSafeNormal(0.0001), FloorSurfaceNormal.GetSafeNormal(0.0001));
- }
- double AVRacer::UpdateTorqueAlign() const
- {
- return bMagneticSurface ? UseFixedAlignTorque()*600 : UseFixedAlignTorque()*300;
- }
- double AVRacer::UseFixedAlignTorque() const
- {
- return PitchValue !=0.0f ? 0.5f : FMath::Max(LevitationFactor,0.2);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement