/** * Copyright 1998-2013 Epic Games, Inc. All Rights Reserved. */ class ParticleSystem extends Object native(Particle) hidecategories(Object); /** * ParticleSystemUpdateMode * Enumeration indicating the method by which the system should be updated */ enum EParticleSystemUpdateMode { /** RealTime - update via the delta time passed in */ EPSUM_RealTime, /** FixedTime - update via a fixed time step */ EPSUM_FixedTime }; var() EParticleSystemUpdateMode SystemUpdateMode; /** UpdateTime_FPS - the frame per second to update at in FixedTime mode */ var() float UpdateTime_FPS; /** UpdateTime_Delta - internal */ var float UpdateTime_Delta; /** WarmupTime - the time to warm-up the particle system when first rendered */ var() float WarmupTime; /** WarmupTickRate - the time step for each tick during warm up. Increasing this improves performance. Decreasing, improves accuracy. Set to 0 to use the default tick time. */ var() float WarmupTickRate; /** Emitters - internal - the array of emitters in the system */ var editinline export array Emitters; /** The component used to preview the particle system in Cascade */ var transient ParticleSystemComponent PreviewComponent; /** The angle to use when rendering the thumbnail image */ var editoronly rotator ThumbnailAngle; /** The distance to place the system when rendering the thumbnail image */ var editoronly float ThumbnailDistance; /** The time to warm-up the system for the thumbnail image */ var(Thumbnail) editoronly float ThumbnailWarmup; /** Deprecated, ParticleSystemLOD::bLit is used instead. */ var deprecated const bool bLit; /** Used for curve editor to remember curve-editing setup. */ var export InterpCurveEdSetup CurveEdSetup; /** If true, the system's Z axis will be oriented toward the camera */ var() bool bOrientZAxisTowardCamera; // // LOD // /** * How often (in seconds) the system should perform the LOD distance check. */ var(LOD) float LODDistanceCheckTime; /** * ParticleSystemLODMethod */ enum ParticleSystemLODMethod { PARTICLESYSTEMLODMETHOD_Automatic, PARTICLESYSTEMLODMETHOD_DirectSet, PARTICLESYSTEMLODMETHOD_ActivateAutomatic }; /** * The method of LOD level determination to utilize for this particle system * PARTICLESYSTEMLODMETHOD_Automatic - Automatically set the LOD level, checking every LODDistanceCheckTime seconds. * PARTICLESYSTEMLODMETHOD_DirectSet - LOD level is directly set by the game code. * PARTICLESYSTEMLODMETHOD_ActivateAutomatic - LOD level is determined at Activation time, then left alone unless directly set by game code. */ var(LOD) ParticleSystemLODMethod LODMethod; /** * The array of distances for each LOD level in the system. * Used when LODMethod is set to PARTICLESYSTEMLODMETHOD_Automatic. * * Example: System with 3 LOD levels * LODDistances(0) = 0.0 * LODDistances(1) = 2500.0 * LODDistances(2) = 5000.0 * * In this case, when the system is [ 0.0 .. 2499.9] from the camera, LOD level 0 will be used. * [2500.0 .. 4999.9] from the camera, LOD level 1 will be used. * [5000.0 .. INFINITY] from the camera, LOD level 2 will be used. * */ var(LOD) editfixedsize array LODDistances; /** LOD setting for intepolation (set by Cascade) Range [0..100] */ var editoronly int EditorLODSetting; /** * Internal value that tracks the regenerate LOD levels preference. * If TRUE, when autoregenerating LOD levels in code, the low level will * be a duplicate of the high. */ var bool bRegenerateLODDuplicate; /** Structure containing per-LOD settings that pertain to the entire UParticleSystem. */ struct native ParticleSystemLOD { /** * Boolean to indicate whether the particle system accepts lights or not. * This must not be changed in-game, it can only be changed safely in the editor through Cascade. */ var() bool bLit; structcpptext { static FParticleSystemLOD CreateParticleSystemLOD() { FParticleSystemLOD NewLOD; NewLOD.bLit = FALSE; return NewLOD; } } }; var(LOD) array LODSettings; /** Whether to use the fixed relative bounding box or calculate it every frame. */ var(Bounds) bool bUseFixedRelativeBoundingBox; /** Fixed relative bounding box for particle system. */ var(Bounds) box FixedRelativeBoundingBox; /** * Number of seconds of emitter not being rendered that need to pass before it * no longer gets ticked/ becomes inactive. */ var() float SecondsBeforeInactive; // // Cascade 'floor' mesh information // var editoronly string FloorMesh; var editoronly vector FloorPosition; var editoronly rotator FloorRotation; var editoronly float FloorScale; var editoronly vector FloorScale3D; /** The background color to display in Cascade */ var editoronly color BackgroundColor; /** EDITOR ONLY: Indicates that Cascade would like to have the PeakActiveParticles count reset */ var bool bShouldResetPeakCounts; /** Set during load time to indicate that physics is used... */ var transient bool bHasPhysics; /** Inidicates the old 'real-time' thumbnail rendering should be used */ var(Thumbnail) bool bUseRealtimeThumbnail; /** Internal: Indicates the PSys thumbnail image is out of date */ var bool ThumbnailImageOutOfDate; /** Internal: The PSys thumbnail image */ var editoronly Texture2D ThumbnailImage; /** * When TRUE, do NOT perform the spawning limiter check. * Intended for effects used in pre-rendered cinematics. */ var() bool bSkipSpawnCountCheck; /** How long this Particle system should delay when ActivateSystem is called on it. */ var(Delay) float Delay; /** The low end of the emitter delay if using a range. */ var(Delay) float DelayLow; /** * If TRUE, select the emitter delay from the range * [DelayLow..Delay] */ var(Delay) bool bUseDelayRange; /** Local space position that UVs generated with the ParticleMacroUV material node will be centered on. */ var(MacroUV) vector MacroUVPosition; /** World space radius that UVs generated with the ParticleMacroUV material node will tile based on. */ var(MacroUV) float MacroUVRadius; /** Occlusion method enumeration */ enum EParticleSystemOcclusionBoundsMethod { /** Don't determine occlusion on this particle system */ EPSOBM_None, /** Use the bounds of the particle system component when determining occlusion */ EPSOBM_ParticleBounds, /** Use the custom occlusion bounds when determining occlusion */ EPSOBM_CustomBounds }; /** * Which occlusion bounds method to use for this particle system. * EPSOBM_None - Don't determine occlusion for this system. * EPSOBM_ParticleBounds - Use the bounds of the component when determining occlusion. */ var(Occlusion) EParticleSystemOcclusionBoundsMethod OcclusionBoundsMethod; /** The occlusion bounds to use if OcclusionBoundsMethod is set to EPSOBM_CustomBounds */ var(Occlusion) Box CustomOcclusionBounds; /** * Temporary array for tracking 'solo' emitter mode. * Entry will be true if emitter was enabled */ struct native LODSoloTrack { var transient array SoloEnableSetting; }; var transient array SoloTracking; // NVCHANGE_BEGIN_TURB: TSC - Enable artist-controlled PhysX particle system overrides (credit to Jiayuan) //NVCHANGE_BEGIN: JCAO - Use MinimumPhysXLevelOverride instead of bLoadIfPhysXLevel in ParticleSystem (Credit to David) enum EParticleSystemOveridePhysXLevel { /** Don't override particle system */ EPSOP_NoOverride, /** Override particle system if PhysXLevel is at least 1 */ EPSOP_PhysXLevel1, /** Override particle system if PhysXLevel is at least 2 */ EPSOP_PhysXLevel2, }; //NVCHANGE_END: JCAO - Use MinimumPhysXLevelOverride instead of bLoadIfPhysXLevel in ParticleSystem (Credit to David) /** Extended Particle System Reference */ var(PhysXParticleExtension) ParticleSystem PhysxParticleSystemExtRef; /** Minimum PhysX Level Extend */ var(PhysXParticleExtension) EParticleSystemOveridePhysXLevel MinimumPhysXLevelExt; /** * PhysX Particle System Reference acts like an override * The referenced Particle System will replace the original Particle System * When it is on non-console platform and PhysXLevel setting matches the LoadIfPhysXLevel setting */ var(PhysXParticleOverride) ParticleSystem PhysxParticleSystemRef; //NVCHANGE_BEGIN: JCAO - Use MinimumPhysXLevelOverride instead of bLoadIfPhysXLevel in ParticleSystem (Credit to David) /** Minimum PhysX Level Override */ var(PhysXParticleOverride) EParticleSystemOveridePhysXLevel MinimumPhysXLevelOverride; //NVCHANGE_END: JCAO - Use MinimumPhysXLevelOverride instead of bLoadIfPhysXLevel in ParticleSystem (Credit to David) // given the current PhysX level, what particle system might this mutate into (if different)? native function ParticleSystem EffectiveParticleSystemAfterPhysXOverride(); // NVCHANGE_END_TURB: TSC - Enable artist-controlled PhysX particle system overrides (credit to Jiayuan) native function EffectiveParticleSystemAfterPhysXExtension(out array ExtensionTemplates); // /** Return the currently set LOD method */ native function ParticleSystemLODMethod GetCurrentLODMethod(); /** Return the number of LOD levels for this particle system */ native function int GetLODLevelCount(); /** Return the distance for the given LOD level */ native function float GetLODDistance(int LODLevelIndex); /** Set the LOD method */ native function SetCurrentLODMethod(ParticleSystemLODMethod InMethod); /** Set the distance for the given LOD index */ native function bool SetLODDistance(int LODLevelIndex, float InDistance); /** * Get the longest possible lifespan for this particle system. * * @param InComponentDelay The delay from the component using the emitter * * @return FLOAT The longest lifespan this PSys could have; 0.0f if infinite. */ native function float GetMaxLifespan(float InComponentDelay); // cpptext { // UObject interface. virtual void PostEditChangeProperty(FPropertyChangedEvent& PropertyChangedEvent); virtual void PreSave(); virtual void PostLoad(); /** * Returns the size of the object/ resource for display to artists/ LDs in the Editor. * * @return size of resource as to be displayed to artists/ LDs in the Editor. */ virtual INT GetResourceSize(); void UpdateColorModuleClampAlpha(class UParticleModuleColorBase* ColorModule); /** * CalculateMaxActiveParticleCounts * Determine the maximum active particles that could occur with each emitter. * This is to avoid reallocation during the life of the emitter. * * @return TRUE if the numbers were determined for each emitter * FALSE if not be determined */ virtual UBOOL CalculateMaxActiveParticleCounts(); /** * Retrieve the parameters associated with this particle system. * * @param ParticleSysParamList The list of FParticleSysParams used in the system * @param ParticleParameterList The list of ParticleParameter distributions used in the system */ void GetParametersUtilized(TArray >& ParticleSysParamList, TArray >& ParticleParameterList); /** * Setup the soloing information... Obliterates all current soloing. */ void SetupSoloing(); /** * Toggle the bIsSoloing flag on the given emitter. * * @param InEmitter The emitter to toggle. * * @return UBOOL TRUE if ANY emitters are set to soloing, FALSE if none are. */ UBOOL ToggleSoloing(class UParticleEmitter* InEmitter); /** * Turn soloing off completely - on every emitter * * @return UBOOL TRUE if successful, FALSE if not. */ UBOOL TurnOffSoloing(); /** * Editor helper function for setting the LOD validity flags used in Cascade. */ void SetupLODValidity(); #if WITH_EDITOR /** * Convert the given module to its randon seed variant. * * @param InEmitter The emitter to convert * @param InModuleIdx The index of the module to convert * @param InSeededClass The seeded variant class * @param bInUpdateModuleLists If TRUE, update the module lists after the conversion * * @return UBOOL TRUE if successful, FALSE if not */ UBOOL ConvertModuleToSeeded(UParticleEmitter* InEmitter, INT InModuleIdx, UClass* InSeededClass, UBOOL bInUpdateModuleLists); /** * Convert all the modules in this particle system to their random seed variant if available * * @return UBOOL TRUE if successful, FALSE if not */ UBOOL ConvertAllModulesToSeeded(); /** * Remove all duplicate modules. * * @param bInMarkForCooker If TRUE, mark removed objects to not cook out. * @param OutRemovedModules Optional map to fill in w/ removed modules... * * @return UBOOL TRUE if successful, FALSE if not */ UBOOL RemoveAllDuplicateModules(UBOOL bInMarkForCooker, TMap* OutRemovedModules); /** * Update all emitter module lists */ void UpdateAllModuleLists(); #endif } // defaultproperties { //bOrientZAxisTowardCamera=TRUE ThumbnailDistance=200.0 ThumbnailWarmup=1.0 UpdateTime_FPS=60.0 UpdateTime_Delta=1.0/60.0 WarmupTime=0.0 WarmupTickRate=0.0 bLit=true EditorLODSetting=0 FixedRelativeBoundingBox=(Min=(X=-1,Y=-1,Z=-1),Max=(X=1,Y=1,Z=1)) LODMethod=PARTICLESYSTEMLODMETHOD_Automatic LODDistanceCheckTime=0.25 bRegenerateLODDuplicate=false ThumbnailImageOutOfDate=true FloorMesh="EditorMeshes.AnimTreeEd_PreviewFloor" FloorPosition=(X=0.000000,Y=0.000000,Z=0.000000) FloorRotation=(Pitch=0,Yaw=0,Roll=0) FloorScale=1.000000 FloorScale3D=(X=1.000000,Y=1.000000,Z=1.000000) MacroUVPosition=(X=0.000000,Y=0.000000,Z=0.000000) MacroUVRadius=200 //NVCHANGE_BEGIN: JCAO - Use MinimumPhysXLevelOverride instead of bLoadIfPhysXLevel in ParticleSystem (Credit to David) MinimumPhysXLevelOverride=EPSOP_NoOverride //NVCHANGE_END: JCAO - Use MinimumPhysXLevelOverride instead of bLoadIfPhysXLevel in ParticleSystem (Credit to David) }