Release Notes 1.1
Release 1.1 includes features developed from roughly June 9 2020 to August 24 2020.
Highlights
New Free Features
The following features are now also available in Free!
Voxel Data Asset Editor: double click any voxel data asset to open the editor. You can create data assets simply by right clicking in the content browser!
Voxel Asset Actors: easily place your data assets into the scene by drag & dropping them
Voxel Erosion: experimental erosion shader for heightmaps
Voxel Disable Edit Box: use this to disable edits in a zone of your world
Perlin Worms: used for caves
Terrace: blueprint node for the surface tool, allowing to make terraces
Additionally, the annoying "Get Voxel Plugin Pro" notifications have been replaced by a one time "Thanks for using Voxel Plugin Free".
Community Contributions
I would like to thank the increasing number of people helping new users on the discord. The plugin discord has really grown into something awesome!
If you're not already on the discord, join now! https://discord.voxelplugin.com
I also want to thank all the people who submitted issues & suggestions on the github. These are incredibly helpful!
If you have a suggestion, or want to report an issue, got ahead on https://github.com/Phyronnaz/VoxelPlugin/issues!
New automated pipeline
I've setup a Jenkins server that builds Free and Pro every 6 hours.
https://github.com/Phyronnaz/VoxelPlugin and https://gitlab.com/Phyronnaz/VoxelPluginPro are now automatically updated & are always guaranteed to compile on all supported Unreal versions & platforms!
I will of course continue to update the marketplace versions as well.
New mailing list
If you want to never miss any Voxel Plugin release, I've setup a new mailing list! You can subscribe here: https://updates.voxelplugin.com
Upgrade Notes
If you used the Import Asset as reference feature in the editor, your old saves might only partially load. You will get a warning message if that's the case; please contact me if you need to recover that data.
C++
Many more inline files (.inl) have been added. If you get a missing symbol error, you're probably missing an include!
If you're using FVoxelData directly, you now need to include VoxelData/VoxelDataIncludes.h.
Voxel containers have been moved to a new VoxelContainers directory.
World Generator Instances now need to call their parents in their constructor. It is valid to pass nullptr
Old:
New:
Compiled Voxel Graphs
If you compiled some voxel graphs to C++, you might get this popup when you open your project with the next plugin version:
To fix it, just delete your Binaries and Intermediates folders in your project, to force a recompile of the generated cpp.
Changes
Tool Improvements
The tool manager has been refactored to be easier to use, maintain and extend.
UX improvements
The voxel tools now support shortcuts:
1-8 (alphanum): select tools
[ ]: decrease/increase brush size
< >: decrease/increase brush strength
You can configure these shortcuts at any time in Edit/Editor Preferences/Keyboard Shortcuts/Voxel.
Instead of a dropdown, the tools are now displayed as icons, making it easier to switch tools:
Experimental support for the new 4.25 toolbar has been added
Adding custom tools
You can now add custom voxel tools to the list of editor tools
Checkout Voxel/Examples/Tools/CustomTools for an example
Directly applying tools
You can now directly apply a voxel tool from a blueprint.
This is very easy to use, as you can just set the tool property as you would in the editor, and tell it where to be applied.
For example, this blueprint creates a Mesh Tool, sets it mesh & size, and finally apply it (which results in stamping the mesh):
Tools Performance
A new Multi Threaded option has been added to the tools (on by default). This makes all tools several times faster.
The smooth/progressive mesh stamp & the surface tool are now using a proper Jump Flood compute shader, making them much faster & much more accurate.
Smooth Improvements
Smooth now has a Num Iterations parameter, and has been optimized to be several times faster (in addition to multithreading).
A new Falloff parameter has also been added
Material Propagation
Thanks to jump flooding, materials can now be propagated when using the surface or mesh tool. Just tick the Propagate Materials checkbox.
This feature should be a game changer for painting in the plugin!
https://twitter.com/phyronnaz/status/1283670427257016320
Fixed Rotation option on the Flatten Tool
The Flatten tool has a new Fixed Rotation parameter to lock the direction it's facing
Perlin Worms/Splines (Data Items) redesign
A new concept has been added to the plugin: Data Items.
A big limitation of voxel graphs is that you don't have any contextual data: you can add noise, but it's very hard to add a ravine or a cave at a specific position.
To solve that, I'm introducing the concept of Data Items: these are data that you can place into your scene and can read back into your graph.
They are extremely generic (just data), so they can be used to create ravines, perlin worms, tunnels using splines, mountains...
Builtin data items are included in /Voxel/VoxelDataItems/
Usage examples are included in /Voxel/Examples/VoxelGraphs/PerlinWorms
You can find more info on their dedicated doc page: Voxel Data Items
Docs improvements
The Blueprint API docs are now automatically generated. Same for the C++ API docs.
You can check them out here:
Scale World Data
You can now rescale an edited voxel world in the editor. This can be useful if you want to change your voxel size while keeping the relative size of your edits for example.
The option is under Voxel - Preview in the voxel world details.
New HardColorTransitions setting
A new HardColorTransitions setting has been added. It will add additional vertices in the RGB mode to ensure all transitions are sharp:
Off:
On:
Voxel Foliage settings are automatically applied
When changing a setting on a voxel spawner used by the voxel world, the voxel world spawners will regenerate to apply that setting.
This is a huge productivity boost to quickly iterate on settings.
If it becomes too slow, you can disable it in the voxel world preview settings.
https://twitter.com/phyronnaz/status/1287348345145421825
Mesh Importer improvements
You can now configure the sweep direction, whether a mesh is watertight or not, and whether to hide leaks or not in the mesh importer settings (and in the mesh tool).
These settings allows to import a larger variety of meshes. Check the options tooltips for more info.
For example, say you want to import this mesh:
Watertight on + sweep direction = X (used to be the only option):
Watertight off + sweep direction = Z:
New Examples
Heightmap Composition
In VoxelContent\Examples\VoxelGraphs\HeightmapComposition
This example shows how to make a voxel graph combining 4 heightmaps together.
Layered World
In VoxelContent\Examples\VoxelGraphs\PerlinWorms
These examples show how to use the new perlin worms to make a flat & a planet world with plenty of caves.
Voxel Graph Improvements
2D Graph Preview & Stats improvements
The graph preview is now a lot more user-friendly!
You can now pan the graph preview (by holding right click), zoom (using the mouse wheel), and preview the node values of a specific voxel by clicking the preview!
The stats have also been improved: they now show the timings of the nodes on the previewed voxel.
Four stats are showed:
C++: this is the time the node will take to execute once the graph is compiled to C++
VM: this is the time the node will take to execute in the voxel graph virtual machine
C++ (range): this is the time the node will take to execute in Range Analysis once compiled to C++. Range analysis is not performance-critical if you're not using the Get Range node
VM (range): this is the time the node will take to execute in Range Analysis in the voxel graph VM. Range analysis is not performance-critical if you're not using the Get Range node
Technical details
The C++ value is obtained by calling the function directly (not through a vcall) N time until it takes >1ms to run. This gives coherent results, as it will simulate a hot cache & no call overhead.
The voxel graph VM value is obtained by doing the same thing, except through a function pointer. That way the compiler cannot inline the function.
Finally, the voxel graph preview is now fully multithreaded, making it several times faster!
3D Graph Preview improvements
In addition to the classic Heightmap 3D preview:
the voxel graph can now do more advanced previews. To enable that, untick Heightmap Mode in the preview settings
Switch the axes to the following to show a 2D slice
Finally switch to 2D preview color to Material
This will show you a 2D slice of your voxel graph:
You can configure the slice position by changing the Center property in the preview settings:
Combined with the new perlin worms/data item debug, it's a very powerful tool to get a 3D view of your world. In the video below you can see the perlin worms & the holes they create in the planet:
New Cost view
A new Cost view mode has been added
It will show the cost of querying each voxel, normalized from green to red:
Here you can see the places where perlin worms intersect are more expensive to query, as there are more worms to query.
The corresponding timings will be showed in the preview info:
Technical note: by default, the 5% lowest and the 5% highest values are ignored for Min/Max, due to too much variability. You can change that using the Cost Percentile property.
New Range Analysis view
A new Range Analysis view mode has been added as well.
It will divide the preview in a number of chunks (by default 64x64), and show green if the chunk would be skipped thanks to range analysis (ie, 0 not in the chunk range), and red if it wouldn't be skipped.
For example, in the new Heightmap Composition example:
Automatic Function Separators pins
Function separators pins are now automatically filled during compilation!
Before, you had to manually add pins to forward your values:
Now you can just add a function separator node & let the graph compiler do the work!
Improved noise node range analysis
Noise nodes now have a Tolerance setting in their range analysis:
When added, they will be sampled Number Of Samples times to get a range of the noise values. Then, that range will be extended by Tolerance to account for the potentially missed values.
Finally, at runtime, the noise values will be clamped between these ranges, to ensure range analysis is always correct.
This means that some noise might now appear flat: if that happens, increase Tolerance. The upside is that since range analysis will always be correct, you cannot have holes anymore due to too noisy noise.
Get Range node & Smart Min/Smart Max
A new Get Range node has been added, to query the estimated range of a pin at runtime (guaranteed to never underestimate).
A new Smart Max (as well as a Smart Min) node has been added. It will first compute the range of all its input, and then only compute the ones truly needed based on that:
all the inputs whose range max is inferior to one of the other input range min can safely be ignored.
That way, it can skip computing some expensive noise, like in the graph below.
Sadly, the Get Range node turned out to be much more expensive than expected. I would only recommend using Smart Min/Max in graph compiled to C++ (where the overhead of GetRange is much lower), and after some benchmarking to check it's not tanking the performance.
Make Seeds node
A new Make Seeds node has been added: it will create a number of unique seeds from a single one, by successively hashing them.
Quality of life improvements
Drag & dropping an asset onto a graph will now use the asset name:
Create local variable now defaults to the pin name:
Electronic Nodes support
The Electronic Nodes plugin now supports voxel graphs! Big thanks to the dev for working on that.
https://unrealengine.com/marketplace/en-US/product/electronic-nodes
Autogenerated Tool API
The tool functions (AddSphere/RemoveSphere etc) are now automatically generated from the C++ templates.
This allows to have a very consistent API across all tools functions, while decreasing the maintenance cost.
All tool functions now take the Multi Threaded and Update Render parameter.
Additionally, they all output Modified Values, which can be useful for detecting mined materials among other things. Recording modified values is not cheap, so you can disable it by setting Record Modified Values to false.
They also output Edited Bounds, which can be used to know on which bounds to call Apply Voxel Physics for example.
On the C++ side, C++-friendly functions are generated. The async variants take a proper C++ callback in input.
For example:
You can view the full code here: https://github.com/Phyronnaz/VoxelPlugin/blob/master/Source/Voxel/Public/VoxelTools/Gen/VoxelSphereTools.h
Per-channel material compression
The voxel materials are now compressed per-channel in memory, leading the memory improvements of up to 10x (1000%)!
If you have a chunk whose materials have only their R component edited, it will only take 4KB + 1B * NumOtherChannels
(chunks are 4096 voxels), whereas before it would take 4 * NumChannel KB
.
When painting, all the channels are unpacked for better performance. You can call CheckForSingleMaterials to compress them back (this is automatically done by voxel tools).
https://wiki.voxelplugin.com/Blueprint_API#Check_for_Single_Materials
Distance Fields improvements
The plugin now uses the Jump Flood algorithm for fast & more precise distance fields computation.
Distance fields are used when using the surface tool or the mesh tool with progressive or smooth stamp on.
A new Voxel Debug window has been added to help visualize mesh distance fields. It can be accessed in Window -> Developer Tools
Open on Startup
To speed up iteration when developing the plugin, I've added a new Open On Startup context menu option that will automatically open the asset when Unreal starts.
You can enable it in Editor Preferences -> Open Assets On Startup
Static Collision Cooking
You can now cook all the collisions of a voxel world & save it to a binary file. That file can then be loaded to very quickly apply voxel collisions.
This does not support runtime edits.
Mainly useful for slow servers where startup performance matters & where voxel worlds cannot be edited.
See https://wiki.voxelplugin.com/Blueprint_API#Cooking
Misc
Merge PR from RobertBiehl to fix crash in Voxel Niagara getters
Turn off Bottom Textures in the Quixel example to mitigate a 4.25 DX12 crash
Fix Diplacement being typoed Dipacement in Quixel examples, making the setting not work on instances
Fix graphs with color outputs not compiling to C++
Fix rare crash on shutdown due to the global pool being destroyed too late
Voxel versions have been split per feature, to reduce asset changes when updating the plugin
You can now save/load voxel save & heightmaps that are bigger than 2GB in memory
Height range mips are now serialized to speed up heightmaps load time by several times
Fix voxel invokers Disable function not setting the bIsInvokerEnabled proper
Properly serialized asset references in voxel saves
Add SwitchColor node
VoxelCharacter has been simplified to be easier to implement without inheriting from it, and with no dependency on the Voxel module: https://github.com/Phyronnaz/VoxelPlugin/blob/master/Source/Voxel/Public/VoxelCharacter.h#L15
You can now force a spawner to spawn everywhere, and query its positions with GetMeshSpawnerTransforms: https://gitlab.com/Phyronnaz/VoxelPluginPro/-/blob/master/Source/Voxel/Public/VoxelSpawners/IVoxelSpawnerManager.h#L24 https://gitlab.com/Phyronnaz/VoxelPluginPro/-/blob/master/Source/Voxel/Public/VoxelSpawners/VoxelSpawnerConfig.h#L189
Commits
Last updated