Доступна версия Texture2D.m для Mac OS X.h? - PullRequest
3 голосов
/ 02 сентября 2010

Класс Apple Texture2D - очень полезный набор для разработчиков iOS.

Q. Существует ли версия этого класса для Mac OS X?

(Я гуглил, но могу найти только реализации iOS, в основном через проекты Cocos2D.)

Приветствие.

1 Ответ

4 голосов
/ 02 сентября 2010

Вы можете написать метод для этого - вот что я использую:

typedef struct {
    void *data;
    GLfloat width;
    GLfloat height;
} TextureData;

+ (TextureData)loadPngTexture:(NSString *)fileName {
    CFURLRef textureURL = CFBundleCopyResourceURL(CFBundleGetMainBundle(),
              (CFStringRef)fileName,
              CFSTR("png"),
              NULL);
 NSAssert(textureURL, @"Texture name invalid");

 CGImageSourceRef imageSource = CGImageSourceCreateWithURL(textureURL, NULL);
 NSAssert(imageSource, @"Invalid Image Path.");
 NSAssert((CGImageSourceGetCount(imageSource) > 0), @"No Image in Image Source.");
 CFRelease(textureURL);

 CGImageRef image = CGImageSourceCreateImageAtIndex(imageSource, 0, NULL);
 NSAssert(image, @"Image not created.");
 CFRelease(imageSource);

 GLuint width = CGImageGetWidth(image);
 GLuint height = CGImageGetHeight(image);

 void *data = malloc(width * height * 4);

 CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
 NSAssert(colorSpace, @"Colorspace not created.");

 CGContextRef context = CGBitmapContextCreate(data,
             width,
             height,
             8,
             width * 4,
             colorSpace,
             kCGImageAlphaPremultipliedFirst | kCGBitmapByteOrder32Host);
 NSAssert(context, @"Context not created.");

 CGColorSpaceRelease(colorSpace);
 // Flip so that it isn't upside-down
 CGContextTranslateCTM(context, 0, height);
 CGContextScaleCTM(context, 1.0f, -1.0f);
 CGContextSetBlendMode(context, kCGBlendModeCopy);
 CGContextDrawImage(context, CGRectMake(0, 0, width, height), image);
 CGImageRelease(image);
 CGContextRelease(context);

    return (TextureData){ data, width, height };
}

А затем используйте это так:

TextureData td = [Renderer loadPngTexture:@"atlas"];
// Or use GL_TEXTURE_2D
glTexImage2D(GL_TEXTURE_RECTANGLE_ARB, 0, GL_RGBA, td.width, td.height, 0, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, td.data);
...