From 0930bd75445d2c548a445c3f10cae4ddb118382f Mon Sep 17 00:00:00 2001 From: Leon van Kammen Date: Wed, 1 Jul 2026 18:46:28 +0200 Subject: [PATCH] separated shaders from startupscene + improved gazecontrol interaction --- xurfer/conf.lua | 4 +- xurfer/ext/gazecontrol/main.lua | 64 +++++++++++++++++++----- xurfer/ext/gazecontrol/reticle_idle.png | Bin 0 -> 14871 bytes xurfer/ext/startupscene/main.lua | 9 ++-- xurfer/main.lua | 3 +- xurfer/runtime/lovr/main.lua | 25 ++++++--- xurfer/runtime/lovr/render/model.lua | 34 ------------- xurfer/runtime/lovr/shaders.lua | 34 +++++++++++++ 8 files changed, 113 insertions(+), 60 deletions(-) create mode 100644 xurfer/ext/gazecontrol/reticle_idle.png create mode 100644 xurfer/runtime/lovr/shaders.lua diff --git a/xurfer/conf.lua b/xurfer/conf.lua index f772356..2333ee5 100644 --- a/xurfer/conf.lua +++ b/xurfer/conf.lua @@ -1,5 +1,7 @@ -- default argument -arg[1] = "https://snips.sh/f/_U5-XctEVE?r=1" +if arg[1] == nil then + arg[1] = "https://snips.sh/f/_U5-XctEVE?r=1" +end -- sync lovr/love positional cli arguments if arg[0] == nil and arg[1] ~= nil then arg[0] = arg[1] end diff --git a/xurfer/ext/gazecontrol/main.lua b/xurfer/ext/gazecontrol/main.lua index feb4955..7902364 100644 --- a/xurfer/ext/gazecontrol/main.lua +++ b/xurfer/ext/gazecontrol/main.lua @@ -6,30 +6,68 @@ local gctl gctl = { name = "gctl", - enabled = false, + enabled = true, + texture = {}, + material = nil, dtmax = 1, dt = 0, init = function() - lovr.mouse.setRelativeMode(true) + --lovr.mouse.setRelativeMode(true) + gctl.initVisor() + gctl.extendECS() + end, - camera = { - transform = lovr.math.newMat4(), - position = vector(), - movespeed = 10, - pitch = 0, - yaw = 0 + + load = function() + gctl.texture.idle = lovr.graphics.newTexture("ext/gazecontrol/reticle_idle.png") + end, + + initVisor = function() + -- add visor object + gctl.visor = { + rotate = { x = 0, y = 0, z = 0}, + scale = 0.1, + texture = gctl.texture.idle } end, - update = function(dt) - end, - - load = function() end, - draw = function(pass,dt) + -- *TODO* render this last (as it needs to be rendered after skybox & floor) + local posx, posy, posz = lovr.headset.getPosition('head') + local dirx, diry, dirz = lovr.headset.getDirection('head') + local distance = 1 + local x = posx + distance * dirx + local y = posy + distance * diry + local z = posz + distance * dirz + local angle, ax, ay, az = lovr.headset.getOrientation(device) + local rot = gctl.visor.rotate + local scale = gctl.visor.scale + pass:setMaterial(gctl.texture.idle) + pass:setShader() --'unlit') + pass:setBlendMode('alpha') + pass:setColor(1, 1, 1) + pass:setCullMode('back') + pass:plane(x, y, z, scale, scale, angle, ax, ay, az) end, + -- ECS API docs: https://bakpakin.github.io/tiny-ecs/doc + extendECS = function() + + local visorSystem = ecs.processingSystem({ + updatethread = true, + filter = ecs.requireAll('mycomponent'), + onAdd = function(self,obj) print_r(obj) end, + onRemove = function(self,obj) end, + process = function(self,obj) end, + }) + ecs.addSystem( api.world, visorSystem ) + + ecs.add( api.world, { visor = gctl.visor } ) + --gctl.visor.commit() -- notify other systems to update entitycache + + end + } return gctl diff --git a/xurfer/ext/gazecontrol/reticle_idle.png b/xurfer/ext/gazecontrol/reticle_idle.png new file mode 100644 index 0000000000000000000000000000000000000000..f1fb1b30dbc6bedfe1de43d88fff382ef9679f1b GIT binary patch literal 14871 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 JPDHLkV1mfgB;Wu5 literal 0 HcmV?d00001 diff --git a/xurfer/ext/startupscene/main.lua b/xurfer/ext/startupscene/main.lua index b06baaf..a4f3e76 100644 --- a/xurfer/ext/startupscene/main.lua +++ b/xurfer/ext/startupscene/main.lua @@ -45,6 +45,8 @@ return { -- skybox pass:setCullMode('back') pass:setBlendMode() + pass:setShader() + pass:setColor(1,1,1,1) pass:skybox(api.world.skybox) pass:setColor(1, 1, 1) @@ -53,6 +55,7 @@ return { -- floor --pass:setMaterial() + pass:setShader() pass:setCullMode('front') pass:setBlendMode('alpha') pass:setMaterial() @@ -61,9 +64,9 @@ return { pass:setColor( 0, 0, 0, 0.75 ) pass:plane(0, 0.01, 0, 500, 500, math.pi * 0.5, 1, 0, 0, "line", 100, 100) - pass:setShader( lovr.shader.pbr ) - pass:send('cubemap', api.world.environmentMap) - pass:send('sphericalHarmonics', api.world.sphericalHarmonics) + --pass:setShader( lovr.shader.pbr ) + --pass:send('cubemap', api.world.environmentMap) + --pass:send('sphericalHarmonics', api.world.sphericalHarmonics) end end diff --git a/xurfer/main.lua b/xurfer/main.lua index 72b2871..168d96c 100755 --- a/xurfer/main.lua +++ b/xurfer/main.lua @@ -33,7 +33,8 @@ api = { protocol = {}, ext = { -- all extensions are loaded here from disk at runtime exec = function(...) util.exec(api.ext,...) end -- util function to call func on each extension - } + }, + i = 1 } api = util.merge( api, runtime.api ) -- overlay api onto lovr/love-compatible runtime api diff --git a/xurfer/runtime/lovr/main.lua b/xurfer/runtime/lovr/main.lua index 01d187a..b2bf969 100644 --- a/xurfer/runtime/lovr/main.lua +++ b/xurfer/runtime/lovr/main.lua @@ -5,6 +5,8 @@ end local util = require "util" local launch = require "launch" +require('shaders').create(api) + local iui = require "lib.iui" local backend = require "lib.lovr-iui" @@ -92,7 +94,7 @@ function lovr.draw(pass) iui.draw() end if api.iui.idiom == "vr" then - pass:setClear(0.5, 0.5, 0.5) + pass:setClear(0.2, 0.2, 0.2) end api.ext.exec("draw",pass) @@ -104,11 +106,14 @@ function lovr.draw(pass) pass:sphere( interactionsUpdater.hitpoint, .01) end - -- Laser pointer - local hand = vec3(lovr.headset.getPosition('hand/left/point')) - local direction = quat(lovr.headset.getOrientation('hand/left/point')):direction() - pass:setColor(1, 1, 1) - pass:line(hand, interactionsUpdater.selectedBox and interactionsUpdater.hitpoint or (hand + direction * 50)) + -- Laser pointers + local hands = {"left","right"} + foreach( hands, function(k,side) + local hand = vec3(lovr.headset.getPosition('hand/' .. side .. '/point')) + local direction = quat(lovr.headset.getOrientation('hand/' .. side .. '/point')):direction() + pass:setColor(1, 1, 1) + pass:line(hand, interactionsUpdater.selectedBox and interactionsUpdater.hitpoint or (hand + direction * 50)) + end) if api.mainWindow then api.mainWindow:draw(pass) @@ -177,9 +182,12 @@ function initInteractions(ecs) function interactionsUpdater:process(obj, dt) ecs.worldPhysics:update(dt) - local ox, oy, oz = lovr.headset.getPosition('hand/left/point') + local castsrc = 'hand/left/point' + local castsrc = 'head' - local direction = quat(lovr.headset.getOrientation('hand/left/point')):direction() + local ox, oy, oz = lovr.headset.getPosition(castsrc) + + local direction = quat(lovr.headset.getOrientation(castsrc)):direction() if direction ~= nil then local dx, dy, dz = direction:mul(50):unpack() local collider, shape, x, y, z = ecs.worldPhysics:raycast(ox, oy, oz, ox + dx, oy + dy, oz + dz) @@ -190,6 +198,7 @@ function initInteractions(ecs) print("buttondown") end if lovr.headset.wasReleased(hand, 'trigger') or interactionsUpdater['mouse']['released'] then + print("cast: mousedown!") local node = collider:getUserData() interactionsUpdater.selectedBox = collider interactionsUpdater.hitpoint:set(x, y, z) diff --git a/xurfer/runtime/lovr/render/model.lua b/xurfer/runtime/lovr/render/model.lua index 596d232..2c7d23b 100644 --- a/xurfer/runtime/lovr/render/model.lua +++ b/xurfer/runtime/lovr/render/model.lua @@ -7,8 +7,6 @@ modelRenderer = { init = function(api) local ecs = api.ecs api.world.shader = { pbr = false } - lovr.shader = lovr.shader or {} - lovr.shader['pbr'] = modelRenderer.initShaderPBR() renderer = ecs.processingSystem() renderer.filter = ecs.requireAll('model') @@ -36,38 +34,6 @@ modelRenderer = { end end ecs.addSystem( api.world, renderer ) - end, - - initShaderPBR = function() - return lovr.graphics.newShader([[ - vec4 lovrmain() { - return DefaultPosition; - } - ]], [[ - uniform textureCube cubemap; - uniform sphericalHarmonics { vec3 sh[9]; }; - - vec4 lovrmain() { - Surface surface; - initSurface(surface); - - vec3 color = vec3(0); - vec3 lightDirection = vec3(-1, -1, -1); - vec4 lightColorAndBrightness = vec4(1, 1, 1, 3); - float visibility = 1.; - color += getLighting(surface, lightDirection, lightColorAndBrightness, visibility); - color += getIndirectLighting(surface, cubemap, sh); - - return vec4(color, 1); - } - ]], { - flags = { - glow = true, - normalMap = true, - vertexTangents = false, -- DamagedHelmet doesn't have vertex tangents - tonemap = true - } - }) end } diff --git a/xurfer/runtime/lovr/shaders.lua b/xurfer/runtime/lovr/shaders.lua new file mode 100644 index 0000000..daa5c6b --- /dev/null +++ b/xurfer/runtime/lovr/shaders.lua @@ -0,0 +1,34 @@ +return { + create = function(api) + lovr.shader = {} + lovr.shader.pbr = lovr.graphics.newShader([[ + vec4 lovrmain() { + return DefaultPosition; + } + ]], [[ + uniform textureCube cubemap; + uniform sphericalHarmonics { vec3 sh[9]; }; + + vec4 lovrmain() { + Surface surface; + initSurface(surface); + + vec3 color = vec3(0); + vec3 lightDirection = vec3(-1, -1, -1); + vec4 lightColorAndBrightness = vec4(1, 1, 1, 3); + float visibility = 1.; + color += getLighting(surface, lightDirection, lightColorAndBrightness, visibility); + color += getIndirectLighting(surface, cubemap, sh); + + return vec4(color, 1); + } + ]], { + flags = { + glow = true, + normalMap = true, + vertexTangents = false, -- DamagedHelmet doesn't have vertex tangents + tonemap = true + } + }) + end +}