Thanks Dave for the update, I believe Laurent just added support for that in trunk:
ptr = Pointer.magic_cookie(12)
glVertexPointer(3, GL_FLOAT, ptr)
It looks like you are having fun with OpenGL and MacRuby, would you mind writing a small intro article for the MacRuby website? That would be really appreciated.
Thanks,
- Matt
Just to give an answer for anyone finding this later.
All the methods for loading the in vertex data work fine and the only problem (as alluded to) is how to pass an integer to a C function expecting a void * pointer.
On 21 Dec 2010, at 20:20, Dave Baldwin wrote:
> I have an openGL program that works if I use vertex arrays to store the geometry data, but if I convert it to use an openGL vertex buffer object then nothing is drawn. Has anyone got vertex buffer objects to work with MacRuby? I am using 0.8 on 10.6.4
>
> (In OpenGL a vertex buffer object just holds geometry but on the graphics card so for large amounts of geometry will be significantly faster than a vertex array where the geometry is held in the client's memory and copied to the graphics card every time it is drawn).
>
> The code is:
>
> @vbo_buffer = Pointer.new('f', 1000)
> ... # initialise with vertex data (BYTES_IN_BUFFER set up with the size of the vertex data)
>
> # Get a buffer object id
> cubeVBO = Pointer.new_with_type('I', 1)
> glGenBuffers(1, cubeVBO)
> @cubeVBO = cubeVBO[0]
>
> glBindBuffer(GL_ARRAY_BUFFER, @cubeVBO)
>
> # The vertex buffer object can be initialised in several ways
> case vbo_method
> when :writeOnAllocate
> # This call will allocate the vertex buffer object and initialise it from @vbo_buffer
> glBufferData(GL_ARRAY_BUFFER, BYTES_IN_BUFFER, @vbo_buffer, GL_STATIC_DRAW)
> when :writeAfterAllocate
> nullPtr = Pointer.new("^I")
> # This call will allocate the vertex buffer object but not initialise it.
> glBufferData(GL_ARRAY_BUFFER, BYTES_IN_BUFFER, nullPtr, GL_STATIC_DRAW)
> # Now initialise it.
> glBufferSubData(GL_ARRAY_BUFFER, 0, BYTES_IN_BUFFER, @vbo_buffer)
> when :mapAfterAllocate
> nullPtr = Pointer.new("^I")
> # This call will allocate the vertex buffer object but not initialise it.
> glBufferData(GL_ARRAY_BUFFER, BYTES_IN_BUFFER, nullPtr, GL_STATIC_DRAW)
> # Get a pointer to the allocated buffer and copy the data over manually.
> buffer = glMapBuffer(GL_ARRAY_BUFFER, GL_READ_WRITE).cast!('f')
> (BYTES_IN_BUFFER / 4).times {|i| buffer[i] = @vbo_buffer[i]} # copy as floats
> glUnmapBuffer(GL_ARRAY_BUFFER)
> end
>
> Finally to draw the vertex buffer object
>
> glBindBuffer(GL_ARRAY_BUFFER, @cubeVBO)
>
> glEnableClientState(GL_VERTEX_ARRAY)
>
> v = Pointer.new("^c") # gives us a null pointer - need to pass in 0 in next call
> glVertexPointer(3, GL_FLOAT, v)
>
> glColor3f(1.0, 0.0, 0.0)
> glDrawArrays(GL_QUADS, 0, 24) # 0 = start offset, 24 = number of vertices
>
>
> None of the three methods to load the vertex buffer object make a difference. The other problem I will have is the colour data is interleaved in with the vertex data so ideally I need to call:
> glVertexPointer(3, GL_FLOAT, 12)
> but this function needs to take a void* pointer so how do I create a pointer with a value?
>
> Dave.
There is no way to do this in MacRuby 0.8 and the only option is to write a small objective C stub to do this. One such stub looks like:
- (void) glVBOVertexPointer: (GLint) size type: (GLenum) type stride: (GLsizei) stride offset:(GLint) offset
{
glVertexPointer(size, type, stride, (void *) offset);
}
and once you have built this and loaded it (see http://www.macruby.org/recipes/create-an-objective-c-bundle.html) then calling it
glVBOVertexPointer(3, type: GL_FLOAT, stride: strideInBytesBetweenVertices, offset: 0)
make everything work as expected.
Dave.
_______________________________________________
MacRuby-devel mailing list
MacRuby-devel@lists.macosforge.org
http://lists.macosforge.org/mailman/listinfo.cgi/macruby-devel