Add glTF PBR model loading
[opengl.git] / image.cpp
index 13174c08ae88dec5c6e5a44552dc681389e3a959..e3c5cbdb81fe2355c63c9452b25f8a92adec68f9 100644 (file)
--- a/image.cpp
+++ b/image.cpp
@@ -6,23 +6,12 @@ Image::Image(const std::string &path) {
        CFURLRef url = CFURLCreateWithFileSystemPath(NULL, str, kCFURLPOSIXPathStyle, false);
        CGImageSourceRef source = CGImageSourceCreateWithURL(url, NULL);
        CGImageRef ref = CGImageSourceCreateImageAtIndex(source, 0, NULL);
-       /* auto provider = CGDataProviderCreateWithFilename(path.c_str()); */
-       /* std::ifstream file(path); */
-       /* long magic; */
-       /* file.read((char*)&magic, 8); */
-       /* file.close(); */
-
-       /* CGImageRef ref; */
-
-       /* if (magic == 0x0a1a0a0d474e5089) // png magic number */
-       /*      ref = CGImageCreateWithPNGDataProvider(provider, nullptr, false, kCGRenderingIntentDefault); */
-       /* else */
-       /*      ref = CGImageCreateWithJPEGDataProvider(provider, nullptr, false, kCGRenderingIntentDefault); */
 
        _width = CGImageGetWidth(ref), _height = CGImageGetHeight(ref);
        info = CGImageGetBitmapInfo(ref);
        alphaInfo = CGImageGetAlphaInfo(ref);
        colorSpace = CGImageGetColorSpace(ref);
+       bitsPerComponent = CGImageGetBitsPerComponent(ref);
 
        dataRef = CGDataProviderCopyData(CGImageGetDataProvider(ref));
        CGImageRelease(ref);
@@ -36,7 +25,8 @@ unsigned char *Image::data() const {
 GLfloat Image::width() const { return _width; }
 GLfloat Image::height() const { return _height; }
 
-GLuint Image::format() const {
+// TODO: Properly implement this for both internal format + format
+GLenum Image::format() const {
        if (CGColorSpaceGetModel(colorSpace) == kCGColorSpaceModelMonochrome) {
                return GL_DEPTH_COMPONENT;
        }
@@ -46,4 +36,24 @@ GLuint Image::format() const {
        return GL_RGBA;
 }
 
+GLint Image::internalFormat() const {
+       switch (format()) {
+               case GL_DEPTH_COMPONENT: return GL_DEPTH_COMPONENT;
+               case GL_RGB: return GL_RGB;
+               default: return GL_RGBA;
+       }
+}
+
+GLenum Image::type() const {
+       bool isFloat = info & kCGBitmapFloatComponents;
+       if (isFloat) return GL_FLOAT;
+       return GL_UNSIGNED_BYTE;
+       
+       //TODO:
+       /* switch (bitsPerComponent) { */
+       /*      case 1: return GL_UNSIGNED_BYTE; */
+       /*      case 16: return GL_UNSIGNED_SHORT; */
+       /*  case 24: */ 
+}
+
 Image::~Image() { CFRelease(dataRef); }