Process hull mesh and find submerged triangles
Process hull mesh and find submerged triangles
This commit is contained in:
parent
62e8c45c91
commit
607a29aa16
3
.gitignore
vendored
3
.gitignore
vendored
@ -11,4 +11,5 @@ Saved
|
||||
*.sln
|
||||
*.suo
|
||||
*.xcodeproj
|
||||
*.xcworkspace
|
||||
*.xcworkspace
|
||||
.idea
|
||||
|
@ -0,0 +1 @@
|
||||
|
@ -2,7 +2,7 @@
|
||||
|
||||
[/Script/EngineSettings.GameMapsSettings]
|
||||
GameDefaultMap=/Engine/Maps/Templates/Template_Default.Template_Default
|
||||
|
||||
EditorStartupMap=/Game/Maps/ShipTest.ShipTest
|
||||
|
||||
[/Script/HardwareTargeting.HardwareTargetingSettings]
|
||||
TargetedHardwareClass=Desktop
|
||||
@ -15,3 +15,6 @@ AppliedDefaultGraphicsPerformance=Maximum
|
||||
+ActiveGameNameRedirects=(OldGameName="/Script/TP_Blank",NewGameName="/Script/SeaOfCrooks")
|
||||
+ActiveClassRedirects=(OldClassName="TP_BlankGameModeBase",NewClassName="SeaOfCrooksGameModeBase")
|
||||
|
||||
[/Script/PythonScriptPlugin.PythonScriptPluginSettings]
|
||||
bRemoteExecution=True
|
||||
|
||||
|
BIN
Content/Core/BP_TestGameMode.uasset
(Stored with Git LFS)
Normal file
BIN
Content/Core/BP_TestGameMode.uasset
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
Content/Core/BP_TestGameState.uasset
(Stored with Git LFS)
Normal file
BIN
Content/Core/BP_TestGameState.uasset
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
Content/Environment/BP_TestOcean.uasset
(Stored with Git LFS)
Normal file
BIN
Content/Environment/BP_TestOcean.uasset
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
Content/Environment/Materials/M_Ocean.uasset
(Stored with Git LFS)
Normal file
BIN
Content/Environment/Materials/M_Ocean.uasset
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
Content/Environment/Materials/M_Sand.uasset
(Stored with Git LFS)
Normal file
BIN
Content/Environment/Materials/M_Sand.uasset
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
Content/Maps/ShipTest.umap
(Stored with Git LFS)
Normal file
BIN
Content/Maps/ShipTest.umap
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
Content/Maps/ShipTest_BuiltData.uasset
(Stored with Git LFS)
Normal file
BIN
Content/Maps/ShipTest_BuiltData.uasset
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
Content/Ships/BP_Ship.uasset
(Stored with Git LFS)
Normal file
BIN
Content/Ships/BP_Ship.uasset
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
Content/Ships/BP_TestShip.uasset
(Stored with Git LFS)
Normal file
BIN
Content/Ships/BP_TestShip.uasset
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
Content/Ships/Ship_Dark/_defaultMat.uasset
(Stored with Git LFS)
Normal file
BIN
Content/Ships/Ship_Dark/_defaultMat.uasset
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
Content/Ships/Ship_Dark/iron.uasset
(Stored with Git LFS)
Normal file
BIN
Content/Ships/Ship_Dark/iron.uasset
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
Content/Ships/Ship_Dark/ship_dark_cannon_front.uasset
(Stored with Git LFS)
Normal file
BIN
Content/Ships/Ship_Dark/ship_dark_cannon_front.uasset
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
Content/Ships/Ship_Dark/ship_dark_cannon_front1.uasset
(Stored with Git LFS)
Normal file
BIN
Content/Ships/Ship_Dark/ship_dark_cannon_front1.uasset
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
Content/Ships/Ship_Dark/ship_dark_cannon_left.uasset
(Stored with Git LFS)
Normal file
BIN
Content/Ships/Ship_Dark/ship_dark_cannon_left.uasset
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
Content/Ships/Ship_Dark/ship_dark_cannon_left2.uasset
(Stored with Git LFS)
Normal file
BIN
Content/Ships/Ship_Dark/ship_dark_cannon_left2.uasset
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
Content/Ships/Ship_Dark/ship_dark_cannon_left3.uasset
(Stored with Git LFS)
Normal file
BIN
Content/Ships/Ship_Dark/ship_dark_cannon_left3.uasset
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
Content/Ships/Ship_Dark/ship_dark_cannon_left4.uasset
(Stored with Git LFS)
Normal file
BIN
Content/Ships/Ship_Dark/ship_dark_cannon_left4.uasset
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
Content/Ships/Ship_Dark/ship_dark_cannon_left5.uasset
(Stored with Git LFS)
Normal file
BIN
Content/Ships/Ship_Dark/ship_dark_cannon_left5.uasset
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
Content/Ships/Ship_Dark/ship_dark_cannon_left6.uasset
(Stored with Git LFS)
Normal file
BIN
Content/Ships/Ship_Dark/ship_dark_cannon_left6.uasset
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
Content/Ships/Ship_Dark/ship_dark_cannon_right.uasset
(Stored with Git LFS)
Normal file
BIN
Content/Ships/Ship_Dark/ship_dark_cannon_right.uasset
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
Content/Ships/Ship_Dark/ship_dark_cannon_right10.uasset
(Stored with Git LFS)
Normal file
BIN
Content/Ships/Ship_Dark/ship_dark_cannon_right10.uasset
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
Content/Ships/Ship_Dark/ship_dark_cannon_right11.uasset
(Stored with Git LFS)
Normal file
BIN
Content/Ships/Ship_Dark/ship_dark_cannon_right11.uasset
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
Content/Ships/Ship_Dark/ship_dark_cannon_right7.uasset
(Stored with Git LFS)
Normal file
BIN
Content/Ships/Ship_Dark/ship_dark_cannon_right7.uasset
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
Content/Ships/Ship_Dark/ship_dark_cannon_right8.uasset
(Stored with Git LFS)
Normal file
BIN
Content/Ships/Ship_Dark/ship_dark_cannon_right8.uasset
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
Content/Ships/Ship_Dark/ship_dark_cannon_right9.uasset
(Stored with Git LFS)
Normal file
BIN
Content/Ships/Ship_Dark/ship_dark_cannon_right9.uasset
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
Content/Ships/Ship_Dark/ship_dark_sail_back.uasset
(Stored with Git LFS)
Normal file
BIN
Content/Ships/Ship_Dark/ship_dark_sail_back.uasset
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
Content/Ships/Ship_Dark/ship_dark_sail_front.uasset
(Stored with Git LFS)
Normal file
BIN
Content/Ships/Ship_Dark/ship_dark_sail_front.uasset
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
Content/Ships/Ship_Dark/ship_dark_sail_middle.uasset
(Stored with Git LFS)
Normal file
BIN
Content/Ships/Ship_Dark/ship_dark_sail_middle.uasset
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
Content/Ships/Ship_Dark/ship_dark_ship_dark_8angles.uasset
(Stored with Git LFS)
Normal file
BIN
Content/Ships/Ship_Dark/ship_dark_ship_dark_8angles.uasset
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
Content/Ships/Ship_Dark/ship_dark_steering.uasset
(Stored with Git LFS)
Normal file
BIN
Content/Ships/Ship_Dark/ship_dark_steering.uasset
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
Content/Ships/Ship_Dark/window.uasset
(Stored with Git LFS)
Normal file
BIN
Content/Ships/Ship_Dark/window.uasset
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
Content/Ships/Ship_Dark/wood.uasset
(Stored with Git LFS)
Normal file
BIN
Content/Ships/Ship_Dark/wood.uasset
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
Content/Ships/Ship_Dark/woodDark.uasset
(Stored with Git LFS)
Normal file
BIN
Content/Ships/Ship_Dark/woodDark.uasset
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
Content/Test/Plane.uasset
(Stored with Git LFS)
Normal file
BIN
Content/Test/Plane.uasset
(Stored with Git LFS)
Normal file
Binary file not shown.
@ -7,7 +7,20 @@
|
||||
{
|
||||
"Name": "SeaOfCrooks",
|
||||
"Type": "Runtime",
|
||||
"LoadingPhase": "Default"
|
||||
"LoadingPhase": "Default",
|
||||
"AdditionalDependencies": [
|
||||
"Engine"
|
||||
]
|
||||
}
|
||||
],
|
||||
"Plugins": [
|
||||
{
|
||||
"Name": "PythonScriptPlugin",
|
||||
"Enabled": true
|
||||
},
|
||||
{
|
||||
"Name": "EditorScriptingUtilities",
|
||||
"Enabled": true
|
||||
}
|
||||
]
|
||||
}
|
223
Source/SeaOfCrooks/Private/Components/BuoyancyComponent.cpp
Normal file
223
Source/SeaOfCrooks/Private/Components/BuoyancyComponent.cpp
Normal file
@ -0,0 +1,223 @@
|
||||
// Fill out your copyright notice in the Description page of Project Settings.
|
||||
|
||||
#include "Components/BuoyancyComponent.h"
|
||||
|
||||
#include "DrawDebugHelpers.h"
|
||||
#include "StaticMeshResources.h"
|
||||
#include "Game/SOCGameState.h"
|
||||
|
||||
static int32 DebugBuoyancy = 0;
|
||||
FAutoConsoleVariableRef CVARDebugProtagonistDrawing(TEXT("SOC.DebugBuoyancy"),
|
||||
DebugBuoyancy,
|
||||
TEXT("Print debug information about buoyancy component"),
|
||||
ECVF_Cheat);
|
||||
|
||||
// Sets default values for this component's properties
|
||||
UBuoyancyComponent::UBuoyancyComponent()
|
||||
{
|
||||
// Set this component to be initialized when the game starts, and to be ticked every frame. You can turn these features
|
||||
// off to improve performance if you don't need them.
|
||||
PrimaryComponentTick.bCanEverTick = true;
|
||||
|
||||
// ...
|
||||
}
|
||||
|
||||
|
||||
// Called when the game starts
|
||||
void UBuoyancyComponent::BeginPlay()
|
||||
{
|
||||
Super::BeginPlay();
|
||||
|
||||
// ...
|
||||
UStaticMeshComponent* MeshComp = Cast<UStaticMeshComponent>(GetOwner()->GetRootComponent());
|
||||
VolumeMesh = MeshComp->GetStaticMesh();
|
||||
|
||||
SubmergedTriangles = TArray<FTriangleData>();
|
||||
SubmergedTriangles.SetNum(GetNumTriangles(), false);
|
||||
}
|
||||
|
||||
|
||||
// Called every frame
|
||||
void UBuoyancyComponent::TickComponent(float DeltaTime, ELevelTick TickType, FActorComponentTickFunction* ThisTickFunction)
|
||||
{
|
||||
Super::TickComponent(DeltaTime, TickType, ThisTickFunction);
|
||||
|
||||
SubmergedTriangles.Empty();
|
||||
|
||||
// determine height of vertices above or below surface of water
|
||||
ASOCGameState* State = Cast<ASOCGameState>(GetWorld()->GetGameState());
|
||||
AOcean* Ocean = nullptr;
|
||||
if(State)
|
||||
{
|
||||
Ocean = State->GetOcean();
|
||||
}
|
||||
|
||||
if(Ocean)
|
||||
{
|
||||
TArray<FVertexData> Vertices = GetVertexPositions();
|
||||
for(int idx = 0; idx < Vertices.Num(); idx++)
|
||||
{
|
||||
Vertices[idx].CalculateDepth(Ocean->GetOceanHeight());
|
||||
}
|
||||
TArray<int32> Indices = GetTriangleIndices();
|
||||
|
||||
TArray<FTriangleData> Triangles;
|
||||
for(int idx = 0; idx < Indices.Num(); idx += 3)
|
||||
{
|
||||
FVertexData V1 = Vertices[Indices[idx]];
|
||||
FVertexData V2 = Vertices[Indices[idx + 1]];
|
||||
FVertexData V3 = Vertices[Indices[idx + 2]];
|
||||
|
||||
if(V1.Depth < 0.0f || V2.Depth < 0.0f || V3.Depth < 0.0f)
|
||||
{
|
||||
FTriangleData temp(V1, V2, V3);
|
||||
Triangles.Add(temp);
|
||||
FVector Center = (V1.Position + V2.Position + V3.Position) / 3.0f;
|
||||
if(DebugBuoyancy)
|
||||
DrawDebugSphere(GetWorld(), Center, 5.0f, 12, FColor::Yellow, false, 0.0f, 0, 1.0f);
|
||||
}
|
||||
}
|
||||
|
||||
ProcessTriangles(Triangles);
|
||||
|
||||
if(DebugBuoyancy)
|
||||
{
|
||||
FString DebugMsg = FString::Printf(TEXT("Num Submerged Triangles: %d\nNum Generated Triangles: %d"),
|
||||
Triangles.Num(), SubmergedTriangles.Num());
|
||||
GEngine->AddOnScreenDebugMessage(-1, 0.0f, FColor::Cyan, DebugMsg);
|
||||
|
||||
for (auto Triangle : SubmergedTriangles)
|
||||
{
|
||||
DrawDebugSphere(GetWorld(), Triangle.Highest.Position, 2.0f, 12, FColor::Red,
|
||||
false, 0.0f, 0, 1.0f);
|
||||
DrawDebugSphere(GetWorld(), Triangle.Middle.Position, 2.0f, 12, FColor::Red,
|
||||
false, 0.0f, 0, 1.0f);
|
||||
DrawDebugSphere(GetWorld(), Triangle.Lowest.Position, 2.0f, 12, FColor::Red,
|
||||
false, 0.0f, 0, 1.0f);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
int32 UBuoyancyComponent::GetNumTriangles()
|
||||
{
|
||||
int32 result = 0;
|
||||
if(!VolumeMesh || !VolumeMesh->RenderData)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
if(VolumeMesh->RenderData->LODResources.Num() > 0)
|
||||
{
|
||||
result = VolumeMesh->RenderData->LODResources[0].GetNumTriangles();
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
TArray<FVertexData> UBuoyancyComponent::GetVertexPositions()
|
||||
{
|
||||
TArray<FVertexData> VertexPositions = TArray<FVertexData>();
|
||||
|
||||
if(!VolumeMesh || !VolumeMesh->RenderData)
|
||||
{
|
||||
return VertexPositions;
|
||||
}
|
||||
|
||||
if(VolumeMesh->RenderData->LODResources.Num() > 0)
|
||||
{
|
||||
FPositionVertexBuffer* VertexBuffer = &VolumeMesh->RenderData->LODResources[0].VertexBuffers.PositionVertexBuffer;
|
||||
if(VertexBuffer)
|
||||
{
|
||||
for(uint32 idx = 0; idx < VertexBuffer->GetNumVertices(); idx++)
|
||||
{
|
||||
// convert asset space vertex position to world space
|
||||
FVector WorldSpaceVertexPos = GetOwner()->GetActorLocation() + GetOwner()->GetTransform().TransformVector(VertexBuffer->VertexPosition(idx));
|
||||
FVertexData temp;
|
||||
temp.Position = WorldSpaceVertexPos;
|
||||
VertexPositions.Add(temp);
|
||||
}
|
||||
}
|
||||
}
|
||||
return VertexPositions;
|
||||
}
|
||||
|
||||
TArray<int32> UBuoyancyComponent::GetTriangleIndices()
|
||||
{
|
||||
TArray<int32> Indices = TArray<int32>();
|
||||
|
||||
if(!VolumeMesh || !VolumeMesh->RenderData) // return empty array
|
||||
{
|
||||
return Indices;
|
||||
}
|
||||
|
||||
if(VolumeMesh->RenderData->LODResources.Num() > 0)
|
||||
{
|
||||
FRawStaticIndexBuffer* IndexBuffer = &VolumeMesh->RenderData->LODResources[0].IndexBuffer;
|
||||
if(IndexBuffer)
|
||||
{
|
||||
for(int idx = 0; idx < IndexBuffer->GetNumIndices(); idx++)
|
||||
{
|
||||
Indices.Add(IndexBuffer->GetIndex(idx));
|
||||
}
|
||||
}
|
||||
}
|
||||
return Indices;
|
||||
}
|
||||
|
||||
void UBuoyancyComponent::ProcessTriangles(TArray<FTriangleData>& Triangles)
|
||||
{
|
||||
for (auto Triangle : Triangles)
|
||||
{
|
||||
int32 NumSubmergedVertices = Triangle.GetNumSubmergedVertices();
|
||||
if(NumSubmergedVertices == 3) // completely submerged so add as is
|
||||
{
|
||||
SubmergedTriangles.Add(Triangle);
|
||||
}
|
||||
else if (NumSubmergedVertices == 2)
|
||||
{
|
||||
FVector H = Triangle.Highest.Position;
|
||||
FVector M = Triangle.Middle.Position;
|
||||
FVector L = Triangle.Lowest.Position;
|
||||
float hH = Triangle.Highest.Depth;
|
||||
float hM = Triangle.Middle.Depth;
|
||||
float hL = Triangle.Lowest.Depth;
|
||||
|
||||
FVector MH = H - M;
|
||||
float tM = -hL/(hH - hL);
|
||||
FVector MIM = tM * MH;
|
||||
FVector IM = MIM + M;
|
||||
|
||||
FVector LH = H - L;
|
||||
float tL = -hL/(hH - hL);
|
||||
FVector LIL = tL * LH;
|
||||
FVector IL = LIL + L;
|
||||
|
||||
SubmergedTriangles.Add(FTriangleData(IM, IL, L));
|
||||
SubmergedTriangles.Add(FTriangleData(M, IM, L));
|
||||
}
|
||||
else if (NumSubmergedVertices == 1)
|
||||
{
|
||||
FVector H = Triangle.Highest.Position;
|
||||
FVector M = Triangle.Middle.Position;
|
||||
FVector L = Triangle.Lowest.Position;
|
||||
float hH = Triangle.Highest.Depth;
|
||||
float hM = Triangle.Middle.Depth;
|
||||
float hL = Triangle.Lowest.Depth;
|
||||
|
||||
FVector LM = M - L;
|
||||
float tM = -hL/(hM - hL);
|
||||
FVector LJM = tM * LM;
|
||||
FVector JM = LJM + L;
|
||||
|
||||
FVector LH = H - L;
|
||||
float tH = -hL/(hH - hL);
|
||||
FVector LJH = tH * LH;
|
||||
FVector JH = LJH + L;
|
||||
|
||||
SubmergedTriangles.Add(FTriangleData(JH, JM, L));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
25
Source/SeaOfCrooks/Private/Game/SOCGameModeBase.cpp
Normal file
25
Source/SeaOfCrooks/Private/Game/SOCGameModeBase.cpp
Normal file
@ -0,0 +1,25 @@
|
||||
// Fill out your copyright notice in the Description page of Project Settings.
|
||||
|
||||
|
||||
#include "Game/SOCGameModeBase.h"
|
||||
#include "Game/SOCGameState.h"
|
||||
|
||||
ASOCGameModeBase::ASOCGameModeBase()
|
||||
{
|
||||
GameStateClass = ASOCGameState::StaticClass();
|
||||
}
|
||||
|
||||
void ASOCGameModeBase::StartPlay()
|
||||
{
|
||||
Super::StartPlay();
|
||||
|
||||
ASOCGameState* State = Cast<ASOCGameState>(GameState);
|
||||
if(State)
|
||||
{
|
||||
FActorSpawnParameters SpawnParams;
|
||||
SpawnParams.SpawnCollisionHandlingOverride = ESpawnActorCollisionHandlingMethod::AlwaysSpawn;
|
||||
SpawnParams.Owner = State;
|
||||
State->SetOcean(GetWorld()->SpawnActor<AOcean>(OceanClass,
|
||||
FVector::ZeroVector, FRotator::ZeroRotator, SpawnParams));
|
||||
}
|
||||
}
|
14
Source/SeaOfCrooks/Private/Game/SOCGameState.cpp
Normal file
14
Source/SeaOfCrooks/Private/Game/SOCGameState.cpp
Normal file
@ -0,0 +1,14 @@
|
||||
// Fill out your copyright notice in the Description page of Project Settings.
|
||||
|
||||
|
||||
#include "Game/SOCGameState.h"
|
||||
|
||||
AOcean* ASOCGameState::GetOcean()
|
||||
{
|
||||
return Ocean;
|
||||
}
|
||||
|
||||
void ASOCGameState::SetOcean(AOcean* NewOcean)
|
||||
{
|
||||
Ocean = NewOcean;
|
||||
}
|
41
Source/SeaOfCrooks/Private/Ocean.cpp
Normal file
41
Source/SeaOfCrooks/Private/Ocean.cpp
Normal file
@ -0,0 +1,41 @@
|
||||
// Fill out your copyright notice in the Description page of Project Settings.
|
||||
|
||||
|
||||
#include "Ocean.h"
|
||||
|
||||
// Sets default values
|
||||
AOcean::AOcean()
|
||||
{
|
||||
// Set this actor to call Tick() every frame. You can turn this off to improve performance if you don't need it.
|
||||
PrimaryActorTick.bCanEverTick = true;
|
||||
|
||||
OceanMesh = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("OceanMesh"));
|
||||
OceanMesh->SetupAttachment(RootComponent);
|
||||
|
||||
OceanMesh->SetCollisionEnabled(ECollisionEnabled::NoCollision);
|
||||
}
|
||||
|
||||
float AOcean::GetOceanHeight()
|
||||
{
|
||||
/**
|
||||
* For now assume a completely flat static ocean.
|
||||
* Once we get into procedural ocean and wave generation we will want to be able to pass in a world X and Y position
|
||||
* and have this function return the height of the ocean at that location
|
||||
*/
|
||||
return GetActorLocation().Z;
|
||||
}
|
||||
|
||||
// Called when the game starts or when spawned
|
||||
void AOcean::BeginPlay()
|
||||
{
|
||||
Super::BeginPlay();
|
||||
|
||||
}
|
||||
|
||||
// Called every frame
|
||||
void AOcean::Tick(float DeltaTime)
|
||||
{
|
||||
Super::Tick(DeltaTime);
|
||||
|
||||
}
|
||||
|
38
Source/SeaOfCrooks/Private/ShipBase.cpp
Normal file
38
Source/SeaOfCrooks/Private/ShipBase.cpp
Normal file
@ -0,0 +1,38 @@
|
||||
// Fill out your copyright notice in the Description page of Project Settings.
|
||||
|
||||
|
||||
#include "ShipBase.h"
|
||||
|
||||
// Sets default values
|
||||
AShipBase::AShipBase()
|
||||
{
|
||||
// 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;
|
||||
|
||||
ShipMesh = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("ShipMesh"));
|
||||
ShipMesh->SetupAttachment(RootComponent);
|
||||
|
||||
BuoyancyComp = CreateDefaultSubobject<UBuoyancyComponent>(TEXT("BuoyancyComponent"));
|
||||
}
|
||||
|
||||
// Called when the game starts or when spawned
|
||||
void AShipBase::BeginPlay()
|
||||
{
|
||||
Super::BeginPlay();
|
||||
|
||||
}
|
||||
|
||||
// Called every frame
|
||||
void AShipBase::Tick(float DeltaTime)
|
||||
{
|
||||
Super::Tick(DeltaTime);
|
||||
|
||||
}
|
||||
|
||||
// Called to bind functionality to input
|
||||
void AShipBase::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent)
|
||||
{
|
||||
Super::SetupPlayerInputComponent(PlayerInputComponent);
|
||||
|
||||
}
|
||||
|
116
Source/SeaOfCrooks/Public/Components/BuoyancyComponent.h
Normal file
116
Source/SeaOfCrooks/Public/Components/BuoyancyComponent.h
Normal file
@ -0,0 +1,116 @@
|
||||
// Fill out your copyright notice in the Description page of Project Settings.
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "CoreMinimal.h"
|
||||
#include "Components/ActorComponent.h"
|
||||
#include "BuoyancyComponent.generated.h"
|
||||
|
||||
USTRUCT()
|
||||
struct FVertexData
|
||||
{
|
||||
GENERATED_BODY()
|
||||
|
||||
FVector Position;
|
||||
// depth of the vertex above the surface of the water
|
||||
// negative value means the vertex is submerged
|
||||
float Depth;
|
||||
|
||||
int32 Index;
|
||||
|
||||
FVertexData() {}
|
||||
|
||||
FVertexData(FVector Position)
|
||||
{
|
||||
this->Position = Position;
|
||||
Depth = 0.0f;
|
||||
}
|
||||
|
||||
FVertexData(FVector Position, float Depth)
|
||||
{
|
||||
this->Position = Position;
|
||||
this->Depth = Depth;
|
||||
}
|
||||
|
||||
void CalculateDepth(float SurfaceHeight)
|
||||
{
|
||||
Depth = Position.Z - SurfaceHeight;
|
||||
}
|
||||
|
||||
bool operator< (const FVertexData& rhs) const
|
||||
{
|
||||
return this->Depth < rhs.Depth;
|
||||
}
|
||||
};
|
||||
|
||||
USTRUCT()
|
||||
struct FTriangleData
|
||||
{
|
||||
GENERATED_BODY()
|
||||
|
||||
FVertexData Highest;
|
||||
FVertexData Middle;
|
||||
FVertexData Lowest;
|
||||
|
||||
FTriangleData() {}
|
||||
|
||||
FTriangleData(FVertexData V1, FVertexData V2, FVertexData V3)
|
||||
{
|
||||
TArray<FVertexData> Vertices = {V1, V2, V3};
|
||||
Vertices.Sort();
|
||||
Lowest = Vertices[0];
|
||||
Middle = Vertices[1];
|
||||
Highest = Vertices[2];
|
||||
}
|
||||
|
||||
int32 GetNumSubmergedVertices()
|
||||
{
|
||||
int32 result = 0;
|
||||
if(Highest.Depth < 0.0f)
|
||||
{
|
||||
result++;
|
||||
}
|
||||
if(Middle.Depth < 0.0f)
|
||||
{
|
||||
result++;
|
||||
}
|
||||
if(Lowest.Depth < 0.0f)
|
||||
{
|
||||
result++;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
};
|
||||
|
||||
UCLASS( ClassGroup=(Custom), meta=(BlueprintSpawnableComponent) )
|
||||
class SEAOFCROOKS_API UBuoyancyComponent : public UActorComponent
|
||||
{
|
||||
GENERATED_BODY()
|
||||
|
||||
public:
|
||||
// Sets default values for this component's properties
|
||||
UBuoyancyComponent();
|
||||
|
||||
protected:
|
||||
UPROPERTY(BlueprintReadOnly)
|
||||
UStaticMesh* VolumeMesh;
|
||||
|
||||
UPROPERTY()
|
||||
TArray<FTriangleData> SubmergedTriangles;
|
||||
|
||||
// Called when the game starts
|
||||
virtual void BeginPlay() override;
|
||||
|
||||
public:
|
||||
// Called every frame
|
||||
virtual void TickComponent(float DeltaTime, ELevelTick TickType, FActorComponentTickFunction* ThisTickFunction) override;
|
||||
|
||||
private:
|
||||
int32 GetNumTriangles();
|
||||
|
||||
TArray<FVertexData> GetVertexPositions();
|
||||
|
||||
TArray<int32> GetTriangleIndices();
|
||||
|
||||
void ProcessTriangles(TArray<FTriangleData>& Triangles);
|
||||
};
|
27
Source/SeaOfCrooks/Public/Game/SOCGameModeBase.h
Normal file
27
Source/SeaOfCrooks/Public/Game/SOCGameModeBase.h
Normal file
@ -0,0 +1,27 @@
|
||||
// Fill out your copyright notice in the Description page of Project Settings.
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "CoreMinimal.h"
|
||||
|
||||
#include "Ocean.h"
|
||||
#include "GameFramework/GameMode.h"
|
||||
#include "SOCGameModeBase.generated.h"
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
UCLASS()
|
||||
class SEAOFCROOKS_API ASOCGameModeBase : public AGameMode
|
||||
{
|
||||
GENERATED_BODY()
|
||||
|
||||
public:
|
||||
ASOCGameModeBase();
|
||||
|
||||
protected:
|
||||
UPROPERTY(EditDefaultsOnly, Category="Ocean")
|
||||
TSubclassOf<AOcean> OceanClass;
|
||||
|
||||
virtual void StartPlay() override;
|
||||
};
|
26
Source/SeaOfCrooks/Public/Game/SOCGameState.h
Normal file
26
Source/SeaOfCrooks/Public/Game/SOCGameState.h
Normal file
@ -0,0 +1,26 @@
|
||||
// Fill out your copyright notice in the Description page of Project Settings.
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "CoreMinimal.h"
|
||||
|
||||
#include "Ocean.h"
|
||||
#include "GameFramework/GameState.h"
|
||||
#include "SOCGameState.generated.h"
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
UCLASS()
|
||||
class SEAOFCROOKS_API ASOCGameState : public AGameState
|
||||
{
|
||||
GENERATED_BODY()
|
||||
|
||||
public:
|
||||
AOcean* GetOcean();
|
||||
|
||||
void SetOcean(AOcean* NewOcean);
|
||||
protected:
|
||||
UPROPERTY()
|
||||
AOcean* Ocean;
|
||||
};
|
31
Source/SeaOfCrooks/Public/Ocean.h
Normal file
31
Source/SeaOfCrooks/Public/Ocean.h
Normal file
@ -0,0 +1,31 @@
|
||||
// Fill out your copyright notice in the Description page of Project Settings.
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "CoreMinimal.h"
|
||||
#include "GameFramework/Actor.h"
|
||||
#include "Ocean.generated.h"
|
||||
|
||||
UCLASS()
|
||||
class SEAOFCROOKS_API AOcean : public AActor
|
||||
{
|
||||
GENERATED_BODY()
|
||||
|
||||
public:
|
||||
// Sets default values for this actor's properties
|
||||
AOcean();
|
||||
|
||||
float GetOceanHeight();
|
||||
|
||||
protected:
|
||||
UPROPERTY(EditDefaultsOnly, Category="Components")
|
||||
UStaticMeshComponent* OceanMesh;
|
||||
|
||||
// Called when the game starts or when spawned
|
||||
virtual void BeginPlay() override;
|
||||
|
||||
public:
|
||||
// Called every frame
|
||||
virtual void Tick(float DeltaTime) override;
|
||||
|
||||
};
|
36
Source/SeaOfCrooks/Public/ShipBase.h
Normal file
36
Source/SeaOfCrooks/Public/ShipBase.h
Normal file
@ -0,0 +1,36 @@
|
||||
// Fill out your copyright notice in the Description page of Project Settings.
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "CoreMinimal.h"
|
||||
#include "GameFramework/Pawn.h"
|
||||
#include "Components/BuoyancyComponent.h"
|
||||
#include "ShipBase.generated.h"
|
||||
|
||||
UCLASS()
|
||||
class SEAOFCROOKS_API AShipBase : public APawn
|
||||
{
|
||||
GENERATED_BODY()
|
||||
|
||||
public:
|
||||
// Sets default values for this pawn's properties
|
||||
AShipBase();
|
||||
|
||||
protected:
|
||||
UPROPERTY(EditDefaultsOnly, Category="Components")
|
||||
UStaticMeshComponent* ShipMesh;
|
||||
|
||||
UPROPERTY(EditDefaultsOnly, Category="Components")
|
||||
UBuoyancyComponent* BuoyancyComp;
|
||||
|
||||
// Called when the game starts or when spawned
|
||||
virtual void BeginPlay() override;
|
||||
|
||||
public:
|
||||
// Called every frame
|
||||
virtual void Tick(float DeltaTime) override;
|
||||
|
||||
// Called to bind functionality to input
|
||||
virtual void SetupPlayerInputComponent(class UInputComponent* PlayerInputComponent) override;
|
||||
|
||||
};
|
@ -8,7 +8,7 @@ public class SeaOfCrooks : ModuleRules
|
||||
{
|
||||
PCHUsage = PCHUsageMode.UseExplicitOrSharedPCHs;
|
||||
|
||||
PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore" });
|
||||
PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore", "RenderCore", "RHI" });
|
||||
|
||||
PrivateDependencyModuleNames.AddRange(new string[] { });
|
||||
|
||||
|
@ -1,5 +0,0 @@
|
||||
// Copyright Epic Games, Inc. All Rights Reserved.
|
||||
|
||||
|
||||
#include "SeaOfCrooksGameModeBase.h"
|
||||
|
@ -1,17 +0,0 @@
|
||||
// Copyright Epic Games, Inc. All Rights Reserved.
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "CoreMinimal.h"
|
||||
#include "GameFramework/GameModeBase.h"
|
||||
#include "SeaOfCrooksGameModeBase.generated.h"
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
UCLASS()
|
||||
class SEAOFCROOKS_API ASeaOfCrooksGameModeBase : public AGameModeBase
|
||||
{
|
||||
GENERATED_BODY()
|
||||
|
||||
};
|
Loading…
Reference in New Issue
Block a user