Browse Source

Update physics examples;

bjorn 3 years ago
parent
commit
e074e57485

+ 14 - 17
examples/Physics/Boxes/main.lua

@@ -9,23 +9,24 @@ function lovr.load()
   -- Create boxes!
   boxes = {}
   for x = -1, 1, .25 do
-    for y = .125, 2, .24999 do
+    for y = .125, 2, .2499 do
       local box = world:newBoxCollider(x, y, -2 - y / 5, .25)
       table.insert(boxes, box)
+      box:setFriction(.8)
     end
   end
 
   controllerBoxes = {}
 
   lovr.timer.step() -- Reset the timer before the first update
-
-  shader = lovr.graphics.newShader('standard')
-  shader:send('lovrExposure', 2)
+  lovr.graphics.setBackground(.8, .8, .8)
 end
 
+local isFirstFrame = true
+
 function lovr.update(dt)
   -- Update the physics simulation
-  world:update(dt)
+  world:update(1 / 60)
 
   -- Place boxes on controllers
   for i, hand in ipairs(lovr.headset.getHands()) do
@@ -38,27 +39,23 @@ function lovr.update(dt)
 end
 
 -- A helper function for drawing boxes
-function drawBox(box)
+function drawBox(pass, box)
   local x, y, z = box:getPosition()
-  lovr.graphics.cube('fill', x, y, z, .25, box:getOrientation())
+  pass:cube(x, y, z, .25, box:getOrientation())
 end
 
-function lovr.draw()
-  lovr.graphics.setBackgroundColor(.8, .8, .8)
-  lovr.graphics.setShader(shader)
+function lovr.draw(pass)
+  pass:setShader(shader)
 
-  lovr.graphics.setColor(1, 0, 0)
+  pass:setColor(1, 0, 0)
   for i, box in ipairs(boxes) do
-    drawBox(box)
+    drawBox(pass, box)
   end
 
   if lovr.headset.getDriver() ~= 'desktop' then
-    lovr.graphics.setColor(0, 0, 1)
+    pass:setColor(0, 0, 1)
     for i, box in ipairs(controllerBoxes) do
-      drawBox(box)
+      drawBox(pass, box)
     end
   end
-
-  lovr.graphics.setColor(1, 1, 1)
-  lovr.graphics.setShader()
 end

+ 24 - 30
examples/Physics/Drawing_Colliders/main.lua

@@ -45,24 +45,21 @@ function lovr.update(dt)
 end
 
 
-function lovr.draw()
+function lovr.draw(pass)
   for i, collider in ipairs(world:getColliders()) do
     -- rendering shapes of each collider
-    drawCollider(collider)
+    drawCollider(pass, collider)
     -- debug geometry for joints (no joints are used in this example)
-    drawAttachedJoints(collider)
+    drawAttachedJoints(pass, collider)
   end
 end
 
 
-function drawCollider(collider)
+function drawCollider(pass, collider)
   local color = collider:getUserData()
-  lovr.graphics.setColor(color or 0x202020)
   local shape = collider:getShapes()[1]
-  if shape:isSensor() then
-    local r,g,b = lovr.graphics.getColor()
-    lovr.graphics.setColor(r,g,b,0.2)
-  end
+  local alpha = shape:isSensor() and 0.2 or 1.0
+  pass:setColor(color or 0x202020, alpha)
   -- shapes
   for _, shape in ipairs(collider:getShapes()) do
     local shapeType = shape:getType()
@@ -70,27 +67,24 @@ function drawCollider(collider)
     -- draw primitive at collider's position with correct dimensions
     if shapeType == 'box' then
       local sx, sy, sz = shape:getDimensions()
-      lovr.graphics.box('fill', x,y,z, sx,sy,sz, angle, ax,ay,az)
+      pass:box(x,y,z, sx,sy,sz, angle, ax,ay,az)
     elseif shapeType == 'sphere' then
-      lovr.graphics.sphere(x,y,z, shape:getRadius())
+      pass:sphere(x,y,z, shape:getRadius())
     elseif shapeType == 'cylinder' then
       local l, r = shape:getLength(), shape:getRadius()
       local x,y,z, angle, ax,ay,az = collider:getPose()
-      lovr.graphics.cylinder(x,y,z, l, angle, ax,ay,az, r, r)
+      pass:cylinder(x,y,z, r, l, angle, ax,ay,az)
     elseif shapeType == 'capsule' then
       local l, r = shape:getLength(), shape:getRadius()
       local x,y,z, angle, ax,ay,az = collider:getPose()
-      local m = mat4(x,y,z, 1,1,1, angle, ax,ay,az)
-      lovr.graphics.cylinder(x,y,z, l, angle, ax,ay,az, r, r, false)
-      lovr.graphics.sphere(vec3(m:mul(0, 0,  l/2)), r)
-      lovr.graphics.sphere(vec3(m:mul(0, 0, -l/2)), r)
+      pass:capsule(x,y,z, r, l, angle, ax,ay,az)
     end
   end
 end
 
 
-function drawAttachedJoints(collider)
-  lovr.graphics.setColor(1,1,1,0.3)
+function drawAttachedJoints(pass, collider)
+  pass:setColor(1,1,1,0.3)
   -- joints are attached to two colliders; function draws joint for second collider
   for j, joint in ipairs(collider:getJoints()) do
     local anchoring, attached = joint:getColliders()
@@ -98,33 +92,33 @@ function drawAttachedJoints(collider)
       jointType = joint:getType()
       if jointType == 'ball' then
         local x1, y1, z1, x2, y2, z2 = joint:getAnchors()
-        drawAnchor(vec3(x1,y1,z1))
-        drawAnchor(vec3(x2,y2,z2))
+        drawAnchor(pass, vec3(x1,y1,z1))
+        drawAnchor(pass, vec3(x2,y2,z2))
       elseif jointType == 'slider' then
         local position = joint:getPosition()
         local x,y,z = anchoring:getPosition()
-        drawAxis(vec3(x,y,z), vec3(joint:getAxis()))
+        drawAxis(pass, vec3(x,y,z), vec3(joint:getAxis()))
       elseif jointType == 'distance' then
         local x1, y1, z1, x2, y2, z2 = joint:getAnchors()
-        drawAnchor(vec3(x1,y1,z1))
-        drawAnchor(vec3(x2,y2,z2))
-        drawAxis(vec3(x2,y2,z2), vec3(x1, y1, z1) - vec3(x2,y2,z2))
+        drawAnchor(pass, vec3(x1,y1,z1))
+        drawAnchor(pass, vec3(x2,y2,z2))
+        drawAxis(pass, vec3(x2,y2,z2), vec3(x1, y1, z1) - vec3(x2,y2,z2))
       elseif jointType == 'hinge' then
         local x1, y1, z1, x2, y2, z2 = joint:getAnchors()
-        drawAnchor(vec3(x1,y1,z1))
-        drawAnchor(vec3(x2,y2,z2))
-        drawAxis(vec3(x1,y1,z1), vec3(joint:getAxis()))
+        drawAnchor(pass, vec3(x1,y1,z1))
+        drawAnchor(pass, vec3(x2,y2,z2))
+        drawAxis(pass, vec3(x1,y1,z1), vec3(joint:getAxis()))
       end
     end
   end
 end
 
 
-function drawAnchor(origin)
-  lovr.graphics.sphere(origin, .02)
+function drawAnchor(pass, origin)
+  pass:sphere(origin, .02)
 end
 
 
 function drawAxis(origin, axis)
-  lovr.graphics.line(origin, origin + axis:normalize() * 0.3)
+  pass:line(origin, origin + axis:normalize() * 0.3)
 end

+ 7 - 7
examples/Physics/Hand_Physics/main.lua

@@ -113,22 +113,22 @@ function lovr.update(dt)
 end
 
 
-function lovr.draw()
+function lovr.draw(pass)
   for i, collider in ipairs(hands.colliders) do
     local alpha = hands.solid[i] and 1 or 0.2
-    lovr.graphics.setColor(0.75, 0.56, 0.44, alpha)
-    drawBoxCollider(collider)
+    pass:setColor(0.75, 0.56, 0.44, alpha)
+    drawBoxCollider(pass, collider)
   end
   lovr.math.setRandomSeed(0)
   for i, collider in ipairs(boxes) do
     local shade = 0.2 + 0.6 * lovr.math.random()
-    lovr.graphics.setColor(shade, shade, shade)
-    drawBoxCollider(collider)
+    pass:setColor(shade, shade, shade)
+    drawBoxCollider(pass, collider)
   end
 end
 
 
-function drawBoxCollider(collider)
+function drawBoxCollider(pass, collider)
   -- query current pose (location and orientation)
   local pose = mat4(collider:getPose())
   -- query dimensions of box
@@ -136,7 +136,7 @@ function drawBoxCollider(collider)
   local size = vec3(shape:getDimensions())
   -- draw box
   pose:scale(size)
-  lovr.graphics.box('fill', pose)
+  pass:box(pose)
 end
 
 

+ 6 - 6
examples/Physics/Newtons_Cradle/main.lua

@@ -30,17 +30,17 @@ function lovr.load()
   -- displace the last ball to set the Newton's cradle in motion
   local lastBall = balls[#balls]
   lastBall:setPosition(vec3(lastBall:getPosition()) + vec3(5 * radius, 5 * radius, 0))
-  lovr.graphics.setBackgroundColor(0.1, 0.1, 0.1)
+  lovr.graphics.setBackground(0.1, 0.1, 0.1)
 end
 
 
-function lovr.draw()
-  lovr.graphics.setColor(0, 0, 0)
-  lovr.graphics.box('fill', framePose)
-  lovr.graphics.setColor(1, 1, 1)
+function lovr.draw(pass)
+  pass:setColor(0, 0, 0)
+  pass:box(framePose)
+  pass:setColor(1, 1, 1)
   for i, ball in ipairs(balls) do
     local position = vec3(ball:getPosition())
-    lovr.graphics.sphere(position, radius)
+    pass:sphere(position, radius)
   end
 end
 

+ 4 - 4
examples/Physics/Saloon_Door/main.lua

@@ -19,15 +19,15 @@ function lovr.load()
   local joint = lovr.physics.newDistanceJoint(door1, door2, vec3(door1:getPosition()), vec3(door2:getPosition()))
   joint:setTightness(0.2)
   joint:setResponseTime(10)
-  lovr.graphics.setBackgroundColor(0.1, 0.1, 0.1)
+  lovr.graphics.setBackground(0.1, 0.1, 0.1)
 end
 
-function lovr.draw()
+function lovr.draw(pass)
   for i, boxCollider in ipairs(world:getColliders()) do
-    lovr.graphics.setColor(i / 3, i / 3, i / 3)
+    pass:setColor(i / 3, i / 3, i / 3)
     local pose = mat4(boxCollider:getPose())
     local size = vec3(boxCollider:getShapes()[1]:getDimensions())
-    lovr.graphics.box('fill', pose:scale(size))
+    pass:box(pose:scale(size))
   end
 end
 

+ 6 - 9
examples/Physics/Zip_Line/main.lua

@@ -24,7 +24,7 @@ function lovr.load()
   local joint = lovr.physics.newDistanceJoint(trolley, weight, vec3(trolley:getPosition()), vec3(weight:getPosition()) + vec3(0, 0.3, 0))
   joint:setResponseTime(10) -- make the hanging rope streachable
 
-  lovr.graphics.setBackgroundColor(0.1, 0.1, 0.1)
+  lovr.graphics.setBackground(0.1, 0.1, 0.1)
 end
 
 
@@ -33,23 +33,20 @@ function lovr.update(dt)
 end
 
 
-function lovr.draw()
+function lovr.draw(pass)
   for i, collider in ipairs(world:getColliders()) do
-    lovr.graphics.setColor(0.6, 0.6, 0.6)
+    pass:setColor(0.6, 0.6, 0.6)
     local shape = collider:getShapes()[1]
     local shapeType = shape:getType()
     local x,y,z, angle, ax,ay,az = collider:getPose()
     if shapeType == 'box' then
       local sx, sy, sz = shape:getDimensions()
-      lovr.graphics.box('fill', x,y,z, sx,sy,sz, angle, ax,ay,az)
+      pass:box(x,y,z, sx,sy,sz, angle, ax,ay,az)
     elseif shapeType == 'capsule' then
-      lovr.graphics.setColor(0.4, 0, 0)
+      pass:setColor(0.4, 0, 0)
       local l, r = shape:getLength(), shape:getRadius()
       local x,y,z, angle, ax,ay,az = collider:getPose()
-      local m = mat4(x,y,z, 1,1,1, angle, ax,ay,az)
-      lovr.graphics.cylinder(x,y,z, l, angle, ax,ay,az, r, r, false)
-      lovr.graphics.sphere(vec3(m:mul(0, 0,  l/2)), r)
-      lovr.graphics.sphere(vec3(m:mul(0, 0, -l/2)), r)
+      pass:capsule(x,y,z, r, l, angle, ax,ay,az)
     end
   end
 end