2015-01-17 11 views
5

Podążam za this tutorial o OpenGL/GLKit dla iOS, ale próbuję go zaimplementować w Swift. To będzie w porządku, dopóki nie dostać się do tej strony:Jak przekonwertować ten wskaźnik pointeru OpenGL na Swift?

- (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 

Mam właściwość self.quad To Swift struct tak:

struct TexturedVertex { 
let geometryVertex: CGPoint 
let textureVertex: CGPoint 
} 

struct TexturedQuad { 

let bottomLeft: TexturedVertex 
let bottomRight: TexturedVertex 
let topLeft: TexturedVertex 
let topRight: TexturedVertex 
} 

Jest to dość prosta konstrukcja, ale nie wiem jak przekazać go do ostatniego argumentu glVertexAttribPointer. Każda pomoc będzie gwiezdna!

Odpowiedz

10

W Swift można użyć ogólnej struktury UnsafePointer do wykonywania arytmetyki wskaźnika i rzutowania. Swift nie ma numeru offsetof, ale można go obejść czysto, pobierając UnsafePointer s z elementów geometryVertex i textureVertex bezpośrednio.

Poniższy kod jest kompilowany na placu zabaw iOS. Nie testowałem go poza tym, ale myślę, że to będzie działać:

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) 
} 

Nawiasem mówiąc, stosując CGPoint drogę zrobiłeś w swoim pytaniu jest niebezpieczne, ponieważ CGFloat zmienia wielkość w zależności od celu (32- bitowy lub 64-bitowy), ale GL_FLOAT zawsze oznacza 32-bitowy. Samouczek, który obserwujesz, został napisany przed wydaniem 64-bitowego iOS.

+0

Doskonale! Dodam także, że następny problem w samouczku to, że większość GLKit jest rozwalona w Swift, ponieważ Swift nie ma "union". Ten kawałek kodu omija problem https://github.com/programmingthomas/OpenGL.swift – jbrennan

+0

Ponadto, tak, 'CGPoint' nie działa, ponieważ zmienne są zbyt duże. Musisz użyć 32-bitowego "GL_FLOAT". – jbrennan

Powiązane problemy