Texture.cc 4.71 KB
Newer Older
1 2 3 4 5
/***********************************************************************
 * Copyright 2011-2012 Computer Graphics Group RWTH Aachen University. *
 * All rights reserved.                                                *
 * Distributed under the terms of the MIT License (see LICENSE.TXT).   *
 **********************************************************************/
Robert Menzel's avatar
Robert Menzel committed
6

Robert Menzel's avatar
Robert Menzel committed
7
#include <ACGL/OpenGL/Objects/Texture.hh>
8
#include <ACGL/OpenGL/glloaders/extensions.hh> // for anisotrophic filtering
Robert Menzel's avatar
Robert Menzel committed
9

Robert Menzel's avatar
Robert Menzel committed
10
using namespace ACGL::OpenGL;
Robert Menzel's avatar
Robert Menzel committed
11

12 13

#ifndef ACGL_OPENGLES_VERSION_20
14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
void Texture::setWrapS( GLenum _wrapS ) 
{
	glBindTexture(mTarget, mObjectName);
	mWrapS = _wrapS;
    glTexParameteri(mTarget, GL_TEXTURE_WRAP_S, mWrapS);
}

void Texture::setWrapT( GLenum _wrapT )
{
	glBindTexture(mTarget, mObjectName);
	mWrapT = _wrapT;
    glTexParameteri(mTarget, GL_TEXTURE_WRAP_T, mWrapT);
}

void Texture::setWrapR( GLenum _wrapR )
{
	glBindTexture(mTarget, mObjectName);
	mWrapR = _wrapR;
    glTexParameteri(mTarget, GL_TEXTURE_WRAP_R, mWrapR);
}


Robert Menzel's avatar
Robert Menzel committed
36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
void Texture::setWrap( GLenum _wrapS, GLenum _wrapT, GLenum _wrapR )
{
    glBindTexture(mTarget, mObjectName);

    mWrapS = _wrapS;
    glTexParameteri(mTarget, GL_TEXTURE_WRAP_S, mWrapS);

    if(_wrapT != 0)
    {
        mWrapT = _wrapT;
        glTexParameteri(mTarget, GL_TEXTURE_WRAP_T, mWrapT);
    }

    if(_wrapR != 0)
    {
        mWrapR = _wrapR;
        glTexParameteri(mTarget, GL_TEXTURE_WRAP_R, mWrapR);
    }

    openGLRareError();
}
57
#endif // ACGL_OPENGLES_VERSION_20
Robert Menzel's avatar
Robert Menzel committed
58 59 60

void Texture::setAnisotropicFilter( GLfloat _sampleCount )
{
61
    if ( ACGL_EXT_texture_filter_anisotrophic() ) {
Robert Menzel's avatar
Robert Menzel committed
62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79
		// anisotrophic filtering is supported:
        GLfloat maxAnisotropicSamples;
        glGetFloatv( GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &maxAnisotropicSamples );
        _sampleCount = std::max( 1.0f, _sampleCount );
        _sampleCount = std::min( maxAnisotropicSamples, _sampleCount );
        glBindTexture( mTarget, mObjectName );
        glTexParameterf( mTarget, GL_TEXTURE_MAX_ANISOTROPY_EXT, _sampleCount );
        openGLRareError();
    } else
    {
		if (_sampleCount != 1.0f ) {
			// anisotropic filtering will just increase the image quality, so this is just
			// a warning and no error, 1 sample is equal to no anisotrophic filtering, so ignore
			// that case entirely!
			ACGL::Utils::warning() << "Anisotropic filtering is not supported, ignored" << std::endl;
		}
    }
}
Janis Born's avatar
Janis Born committed
80

81
#ifndef ACGL_OPENGLES_VERSION_20
82
SharedTextureData Texture::getImageData(GLint _lod, GLenum _type) const
Janis Born's avatar
Janis Born committed
83
{
84
    if(_type == GL_INVALID_ENUM) _type = mType;
Janis Born's avatar
Janis Born committed
85

86 87
    // remember the previously bound texture
    GLint prevTexture;
88
    
89 90 91 92 93 94 95 96
    if     (mTarget == GL_TEXTURE_1D)                   glGetIntegerv(GL_TEXTURE_BINDING_1D,                   &prevTexture);
    else if(mTarget == GL_TEXTURE_2D)                   glGetIntegerv(GL_TEXTURE_BINDING_2D,                   &prevTexture);
    else if(mTarget == GL_TEXTURE_3D)                   glGetIntegerv(GL_TEXTURE_BINDING_3D,                   &prevTexture);
    else if(mTarget == GL_TEXTURE_1D_ARRAY)             glGetIntegerv(GL_TEXTURE_BINDING_1D_ARRAY,             &prevTexture);
    else if(mTarget == GL_TEXTURE_2D_ARRAY)             glGetIntegerv(GL_TEXTURE_BINDING_2D_ARRAY,             &prevTexture);
    else if(mTarget == GL_TEXTURE_RECTANGLE)            glGetIntegerv(GL_TEXTURE_BINDING_RECTANGLE,            &prevTexture);
    else if(mTarget == GL_TEXTURE_2D_MULTISAMPLE)       glGetIntegerv(GL_TEXTURE_BINDING_2D_MULTISAMPLE,       &prevTexture);
    else if(mTarget == GL_TEXTURE_2D_MULTISAMPLE_ARRAY) glGetIntegerv(GL_TEXTURE_BINDING_2D_MULTISAMPLE_ARRAY, &prevTexture);
Janis Born's avatar
Janis Born committed
97 98 99
    // determine the required buffer size to hold the requested LOD level
    bind();
    GLint width, height, depth;
100
    glGetTexLevelParameteriv(mTarget, _lod, GL_TEXTURE_WIDTH,  &width);
Janis Born's avatar
Janis Born committed
101
    glGetTexLevelParameteriv(mTarget, _lod, GL_TEXTURE_HEIGHT, &height);
102
    glGetTexLevelParameteriv(mTarget, _lod, GL_TEXTURE_DEPTH,  &depth);
Janis Born's avatar
Janis Born committed
103 104

    // fetch the image data
105 106 107 108
    int channels = 4;
    if (mFormat == GL_RGB) channels = 3; // TODO: check the other channel types

    GLubyte* imageData = new GLubyte[width * height * getGLTypeSize(_type) * channels];
109
    glGetTexImage(mTarget, _lod, mFormat, _type, (GLvoid*)imageData);
Janis Born's avatar
Janis Born committed
110

111 112 113
    // revert to the previously bound texture
    glBindTexture(mTarget, prevTexture);

Janis Born's avatar
Janis Born committed
114 115 116 117 118 119
    // store the image data and meta information in a TextureData object
    SharedTextureData dataObject = SharedTextureData(new TextureData());
    dataObject->setWidth(width);
    dataObject->setHeight(height);
    dataObject->setDepth(depth);
    dataObject->setType(_type);
120
    dataObject->setFormat(mFormat);
Janis Born's avatar
Janis Born committed
121 122 123 124
    dataObject->setData(imageData); // dataObject will take care of freeing imageData

    return dataObject;
}
125
#endif // ES 2.0