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 handles 77,750 leaf meshes while the game runs at over 220 FPS on my machine. It’s pretty darn fast, all things considered. This is made possible by BulkMoveTo and a optimized 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 @BIackoutDev

by @DevForHire


Source:

GitHub:

Library:

Uncopylocked Demo:


API:

Read the API

Properties

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

Functions

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 the MatchWorkspaceWind config set to true, this is called automatically

Returns:

  • void

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 WindShake = require(script.WindShake)

WindShake:Init({
    MatchWorkspaceWind = true, -- WindShake will use workspace.GlobalWind
})

-- 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.

Get this plugin here!




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

If you’d like to help fund my work, consider sponsoring me on GitHub/Patreon or donating on BuyMeACoffee/PayPal!

936 Likes
How can I Achive "Wild West" Type Grass?
How to fill gaps in between trees?
First showcase of mine
Decals glitching out
Whisperbit Attribution
How to add "Stylized Wind" to your game
How to Make a Part Sway?
Accessory shaking effect
No Title Game - Credits
I need a less costly method to multiplying these CFrames
About Rainy Vibes
Breeze into Wind! [Fully Released]
Map feels empty
Outside | Credits
Simple Weather [1.4]
Oscillating Wing Vortex Trail Effect
How should I go about changing the color of thousands of parts multiple times per second?
Feedback on my Stylized Map
House in the Woods Update Log (Deprecated)
Any other way to implement collection service
ARFJ Asset Attributions
Optimizing client-server rendering
A tree model / render
Challenge: I map in one hour and here is the results
Grass System: looking for advice on how to lower script activity
Feedback on showcase
About Sad Hangout
What are you working on currently? (2021)
WarriorCatsRP Asset Attributions
How to make grass effects?
How can I stop the lag from this raycasting rain script?
StreamingQueue - Queue changes to Instances that are affected by StreamingEnabled
Animating leafs - How do you do it?
Custom Grass Module
Help With Animation Script
Custom Grass Module Release
Little Lands Updates & Attribution
How do i add grass on a PART?
Custom Grass System - How might I go about optimizing it?
Arcade Island Credits
Does anyone have/know how to create a foliage script?
RopeConstraint Wind Simulation (kind of)
Doom Towers: Credits & Attributions
Tree swaying script
PB the Flying Pig | Update-Log
How to animate foliage(plants)
How would I add a wind system to my plant
Any methods to check distances between Character and multiple Parts?
BaseGrass - Custom Performant Grass System (Devlog)
Foliage Sway Module
Potential backdoor?
Magic Combat Simulator - Information
Scribel - Credits and Attributions

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

7 Likes

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

14 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!

22 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.

2 Likes

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:

24 Likes

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

6 Likes

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!

7 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

20 Likes

Thanks! This looks fantastic

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

7 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:

3 Likes

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:

3 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…

3 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.

1 Like

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

1 Like

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.

8 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

3 Likes

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

2 Likes

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

2 Likes

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

4 Likes