ios swift opengl-es glkit

ios - ¿Cómo convierto este matemático de puntero OpenGL a Swift?



opengl-es glkit (1)

Estoy siguiendo este tutorial sobre OpenGL / GLKit para iOS pero tratando de implementarlo en Swift. Todo 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(TexturedVertex), (void *) (offset + offsetof(TexturedVertex, geometryVertex))); glVertexAttribPointer(GLKVertexAttribTexCoord0, 2, GL_FLOAT, GL_FALSE, sizeof(TexturedVertex), (void *) (offset + offsetof(TexturedVertex, textureVertex))); // 5 glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); } @end

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

struct TexturedVertex { let geometryVertex: CGPoint let textureVertex: CGPoint } struct TexturedQuad { let bottomLeft: TexturedVertex let bottomRight: TexturedVertex let topLeft: TexturedVertex let topRight: TexturedVertex }

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


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

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

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

Por cierto, usar CGPoint como lo hizo en su pregunta es peligroso, porque CGFloat cambia de tamaño dependiendo de su objetivo (32 bits o 64 bits), pero GL_FLOAT siempre significa 32 bits. El tutorial que estás siguiendo se escribió antes de que saliera iOS de 64 bits.