/**
 * Copyright 1998-2013 Epic Games, Inc. All Rights Reserved.
 *
 * Used to affect reverb settings in the game and editor.
 */
class ReverbVolume extends Volume
	native
	placeable
	dontsortcategories(ReverbVolume)
	hidecategories(Advanced, Attachment, Collision, Volume, Toggle);

/**
 * Indicates a reverb preset to use.
 */
enum ReverbPreset
{
    REVERB_Default,
    REVERB_Bathroom,
    REVERB_StoneRoom,
    REVERB_Auditorium,
    REVERB_ConcertHall,
    REVERB_Cave,
    REVERB_Hallway,
    REVERB_StoneCorridor,
    REVERB_Alley,
    REVERB_Forest,
    REVERB_City,
    REVERB_Mountains,
    REVERB_Quarry,
    REVERB_Plain,
    REVERB_ParkingLot,
    REVERB_SewerPipe,
    REVERB_Underwater,
    REVERB_SmallRoom,
    REVERB_MediumRoom,
    REVERB_LargeRoom,
    REVERB_MediumHall,
    REVERB_LargeHall,
    REVERB_Plate,
};

/** Struct encapsulating settings for reverb effects. */
struct native ReverbSettings
{
	var() bool			bApplyReverb<ToolTip=Whether to apply the reverb settings below>;

	/** The reverb preset to employ. */
	var() ReverbPreset	ReverbType;

	/** Volume level of the reverb affect. */
	var() float			Volume;

	/** Time to fade from the current reverb settings into this setting, in seconds. */
	var() float			FadeTime;

	structdefaultproperties
	{
		bApplyReverb=true
		ReverbType=REVERB_Default
		Volume=0.5
		FadeTime=2.0
	}
};

/** Struct encapsulating settings for interior areas. */
//@warning: manually mirrored in UnActorComponent.h
struct InteriorSettings
{
	var	  bool			bIsWorldInfo;

	var() float			ExteriorVolume;
	var() float			ExteriorTime;

	var() float			ExteriorLPF;
	var() float			ExteriorLPFTime;

	var() float			InteriorVolume;
	var() float			InteriorTime;

	var() float			InteriorLPF;
	var() float			InteriorLPFTime;

	structdefaultproperties
	{
		bIsWorldInfo=false
		ExteriorVolume=1.0f
		ExteriorTime=0.5f
		InteriorVolume=1.0f
		InteriorTime=0.5f
		ExteriorLPF=1.0f
		ExteriorLPFTime=0.5f
		InteriorLPF=1.0f
		InteriorLPFTime=0.5f
	}
};

/**
 * Priority of this volume. In the case of overlapping volumes the one with the highest priority
 * is chosen. The order is undefined if two or more overlapping volumes have the same priority.
 */
var() float Priority;
/** whether this volume is currently enabled and able to affect sounds */
var(Toggle) bool bEnabled;

/** Reverb settings to use for this volume. */
var(UAudio) ReverbSettings Settings;
/** Interior settings used for this volume */
var(UAudio) InteriorSettings AmbientZoneSettings;

/** Next volume in linked listed, sorted by priority in descending order. */
var const noimport transient ReverbVolume NextLowerPriorityVolume;

cpptext
{
	/**
	 * Removes the reverb volume to world info's list of reverb volumes.
	 */
	virtual void ClearComponents();

	/**
	 * callback for changed property
	 */
	virtual void PostEditChangeProperty(FPropertyChangedEvent& PropertyChangedEvent);

#if __TW_WWISE_
    /**
     * applies reverb settings to active AkComponents
     */
	virtual void SetEnvironmentalEffects(){}

    /**
     * returns name of associated environment
     */
	virtual FName GetEnvironmentName(){ return NAME_None; }

	/**
	 * returns scalar for occlusion within same volume
	 */
	virtual float GetIntraVolumeOcclusionScalar(){ return 1.f; }
#endif // __TW_WWISE_

protected:
	/**
	 * Adds the reverb volume to world info's list of reverb volumes.
	 */
	virtual void UpdateComponentsInternal( UBOOL bCollisionUpdate = FALSE );
public:
}

replication
{
	if (bNetDirty)
		bEnabled;
}

`if(`__TW_WWISE_)
// Implemented in subclasses
simulated function float GetEnvironmentEchoDistance(){return 2500.0;} // 25 meters
`endif //__TW_WWISE_

defaultproperties
{
	Begin Object Name=BrushComponent0
		CollideActors=False
		BlockActors=False
		BlockZeroExtent=False
		BlockNonZeroExtent=False
		BlockRigidBody=False
	End Object

	bColored=True
	BrushColor=(R=255,G=255,B=0,A=255)

	bEnabled=true
	bCollideActors=False
	bBlockActors=False
	bProjTarget=False
	SupportedEvents.Empty
	SupportedEvents(0)=class'SeqEvent_Touch'
}
