Wind Shake: High performance wind effect for leaves and foliage

WindShake

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 can have it!

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. This is made possible by BulkMoveTo and a modified version of @Quenty’s incredible octree module.

Note: the wind lines in this demo are a separate module, not related to the shake effect. The lines are open sourced as well in the uncopylocked place below!


Here’s some examples of people using this module!


by @DevForHire


by @Hodicus


by @BIackoutDev


Source:

GitHub:

Library:

Uncopylocked Demo:


API:

Read the API

Functions

function WindShake:Init()

Initializes the wind shake logic and adds shake to all tagged objects

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
Settings

Events

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

Types

`Settings` tables are structured like so:
{
    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.
}

Usage Example:

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

WindShake Editor Plugin

No programming needed, no tag editor plugins, no more manual attribute creation. No more pressing play to see what a tweaked value looks like.
Everything WindShake, made simple.

Features:

  • Import
    Don’t know any programming, but want WindShake running in your game? Import brings in the latest WindShake module and a script that’ll get it up and running right away. One click is all it takes.

  • Preview
    Having to playtest your game just to see what WindPower value looks best is… annoying. Preview fixes that by allowing you to see your models shaking in a ViewportFrame! Rather than naively displaying only your selected leaves, it brings in the entire model so you get to see your leaves relative to the trunk and branches. It also has a direction display in the corner to keep you oriented.

  • Simplified Tools
    CollectionService tags that aren’t viewable without special plugins? Attributes that need to be manually created by you? No more! The plugin handles all that stuff internally, and exposes it in a familiar “properties” style that’ll get you working quickly and easily.




Enjoying my work? I love to create and share with the community, for free.

I make loads of free and open source scripts and modules for you all to use in your projects!
You can find a lot of them listed for you in my portfolio. Enjoy!

If you’d like to help fund my work, check out my Patreon or BuyMeACoffee!

330 Likes

Awesome, wind effect looks so neat at this game but im sure that effect can be used with some graphic changes

2 Likes

This is extremely useful for any developer trying to make their vegetation look more alive, thank you for releasing it!

4 Likes

Amazing work Boat! :clap:

After playing with it for a bit, I was curious if you had any plans on adding roof detection so that wind particles are not created inside buildings, I feel like that could be a pretty neat and useful touch!

5 Likes

One question I have is if you use WindShake:Cleanup(), is there another way to start it up again? I tried WindShake:Init() after cleaning it up but nothing happened.

Found the answer to my own question, just disable the WindController script. You can enable it again and it’ll start over.

I love weather effects used in games, it reminds me of ‘stormworks’ on steam which uses a very similar method to graphically simulate wind. Wonderfully cool resource :happy1:

Stormworks Wind reference (I’m really impressed how similar this could be recreated on Roblox) :heart:

5 Likes

This looks great however I have a question why is everything the wind touches shaked or is it a script for that?

Calling Init() again works, but you have to add your shake objects again because they were cleaned up! The reason disable works is because it adds the objects again when you re-enable.

I should probably add a Pause method that allows you to halt without cleaning. Thanks for bringing that up!

4 Likes

Update!

Added WindShake:Pause() and WindShake:Resume() so you can halt and restart your wind effect without needing to re-add all your object shakes.

cc: @VampiricCode

7 Likes

Thanks! This looks fantastic

I would say that you and @EgoMoose have the best open source projects

2 Likes

I’ve always wanted to try implementing octrees and quadtrees in some of my code as they’re way more performant, but didn’t quite understand them. I’ll look into these two resources and try learning, thank you! :pray:

1 Like

Pretty beautiful and creative indeed. Thank you!
And it will be helpful if you can make for us a tutorial about octrees and quadtrees :smiley:

2 Likes

Oh no! I have only just made on of these! (and for a commision which probably won’t work out now :man_facepalming:)

This is really well done! Good job @boatbomber!

wish me luck…

2 Likes

Wow, thank you so much for including the API. This is a very handy resource as I was just starting to learn how to do these effects for my game.

Hi, I just have one question you could help answer. How can you disable the gui’s?

You just… don’t put GUIs in. Those are not part of the module. The module does not put anything on your screen. It just moves BaseParts. Those GUIs are added via a LocalScript in the demo place.

5 Likes

I’m getting very ugly results with this module. Out of the box, the module seems to be updating things at only a fraction of the frequency that it should, leading to the shake looking extremely choppy. I definitely feel like something is wrong here, because the demo videos look buttery smooth. Not sure what I’m doing wrong, however.

https://i.gyazo.com/1ada2cb95e3b7d1ca17786dcc3838330.mp4

1 Like

You can edit the Hz parameter in the WindController>WindShake. Increasing the Hz to 60 might help.

Looks amazing but is it possible to like, prevent it from being in a building?

Restarting his machine fixed it, something was wrong on his end. We aren’t sure what though.

1 Like