From 9e6048fe387dad152854996373516a35f1931eb5 Mon Sep 17 00:00:00 2001 From: trent Date: Wed, 4 Apr 2018 02:21:50 -0400 Subject: [PATCH] Got the FluidSurface plugin building for UE 4.19; currently has shader issues at launch, but it's 3am for me. --- FluidSurface/FluidSurface.uplugin | 8 +-- .../Source/FluidSurface/FluidSurface.Build.cs | 56 +++++++++---------- .../FluidSurface/Private/FluidSurface.cpp | 16 +----- .../Private/FluidSurfaceActor.cpp | 4 +- .../Private/FluidSurfaceComponent.cpp | 42 ++++++-------- .../Private/FluidSurfacePrivatePCH.h | 12 ---- .../Private/FluidSurfaceRender.cpp | 53 ++++++++++++------ .../FluidSurface/Private/FluidSurfaceRender.h | 15 +++-- .../Modifiers/FluidSurfaceModifier.cpp | 6 +- .../Modifiers/FluidSurfaceOscillator.cpp | 5 +- .../Private/Modifiers/FluidSurfaceRain.cpp | 2 +- .../Source/FluidSurface/Public/FluidSurface.h | 12 ++++ .../FluidSurface/Public/FluidSurfaceActor.h | 37 ++++++++++++ .../Public/FluidSurfaceComponent.h | 47 ++++------------ .../Public/FluidSurfaceModifier.h | 5 ++ .../Public/FluidSurfaceOscillator.h | 5 ++ .../FluidSurface/Public/FluidSurfaceRain.h | 5 ++ .../FluidSurfaceEngine.Build.cs | 42 +++++++------- .../Private/FluidSurfaceEngine.cpp | 42 ++++++++------ .../Private/FluidSurfaceEnginePrivatePCH.h | 6 -- .../Public/FluidSurfaceEngine.h | 31 +++++++++- README.md | 2 + Shaders/FluidSurfaceShader.usf | 2 +- ...tory.usf => FluidSurfaceVertexFactory.ush} | 4 +- ...sf => FluidSurfaceVertexFactoryCommon.ush} | 0 25 files changed, 260 insertions(+), 199 deletions(-) delete mode 100644 FluidSurface/Source/FluidSurface/Private/FluidSurfacePrivatePCH.h create mode 100644 FluidSurface/Source/FluidSurface/Public/FluidSurface.h delete mode 100644 FluidSurface/Source/FluidSurfaceEngine/Private/FluidSurfaceEnginePrivatePCH.h rename Shaders/{FluidSurfaceVertexFactory.usf => FluidSurfaceVertexFactory.ush} (99%) rename Shaders/{FluidSurfaceVertexFactoryCommon.usf => FluidSurfaceVertexFactoryCommon.ush} (100%) diff --git a/FluidSurface/FluidSurface.uplugin b/FluidSurface/FluidSurface.uplugin index ac37109..6c89e42 100644 --- a/FluidSurface/FluidSurface.uplugin +++ b/FluidSurface/FluidSurface.uplugin @@ -1,16 +1,14 @@ { - "PluginFileVersion" : 3, - + "FileVersion" : 3, + "Version" : 1, "FriendlyName" : "Fluid Surface Actor", "Version" : 10, "VersionName" : "0.1.3", "CreatedBy" : "Ehamloptiran", "CreatedByURL" : "galaxyeham@gmail.com", - "EngineVersion" : "4.10.0", "Description" : "Simulated fluid surface actor", "Category" : "Rendering", "EnabledByDefault" : true, - "Modules" : [ { @@ -20,7 +18,7 @@ { "Name" : "FluidSurfaceEngine", "Type" : "Runtime", - "LoadingPhase" : "PostConfigInit" + "LoadingPhase": "PostConfigInit" } ] } \ No newline at end of file diff --git a/FluidSurface/Source/FluidSurface/FluidSurface.Build.cs b/FluidSurface/Source/FluidSurface/FluidSurface.Build.cs index 94f87ed..5b55dfd 100644 --- a/FluidSurface/Source/FluidSurface/FluidSurface.Build.cs +++ b/FluidSurface/Source/FluidSurface/FluidSurface.Build.cs @@ -1,36 +1,34 @@ -// Copyright 1998-2014 Epic Games, Inc. All Rights Reserved. +// Copyright 1998-2018 Epic Games, Inc. All Rights Reserved. +using UnrealBuildTool; -namespace UnrealBuildTool.Rules +public class FluidSurface : ModuleRules { - public class FluidSurface : ModuleRules + public FluidSurface(ReadOnlyTargetRules Target) : base(Target) { - public FluidSurface(TargetInfo Target) - { - PrivateIncludePaths.AddRange( - new string[] { - "FluidSurface/Private", - "FluidSurface/Private/Modifiers" - } - ); + PrivateIncludePaths.AddRange( + new string[] { + "FluidSurface/Private", + "FluidSurface/Private/Modifiers" + } + ); - PublicIncludePaths.AddRange( - new string[] { - "FluidSurfaceRender/Public" - } - ); + PublicIncludePaths.AddRange( + new string[] { + "FluidSurfaceRender/Public" + } + ); - PublicDependencyModuleNames.AddRange( - new string[] - { - "Core", - "CoreUObject", - "Engine", - "RenderCore", - "ShaderCore", - "RHI", - "FluidSurfaceEngine" - } - ); - } + PublicDependencyModuleNames.AddRange( + new string[] + { + "Core", + "CoreUObject", + "Engine", + "RenderCore", + "ShaderCore", + "RHI", + "FluidSurfaceEngine" + } + ); } } \ No newline at end of file diff --git a/FluidSurface/Source/FluidSurface/Private/FluidSurface.cpp b/FluidSurface/Source/FluidSurface/Private/FluidSurface.cpp index 5c7a74c..85f5a31 100644 --- a/FluidSurface/Source/FluidSurface/Private/FluidSurface.cpp +++ b/FluidSurface/Source/FluidSurface/Private/FluidSurface.cpp @@ -1,18 +1,9 @@ // Copyright 1998-2014 Epic Games, Inc. All Rights Reserved. -#include "FluidSurfacePrivatePCH.h" - -class FFluidSurface : public IModuleInterface -{ - /** IModuleInterface implementation */ - virtual void StartupModule( ) override; - virtual void ShutdownModule( ) override; -}; +#include "FluidSurface.h" IMPLEMENT_MODULE( FFluidSurface, FluidSurface ) - - void FFluidSurface::StartupModule() { // This code will execute after your module is loaded into memory (but after global variables are initialized, of course.) @@ -23,7 +14,4 @@ void FFluidSurface::ShutdownModule() { // This function may be called during shutdown to clean up your module. For modules that support dynamic reloading, // we call this function before unloading the module. -} - - - +} \ No newline at end of file diff --git a/FluidSurface/Source/FluidSurface/Private/FluidSurfaceActor.cpp b/FluidSurface/Source/FluidSurface/Private/FluidSurfaceActor.cpp index 6f1b4bf..45d5b90 100644 --- a/FluidSurface/Source/FluidSurface/Private/FluidSurfaceActor.cpp +++ b/FluidSurface/Source/FluidSurface/Private/FluidSurfaceActor.cpp @@ -1,5 +1,7 @@ -#include "FluidSurfacePrivatePCH.h" +#include "FluidSurfaceActor.h" + +#include "FluidSurfaceComponent.h" AFluidSurfaceActor::AFluidSurfaceActor(const FObjectInitializer& ObjectInitializer) : Super(ObjectInitializer) diff --git a/FluidSurface/Source/FluidSurface/Private/FluidSurfaceComponent.cpp b/FluidSurface/Source/FluidSurface/Private/FluidSurfaceComponent.cpp index 23bb6b1..53f0c73 100644 --- a/FluidSurface/Source/FluidSurface/Private/FluidSurfaceComponent.cpp +++ b/FluidSurface/Source/FluidSurface/Private/FluidSurfaceComponent.cpp @@ -1,7 +1,10 @@ -#include "FluidSurfacePrivatePCH.h" +#include "FluidSurfaceComponent.h" + #include "FluidSurfaceRender.h" +#include "FluidSurfaceModifier.h" + #include "Particles/Emitter.h" #include "Particles/ParticleSystemComponent.h" #include "PhysicsEngine/BodySetup.h" @@ -58,7 +61,7 @@ UFluidSurfaceComponent::UFluidSurfaceComponent(const FObjectInitializer& ObjectI UpdateComponent = true; /* Create dynamic delegate for overlapped event */ - OnComponentBeginOverlap.AddDynamic( this, &UFluidSurfaceComponent::ComponentTouched ); + OnComponentBeginOverlap.AddDynamic( this, &UFluidSurfaceComponent::ComponentBeginOverlap ); } #if WITH_EDITOR @@ -154,7 +157,8 @@ void UFluidSurfaceComponent::Pling( const FVector& Position, float Strength, flo int HitX, HitY; GetNearestIndex( Position, HitX, HitY ); - PLingBuffer[ NumPLing ].LocalHitPosition = GetWorldToComponent( ).TransformPosition( Position ); + PLingBuffer[ NumPLing ].LocalHitPosition = GetComponentTransform( ).Inverse( ).TransformPosition( Position ); + PLingBuffer[ NumPLing ].HitX = HitX; PLingBuffer[ NumPLing ].HitY = HitY; PLingBuffer[ NumPLing ].Strength = Strength; @@ -166,7 +170,7 @@ void UFluidSurfaceComponent::Pling( const FVector& Position, float Strength, flo /** Get nearest index */ void UFluidSurfaceComponent::GetNearestIndex( const FVector& Pos, int& xIndex, int& yIndex ) { - FVector LocalPos = GetWorldToComponent( ).TransformPosition( Pos ); + FVector LocalPos = GetComponentTransform( ).Inverse( ).TransformPosition( Pos ); xIndex = FMath::RoundToInt( ( LocalPos.X - FluidOrigin.X ) / FluidGridSpacing ); xIndex = FMath::Clamp( xIndex, 0, FluidXSize - 1 ); @@ -217,7 +221,7 @@ void UFluidSurfaceComponent::OnRegister( ) void UFluidSurfaceComponent::CreateRenderState_Concurrent() { /* Create render data */ - RenderData = new FFluidSurfaceRenderData(); + RenderData = MakeUnique< FFluidSurfaceRenderData >( ); RenderData->InitResources(this); Super::CreateRenderState_Concurrent(); @@ -281,7 +285,7 @@ void UFluidSurfaceComponent::TickComponent( float DeltaTime, enum ELevelTick Tic /* Dont care about self and modifiers */ if( Actor != NULL && !Actor->IsA( AFluidSurfaceActor::StaticClass( ) ) && !Actor->IsA( AFluidSurfaceModifier::StaticClass( ) ) ) { - FVector LocalVel = GetWorldToComponent( ).TransformVector( Actor->GetVelocity( ) ); + FVector LocalVel = GetComponentTransform( ).Inverse( ).TransformVector( Actor->GetVelocity( ) ); float HorizVelMag = LocalVel.Size( ); Pling( Actor->GetActorLocation( ), RippleVelocityFactor * HorizVelMag, Actor->GetSimpleCollisionRadius( ) ); @@ -304,7 +308,7 @@ void UFluidSurfaceComponent::TickComponent( float DeltaTime, enum ELevelTick Tic LocalRipplePos.Y = ( RippleRadius * FMath::Cos( TestRippleAng ) ); LocalRipplePos.Z = 0.f; - WorldRipplePos = ComponentToWorld.TransformPosition( LocalRipplePos ); + WorldRipplePos = GetComponentTransform( ).Inverse( ).TransformPosition( LocalRipplePos ); Pling( WorldRipplePos, TestRippleStrength, TestRippleRadius ); } @@ -339,24 +343,24 @@ void UFluidSurfaceComponent::ReceiveComponentDamage( float DamageAmount, FDamage /* Spawn shoot effect emitter */ FRotator Rotation = FRotator( 0, 0, 0 ); AEmitter* Emitter = GetWorld( )->SpawnActor( HitLocation, Rotation ); - Emitter->ParticleSystemComponent->SetTemplate( ShootEffect ); + Emitter->GetParticleSystemComponent( )->SetTemplate( ShootEffect ); } } /** Called when an object has overlapped this component */ -void UFluidSurfaceComponent::ComponentTouched( AActor* Other, UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult& SweepResult ) +void UFluidSurfaceComponent::ComponentBeginOverlap( UPrimitiveComponent* OverlappedComponent, AActor* OtherActor, UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult& SweepResult ) { - if( !Other ) + if( !OtherActor ) return; - FVector ActorLocation = Other->GetActorLocation( ); + FVector ActorLocation = OtherActor->GetActorLocation( ); if( TouchEffect ) { /* Spawn touch effect emitter */ FRotator Rotation = FRotator( 0, 0, 0 ); AEmitter* Emitter = GetWorld( )->SpawnActor( ActorLocation, Rotation ); - Emitter->ParticleSystemComponent->SetTemplate( TouchEffect ); + Emitter->GetParticleSystemComponent( )->SetTemplate( TouchEffect ); } } @@ -374,7 +378,7 @@ void UFluidSurfaceComponent::UpdateBody( ) FVector BoxExtents = FluidBoundingBox.GetExtent( ); FKBoxElem& BoxElem = *new ( BodySetup->AggGeom.BoxElems ) FKBoxElem( BoxExtents.X * 2, BoxExtents.Y * 2, BoxExtents.Z * 2 ); BoxElem.Center = FVector::ZeroVector; - BoxElem.Orientation = GetComponentQuat( ); + BoxElem.Rotation = FRotator( GetComponentQuat( ) ); BodySetup->ClearPhysicsMeshes( ); BodySetup->CreatePhysicsMeshes( ); @@ -446,18 +450,6 @@ void UFluidSurfaceComponent::BeginDestroy( ) Super::BeginDestroy( ); } -void UFluidSurfaceComponent::CreatePhysicsState( ) -{ -#if WITH_EDITOR - if( bPhysicsStateCreated ) - DestroyPhysicsState( ); - - UpdateBody( ); -#endif - - return Super::CreatePhysicsState( ); -} - UBodySetup* UFluidSurfaceComponent::GetBodySetup( ) { return BodySetup; diff --git a/FluidSurface/Source/FluidSurface/Private/FluidSurfacePrivatePCH.h b/FluidSurface/Source/FluidSurface/Private/FluidSurfacePrivatePCH.h deleted file mode 100644 index e47f9c3..0000000 --- a/FluidSurface/Source/FluidSurface/Private/FluidSurfacePrivatePCH.h +++ /dev/null @@ -1,12 +0,0 @@ -// Copyright 1998-2014 Epic Games, Inc. All Rights Reserved. - -#include "CoreUObject.h" -#include "Engine.h" - -#include "FluidSurfaceEngine.h" -#include "FluidSurfaceActor.h" -#include "FluidSurfaceComponent.h" -#include "FluidSurfaceModifier.h" -#include "FluidSurfaceOscillator.h" -#include "FluidSurfaceRain.h" -#include "FluidSurfaceRender.h" diff --git a/FluidSurface/Source/FluidSurface/Private/FluidSurfaceRender.cpp b/FluidSurface/Source/FluidSurface/Private/FluidSurfaceRender.cpp index fa64d74..8c5085b 100644 --- a/FluidSurface/Source/FluidSurface/Private/FluidSurfaceRender.cpp +++ b/FluidSurface/Source/FluidSurface/Private/FluidSurfaceRender.cpp @@ -1,16 +1,37 @@ -#include "FluidSurfacePrivatePCH.h" - -#include "TessellationRendering.h" -#include "PhysicsEngine/BodySetup.h" +#include "FluidSurfaceRender.h" + +#include "EngineGlobals.h" +#include "RHI.h" +#include "RenderResource.h" +#include "RenderingThread.h" +#include "VertexFactory.h" +#include "PackedNormal.h" +#include "LocalVertexFactory.h" +#include "PrimitiveViewRelevance.h" +#include "Materials/MaterialInterface.h" +#include "Materials/MaterialInstanceDynamic.h" +#include "PrimitiveSceneProxy.h" +#include "Engine/CollisionProfile.h" +#include "Curves/CurveFloat.h" +#include "SceneManagement.h" +#include "Engine/Engine.h" +#include "Engine/LevelStreaming.h" +#include "LevelUtils.h" +#include "ShowFlags.h" +#include "Camera/CameraTypes.h" +#include "Materials/MaterialInstanceDynamic.h" +#include "Engine/SceneCapture2D.h" +#include "Engine/Texture2DDynamic.h" +#include "Engine/TextureRenderTarget2D.h" +#include "DynamicMeshBuilder.h" +#include "Components/SceneCaptureComponent2D.h" +#include "StaticMeshResources.h" + +#include "FluidSurfaceComponent.h" /** Render Data */ -FFluidSurfaceRenderData::FFluidSurfaceRenderData( ) - : HasTessellationData( false ) -{ -} - /** Initialise render resources */ void FFluidSurfaceRenderData::InitResources( UFluidSurfaceComponent* Component ) { @@ -578,7 +599,7 @@ FFluidSurfaceSceneProxy::FFluidSurfaceSceneProxy( UFluidSurfaceComponent* Compon , Material( NULL ) , DynamicData( NULL ) , BodySetup( Component->BodySetup ) - , RenderData( Component->RenderData ) + , RenderData( Component->RenderData.Get( ) ) , MaterialRelevance( Component->GetMaterialRelevance( GetScene( ).GetFeatureLevel( ) ) ) , Time( 0.0f ) , LevelColor( 1,1,1 ) @@ -601,6 +622,12 @@ FFluidSurfaceSceneProxy::~FFluidSurfaceSceneProxy( ) if( DynamicData != NULL ) { delete DynamicData; } } +SIZE_T FFluidSurfaceSceneProxy::GetTypeHash( ) const +{ + static size_t UniquePointer; + return reinterpret_cast< size_t >( &UniquePointer ); +} + /** Returns the view revelance */ FPrimitiveViewRelevance FFluidSurfaceSceneProxy::GetViewRelevance( const FSceneView* View ) { @@ -613,12 +640,6 @@ FPrimitiveViewRelevance FFluidSurfaceSceneProxy::GetViewRelevance( const FSceneV return Result; } -/** Can mesh be occluded */ -bool FFluidSurfaceSceneProxy::CanBeOccluded( ) const -{ - return !MaterialRelevance.bDisableDepthTest; -} - /** Memory footprint */ uint32 FFluidSurfaceSceneProxy::GetMemoryFootprint( ) const { diff --git a/FluidSurface/Source/FluidSurface/Private/FluidSurfaceRender.h b/FluidSurface/Source/FluidSurface/Private/FluidSurfaceRender.h index 99f2046..f3bed4e 100644 --- a/FluidSurface/Source/FluidSurface/Private/FluidSurfaceRender.h +++ b/FluidSurface/Source/FluidSurface/Private/FluidSurfaceRender.h @@ -1,6 +1,13 @@ #pragma once +#include "FluidSurfaceEngine.h" + +#include "TessellationRendering.h" +#include "PhysicsEngine/BodySetup.h" + +#include "FluidSurfaceActor.h" + #define MAX_FLUID_PLINGS 1024 /** PLing Parameters */ @@ -67,9 +74,7 @@ struct FReadBufferStructured class FFluidSurfaceRenderData { public: - - /** Default constructor */ - FFluidSurfaceRenderData( ); + FFluidSurfaceRenderData( ) { } /** Initialise required resources */ void InitResources( UFluidSurfaceComponent* Component ); @@ -139,11 +144,11 @@ class FFluidSurfaceSceneProxy : public FPrimitiveSceneProxy virtual ~FFluidSurfaceSceneProxy( ); /* Begin UPrimitiveSceneProxy interface */ + virtual SIZE_T GetTypeHash( ) const override; virtual FPrimitiveViewRelevance GetViewRelevance( const FSceneView* View ); - virtual bool CanBeOccluded( ) const override; virtual uint32 GetMemoryFootprint( ) const; uint32 GetAllocatedSize( ) const; - virtual void GetDynamicMeshElements(const TArray& Views, const FSceneViewFamily& ViewFamily, uint32 VisibilityMap, FMeshElementCollector& Collector) const override; + virtual void GetDynamicMeshElements( const TArray& Views, const FSceneViewFamily& ViewFamily, uint32 VisibilityMap, FMeshElementCollector& Collector ) const override; /* End UPrimitiveSceneProxy interface */ /* Set data sent from the game thread */ diff --git a/FluidSurface/Source/FluidSurface/Private/Modifiers/FluidSurfaceModifier.cpp b/FluidSurface/Source/FluidSurface/Private/Modifiers/FluidSurfaceModifier.cpp index 0bd716f..1ca06cf 100644 --- a/FluidSurface/Source/FluidSurface/Private/Modifiers/FluidSurfaceModifier.cpp +++ b/FluidSurface/Source/FluidSurface/Private/Modifiers/FluidSurfaceModifier.cpp @@ -1,5 +1,7 @@ -#include "FluidSurfacePrivatePCH.h" +#include "FluidSurfaceModifier.h" + +#include "Components/BillboardComponent.h" AFluidSurfaceModifier::AFluidSurfaceModifier(const class FObjectInitializer& ObjectInitializer) : Super(ObjectInitializer) @@ -28,7 +30,7 @@ AFluidSurfaceModifier::AFluidSurfaceModifier(const class FObjectInitializer& Obj static FConstructorStatics ConstructorStatics; SpriteComponent->Sprite = ConstructorStatics.TextRenderTexture.Get( ); - SpriteComponent->AttachParent = SceneComponent; + SpriteComponent->SetupAttachment( SceneComponent ); SpriteComponent->bIsScreenSizeScaled = true; SpriteComponent->bAbsoluteScale = true; SpriteComponent->bReceivesDecals = false; diff --git a/FluidSurface/Source/FluidSurface/Private/Modifiers/FluidSurfaceOscillator.cpp b/FluidSurface/Source/FluidSurface/Private/Modifiers/FluidSurfaceOscillator.cpp index f1eb690..edc4e43 100644 --- a/FluidSurface/Source/FluidSurface/Private/Modifiers/FluidSurfaceOscillator.cpp +++ b/FluidSurface/Source/FluidSurface/Private/Modifiers/FluidSurfaceOscillator.cpp @@ -1,5 +1,6 @@ -#include "FluidSurfacePrivatePCH.h" +#include "FluidSurfaceOscillator.h" + AFluidSurfaceOscillator::AFluidSurfaceOscillator( const class FObjectInitializer& ObjectInitializer ) : Super(ObjectInitializer) @@ -15,7 +16,7 @@ AFluidSurfaceOscillator::AFluidSurfaceOscillator( const class FObjectInitializer { if( RadiusComponent != nullptr ) { - RadiusComponent->AttachParent = SceneComponent; + RadiusComponent->SetupAttachment( SceneComponent ); RadiusComponent->SetSphereRadius( Radius ); } } diff --git a/FluidSurface/Source/FluidSurface/Private/Modifiers/FluidSurfaceRain.cpp b/FluidSurface/Source/FluidSurface/Private/Modifiers/FluidSurfaceRain.cpp index c491b5b..9c749d0 100644 --- a/FluidSurface/Source/FluidSurface/Private/Modifiers/FluidSurfaceRain.cpp +++ b/FluidSurface/Source/FluidSurface/Private/Modifiers/FluidSurfaceRain.cpp @@ -1,5 +1,5 @@ +#include "FluidSurfaceRain.h" -#include "FluidSurfacePrivatePCH.h" AFluidSurfaceRain::AFluidSurfaceRain(const class FObjectInitializer& ObjectInitializer) : Super(ObjectInitializer) diff --git a/FluidSurface/Source/FluidSurface/Public/FluidSurface.h b/FluidSurface/Source/FluidSurface/Public/FluidSurface.h new file mode 100644 index 0000000..e391ba0 --- /dev/null +++ b/FluidSurface/Source/FluidSurface/Public/FluidSurface.h @@ -0,0 +1,12 @@ +#pragma once + +#include "EngineMinimal.h" + +#include "ModuleManager.h" + +class FFluidSurface : public IModuleInterface +{ + /** IModuleInterface implementation */ + virtual void StartupModule( ) override; + virtual void ShutdownModule( ) override; +}; \ No newline at end of file diff --git a/FluidSurface/Source/FluidSurface/Public/FluidSurfaceActor.h b/FluidSurface/Source/FluidSurface/Public/FluidSurfaceActor.h index 497cf60..3513475 100644 --- a/FluidSurface/Source/FluidSurface/Public/FluidSurfaceActor.h +++ b/FluidSurface/Source/FluidSurface/Public/FluidSurfaceActor.h @@ -1,6 +1,11 @@ #pragma once +#include "CoreMinimal.h" +#include "UObject/ObjectMacros.h" + +#include "GameFramework/Actor.h" + #include "FluidSurfaceActor.generated.h" UCLASS( HideCategories = ( Input, Replication, Physics ) ) @@ -10,4 +15,36 @@ class AFluidSurfaceActor : public AActor UPROPERTY( Category = FluidSurface, VisibleAnywhere, BlueprintReadOnly ) class UFluidSurfaceComponent* FluidSurfaceComponent; +}; + +UENUM( ) +namespace EFluidGridType +{ +enum Type +{ + FGT_Square = 0, + FGT_Hexagonal = 1, + FGT_MAX = 2, +}; +} + +/** Stores a range of values */ +USTRUCT( BlueprintType ) +struct FRangedValues +{ + GENERATED_USTRUCT_BODY( ); + + /** Minimum value of range */ + UPROPERTY( EditAnywhere, BlueprintReadWrite, Category = "Range" ) + float MinValue; + + /** Maximum value of range */ + UPROPERTY( EditAnywhere, BlueprintReadWrite, Category = "Range" ) + float MaxValue; + + /** Get a random number from within the range */ + float GetRand( ) + { + return FMath::FRandRange( MinValue, MaxValue ); + } }; \ No newline at end of file diff --git a/FluidSurface/Source/FluidSurface/Public/FluidSurfaceComponent.h b/FluidSurface/Source/FluidSurface/Public/FluidSurfaceComponent.h index ec7f610..d63cdeb 100644 --- a/FluidSurface/Source/FluidSurface/Public/FluidSurfaceComponent.h +++ b/FluidSurface/Source/FluidSurface/Public/FluidSurfaceComponent.h @@ -1,42 +1,19 @@ #pragma once -#include "FluidSurfaceComponent.generated.h" +#include "CoreMinimal.h" +#include "UObject/ObjectMacros.h" -#define ROOT3OVER2 (0.866025f) -#define FLUIDBOXHEIGHT (5) +#include "GameFramework/Actor.h" -UENUM( ) -namespace EFluidGridType -{ - enum Type - { - FGT_Square = 0, - FGT_Hexagonal = 1, - FGT_MAX = 2, - }; -} - -/** Stores a range of values */ -USTRUCT( BlueprintType ) -struct FRangedValues -{ - GENERATED_USTRUCT_BODY( ); +#include "Components/MeshComponent.h" - /** Minimum value of range */ - UPROPERTY( EditAnywhere, BlueprintReadWrite, Category = "Range" ) - float MinValue; +#include "FluidSurfaceRender.h" - /** Maximum value of range */ - UPROPERTY( EditAnywhere, BlueprintReadWrite, Category = "Range" ) - float MaxValue; +#include "FluidSurfaceComponent.generated.h" - /** Get a random number from within the range */ - float GetRand( ) - { - return FMath::FRandRange( MinValue, MaxValue ); - } -}; +#define ROOT3OVER2 (0.866025f) +#define FLUIDBOXHEIGHT (5) UCLASS( ClassGroup = ( Rendering, Common ), HideCategories = ( Object, LOD, Physics, Activation, "Components|Activation" ), EditInLineNew, Meta = ( BlueprintSpawnableComponent ), ClassGroup = Rendering ) class UFluidSurfaceComponent : public UMeshComponent @@ -47,7 +24,6 @@ class UFluidSurfaceComponent : public UMeshComponent virtual FPrimitiveSceneProxy* CreateSceneProxy( ) override; virtual class UBodySetup* GetBodySetup( ) override; virtual void ReceiveComponentDamage( float DamageAmount, FDamageEvent const& DamageEvent, AController* EventInstigator, AActor* DamageCauser ) override; - virtual void CreatePhysicsState( ) override; /* End UPrimitiveComponent interface*/ /* Begin UMeshComponent interface */ @@ -77,7 +53,7 @@ class UFluidSurfaceComponent : public UMeshComponent /* Delegates */ UFUNCTION( ) - void ComponentTouched( AActor* Other, UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult& SweepResult ); + void ComponentBeginOverlap( UPrimitiveComponent* OverlappedComponent, AActor* OtherActor, UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult& SweepResult ); /** Color to use when displayed in wireframe */ FColor GetWireframeColor( ) const; @@ -206,7 +182,7 @@ class UFluidSurfaceComponent : public UMeshComponent int NumPLing; /** Render data */ - TScopedPointer RenderData; + TUniquePtr< class FFluidSurfaceRenderData > RenderData; /** Bounding box of the fluid surface */ FBox FluidBoundingBox; @@ -240,9 +216,6 @@ class UFluidSurfaceComponent : public UMeshComponent /* Update the physics body */ void UpdateBody( ); - /* Get World to Component transform */ - FORCEINLINE FTransform GetWorldToComponent( ) const { return FTransform( ComponentToWorld.ToMatrixWithScale( ).Inverse( ) ); } - /* Create the dynamic data that is sent to the render thread */ struct FFluidSurfaceDynamicData* CreateDynamicData( ); diff --git a/FluidSurface/Source/FluidSurface/Public/FluidSurfaceModifier.h b/FluidSurface/Source/FluidSurface/Public/FluidSurfaceModifier.h index 6a21136..99b3fa8 100644 --- a/FluidSurface/Source/FluidSurface/Public/FluidSurfaceModifier.h +++ b/FluidSurface/Source/FluidSurface/Public/FluidSurfaceModifier.h @@ -1,6 +1,11 @@ #pragma once +#include "CoreMinimal.h" +#include "UObject/ObjectMacros.h" + +#include "GameFramework/Actor.h" + #include "FluidSurfaceModifier.generated.h" /** Base class for Fluid Surface modifiers */ diff --git a/FluidSurface/Source/FluidSurface/Public/FluidSurfaceOscillator.h b/FluidSurface/Source/FluidSurface/Public/FluidSurfaceOscillator.h index 045283a..25eed0b 100644 --- a/FluidSurface/Source/FluidSurface/Public/FluidSurfaceOscillator.h +++ b/FluidSurface/Source/FluidSurface/Public/FluidSurfaceOscillator.h @@ -1,6 +1,11 @@ #pragma once +#include "CoreMinimal.h" +#include "UObject/ObjectMacros.h" + +#include "GameFramework/Actor.h" + #include "FluidSurfaceOscillator.generated.h" /** Fluid Surface modifier extension to perform oscillation */ diff --git a/FluidSurface/Source/FluidSurface/Public/FluidSurfaceRain.h b/FluidSurface/Source/FluidSurface/Public/FluidSurfaceRain.h index e752011..3315080 100644 --- a/FluidSurface/Source/FluidSurface/Public/FluidSurfaceRain.h +++ b/FluidSurface/Source/FluidSurface/Public/FluidSurfaceRain.h @@ -1,6 +1,11 @@ #pragma once +#include "CoreMinimal.h" +#include "UObject/ObjectMacros.h" + +#include "GameFramework/Actor.h" + #include "FluidSurfaceRain.generated.h" /** Example extension of the Fluid Surface Modifier, to simulate rain falling */ diff --git a/FluidSurface/Source/FluidSurfaceEngine/FluidSurfaceEngine.Build.cs b/FluidSurface/Source/FluidSurfaceEngine/FluidSurfaceEngine.Build.cs index 2816e02..9f4f79e 100644 --- a/FluidSurface/Source/FluidSurfaceEngine/FluidSurfaceEngine.Build.cs +++ b/FluidSurface/Source/FluidSurfaceEngine/FluidSurfaceEngine.Build.cs @@ -1,28 +1,26 @@ -// Copyright 1998-2014 Epic Games, Inc. All Rights Reserved. +// Copyright 1998-2018 Epic Games, Inc. All Rights Reserved. +using UnrealBuildTool; -namespace UnrealBuildTool.Rules +public class FluidSurfaceEngine : ModuleRules { - public class FluidSurfaceEngine : ModuleRules + public FluidSurfaceEngine(ReadOnlyTargetRules Target) : base(Target) { - public FluidSurfaceEngine(TargetInfo Target) - { - PrivateIncludePaths.AddRange( - new string[] { - "FluidSurfaceEngine/Private" - } - ); + PrivateIncludePaths.AddRange( + new string[] { + "FluidSurfaceEngine/Private" + } + ); - PublicDependencyModuleNames.AddRange( - new string[] - { - "Core", - "CoreUObject", - "Engine", - "RenderCore", - "ShaderCore", - "RHI" - } - ); - } + PublicDependencyModuleNames.AddRange( + new string[] + { + "Core", + "CoreUObject", + "Engine", + "RenderCore", + "ShaderCore", + "RHI" + } + ); } } \ No newline at end of file diff --git a/FluidSurface/Source/FluidSurfaceEngine/Private/FluidSurfaceEngine.cpp b/FluidSurface/Source/FluidSurfaceEngine/Private/FluidSurfaceEngine.cpp index 7b5ece6..d1fdc2d 100644 --- a/FluidSurface/Source/FluidSurfaceEngine/Private/FluidSurfaceEngine.cpp +++ b/FluidSurface/Source/FluidSurfaceEngine/Private/FluidSurfaceEngine.cpp @@ -1,9 +1,26 @@ -#include "FluidSurfaceEnginePrivatePCH.h" +#include "FluidSurfaceEngine.h" #include "ShaderParameterUtils.h" #include "RHIStaticStates.h" +/** Fluid Surface triangles stat */ +DEFINE_STAT( STAT_FluidSurfaceTriangles ); + +IMPLEMENT_MODULE( FFluidSurfaceEngine, FluidSurfaceEngine ) + +void FFluidSurfaceEngine::StartupModule( ) +{ + // This code will execute after your module is loaded into memory (but after global variables are initialized, of course.) +} + + +void FFluidSurfaceEngine::ShutdownModule( ) +{ + // This function may be called during shutdown to clean up your module. For modules that support dynamic reloading, + // we call this function before unloading the module. +} + IMPLEMENT_UNIFORM_BUFFER_STRUCT( FFluidSurfaceParameters, TEXT( "FluidSurfaceParams" ) ) IMPLEMENT_UNIFORM_BUFFER_STRUCT( FFluidSurfaceFrameParameters, TEXT( "FluidSurfaceFrameParams" ) ) @@ -51,13 +68,11 @@ void FFluidSurfaceVertexFactoryShaderParameters::SetMesh( FRHICommandList& RHICm } } -/** Vertex Factory */ - void FFluidSurfaceVertexFactory::Init( const FFluidSurfaceVertexBuffer* VertexBuffer ) { if( IsInRenderingThread( ) ) { - DataType NewData; + FDataType NewData; NewData.PositionComponent = STRUCTMEMBER_VERTEXSTREAMCOMPONENT( VertexBuffer, FFluidSurfaceVertex, Position, VET_Float3 ); NewData.TextureCoordinates.Add( FVertexStreamComponent( VertexBuffer, STRUCT_OFFSET( FFluidSurfaceVertex, TextureCoordinate ), sizeof( FFluidSurfaceVertex ), VET_Float2 ) ); NewData.TangentBasisComponents[ 0 ] = STRUCTMEMBER_VERTEXSTREAMCOMPONENT( VertexBuffer, FFluidSurfaceVertex, Tangent, VET_Float3 ); @@ -73,7 +88,7 @@ void FFluidSurfaceVertexFactory::Init( const FFluidSurfaceVertexBuffer* VertexBu const FFluidSurfaceVertexBuffer*, VertexBuffer, VertexBuffer, { // Initialize the vertex factory's stream components - DataType NewData; + FDataType NewData; NewData.PositionComponent = STRUCTMEMBER_VERTEXSTREAMCOMPONENT( VertexBuffer, FFluidSurfaceVertex, Position, VET_Float3 ); NewData.TextureCoordinates.Add( FVertexStreamComponent( VertexBuffer, STRUCT_OFFSET( FFluidSurfaceVertex, TextureCoordinate ), sizeof( FFluidSurfaceVertex ), VET_Float2 ) ); NewData.TangentBasisComponents[ 0 ] = STRUCTMEMBER_VERTEXSTREAMCOMPONENT( VertexBuffer, FFluidSurfaceVertex, Tangent, VET_Float3 ); @@ -101,7 +116,7 @@ void FFluidSurfaceVertexFactory::Copy( const FFluidSurfaceVertexFactory& Other ) ENQUEUE_UNIQUE_RENDER_COMMAND_TWOPARAMETER( FFluidSurfaceVertexFactoryCopyData, FFluidSurfaceVertexFactory*, VertexFactory, this, - const DataType*, DataCopy, &Other.Data, + const FDataType*, DataCopy, &Other.Data, { VertexFactory->Data = *DataCopy; } ); @@ -117,8 +132,7 @@ FVertexFactoryShaderParameters* FFluidSurfaceVertexFactory::ConstructShaderParam return NULL; } -IMPLEMENT_VERTEX_FACTORY_TYPE( FFluidSurfaceVertexFactory, "FluidSurfaceVertexFactory", true, true, true, true, false ); - +IMPLEMENT_VERTEX_FACTORY_TYPE( FFluidSurfaceVertexFactory, "/Engine/Private/FluidSurfaceVertexFactory.ush", true, true, true, true, false ); /** Compute Shader */ FFluidSurfaceCS::FFluidSurfaceCS( const ShaderMetaType::CompiledShaderInitializerType& Initializer ) @@ -131,9 +145,9 @@ FFluidSurfaceCS::FFluidSurfaceCS( const ShaderMetaType::CompiledShaderInitialize } /* Sets flags to use during compilation of this shader */ -void FFluidSurfaceCS::ModifyCompilationEnvironment( EShaderPlatform Platform, FShaderCompilerEnvironment& OutEnvironment ) +void FFluidSurfaceCS::ModifyCompilationEnvironment( const FGlobalShaderPermutationParameters& Parameters, FShaderCompilerEnvironment& OutEnvironment ) { - FGlobalShader::ModifyCompilationEnvironment( Platform, OutEnvironment ); + FGlobalShader::ModifyCompilationEnvironment( Parameters, OutEnvironment ); OutEnvironment.CompilerFlags.Add( CFLAG_StandardOptimization ); } @@ -194,10 +208,4 @@ void FFluidSurfaceCS::UnbindBuffers( FRHICommandList& RHICmdList ) RHICmdList.SetShaderResourceViewParameter( ComputeShaderRHI, InFluidPLingBuffer.GetBaseIndex( ), FShaderResourceViewRHIRef( ) ); } -IMPLEMENT_SHADER_TYPE( , FFluidSurfaceCS, TEXT( "FluidSurfaceShader" ), TEXT( "ComputeFluidSurface" ), SF_Compute ); - -/** Fluid Surface triangles stat */ -DEFINE_STAT( STAT_FluidSurfaceTriangles ); - -class FFluidSurfaceEngine : public FDefaultModuleImpl {}; -IMPLEMENT_MODULE(FFluidSurfaceEngine, FluidSurfaceEngine) +IMPLEMENT_SHADER_TYPE( , FFluidSurfaceCS, TEXT( "/Engine/Private/FluidSurfaceShader.usf" ), TEXT( "ComputeFluidSurface" ), SF_Compute ); \ No newline at end of file diff --git a/FluidSurface/Source/FluidSurfaceEngine/Private/FluidSurfaceEnginePrivatePCH.h b/FluidSurface/Source/FluidSurfaceEngine/Private/FluidSurfaceEnginePrivatePCH.h deleted file mode 100644 index 810b84c..0000000 --- a/FluidSurface/Source/FluidSurfaceEngine/Private/FluidSurfaceEnginePrivatePCH.h +++ /dev/null @@ -1,6 +0,0 @@ -// Copyright 1998-2014 Epic Games, Inc. All Rights Reserved. - -#include "CoreUObject.h" -#include "Engine.h" - -#include "FluidSurfaceEngine.h" diff --git a/FluidSurface/Source/FluidSurfaceEngine/Public/FluidSurfaceEngine.h b/FluidSurface/Source/FluidSurfaceEngine/Public/FluidSurfaceEngine.h index c4f5fb9..7f490da 100644 --- a/FluidSurface/Source/FluidSurfaceEngine/Public/FluidSurfaceEngine.h +++ b/FluidSurface/Source/FluidSurfaceEngine/Public/FluidSurfaceEngine.h @@ -1,12 +1,27 @@ #pragma once +#include "ModuleManager.h" + +#include "Shader.h" #include "GlobalShader.h" #include "UniformBuffer.h" +#include "SimpleElementShaders.h" +#include "ShaderParameterUtils.h" +#include "PipelineStateCache.h" #include "RHICommandList.h" +#include "VertexFactory.h" +#include "LocalVertexFactory.h" + DECLARE_DWORD_COUNTER_STAT_EXTERN( TEXT( "Fluid Surface Tris" ), STAT_FluidSurfaceTriangles, STATGROUP_Engine, FLUIDSURFACEENGINE_API ); +class FFluidSurfaceEngine : public IModuleInterface +{ + /** IModuleInterface implementation */ + virtual void StartupModule( ) override; + virtual void ShutdownModule( ) override; +}; /** Vertex */ struct FFluidSurfaceVertex @@ -113,7 +128,14 @@ class FLUIDSURFACEENGINE_API FFluidSurfaceVertexFactory : public FLocalVertexFac public: /** Default constructor */ - FFluidSurfaceVertexFactory( ) {} + FFluidSurfaceVertexFactory( ) + : FLocalVertexFactory( ERHIFeatureLevel::SM4, "FluidSurfaceVertexFactory", nullptr ) + {} + + /** Default constructor */ + FFluidSurfaceVertexFactory( ERHIFeatureLevel::Type InFeatureLevel, const char* InDebugName, const FStaticMeshDataType* InStaticMeshDataType = nullptr ) + : FLocalVertexFactory( InFeatureLevel, InDebugName, InStaticMeshDataType ) + {} /** Initialization */ void Init( const FFluidSurfaceVertexBuffer* VertexBuffer ); @@ -176,8 +198,13 @@ class FLUIDSURFACEENGINE_API FFluidSurfaceCS : public FGlobalShader /** Cache only when using SM5 */ static bool ShouldCache( EShaderPlatform Platform ) { return IsFeatureLevelSupported( Platform, ERHIFeatureLevel::SM5 ); } + static bool ShouldCompilePermutation( const FGlobalShaderPermutationParameters& Parameters ) + { + return IsFeatureLevelSupported( Parameters.Platform, ERHIFeatureLevel::SM4 ); + } + /** Modify compilation environment */ - static void ModifyCompilationEnvironment( EShaderPlatform Platform, FShaderCompilerEnvironment& OutEnvironment ); + static void ModifyCompilationEnvironment( const FGlobalShaderPermutationParameters& Parameters, FShaderCompilerEnvironment& OutEnvironment ); /** Serialization */ virtual bool Serialize( FArchive& Ar ) override diff --git a/README.md b/README.md index 3d151b5..ac47ce2 100644 --- a/README.md +++ b/README.md @@ -14,6 +14,8 @@ Installation Version History --------------- +__0.1.4-dev__ Very _rough_ update from [Trent Polack](https://github.com/trentpolack) to bring the plugin up to UE 4.19 building/deployment standards (still needs shader work): https://github.com/trentpolack/FluidSurface + __0.1.3__ Update for 4.10 base on DamirH's modification __0.1.2__ Update for 4.8 diff --git a/Shaders/FluidSurfaceShader.usf b/Shaders/FluidSurfaceShader.usf index 535f9ea..c4f5c8d 100644 --- a/Shaders/FluidSurfaceShader.usf +++ b/Shaders/FluidSurfaceShader.usf @@ -4,7 +4,7 @@ FluidSurfaceShader.usf: Shader to compute fluid surfaces. ==============================================================================*/ -#include "Common.usf" +#include "Common.ush" /** diff --git a/Shaders/FluidSurfaceVertexFactory.usf b/Shaders/FluidSurfaceVertexFactory.ush similarity index 99% rename from Shaders/FluidSurfaceVertexFactory.usf rename to Shaders/FluidSurfaceVertexFactory.ush index fa7b9bd..430a634 100644 --- a/Shaders/FluidSurfaceVertexFactory.usf +++ b/Shaders/FluidSurfaceVertexFactory.ush @@ -4,8 +4,8 @@ FluidSurfaceVertexFactory.usf: Local vertex factory shader code. =============================================================================*/ -#include "VertexFactoryCommon.usf" -#include "FluidSurfaceVertexFactoryCommon.usf" +#include "VertexFactoryCommon.ush" +#include "FluidSurfaceVertexFactoryCommon.ush" #if USE_FLUIDSURFACE Texture2D FluidTexture; diff --git a/Shaders/FluidSurfaceVertexFactoryCommon.usf b/Shaders/FluidSurfaceVertexFactoryCommon.ush similarity index 100% rename from Shaders/FluidSurfaceVertexFactoryCommon.usf rename to Shaders/FluidSurfaceVertexFactoryCommon.ush