High performance wind effect for leaves and foliage
by boatbomber
I wanted to have massive forests full of moving leaves. Not for any project of mine, I just wanted to make it cuz it sounded like fun. So I did. And now you guys benefit!
This module handled 77,750+ leaf meshes while the game ran at over 400 FPS on my machine. It's pretty darn fast, all things considered.
Demo: https://www.youtube.com/watch?v=WdJr7k9Uqfw
GitHub:
https://github.com/boatbomber/WindShake
Library:
https://www.roblox.com/library/6377120469/WindShake
Uncopylocked Demo:
https://www.roblox.com/games/6342320514/Wind-Demo
number WindShake.RenderDistance
Sets the render distance for active objects in studs. Default 150
number WindShake.MaxRefreshRate
Sets the maximum dynamic refresh rate for active objects in seconds. Default 1/60
function WindShake:Init(config: {
MatchWorkspaceWind: boolean?,
}?)
Initializes the wind shake logic and adds shake to all tagged objects
Parameters:
-
config
[Optional Dictionary]Configuration for the initialization
-
MatchWorkspaceWind
[Optional Boolean]Whether to match the wind settings to the Workspace's GlobalWind setting. Default false
-
Returns:
void
function WindShake:Cleanup()
Halts and clears the wind shake logic and all object shakes
Returns:
void
function WindShake:Pause()
Halts the wind shake logic without clearing
Returns:
void
function WindShake:Resume()
Restarts the wind shake logic without clearing
Returns:
void
function WindShake:AddObjectShake(Object, Settings)
Adds an object to be shaken
Parameters:
-
Object
[BasePart] The Object to apply shaking to -
Settings
[Optional Dictionary] The settings to apply to this object's shake (See below for Settings structure)
Returns:
void
function WindShake:RemoveObjectShake(Object)
Removes shake from an object
Parameters:
Object
[BasePart] The Object to remove shaking from
Returns:
void
function WindShake:SetDefaultSettings(Settings) [DEPRECATED]
Deprecated in favor of setting the Attributes of the WindShake modulescript
Sets the default settings for future object shake additions
Parameters:
Settings
[Dictionary] The settings to use as default (See below for Settings structure)
Returns:
void
function WindShake:UpdateObjectSettings(Object, Settings) [DEPRECATED]
Deprecated in favor of setting the Attributes of the Object
Updates the shake settings of an object already added
Parameters:
-
Object
[BasePart] The Object to apply shake settings to -
Settings
[Dictionary] The settings to apply to this object's shake (See below for Settings structure)
Returns:
void
function WindShake:UpdateAllObjectSettings(Settings)
Updates the shake settings of all active shakes
Parameters:
Settings
[Dictionary] The settings to apply to all objects' shake (See below for Settings structure)
Returns:
void
function WindShake:MatchWorkspaceWind()
Sets the wind settings to match the current workspace GlobalWind
When
:Init()
is called with theMatchWorkspaceWind
config set to true, this is called automatically
Returns:
void
RBXScriptSignal WindShake.ObjectShakeAdded(Object)
Fires when an object is added to WindShake
Parameters:
Object
[BasePart] The object that was added
RBXScriptSignal WindShake.ObjectShakeRemoved(Object)
Fires when an object is removed from WindShake
Parameters:
Object
[BasePart] The object that was removed
RBXScriptSignal WindShake.ObjectShakeUpdated(Object)
Fires when an object's settings are updated through the update APIs
Parameters:
Object
[BasePart] The object that had its settings updated
RBXScriptSignal WindShake.Resumed()
Fires when WindShake begins shaking the objects
RBXScriptSignal WindShake.Paused()
Fires when WindShake stops shaking the objects
Settings = {
WindDirection: Vector3 to shake towards (Initially 0.5,0,0.5)
WindSpeed: Positive number that defines how fast to shake (Initially 20)
WindPower: Positive number that defines how much to shake (Initially 0.5)
--If one of these is not defined, it will use default for that one,
--so you can pass a table with just one or two settings and the rest
--will be default so you don't need to make the full table every time.
}
local WIND_DIRECTION = Vector3.new(1,0,0.3)
local WIND_SPEED = 25
local WIND_POWER = 0.4
local WindShake = require(script.WindShake)
WindShake:SetDefaultSettings({
WindSpeed = WIND_SPEED;
WindDirection = WIND_DIRECTION;
WindPower = WIND_POWER;
})
WindShake:Init() -- Anything with the WindShake tag will now shake