Explorar o código

Port more examples;

bjorn %!s(int64=3) %!d(string=hai) anos
pai
achega
e688b479cd

+ 3 - 5
examples/Animation/2_Bone_IK/main.lua

@@ -36,7 +36,7 @@ function lovr.update(dt)
   -- Allow hands to drag any of the points
   local points = { root, target, control }
   for i, hand in ipairs(lovr.headset.getHands()) do
-    local handPosition = vec3(lovr.headset.getPosition(hand))
+    local handPosition = vec3(lovr.headset.getPosition(hand .. '/point'))
 
     if lovr.headset.wasPressed(hand, 'trigger') then
       for j, point in ipairs(points) do
@@ -65,10 +65,8 @@ function lovr.draw(pass)
 
   -- Draw the hand
   pass:setColor(0xffffff)
-  for _, hand in ipairs({ 'left', 'right' }) do
-    if lovr.headset.isTracked(hand) then
-      pass:cube(mat4(lovr.headset.getPose(hand)):scale(.01))
-    end
+  for _, hand in ipairs(lovr.headset.getHands()) do
+    pass:cube(mat4(lovr.headset.getPose(hand .. '/point')):scale(.01))
   end
 
   -- Draw a line from the root to the result from the IK solver, then to the target

+ 1 - 1
examples/Debugging/FPS_Controls/lovr-mouse.lua

@@ -42,7 +42,7 @@ ffi.cdef [[
   GLFWcursorposfun glfwSetScrollCallback(GLFWwindow* window, GLFWscrollfun callback);
 ]]
 
-local window = C.os_get_glfw_window()
+local window = ffi.C.os_get_glfw_window()
 
 local mouse = {}
 

+ 22 - 21
examples/Effects/Billboards/main.lua

@@ -15,7 +15,6 @@ function lovr.load()
     end
   end
   puffTexture = lovr.graphics.newTexture(puffImage)
-  -- puffTexture:setFilter('nearest')                                         -- try uncommenting
   puffMaterial = lovr.graphics.newMaterial(puffTexture)
 
   -- puff positions
@@ -42,7 +41,9 @@ function lovr.load()
 
   -- red puff billboard shader
   redPuffVertex = [[
-    uniform vec3 headPosition;
+    Constants {
+      vec3 headPosition;
+    };
 
     mat4 target(vec3 from, vec3 to, vec3 up) {
       mat4 m;
@@ -56,9 +57,9 @@ function lovr.load()
       return m;
     }
 
-    vec4 position(mat4 projection, mat4 transform, vec4 vertex) {
-      vec3 puffPosition = lovrModel[3].xyz;
-      vec3 puffScale = vec3(length(lovrModel[0]), length(lovrModel[1]), length(lovrModel[2]));
+    vec4 lovrmain() {
+      vec3 puffPosition = Transform[3].xyz;
+      vec3 puffScale = vec3(length(Transform[0]), length(Transform[1]), length(Transform[2]));
       mat4 billboardModel = target(puffPosition, headPosition, vec3(0, 1, 0));
       billboardModel *= mat4(
         puffScale.x, 0,           0,           0,
@@ -66,12 +67,12 @@ function lovr.load()
         0,           0,           puffScale.z, 0,
         0,           0,           0,           1
       );
-      return projection * lovrView * billboardModel * vertex;
+      return Projection * View * billboardModel * VertexPosition;
     }
   ]]
   defaultFragment = [[
-    vec4 color(vec4 graphicsColor, sampler2D image, vec2 uv) {
-      return graphicsColor * lovrDiffuseColor * lovrVertexColor * texture(image, uv);
+    vec4 lovrmain() {
+      return DefaultColor;
     }
   ]]
   redPuffShader = lovr.graphics.newShader(redPuffVertex, defaultFragment)
@@ -79,24 +80,24 @@ function lovr.load()
   lovr.graphics.setBackgroundColor(0, .5, 1)
 end
 
-function lovr.draw()
+function lovr.draw(pass)
+  pass:setSampler('nearest')                                         -- try uncommenting
+
   -- red puffs
-  lovr.graphics.setColor(1, .9, .9)
-  lovr.graphics.setDepthTest('lequal', false)
-  lovr.graphics.setShader(redPuffShader)
-  redPuffShader:send('headPosition', {lovr.headset.getPosition('head')})
+  pass:setColor(1, .9, .9)
+  pass:setMaterial(puffMaterial)
+  pass:setDepthWrite(false)
+  pass:setShader(redPuffShader)
+  pass:send('headPosition', lovr.headset.getPosition('head'))
   for _, puff in pairs(redPuffs) do
-    lovr.graphics.plane(puffMaterial, puff.position, .1)
+    pass:plane(puff.position, .1)
   end
-  lovr.graphics.setDepthTest('lequal', true)
-  lovr.graphics.setShader()
+  pass:setShader()
 
   -- blue puffs
-  lovr.graphics.setColor(.9, 1, 1)
-  lovr.graphics.setDepthTest('lequal', false)
+  pass:setColor(.9, 1, 1)
   for _, puff in pairs(bluePuffs) do
     puff.orientation = quat(mat4():target(puff.position, vec3(lovr.headset.getPosition('head'))))
-    lovr.graphics.plane(puffMaterial, puff.position, .1, .1, puff.orientation)
+    pass:plane(puff.position, .1, .1, puff.orientation)
   end
-  lovr.graphics.setDepthTest('lequal', true)
-end
+end

+ 13 - 14
examples/Effects/Cubemap_Texturing/main.lua

@@ -1,3 +1,4 @@
+-- Applies a cubemap texture to a cube
 -- Texture from Humus (www.humus.name)
 
 function lovr.load()
@@ -11,24 +12,22 @@ function lovr.load()
   })
 
   shader = lovr.graphics.newShader([[
-    out vec3 pos;
-    vec4 position(mat4 projection, mat4 transform, vec4 vertex) {
-      pos = vertex.xyz;
-      return projection * transform * vertex;
+    layout(location = 0) out vec3 pos;
+    vec4 lovrmain() {
+      pos = VertexPosition.xyz;
+      return DefaultPosition;
     }
   ]], [[
-    uniform samplerCube cube;
-    in vec3 pos;
-    vec4 color(vec4 tint, sampler2D image, vec2 uv) {
-      return texture(cube, pos);
+    layout(set = 2, binding = 0) uniform textureCube cube;
+    layout(location = 0) in vec3 pos;
+    vec4 lovrmain() {
+      return getPixel(cube, pos);
     }
   ]])
-
-  shader:send('cube', cube)
 end
 
-function lovr.draw()
-  lovr.graphics.setShader(shader)
-  lovr.graphics.cube('fill', 0, 1.7, -3, 1, lovr.timer.getTime(), 1, 1, 1)
-  lovr.graphics.setShader()
+function lovr.draw(pass)
+  pass:setShader(shader)
+  pass:send('cube', cube)
+  pass:cube(0, 1.7, -3, 1, lovr.timer.getTime(), 1, 1, 1)
 end

+ 13 - 16
examples/Effects/Stereo_Image/main.lua

@@ -1,30 +1,27 @@
+-- Renders a side-by-side stereo image on a plane, resulting in a 3D effect
+
 function lovr.load()
   sbsTexture = lovr.graphics.newTexture('sbs_left_right.png', { mipmaps = false })
   sbsShader = lovr.graphics.newShader([[
-    vec4 position(mat4 projection, mat4 transform, vec4 vertex) {
-      return projection * transform * vertex;
+    vec4 lovrmain() {
+      return DefaultPosition;
     }
   ]], [[
-    uniform sampler2D tex;
-    vec4 color(vec4 graphicsColor, sampler2D image, vec2 uv) {
-      vec2 newUV = clamp(uv, 0., 1.) * vec2(.5, 1.) + vec2(lovrViewID) * vec2(.5, 0.);
+    vec4 lovrmain() {
+      vec2 newUV = clamp(UV, 0., 1.) * vec2(.5, 1.) + vec2(ViewIndex) * vec2(.5, 0.);
 
       // Use this instead for top-bottom stereo
-      // vec2 newUV = clamp(uv, 0., 1.) * vec2(1., .5) + vec2(lovrViewID) * vec2(0., .5);
+      // vec2 newUV = clamp(UV, 0., 1.) * vec2(1., .5) + vec2(ViewIndex) * vec2(0., .5);
 
-      return texture(tex, newUV);
-    }
-  ]], {
-    flags = {
-      highp = true
+      return getPixel(ColorTexture, newUV);
     }
-  })
+  ]])
 
   lovr.graphics.setBackgroundColor(.05, .05, .05)
 end
 
-function lovr.draw()
-  lovr.graphics.setShader(sbsShader)
-  sbsShader:send('tex', sbsTexture)
-  lovr.graphics.plane('fill', 0, 1, -2, 2.5, 2, 0, 0, 0, 0)
+function lovr.draw(pass)
+  pass:setMaterial(sbsTexture)
+  pass:setShader(sbsShader)
+  pass:plane(0, 1, -2, 2.5, 2)
 end

+ 4 - 0
examples/Environment/Mirror/conf.lua

@@ -0,0 +1,4 @@
+function lovr.conf(t)
+  t.graphics.stencil = true
+  t.headset.stencil = true
+end

+ 42 - 37
examples/Environment/Mirror/main.lua

@@ -1,65 +1,70 @@
 local mirrorPose = lovr.math.newMat4(0, 1.65, -0.75)
 local mirrorSize = lovr.math.newVec3(0.6, 1.2, 1)
 
-local function draw_mirror(outline)
+local function draw_mirror(pass, outline)
   local pose = mat4(mirrorPose)
   pose:scale(mirrorSize)
-  lovr.graphics.plane(outline and 'line' or 'fill', pose)
+  pass:plane(pose, outline and 'line' or 'fill')
 end
 
-local function draw_scene()
-  lovr.graphics.setColor(0x203c56)
-  lovr.graphics.box('fill', 0, 0, 0,  4, 0.05, 4) -- floor
-  lovr.graphics.setColor(0x544e68)
-  lovr.graphics.box('fill', 0, 1, -0.5,  1, 0.1, 0.4) -- a table
-  lovr.graphics.setColor(0xffaa5e)
-  lovr.graphics.cylinder(0.2, 1.2, -0.4,  0.3,  math.pi/2, 1,0,0, 0.07, 0.05, true, 8) -- a vase
-  lovr.graphics.setColor(0xffd4a3)
-  lovr.graphics.box('fill', 0.1, 1.1, -0.6,  0.12, 0.1, 0.12) -- a jewelry box
+local function draw_scene(pass)
+  pass:setColor(0x203c56)
+  pass:box(0, 0, 0,  4, 0.05, 4) -- floor
+  pass:setColor(0x544e68)
+  pass:box(0, 1, -0.5,  1, 0.1, 0.4) -- a table
+  pass:setColor(0xffaa5e)
+  pass:cylinder(0.2, 1.2, -0.4,  .06,0.3,  math.pi/2, 1,0,0, true, 0,2*math.pi, 8) -- a vase
+  pass:setColor(0xffd4a3)
+  pass:box(0.1, 1.1, -0.6,  0.12, 0.1, 0.12) -- a jewelry box
   local pose = mat4()
   pose:set(lovr.headset.getPose('head')):scale(0.09, 0.12, 0.11)
-  lovr.graphics.setColor(0x8d697a)
-  lovr.graphics.sphere(pose) -- head
-  lovr.graphics.setColor(0xd08159)
+  pass:setColor(0x8d697a)
+  pass:sphere(pose) -- head
+  pass:setColor(0xd08159)
   pose:set(lovr.headset.getPose('head'))
   pose:translate(0, -0.02, -0.1)
   pose:rotate(-0.2, 1,0,0)
-  pose:scale(0.03, 0.04, 0.03)
-  lovr.graphics.cylinder(pose, 0.015, 0.02) -- nose
+  pose:scale(0.015, 0.02, 0.03)
+  pass:cylinder(pose) -- nose
   for _, handness in ipairs(lovr.headset.getHands()) do
     local skeleton = lovr.headset.getSkeleton(handness)
     if skeleton then
       for _, bone in ipairs(skeleton) do
-        lovr.graphics.box('fill', pose:set(unpack(bone)):scale(0.017, 0.012, 0.019)) -- hand bone
+        pass:box(pose:set(unpack(bone)):scale(0.017, 0.012, 0.019)) -- hand bone
       end
     else
       pose:set(lovr.headset.getPose(handness)):scale(0.03, 0.07, 0.09)
-      lovr.graphics.box('fill', pose) -- palm
+      pass:box(pose) -- palm
     end
   end
 end
 
 function lovr.load()
-  lovr.graphics.setCullingEnabled(true)
   lovr.graphics.setBackgroundColor(0x0d2b45)
-  lovr.graphics.setLineWidth(5)
 end
 
-function lovr.draw()
-  draw_scene()
-  lovr.graphics.setColor(0xffecd6)
-  draw_mirror(true) -- mirror frame
-  lovr.graphics.push()
-  lovr.graphics.stencil(draw_mirror, 'replace', 1, false)
-  lovr.graphics.setStencilTest('equal', 1)
-  lovr.graphics.transform(mirrorPose)
-  lovr.graphics.scale(1, 1, -1) -- after Z-flip all triangles will change their windings
-  lovr.graphics.transform(mat4(mirrorPose):invert())
-  lovr.graphics.setWinding('clockwise') -- invert the winding to account for the flip
-  draw_scene()
-  lovr.graphics.setWinding('counterclockwise')
-  lovr.graphics.setStencilTest()
-  lovr.graphics.pop()
-  lovr.graphics.setColor(0x000000, 0.3)
-  draw_mirror(false) -- glass tint
+function lovr.draw(pass)
+  pass:setCullMode('back')
+  draw_scene(pass)
+  pass:setColor(0xffecd6)
+  draw_mirror(pass, true) -- mirror frame
+  pass:push()
+  pass:setStencilWrite('replace', 1)
+  pass:setColorWrite(false)
+  pass:setDepthWrite(false)
+  draw_mirror(pass)
+  pass:setDepthWrite(true)
+  pass:setColorWrite(true)
+  pass:setStencilWrite()
+  pass:setStencilTest('equal', 1)
+  pass:transform(mirrorPose)
+  pass:scale(1, 1, -1) -- after Z-flip all triangles will change their windings
+  pass:transform(mat4(mirrorPose):invert())
+  pass:setWinding('clockwise') -- invert the winding to account for the flip
+  draw_scene(pass)
+  pass:setWinding('counterclockwise')
+  pass:setStencilTest()
+  pass:pop()
+  pass:setColor(0x000000, 0.3)
+  draw_mirror(pass, false) -- glass tint
 end