From: 
[https://nim-lang.org/docs/manual.html#statements-and-expressions-the-addr-operator](https://nim-lang.org/docs/manual.html#statements-and-expressions-the-addr-operator)

> The addr operator returns the address of an l-value.

From: 
[https://nim-lang.org/docs/manual.html#procedures-var-return-type](https://nim-lang.org/docs/manual.html#procedures-var-return-type)

> A proc, converter or iterator may return a var type which means that the 
> returned value is an l-value and can be modified by the caller:

In other words, when a return type is not a var type, it is not an l-value.

From: 
[https://nim-lang.org/docs/tables.html#%5B%5D%2CTable%5BA%2CB%5D%2CA](https://nim-lang.org/docs/tables.html#%5B%5D%2CTable%5BA%2CB%5D%2CA)
 
[https://nim-lang.org/docs/tables.html#%5B%5D%2CTable%5BA%2CB%5D%2CA_2](https://nim-lang.org/docs/tables.html#%5B%5D%2CTable%5BA%2CB%5D%2CA_2)

> proc `[]`[A, B](t: Table[A, B]; key: A): B
> 
> proc `[]`[A, B](t: var Table[A, B]; key: A): var B

So in your `CreateBuffers` proc, `proc `[]`[A, B](t: Table[A, B]; key: A): B` 
is called and it doesn't return var type. You can get an address only from an 
l-value. That is why you cannt use `unsafeAddr` in your code.

You can not access `seq[0]` when the lenght of the sequence is 0.

I think your code shoulde be like: 
    
    
    proc CreateBuffers*(obj: var RenderableObject) {.inline.} =
    # # #
      glBufferData(GL_ARRAY_BUFFER, obj.vertices_tbl[f].len*sizeof(GLfloat), if 
obj.vertices_tbl[f].len == 0: nil else: obj.vertices_tbl[f][0].unsafeAddr, 
GL_STATIC_DRAW)
    
    
    Run

> if I pass it with var like obj: var RenderableObject it works, but that kinda 
> defeats the purpose of using tables and its very slow

I don't understand neither why you are using tables in your code nor why `var` 
defeats the purpose of using tables only from your code.

Reply via email to