images | ||
.appveyor.yml | ||
config.py | ||
INSTRUCTIONS_SINGLEROOM.md | ||
INSTRUCTIONS.md | ||
larea.cpp | ||
larea.h | ||
lbitfield_dynamic.cpp | ||
lbitfield_dynamic.h | ||
lbound.cpp | ||
lbound.h | ||
ldae_exporter.cpp | ||
ldae_exporter.h | ||
ldebug.cpp | ||
ldebug.h | ||
ldob.cpp | ||
ldob.h | ||
lhelper.cpp | ||
lhelper.h | ||
LICENSE | ||
lmain_camera.cpp | ||
lmain_camera.h | ||
lplanes_pool.cpp | ||
lplanes_pool.h | ||
lportal_all.cpp | ||
lportal.cpp | ||
lportal.h | ||
lroom_converter.cpp | ||
lroom_converter.h | ||
lroom_manager.cpp | ||
lroom_manager.h | ||
lroom.cpp | ||
lroom.h | ||
lscene_saver.cpp | ||
lscene_saver.h | ||
ltrace.cpp | ||
ltrace.h | ||
lvector.h | ||
OCCLUSION_CULLING.md | ||
README.md | ||
register_types.cpp | ||
register_types.h | ||
SCsub |
godot-lportal
Portal rendering / Occlusion culling module for Godot 3.2
You can either use LPortal as a full occlusion culling system if you can create your level as rooms and portals, or use it in a simplified single room mode to speed up culling in any 3d level.
Note that this is a Work in progress. Feel free to try out the latest version (master) but recognise that the API may change as I move towards first release.
Video of initial testing:
https://www.youtube.com/watch?v=uVwLltiouBs
https://www.youtube.com/watch?v=xF_3Fe2HRdk
https://www.youtube.com/watch?v=NmlWkkhGoJA
Features
- Support for dynamic objects (DOBs)
- Dynamic lights
- Optional auto-generation of room bound convex hulls
- Internal lightmapping workflow (for baking lights in Godot)
- External lightmapping workflow (for baking lights in Blender etc)
- Single room mode (for non-portalled levels)
Demos / Tutorials
https://github.com/lawnjelly/lportal-demos
Feel free to leave suggestions / feature requests on the issue tracker, especially regarding ease of use.
Current status
As everything is now basically working, I am currently working on a small demo / test first person shooter game. This is helping me find bugs / add usability features as I go.
Note I'm also currently rewriting the Godot 2d GLES renderer in core, so that has to take priority until it is working.
Instructions
Roadmap
-
Auto conversion of named room spatials and portal mesh instances to LRoom and LPortal DONE
-
Auto creation of mirror portals DONE
-
Recursive determine visibility DONE
-
Prevent memory allocations (use pools for plane vectors) DONE
-
Add support for objects moving between rooms - cameras, players, physics etc - DONE
-
Handle special cases (multiple portals views into room etc) DONE
-
Optimize non-moving statics DONE
-
Optional convex hull bound for rooms DONE
-
Auto convex hull bound generation DONE
-
Add debug graphical view of portal planes DONE
-
Add debug graphical view of room bounds DONE
-
Dealing with shadows from objects outside of view DONE
-
Universal visibility query for camera and dynamic lights DONE
-
Support for global directional lights (like the sun) DONE
-
Internal baked lightmap workflow DONE
-
External baked lightmap workflow DONE
-
Switchable culling method DONE
-
Bug fixing / testing ONGOING
-
Demo game ONGOING
-
Shadow caster optimization
-
Closable portals
-
PVS (primary and secondary)
Installation
For convenience to trial LPortal I have provided a win64 build under the 'releases' tab in github. However, note that for production use (on multiple platforms) you will currently have to compile from source.
I will work on increasing the number of builds for different platforms.
Compiling from source
See: http://docs.godotengine.org/en/3.0/development/compiling/index.html
Once the engine is compiling okay on your system, to add the module:
- Create a folder inside godot/modules called 'lportal'
- Clone / download this repository as a zip file and place the files in the lportal folder
- Compile the engine as normal, it should automatically pick up the lportal module
- Note that to export to other platforms you will also have to compile export templates for those platforms
You will know the installation was successful when you see a new Node type 'LRoomManager' in the Godot IDE.