/**
 * Copyright 1998-2013 Epic Games, Inc. All Rights Reserved.
 */
class StaticMeshComponent extends MeshComponent
	native(Mesh)
	noexport
	hidecategories(Object)
	dependson(LightmassPrimitiveSettingsObject)
	editinlinenew;


/** If 0, auto-select LOD level. if >0, force to (ForcedLodModel-1). */
var() int		ForcedLodModel;
var int			PreviousLODLevel; // Previous LOD level

var() const StaticMesh StaticMesh;
var() Color WireframeColor;

/**
 *	Ignore this instance of this static mesh when calculating streaming information.
 *	This can be useful when doing things like applying character textures to static geometry,
 *	to avoid them using distance-based streaming.
 */
var()	bool	bIgnoreInstanceForTextureStreaming;

/** Deprecated. Replaced by 'bOverrideLightMapRes'. */
var deprecated const bool bOverrideLightMapResolution;

`if(`__TW_LIGHTING_MODIFICATIONS_)
/** Auto-generated lightmap resolution based on mesh bounds */
var() const editconst int LightMapRes;
`endif

/** Whether to override the lightmap resolution defined in the static mesh. */
var() const bool bOverrideLightMapRes;

/** Deprecated. Replaced by 'OverriddenLightMapRes'. */
var deprecated const int OverriddenLightMapResolution;

/** Light map resolution used if bOverrideLightMapRes is TRUE */
var() const int	 OverriddenLightMapRes;

`if(`__TW_PERSISTENT_SPLATTER_SYSTEM_)
/** Auto-generated splattermap resolution based on mesh bounds */
var(PersistentSplats) const editconst int	 SplatterMapRes;
/** Whether to override the auto-generated splattermap resolution */
var(PersistentSplats) const bool bOverrideSplatterMapRes;
/** Light map resolution used if bOverrideSplatterMapRes is TRUE */
var(PersistentSplats) const int	 OverriddenSplatterMapRes;
`endif

/** With the default value of 0, the LODMaxRange from the UStaticMesh will be used to control LOD transitions, otherwise this value overrides. */
var() float OverriddenLODMaxRange;

/**
 * Allows adjusting the desired streaming distance of streaming textures that uses UV 0.
 * 1.0 is the default, whereas a higher value makes the textures stream in sooner from far away.
 * A lower value (0.0-1.0) makes the textures stream in later (you have to be closer).
 */
var()	float	StreamingDistanceMultiplier;

/** Subdivision step size for static vertex lighting.				*/
var const int	SubDivisionStepSize;
/** Whether to use subdivisions or just the triangle's vertices.	*/
var const bool bUseSubDivisions;
/** if True then decals will always use the fast path and will be treated as static wrt this mesh */
var const transient bool bForceStaticDecals;
/** Whether or not we can highlight selected sections - this should really only be done in the editor */
var transient bool bCanHighlightSelectedSections;

/** Whether or not to use the optional simple lightmap modification texture */
var(MobileSettings) bool bUseSimpleLightmapModifications;

enum ELightmapModificationFunction
{
	/** Lightmap.RGB * Modification.RGB */
	MLMF_Modulate,
	/** Lightmap.RGB * (Modification.RGB * Modification.A) */
	MLMF_ModulateAlpha,
};

/** The texture to use when modifying the simple lightmap texture */
var(MobileSettings) editoronly texture SimpleLightmapModificationTexture <EditCondition=bUseSimpleLightmapModifications>;

/** The function to use when modifying the simple lightmap texture */
var(MobileSettings) ELightmapModificationFunction SimpleLightmapModificationFunction <EditCondition=bUseSimpleLightmapModifications>;

/** Never become dynamic, even if my mesh has bCanBecomeDynamic=true */
var(Physics) bool bNeverBecomeDynamic;

`if(`__TW_)
/** (Advanded) Overrides StaticMesh's 'IgnoreForVisibilityCollision' flag and respects RBCollideWithChannels. */
var(Collision) const bool bOverrideVisibilityCollision<DisplayName=ForceVisibilityCollision>;
`endif

var const array<Guid>	IrrelevantLights;

/** Cached vertex information at the time the mesh was painted. */
struct PaintedVertex
{
	var vector Position;
	var packednormal Normal;
	var color Color;
};

struct StaticMeshComponentLODInfo
{
	var private const array<ShadowMap2D> ShadowMaps;
	var private const array<Object> ShadowVertexBuffers;
	var native private const pointer LightMap{FLightMap};

	/** Vertex colors to use for this mesh LOD */
	var private native const pointer OverrideVertexColors{FColorVertexBuffer_Mirror};

	/** Vertex data cached at the time this LOD was painted, if any */
	var private const array<PaintedVertex> PaintedVertices;

`if(`__TW_PERSISTENT_SPLATTER_SYSTEM_)
	/** Splatter map data to use for this mesh LOD */
	var private const TWSplatterMap2D SplatterMap;
`endif
};

/** Static mesh LOD data.  Contains static lighting data along with instanced mesh vertex colors. */
var native serializetext private const array<StaticMeshComponentLODInfo> LODData;

/** Incremented any time the position of vertices from the source mesh change, used to determine if an update from the source static mesh is required */
var private const int VertexPositionVersionNumber;

/** The Lightmass settings for this object. */
var(Lightmass) LightmassPrimitiveSettings	LightmassSettings <ScriptOrder=true>;

/** Change the StaticMesh used by this instance. */
simulated native function bool SetStaticMesh( StaticMesh NewMesh, optional bool bForce );

/** Disables physics collision between a specific pair of primitive components. */
simulated native function DisableRBCollisionWithSMC( PrimitiveComponent OtherSMC, bool bDisabled );

/**
 * Changes the value of bForceStaticDecals.
 * @param bInForceStaticDecals - The value to assign to bForceStaticDecals.
 */
native final function SetForceStaticDecals(bool bInForceStaticDecals);

/**
 * @RETURNS true if this mesh can become dynamic
 */
native function bool CanBecomeDynamic();

defaultproperties
{
	// Various physics related items need to be ticked pre physics update
	TickGroup=TG_PreAsyncWork

	CollideActors=True
	BlockActors=True
	BlockZeroExtent=True
	BlockNonZeroExtent=True
	BlockRigidBody=True
	WireframeColor=(R=0,G=255,B=255,A=255)
	bAcceptsStaticDecals=TRUE
	bAcceptsDecals=TRUE
	bOverrideLightMapResolution=TRUE
	OverriddenLightMapResolution=0
	bOverrideLightMapRes=FALSE
	OverriddenLightMapRes=64
	bUsePrecomputedShadows=FALSE
	SubDivisionStepSize=32
	bUseSubDivisions=TRUE
	bForceStaticDecals=FALSE
	bCanHighlightSelectedSections=false;
	StreamingDistanceMultiplier=1.0

`if(`__TW_LIGHTING_MODIFICATIONS_)
	// Defaults are needed for editor copy/paste to work correctly.
	// Was causing a bug where moving SM actors between sublevels was resetting the lighting channels.
	LightingChannels=(Indoor=TRUE,Outdoor=TRUE,bInitialized=TRUE) 	
`endif

`if(`__TW_PERSISTENT_SPLATTER_SYSTEM_)
	bAllowPersistentSplatters=TRUE
`endif

`if(`__TW_LIGHTING_MODIFICATIONS_)
	bAllowPreshadows=FALSE
`endif
}
