¿Cómo convierto esta matemática del puntero OpenGL a Swift?

Estoy siguiendo este tutorial sobre OpenGL / GLKit para iOS, pero trato de implementarlo en Swift. Va bien hasta que llegue a esta parte:

- (void)render { // 1 self.effect.texture2d0.name = self.textureInfo.name; self.effect.texture2d0.enabled = YES; // 2 [self.effect prepareToDraw]; // 3 glEnableVertexAttribArray(GLKVertexAttribPosition); glEnableVertexAttribArray(GLKVertexAttribTexCoord0); //---------------- This is where things break down... long offset = (long)&_quad; glVertexAttribPointer(GLKVertexAttribPosition, 2, GL_FLOAT, GL_FALSE, sizeof(TextunetworkingVertex), (void *) (offset + offsetof(TextunetworkingVertex, geometryVertex))); glVertexAttribPointer(GLKVertexAttribTexCoord0, 2, GL_FLOAT, GL_FALSE, sizeof(TextunetworkingVertex), (void *) (offset + offsetof(TextunetworkingVertex, textureVertex))); // 5 glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); } @end 

Tengo una propiedad self.quad que es una estructura Swift como esta:

 struct TextunetworkingVertex { let geometryVertex: CGPoint let textureVertex: CGPoint } struct TextunetworkingQuad { let bottomLeft: TextunetworkingVertex let bottomRight: TextunetworkingVertex let topLeft: TextunetworkingVertex let topRight: TextunetworkingVertex } 

Es una estructura bastante sencilla, pero no sé cómo pasarla al último argumento de glVertexAttribPointer . ¡Cualquier ayuda sería estelar!

En Swift, puede utilizar la estructura genérica UnsafePointer para realizar la aritmética y la conversión de puntero. Swift no tiene offsetof , pero puedes offsetof limpiamente tomando UnsafePointer de los elementos geometryVertex y textureVertex directamente.

El siguiente código se comstack en un patio iOS. No lo he probado más allá de eso, pero creo que funcionará:

 import OpenGLES import GLKit struct TextunetworkingVertex { var geometryVertex = GLKVector2() var textureVertex = GLKVector2() } struct TextunetworkingQuad { var bl = TextunetworkingVertex() var br = TextunetworkingVertex() var tl = TextunetworkingVertex() var tr = TextunetworkingVertex() init() { } } var _quad = TextunetworkingQuad() withUnsafePointer(&_quad.bl.geometryVertex) { (pointer) -> Void in glVertexAttribPointer(GLuint(GLKVertexAttrib.Position.rawValue), 2, GLenum(GL_FLOAT), GLboolean(GL_FALSE), GLsizei(sizeof(TextunetworkingVertex)), pointer) } withUnsafePointer(&_quad.bl.textureVertex) { (pointer) -> Void in glVertexAttribPointer(GLuint(GLKVertexAttrib.TexCoord0.rawValue), 2, GLenum(GL_FLOAT), GLboolean(GL_FALSE), GLsizei(sizeof(TextunetworkingVertex)), pointer) } 

Por cierto, usar CGPoint la forma que lo hizo en su pregunta es peligroso, ya que CGFloat cambia el tamaño según su objective (32 bits o 64 bits), pero GL_FLOAT siempre significa 32 bits. El tutorial que está siguiendo se escribió antes de que salga el iOS de 64 bits.