buffers.lua 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. function lovr.load()
  2. local buffer, data
  3. -- Size
  4. buffer = lovr.graphics.newBuffer(16)
  5. assert(buffer:getSize() == 16)
  6. assert(buffer:getLength() == nil)
  7. assert(buffer:getStride() == nil)
  8. assert(buffer:getFormat() == nil)
  9. -- Format
  10. buffer = lovr.graphics.newBuffer('int')
  11. assert(buffer:getSize() == 4)
  12. assert(buffer:getLength() == 1)
  13. assert(buffer:getStride() == 4)
  14. -- Length
  15. buffer = lovr.graphics.newBuffer('float', 16)
  16. assert(buffer:getSize() == 64)
  17. assert(buffer:getLength() == 16)
  18. assert(buffer:getStride() == 4)
  19. -- Table data
  20. buffer = lovr.graphics.newBuffer('int', { 1, 2, 3 })
  21. assert(buffer:getSize() == 12)
  22. assert(buffer:getLength() == 3)
  23. assert(buffer:getStride() == 4)
  24. data = buffer:getData()
  25. assert(data[1] == 1 and data[2] == 2 and data[3] == 3)
  26. buffer:setData({ 4, 5, 6 })
  27. data = buffer:getData()
  28. assert(data[1] == 4 and data[2] == 5 and data[3] == 6)
  29. buffer:setData({ 8, 9 }, 2)
  30. data = buffer:getData()
  31. assert(data[1] == 4 and data[2] == 8 and data[3] == 9)
  32. buffer:clear()
  33. data = buffer:getData()
  34. assert(data[1] == 0 and data[2] == 0 and data[3] == 0)
  35. -- Keys
  36. buffer = lovr.graphics.newBuffer({{ 'x', 'int' }, { 'y', 'float' }})
  37. buffer:setData({ x = -1, y = 1e7 })
  38. data = buffer:getData()[1]
  39. assert(data[1] == -1 and data[2] == 1e7)
  40. -- Arrays
  41. buffer = lovr.graphics.newBuffer({{ 'a', 'float', 3 }})
  42. assert(buffer:getSize() == 12)
  43. assert(buffer:getLength() == 1)
  44. assert(buffer:getStride() == 12)
  45. buffer:setData({ a = { 10, 100, 1000 } })
  46. data = buffer:getData()[1]
  47. assert(data.a[1] == 10 and data.a[2] == 100 and data.a[3] == 1000)
  48. -- Structs
  49. buffer = lovr.graphics.newBuffer({
  50. { 'a', {
  51. { 'b', {
  52. { 'c', 'vec2' }
  53. }}
  54. }}
  55. })
  56. assert(buffer:getSize() == 8)
  57. assert(buffer:getLength() == 1)
  58. assert(buffer:getStride() == 8)
  59. buffer:setData({ a = { b = { c = { 1.2, 3.4 } } } })
  60. data = buffer:getData()[1]
  61. assert(vec2(unpack(data.a.b.c)):equals(vec2(1.2, 3.4)))
  62. -- Layouts
  63. buffer = lovr.graphics.newBuffer({ 'float', layout = 'std140' })
  64. assert(buffer:getStride() == 16)
  65. buffer = lovr.graphics.newBuffer({ 'vec3', layout = 'std430' })
  66. assert(buffer:getStride() == 16)
  67. -- Blob length
  68. buffer = lovr.graphics.newBuffer('un10x3', lovr.data.newBlob(16))
  69. assert(buffer:getLength() == 4)
  70. buffer = lovr.graphics.newBuffer('un10x3', lovr.data.newBlob(15))
  71. assert(buffer:getLength() == 3)
  72. -- FFI
  73. local ok, ffi = pcall(require, 'ffi')
  74. if ok and ffi then
  75. buffer = lovr.graphics.newBuffer('float')
  76. ffi.cast('float*', buffer:mapData())[0] = 7
  77. assert(buffer:getData()[1] == 7)
  78. end
  79. -- Push constants
  80. shader = lovr.graphics.newShader([[
  81. struct S { int a, b, c; };
  82. Constants {
  83. float x;
  84. vec2 y;
  85. float z[3];
  86. vec2 w[2];
  87. S s;
  88. S t[2];
  89. };
  90. void lovrmain() {}
  91. ]])
  92. pass = lovr.graphics.newPass()
  93. pass:setShader(shader)
  94. pass:send('x', 7)
  95. pass:send('y', 3, 4)
  96. pass:send('y', { 3, 4 })
  97. pass:send('y', vec2(3, 4))
  98. pass:send('z', { 1, 2, 3 })
  99. pass:send('w', { 1, 2, 3, 4 })
  100. pass:send('w', { vec2(1, 2), vec2(3, 4) })
  101. pass:send('w', { { 1, 2 }, { 3, 4 } })
  102. pass:send('s', { a = 1, b = 2, c = 3 })
  103. pass:send('t', { { a = 1, b = 2, c = 3 }, { a = 4, b = 5, c = 6 } })
  104. end