gfxGLTextureArray.cpp
Engine/source/gfx/gl/gfxGLTextureArray.cpp
Detailed Description
1 2#include "gfxGLTextureArray.h" 3 4#include "gfxGLTextureObject.h" 5#include "gfxGLUtils.h" 6#include "core/util/tVector.h" 7 8GFXGLTextureArray::GFXGLTextureArray() 9{ 10 mTextureArray = NULL; 11} 12 13void GFXGLTextureArray::init() 14{ 15 PRESERVE_2D_TEXTURE_ARRAY(); 16 glGenTextures(1, &mTextureArray); 17 glBindTexture(GL_TEXTURE_2D_ARRAY, mTextureArray); 18 glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAX_LEVEL, mMin(mMipLevels - 1, 1)); 19 glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 20 glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 21 glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 22 glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 23 24 glTexStorage3D(GL_TEXTURE_2D_ARRAY, mMipLevels, GFXGLTextureInternalFormat[mFormat], mWidth, mHeight, mArraySize); 25} 26 27void GFXGLTextureArray::_setTexture(const GFXTexHandle& texture, U32 slot) 28{ 29 PRESERVE_2D_TEXTURE_ARRAY(); 30 glBindTexture(GL_TEXTURE_2D_ARRAY, mTextureArray); 31 32 GFXGLTextureObject* texObj = dynamic_cast<GFXGLTextureObject*>(texture.getPointer()); 33 for (U32 mip = 0; mip < mMipLevels; ++mip) 34 { 35 U8* buf = texObj->getTextureData(mip); 36 const U32 mipWidth = getMax(U32(1), mWidth >> mip); 37 const U32 mipHeight = getMax(U32(1), mHeight >> mip); 38 if (mIsCompressed) 39 { 40 glCompressedTexSubImage3D( 41 GL_TEXTURE_2D_ARRAY, 42 mip, 0, 0, 43 slot, mipWidth, mipHeight, 1, 44 GFXGLTextureFormat[mFormat], GFXGLTextureType[mFormat], buf 45 ); 46 } 47 else 48 { 49 glTexSubImage3D( 50 GL_TEXTURE_2D_ARRAY, 51 mip, 0, 0, 52 slot, mipWidth, mipHeight, 1, 53 GFXGLTextureFormat[mFormat], GFXGLTextureType[mFormat], buf 54 ); 55 } 56 delete[] buf; 57 } 58} 59 60void GFXGLTextureArray::setToTexUnit(U32 tuNum) 61{ 62 dynamic_cast<GFXGLDevice*>(getOwningDevice())->setTextureArrayInternal(tuNum, this); 63} 64 65void GFXGLTextureArray::Release() 66{ 67 glDeleteTextures(1, &mTextureArray); 68 mTextureArray = 0; 69 70 GFXTextureArray::Release(); 71} 72 73void GFXGLTextureArray::bind(U32 textureUnit) const 74{ 75 glActiveTexture(GL_TEXTURE0 + textureUnit); 76 glBindTexture(GL_TEXTURE_2D_ARRAY, mTextureArray); 77 78 dynamic_cast<GFXGLDevice*>(getOwningDevice())->getOpenglCache()->setCacheBindedTex(textureUnit, GL_TEXTURE_2D_ARRAY, mTextureArray); 79 80 GFXGLStateBlockRef sb = dynamic_cast<GFXGLDevice*>(GFX)->getCurrentStateBlock(); 81 AssertFatal(sb, "GFXGLTextureArray::bind - No active stateblock!"); 82 if (!sb) 83 return; 84 85 const GFXSamplerStateDesc& ssd = sb->getDesc().samplers[textureUnit]; 86 glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MIN_FILTER, minificationFilter(ssd.minFilter, ssd.mipFilter, 0)); 87 glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAG_FILTER, GFXGLTextureFilter[ssd.magFilter]); 88 glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAX_LEVEL, mMin(mMipLevels - 1, 1)); 89 glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_WRAP_S, GFXGLTextureAddress[ssd.addressModeU]); 90 glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_WRAP_T, GFXGLTextureAddress[ssd.addressModeV]); 91} 92 93void GFXGLTextureArray::zombify() 94{ 95} 96 97void GFXGLTextureArray::resurrect() 98{ 99} 100