vertexbuffer.monkey2 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. Namespace mojo.graphics
  2. #rem monkeydoc @hidden
  3. #end
  4. Class VertexBuffer
  5. Method New( capacity:Int )
  6. _capacity=capacity
  7. _data=New Vertex2f[_capacity]
  8. End
  9. Property Capacity:Int()
  10. Return _capacity
  11. End
  12. Property Length:Int()
  13. Return _length
  14. End
  15. Property Pitch:Int()
  16. Return 28
  17. End
  18. Method Clear()
  19. _length=0
  20. _clean=0
  21. End
  22. Method AddVertices:Vertex2f Ptr( count:Int )
  23. If _length+count>_capacity Return Null
  24. Local p:=_data.Data+_length
  25. _length+=count
  26. Return p
  27. End
  28. '***** INTERNAL *****
  29. Method Bind()
  30. If _seq<>glGraphicsSeq
  31. _seq=glGraphicsSeq
  32. _clean=0
  33. glGenBuffers( 1,Varptr _glvbo )
  34. glBindBuffer( GL_ARRAY_BUFFER,_glvbo )
  35. glBufferData( GL_ARRAY_BUFFER,_capacity * Pitch,Null,GL_DYNAMIC_DRAW )
  36. Else
  37. glBindBuffer( GL_ARRAY_BUFFER,_glvbo )
  38. Endif
  39. glEnableVertexAttribArray( 0 ) ; glVertexAttribPointer( 0,2,GL_FLOAT,False,Pitch,Cast<Void Ptr>( 0 ) )
  40. glEnableVertexAttribArray( 1 ) ; glVertexAttribPointer( 1,2,GL_FLOAT,False,Pitch,Cast<Void Ptr>( 8 ) )
  41. glEnableVertexAttribArray( 2 ) ; glVertexAttribPointer( 2,2,GL_FLOAT,False,Pitch,Cast<Void Ptr>( 16 ) )
  42. glEnableVertexAttribArray( 3 ) ; glVertexAttribPointer( 3,4,GL_UNSIGNED_BYTE,True,Pitch,Cast<Void Ptr>( 24 ) )
  43. End
  44. Method Validate()
  45. If _clean=_length Return
  46. _clean=_length
  47. 'mythical 'orphaning'...
  48. ' glBufferData( GL_ARRAY_BUFFER,_capacity*Pitch,Null,GL_DYNAMIC_DRAW )
  49. ' glBufferSubData( GL_ARRAY_BUFFER,0,_length*Pitch,_data.Data )
  50. 'lazy - but fastest?
  51. glBufferData( GL_ARRAY_BUFFER,_length*Pitch,_data.Data,GL_DYNAMIC_DRAW )
  52. End
  53. Private
  54. Field _capacity:Int
  55. Field _length:Int
  56. Field _clean:Int
  57. Field _data:Vertex2f[]
  58. Field _glvbo:GLuint
  59. Field _seq:Int
  60. End