300 lines
11 KiB
Ucode
300 lines
11 KiB
Ucode
|
/**
|
||
|
* Copyright 1998-2013 Epic Games, Inc. All Rights Reserved.
|
||
|
*/
|
||
|
|
||
|
/**
|
||
|
* Utility component for drawing an interactive body of fluid.
|
||
|
* Origin is at the component location.
|
||
|
*/
|
||
|
class FluidSurfaceComponent extends PrimitiveComponent
|
||
|
native(Fluid)
|
||
|
AutoExpandCategories(FluidSurfaceComponent,Fluid,FluidDetail)
|
||
|
hidecategories(Object)
|
||
|
dependson(LightmassPrimitiveSettingsObject)
|
||
|
editinlinenew;
|
||
|
|
||
|
/** Surface material */
|
||
|
var() materialinterface FluidMaterial;
|
||
|
|
||
|
/** Resolution of the fluid's texture lightmap. */
|
||
|
var(Lighting) int LightmapResolution;
|
||
|
|
||
|
/** The Lightmass settings for this object. */
|
||
|
var(Lightmass) LightmassPrimitiveSettings LightmassSettings <ScriptOrder=true>;
|
||
|
|
||
|
/** Whether the vertex positions in the simulation grid should be animated or not */
|
||
|
var(Fluid) bool EnableSimulation;
|
||
|
|
||
|
/** Number of quads in the simulated grid (along the X-axis) */
|
||
|
var(Fluid) int SimulationQuadsX;
|
||
|
|
||
|
/** Number of quads in the simulated grid (along the Y-axis) */
|
||
|
var(Fluid) int SimulationQuadsY;
|
||
|
|
||
|
/** The size of a grid cell in the vertex simulation (in world space units) */
|
||
|
var(Fluid) float GridSpacing;
|
||
|
|
||
|
/** Fluids automatically draw a low-resolution grid when they are deactivated. A reasonable value is needed for vertex fogging to work when the fluid is translucent. A maximum of 65000 vertices are allowed before GridSpacingLowRes is clamped. */
|
||
|
var(Fluid) float GridSpacingLowRes;
|
||
|
|
||
|
/** Target actor which the simulation grid will center around. If none is provided, the simulation grid will center around the active camera. */
|
||
|
var(Fluid) actor TargetSimulation;
|
||
|
|
||
|
/** How much the GPU should tessellate the fluid grid. (Only used on platforms that completely supports GPU tessellation.) */
|
||
|
var(Fluid) float GPUTessellationFactor;
|
||
|
|
||
|
/** How much to dampen the amplitude of waves in the fluid (0.0-30.0) */
|
||
|
var(Fluid) float FluidDamping;
|
||
|
|
||
|
/** Wave travel speed factor for the simulation grid (0.0-1.0) */
|
||
|
var(Fluid) float FluidTravelSpeed;
|
||
|
|
||
|
/** Wave height scale - higher value produces higher waves */
|
||
|
var(Fluid) float FluidHeightScale;
|
||
|
|
||
|
/** Fluid update rate in number of updates per second */
|
||
|
var(Fluid) float FluidUpdateRate;
|
||
|
|
||
|
/** How much ripple to make when fluid is hit by a weapon or touched by a object for the first time. */
|
||
|
var(Fluid) float ForceImpact;
|
||
|
|
||
|
/** How much ripple to make when an Actor moves through the fluid. */
|
||
|
var(Fluid) float ForceContinuous;
|
||
|
|
||
|
/** Increasing this value adds more contrast to the lighting by exaggerating the curvature for the fluid normals. */
|
||
|
var(Fluid) float LightingContrast;
|
||
|
|
||
|
/** Target actor which the detail texture will center around. If none is provided, the detail texture will center around the active camera. */
|
||
|
var(Fluid) actor TargetDetail;
|
||
|
|
||
|
/** Whether the detail simulation grid should be used or not */
|
||
|
var(Fluid) bool EnableDetail;
|
||
|
|
||
|
/** Distance between the camera and the closest fluid edge where the fluid will deactivate and start rendering as a simple flat quad. */
|
||
|
var(Fluid) float DeactivationDistance;
|
||
|
|
||
|
/** Number of simulation cells along each axis in the detail texture */
|
||
|
var(FluidDetail) int DetailResolution;
|
||
|
|
||
|
/** World space size of one edge of the detail texture */
|
||
|
var(FluidDetail) float DetailSize;
|
||
|
|
||
|
/** How much to dampen the amplitude of waves in the detail texture (0.0-30.0) */
|
||
|
var(FluidDetail) float DetailDamping;
|
||
|
|
||
|
/** Wave travel speed factor for the detail texture (0.0-1.0) */
|
||
|
var(FluidDetail) float DetailTravelSpeed;
|
||
|
|
||
|
/** How much of an applied force should be transferred to the detail texture (0.0-1.0) */
|
||
|
var(FluidDetail) float DetailTransfer;
|
||
|
|
||
|
/** Wave height scale for the detail texture - higher value produces higher waves */
|
||
|
var(FluidDetail) float DetailHeightScale;
|
||
|
|
||
|
/** Fluid update rate in number of updates per second */
|
||
|
var(FluidDetail) float DetailUpdateRate;
|
||
|
|
||
|
/** Whether to make the detail simulation tiled. */
|
||
|
var(FluidDetail) bool bTiling;
|
||
|
|
||
|
/** Whether to update the fluid or pause it */
|
||
|
var(FluidDebug) transient bool bPause;
|
||
|
|
||
|
/** Whether to render lines for normals */
|
||
|
var(FluidDebug) transient bool bShowSimulationNormals;
|
||
|
|
||
|
/** Whether to visualize the placement of the simulated grid */
|
||
|
var(FluidDebug) bool bShowSimulationPosition;
|
||
|
|
||
|
/** The length of the visualized normals, when bShowSimulationNormals is turned on */
|
||
|
var(FluidDebug) float NormalLength;
|
||
|
|
||
|
/** Whether to render an overlay of the detail normal for debugging */
|
||
|
var(FluidDebug) bool bShowDetailNormals;
|
||
|
|
||
|
/** Whether to visualize the placement of the detail texture */
|
||
|
var(FluidDebug) bool bShowDetailPosition;
|
||
|
|
||
|
/** Whether to visualize the height of the main fluid grid */
|
||
|
var(FluidDebug) transient bool bShowFluidSimulation;
|
||
|
|
||
|
/** Whether to show the detail normalmap on the fluid */
|
||
|
var(FluidDebug) transient bool bShowFluidDetail;
|
||
|
|
||
|
/** Whether to enable a force for debugging */
|
||
|
var(FluidDebug) bool bTestRipple;
|
||
|
|
||
|
/** Whether the test ripple should center on the detail texture or the main grid. */
|
||
|
var(FluidDebug) bool bTestRippleCenterOnDetail;
|
||
|
|
||
|
/** Angular speed of the test ripple */
|
||
|
var(FluidDebug) float TestRippleSpeed;
|
||
|
|
||
|
/** Number of seconds between each pling on the test ripple. 0 makes it continuous. */
|
||
|
var(FluidDebug) float TestRippleFrequency;
|
||
|
|
||
|
/** Radius of the test ripple, in world space */
|
||
|
var(FluidDebug) float TestRippleRadius;
|
||
|
|
||
|
var private float FluidWidth;
|
||
|
var private float FluidHeight;
|
||
|
var private native transient float TestRippleTime;
|
||
|
var private native transient float TestRippleAngle;
|
||
|
var private native transient float DeactivationTimer;
|
||
|
var private native transient float ViewDistance;
|
||
|
var private native transient vector SimulationPosition;
|
||
|
var private native transient vector DetailPosition;
|
||
|
|
||
|
/** Stores a 1 for each clamped vertex that should not be simulated, and a 0 for each vertex that should be simulated. */
|
||
|
var const array<byte> ClampMap;
|
||
|
|
||
|
var private const array<ShadowMap2D> ShadowMaps;
|
||
|
|
||
|
/** Reference to the texture lightmap resource. */
|
||
|
var native private const LightMapRef LightMap;
|
||
|
|
||
|
/** All transient member variables are contained inside the FFluidSurfaceInfo object. */
|
||
|
var private native transient const pointer FluidSimulation{class FFluidSimulation};
|
||
|
|
||
|
/** Apply a force to the fluid. */
|
||
|
native final function ApplyForce( vector WorldPos, float Strength, float Radius, optional bool bImpulse );
|
||
|
|
||
|
/** Set the position of the origin of the detail texture, within the fluid. */
|
||
|
native final function SetDetailPosition( vector WorldPos );
|
||
|
|
||
|
/** Set the position of the origin of the simulation grid, within the fluid. */
|
||
|
native final function SetSimulationPosition( vector WorldPos );
|
||
|
|
||
|
cpptext
|
||
|
{
|
||
|
public:
|
||
|
UFluidSurfaceComponent();
|
||
|
|
||
|
UMaterialInterface* GetMaterial() const;
|
||
|
FMaterialViewRelevance GetMaterialViewRelevance() const;
|
||
|
const class FFluidGPUResource* GetFluidGPUResource() const;
|
||
|
void InitResources( UBOOL bActive );
|
||
|
void ReleaseResources( UBOOL bBlockOnRelease );
|
||
|
void RebuildClampMap();
|
||
|
void OnScaleChange();
|
||
|
|
||
|
// Base class interfaces.
|
||
|
virtual FPrimitiveSceneProxy* CreateSceneProxy();
|
||
|
virtual void Serialize(FArchive& Ar);
|
||
|
virtual void AddReferencedObjects(TArray<UObject*>& ObjectArray);
|
||
|
virtual void UpdateBounds();
|
||
|
virtual void Attach();
|
||
|
virtual void Detach( UBOOL bWillReattach );
|
||
|
virtual void PreEditChange(UProperty* PropertyAboutToChange);
|
||
|
virtual void PostEditChangeProperty(FPropertyChangedEvent& PropertyChangedEvent);
|
||
|
virtual void BeginDestroy();
|
||
|
virtual UBOOL IsReadyForFinishDestroy();
|
||
|
virtual void FinishDestroy();
|
||
|
virtual void Tick(FLOAT DeltaTime);
|
||
|
virtual UBOOL LineCheck(FCheckResult& Result, const FVector& End, const FVector& Start, const FVector& Extent, DWORD TraceFlags);
|
||
|
virtual UBOOL PointCheck(FCheckResult& Result,const FVector& Location,const FVector& Extent,DWORD TraceFlags);
|
||
|
virtual void InvalidateLightingCache();
|
||
|
|
||
|
/**
|
||
|
* Retrieves the materials used in this component
|
||
|
*
|
||
|
* @param OutMaterials The list of used materials.
|
||
|
*/
|
||
|
virtual void GetUsedMaterials( TArray<UMaterialInterface*>& OutMaterials ) const;
|
||
|
|
||
|
/**
|
||
|
* Returns the lightmap resolution used for this primivite instnace in the case of it supporting texture light/ shadow maps.
|
||
|
* 0 if not supported or no static shadowing.
|
||
|
*
|
||
|
* @param Width [out] Width of light/shadow map
|
||
|
* @param Height [out] Height of light/shadow map
|
||
|
*
|
||
|
* @return UBOOL TRUE if LightMap values are padded, FALSE if not
|
||
|
*/
|
||
|
virtual UBOOL GetLightMapResolution( INT& Width, INT& Height ) const;
|
||
|
virtual INT GetStaticLightMapResolution() const;
|
||
|
virtual void GetLightAndShadowMapMemoryUsage( INT& LightMapMemoryUsage, INT& ShadowMapMemoryUsage ) const;
|
||
|
virtual void GetStaticLightingInfo(FStaticLightingPrimitiveInfo& OutPrimitiveInfo,const TArray<ULightComponent*>& InRelevantLights,const FLightingBuildOptions& Options);
|
||
|
virtual ELightMapInteractionType GetStaticLightingType() const { return LMIT_Texture; }
|
||
|
/** Gets the emissive boost for the primitive component. */
|
||
|
virtual FLOAT GetEmissiveBoost(INT ElementIndex) const;
|
||
|
/** Gets the diffuse boost for the primitive component. */
|
||
|
virtual FLOAT GetDiffuseBoost(INT ElementIndex) const;
|
||
|
/** Gets the specular boost for the primitive component. */
|
||
|
virtual FLOAT GetSpecularBoost(INT ElementIndex) const;
|
||
|
virtual void GetStreamingTextureInfo(TArray<FStreamingTexturePrimitiveInfo>& OutStreamingTextures) const;
|
||
|
|
||
|
private:
|
||
|
UBOOL PropertyNeedsResourceRecreation(UProperty* Property);
|
||
|
void UpdateMemory(FLOAT DeltaTime);
|
||
|
|
||
|
/**
|
||
|
* Calculates the distance from the fluid's edge to the specified position.
|
||
|
* @param WorldPosition A world-space position to measure the distance to.
|
||
|
* @return Distance from the fluid's edge to the specified position, or 0 if it's inside the fluid.
|
||
|
*/
|
||
|
FLOAT CalcDistance( const FVector& WorldPosition );
|
||
|
}
|
||
|
|
||
|
defaultproperties
|
||
|
{
|
||
|
LightmapResolution=128
|
||
|
EnableSimulation=true
|
||
|
EnableDetail=true
|
||
|
DeactivationDistance=3000.0
|
||
|
FluidUpdateRate=30.0
|
||
|
DetailUpdateRate=30.0
|
||
|
bTiling=false
|
||
|
FluidHeightScale=1.0
|
||
|
DetailHeightScale=1.0
|
||
|
bPause=false
|
||
|
SimulationQuadsX=200
|
||
|
SimulationQuadsY=200
|
||
|
GridSpacing=10.0
|
||
|
GridSpacingLowRes=800.0
|
||
|
DetailResolution=256
|
||
|
DetailSize=500
|
||
|
FluidDamping=1.0
|
||
|
FluidTravelSpeed=1.0
|
||
|
DetailDamping=1.0
|
||
|
DetailTravelSpeed=1.0
|
||
|
DetailTransfer=0.5
|
||
|
bTestRipple=false
|
||
|
TestRippleSpeed=1
|
||
|
TestRippleRadius=30
|
||
|
TestRippleFrequency=1.0
|
||
|
bShowFluidDetail=true
|
||
|
bShowFluidSimulation=true
|
||
|
bShowDetailNormals=false
|
||
|
bShowDetailPosition=false
|
||
|
bShowSimulationNormals=false
|
||
|
bShowSimulationPosition=false
|
||
|
NormalLength=10.0
|
||
|
LightingContrast=1.0
|
||
|
GPUTessellationFactor=1.0
|
||
|
|
||
|
ForceImpact=-3.0
|
||
|
ForceContinuous=-200.0
|
||
|
|
||
|
FluidWidth=2000.0
|
||
|
FluidHeight=2000.0
|
||
|
TestRippleTime=0.0
|
||
|
TestRippleAngle=0.0
|
||
|
DeactivationTimer=10.0
|
||
|
ViewDistance=0.0
|
||
|
|
||
|
bTickInEditor=true
|
||
|
CollideActors=true
|
||
|
BlockZeroExtent=true
|
||
|
BlockNonZeroExtent=true
|
||
|
BlockRigidBody=false
|
||
|
|
||
|
CastShadow=false
|
||
|
bForceDirectLightMap=true
|
||
|
bAcceptsLights=true
|
||
|
bUsePrecomputedShadows=true
|
||
|
|
||
|
// Fluid surfaces often have expensive vertex shaders so we want to make sure they get occlusion queried
|
||
|
bIgnoreNearPlaneIntersection=true
|
||
|
}
|