Browse Source

Make ShaderBlock examples more consistent;

bjorn 6 years ago
parent
commit
307d276def
3 changed files with 8 additions and 16 deletions
  1. 1 1
      api/init.lua
  2. 6 13
      api/lovr/graphics/ShaderBlock/init.lua
  3. 1 2
      examples/Instancing/main.lua

+ 1 - 1
api/init.lua

@@ -13185,7 +13185,7 @@ return {
           },
           examples = {
             {
-              code = "function lovr.load()\n  -- Create a ShaderBlock to store positions for 1000 models\n  block = lovr.graphics.newShaderBlock({\n    modelPositions = { 'mat4', 1000 }\n  }, { writable = false, usage = 'static' })\n\n  -- Write some random transforms to the block\n  local transforms = {}\n  for i = 1, 1000 do\n    local transform = lovr.math.newTransform()\n\n    local x = lovr.math.randomNormal(10)\n    local y = lovr.math.randomNormal(10)\n    local z = lovr.math.randomNormal(10)\n    transform:translate(x, y, z)\n    local angle = lovr.math.random() * 2 * math.pi\n    local ax, ay, az = lovr.math.random(), lovr.math.random(), lovr.math.random()\n    transform:rotate(angle, ax, ay, az)\n\n    transforms[i] = transform\n  end\n\n  -- Create the shader, injecting the shader code for the block\n  shader = lovr.graphics.newShader(\n    block:getShaderCode('ModelBlock') .. [[\n    vec4 position(mat4 projection, mat4 transform, vec4 vertex) {\n      return projection * lovrTransform * modelPositions[gl_InstanceID] * vertex;\n    }\n  ]])\n\n  -- Bind the block to the shader\n  shader:sendBlock('ModelBlock', block)\n\n  model = lovr.graphics.newModel('monkey.obj')\nend\n\n-- Draw the model 1000 times, using positions from the shader block\nfunction lovr.draw()\n  lovr.graphics.setShader(shader)\n  model:drawInstanced(1000)\n  lovr.graphics.setShader()\nend"
+              code = "function lovr.load()\n  -- Create a ShaderBlock to store positions for 1000 models\n  block = lovr.graphics.newShaderBlock({\n    modelPositions = { 'mat4', 1000 }\n  }, { writable = false, usage = 'static' })\n\n  -- Write some random transforms to the block\n  local transforms = {}\n  for i = 1, 1000 do\n    transforms[i] = lovr.math.newTransform()\n    local random, randomNormal = lovr.math.random, lovr.math.randomNormal\n    transforms[i]:translate(randomNormal(8), randomNormal(8), randomNormal(8))\n    transforms[i]:rotate(random(2 * math.pi), random(), random(), random())\n  end\n  block:send('modelPositions', transforms)\n\n  -- Create the shader, injecting the shader code for the block\n  shader = lovr.graphics.newShader(\n    block:getShaderCode('ModelBlock') .. [[\n    vec4 position(mat4 projection, mat4 transform, vec4 vertex) {\n      return projection * transform * modelPositions[gl_InstanceID] * vertex;\n    }\n  ]])\n\n  -- Bind the block to the shader\n  shader:sendBlock('ModelBlock', block)\n  model = lovr.graphics.newModel('monkey.obj')\nend\n\n-- Draw the model 1000 times, using positions from the shader block\nfunction lovr.draw()\n  lovr.graphics.setShader(shader)\n  model:drawInstanced(1000)\n  lovr.graphics.setShader()\nend"
             }
           }
         },

+ 6 - 13
api/lovr/graphics/ShaderBlock/init.lua

@@ -29,30 +29,23 @@ return {
       -- Write some random transforms to the block
       local transforms = {}
       for i = 1, 1000 do
-        local transform = lovr.math.newTransform()
-
-        local x = lovr.math.randomNormal(10)
-        local y = lovr.math.randomNormal(10)
-        local z = lovr.math.randomNormal(10)
-        transform:translate(x, y, z)
-        local angle = lovr.math.random() * 2 * math.pi
-        local ax, ay, az = lovr.math.random(), lovr.math.random(), lovr.math.random()
-        transform:rotate(angle, ax, ay, az)
-
-        transforms[i] = transform
+        transforms[i] = lovr.math.newTransform()
+        local random, randomNormal = lovr.math.random, lovr.math.randomNormal
+        transforms[i]:translate(randomNormal(8), randomNormal(8), randomNormal(8))
+        transforms[i]:rotate(random(2 * math.pi), random(), random(), random())
       end
+      block:send('modelPositions', transforms)
 
       -- Create the shader, injecting the shader code for the block
       shader = lovr.graphics.newShader(
         block:getShaderCode('ModelBlock') .. [[
         vec4 position(mat4 projection, mat4 transform, vec4 vertex) {
-          return projection * lovrTransform * modelPositions[gl_InstanceID] * vertex;
+          return projection * transform * modelPositions[gl_InstanceID] * vertex;
         }
       ]])
 
       -- Bind the block to the shader
       shader:sendBlock('ModelBlock', block)
-
       model = lovr.graphics.newModel('monkey.obj')
     end
 

+ 1 - 2
examples/Instancing/main.lua

@@ -22,11 +22,10 @@ function lovr.load()
   -- Create the shader, injecting the shader code for the block
   shader = lovr.graphics.newShader(
     block:getShaderCode('ModelBlock') .. [[
-
     out vec3 vNormal;
     vec4 position(mat4 projection, mat4 transform, vec4 vertex) {
       vNormal = lovrNormal;
-      return projection * lovrTransform * modelPositions[lovrInstanceID] * vertex;
+      return projection * transform * modelPositions[lovrInstanceID] * vertex;
     }
   ]], [[
     in vec3 vNormal;