|
@@ -6,12 +6,12 @@ LÖVR v0.17.0, codename TBD, is currently <span style="font-weight: bold; color:
|
|
This version includes tons of bugfixes and usability improvements for the new graphics module, along
|
|
This version includes tons of bugfixes and usability improvements for the new graphics module, along
|
|
with the following new features:
|
|
with the following new features:
|
|
|
|
|
|
-- Passthrough, enabling mixed reality experiences and AR headsets
|
|
|
|
-- TerrainShape, for 3D heightfields in physics simulations
|
|
|
|
-- Support for blend shapes, used for facial animation and other mesh deformation
|
|
|
|
-- Builtin HTTP plugin, with support for HTTPS
|
|
|
|
-- Frustum culling, which is a quick way to improve rendering performance
|
|
|
|
-- Thick 3D rounded rectangles, great for VR UI
|
|
|
|
|
|
+- Passthrough, enabling mixed reality experiences
|
|
|
|
+- `TerrainShape`, for 3D heightfields in physics simulations
|
|
|
|
+- Blend shapes, for facial animation and making meshes squishy
|
|
|
|
+- HTTP, with support for HTTPS
|
|
|
|
+- Frustum culling, a quick way to improve rendering performance
|
|
|
|
+- Rounded rectangles with thickness, great for VR UI
|
|
- Mouse input
|
|
- Mouse input
|
|
|
|
|
|
And munch more! Read on for more details plus a full changelog.
|
|
And munch more! Read on for more details plus a full changelog.
|
|
@@ -116,7 +116,7 @@ Temporary Buffer/Pass objects were really tricky due to the way they got invalid
|
|
|
|
|
|
This version, `lovr.graphics.getBuffer` and `lovr.graphics.getPass` have been deprecated and
|
|
This version, `lovr.graphics.getBuffer` and `lovr.graphics.getPass` have been deprecated and
|
|
replaced by `lovr.graphics.newBuffer` and `lovr.graphics.newPass`. These "permanent" types behave
|
|
replaced by `lovr.graphics.newBuffer` and `lovr.graphics.newPass`. These "permanent" types behave
|
|
-like all other objects, and you can call `lovr.graphics.submit` freely without messing them up.
|
|
|
|
|
|
+like all other objects, and you can call `lovr.graphics.submit` without messing them up.
|
|
|
|
|
|
For passes, instead of getting a new one every frame, you can create it once and call `Pass:reset`
|
|
For passes, instead of getting a new one every frame, you can create it once and call `Pass:reset`
|
|
at the beginning of a frame to reset it to a fresh state. There's also the option of recording its
|
|
at the beginning of a frame to reset it to a fresh state. There's also the option of recording its
|
|
@@ -124,7 +124,7 @@ draws once and submitting it over and over again, to reduce the Lua overhead of
|
|
|
|
|
|
### No more pass types
|
|
### No more pass types
|
|
|
|
|
|
-Passes no longer have a "type" that controls what commands can be recorded on them. Instead, all
|
|
|
|
|
|
+Passes no longer have a "type" that defines what commands can be recorded on them. Instead, all
|
|
`Pass` objects can receive both graphics and compute work, with computes running before the draws
|
|
`Pass` objects can receive both graphics and compute work, with computes running before the draws
|
|
whenever the pass is submitted.
|
|
whenever the pass is submitted.
|
|
|
|
|
|
@@ -147,17 +147,25 @@ Compute Barriers
|
|
This is a small change, but there's a new `Pass:barrier` function that lets you sequence multiple
|
|
This is a small change, but there's a new `Pass:barrier` function that lets you sequence multiple
|
|
compute shader dispatches within a pass. Since computes within a pass all ran at the same time, you
|
|
compute shader dispatches within a pass. Since computes within a pass all ran at the same time, you
|
|
previously had to use multiple Pass objects to get computes to wait for each other, which is costly.
|
|
previously had to use multiple Pass objects to get computes to wait for each other, which is costly.
|
|
-With `Pass:barrier`, all computes before the barrier will complete before further compute work can
|
|
|
|
-start.
|
|
|
|
|
|
+With `Pass:barrier`, all computes before the barrier will finish before further compute work starts.
|
|
|
|
|
|
Headless VR
|
|
Headless VR
|
|
---
|
|
---
|
|
|
|
|
|
-The headset module can now be used in headless mode (spooky!!). This means it will still work even
|
|
|
|
|
|
+The headset module can now be used in headless mode (spooky!). This means it will still work even
|
|
when the graphics module is disabled. The intended use case is for console applications that don't
|
|
when the graphics module is disabled. The intended use case is for console applications that don't
|
|
need to render anything but still want to use pose data. Note that this only works on certain XR
|
|
need to render anything but still want to use pose data. Note that this only works on certain XR
|
|
runtimes -- currently monado and SteamVR are known to work.
|
|
runtimes -- currently monado and SteamVR are known to work.
|
|
|
|
|
|
|
|
+New Headset Simulator
|
|
|
|
+---
|
|
|
|
+
|
|
|
|
+The headset simulator incorporated changes from the
|
|
|
|
+[`lovr-mousearm`](https://github.com/jmiskovic/lovr-mousearm) library. The virtual hand is now
|
|
|
|
+placed at the projected mouse position, and the scroll wheel can be used to control the hand
|
|
|
|
+distance. The shift key can also be used to "sprint", which is great for moving through large
|
|
|
|
+worlds.
|
|
|
|
+
|
|
Mouse Input
|
|
Mouse Input
|
|
---
|
|
---
|
|
|
|
|
|
@@ -173,3 +181,73 @@ Mouse input has been added to `lovr.system`. You'll find the following new meth
|
|
- `lovr.wheelmoved`
|
|
- `lovr.wheelmoved`
|
|
|
|
|
|
You might not need the `lovr-mouse` library anymore!
|
|
You might not need the `lovr-mouse` library anymore!
|
|
|
|
+
|
|
|
|
+Tally Changes
|
|
|
|
+---
|
|
|
|
+
|
|
|
|
+Recording GPU timing info is now as simple as calling `lovr.graphics.setTimingEnabled`. Stats will
|
|
|
|
+be made available via `Pass:getStats`, with a frame or two of delay. Timing stats are also active
|
|
|
|
+by default when `t.graphics.debug` is set.
|
|
|
|
+
|
|
|
|
+Pixel tallies (occlusion queries) also have a new revamped API. Instead of using a `Tally` object
|
|
|
|
+and a transfer pass, `Pass:beginTally` and `Pass:finishTally` will start and stop an occlusion
|
|
|
|
+query. The results for tallies can be copied to a Buffer after the Pass with `Pass:setTallyBuffer`.
|
|
|
|
+
|
|
|
|
+Quality of Life
|
|
|
|
+---
|
|
|
|
+
|
|
|
|
+There are also a bunch of small improvements worth mentioning.
|
|
|
|
+
|
|
|
|
+Drawing a texture on a plane no longer requires a call to `Pass:setMaterial`. Instead, `Pass:draw`
|
|
|
|
+can take a `Texture`:
|
|
|
|
+
|
|
|
|
+ -- Old
|
|
|
|
+ pass:setMaterial(texture)
|
|
|
|
+ pass:plane(x, y, z, w, h)
|
|
|
|
+ pass:setMaterial()
|
|
|
|
+
|
|
|
|
+ -- New
|
|
|
|
+ pass:draw(texture, x, y, z, w)
|
|
|
|
+
|
|
|
|
+All objects now have the `Object:type` method to return their type name as a string.
|
|
|
|
+
|
|
|
|
+There's a new `Image:mapPixel` function which is an easier way to set all the pixels of an Image.
|
|
|
|
+
|
|
|
|
+Shaders now support `#include` to load shader code from LÖVR's filesystem.
|
|
|
|
+
|
|
|
|
+When `t.graphics.debug` is set, shaders include debug info now. This allows graphics debugging
|
|
|
|
+tools like RenderDoc to inspect variables in a shader and step through each line interactively.
|
|
|
|
+
|
|
|
|
+Vectors have capitalized constructors to create permanent vectors, e.g. `Vec3` can be used in
|
|
|
|
+addition to `vec3`.
|
|
|
|
+
|
|
|
|
+Vectors also have named constants: `vec3.up`, `vec4.one`, etc.
|
|
|
|
+
|
|
|
|
+Physics has `World:queryBox` and `World:querySphere` to query all the Shapes that intersect a
|
|
|
|
+volume.
|
|
|
|
+
|
|
|
|
+Community
|
|
|
|
+---
|
|
|
|
+
|
|
|
|
+LÖVR's Slack is now deprecated because it held our messages hostage! We migrated all the chat
|
|
|
|
+history over to a [Matrix](https://matrix.org) homeserver hosted on `#community:lovr.org` and
|
|
|
|
+bridged everything to a new Discord server. Keeping the source of truth for chat on a self-hosted,
|
|
|
|
+open source platform ensures the community is hopefully a bit more resilient to future corporate
|
|
|
|
+monkey business.
|
|
|
|
+
|
|
|
|
+Speaking of corporate monkey business, LÖVR has entrenched itself further into the GitHub ecosystem
|
|
|
|
+by adding continuous releases via GitHub Actions! This means us mere mortals can have up-to-date
|
|
|
|
+builds for all platforms without needing to touch CMake or anything related to Android Studio.
|
|
|
|
+
|
|
|
|
+For the remaining masochists among us who choose to build LÖVR from source, there has been a change
|
|
|
|
+to the branching system. The `dev` branch is now the default branch, and `master` has been renamed
|
|
|
|
+to `stable`. The development workflow otherwise remains the same, where new features go into `dev`
|
|
|
|
+and bugfixes are made on `stable`. The following commands will update a local clone:
|
|
|
|
+
|
|
|
|
+ $ git branch -m master stable
|
|
|
|
+ $ git fetch origin
|
|
|
|
+ $ git branch -u origin/stable stable
|
|
|
|
+ $ git remote set-head origin -a
|
|
|
|
+
|
|
|
|
+Changelog
|
|
|
|
+---
|